[feat] add system language support across desktop and mobile

This commit is contained in:
dijunkun
2026-10-27 12:35:47 +08:00
parent b4acf0b597
commit b07f457e76
105 changed files with 21711 additions and 1627 deletions
@@ -35,6 +35,8 @@
10000000000000000000001A /* AnnouncementText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20000000000000000000001A /* AnnouncementText.swift */; };
10000000000000000000001B /* AnnouncementInboxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20000000000000000000001B /* AnnouncementInboxView.swift */; };
10000000000000000000001C /* AppUpdateChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20000000000000000000001C /* AppUpdateChecker.swift */; };
3C550ED141D4AEA30950BB7A /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5BD6CC3A43B86A2E2267994F; };
4870B14C46F4C4B8F10FEF08 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A0A3C0DA09EE562AE21DF986; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@@ -70,6 +72,28 @@
20000000000000000000001A /* AnnouncementText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnouncementText.swift; sourceTree = "<group>"; };
20000000000000000000001B /* AnnouncementInboxView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnouncementInboxView.swift; sourceTree = "<group>"; };
20000000000000000000001C /* AppUpdateChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppUpdateChecker.swift; sourceTree = "<group>"; };
51B43C654308785E6FC27C98 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en"; path = "Resources/en.lproj/Localizable.strings"; sourceTree = "<group>"; };
C04C96DC6D837D5C45257B37 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "Resources/zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
4E23FD4A4331F613A7BF3C81 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "Resources/zh-Hant.lproj/Localizable.strings"; sourceTree = "<group>"; };
10718835138E0FDDFDE9B567 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ru"; path = "Resources/ru.lproj/Localizable.strings"; sourceTree = "<group>"; };
BA8BCB85D00055B796EBB9E1 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ja"; path = "Resources/ja.lproj/Localizable.strings"; sourceTree = "<group>"; };
10083BB5398965A4432CEC1E /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ko"; path = "Resources/ko.lproj/Localizable.strings"; sourceTree = "<group>"; };
8CEF64DB2A646A3C710CAAE7 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "de"; path = "Resources/de.lproj/Localizable.strings"; sourceTree = "<group>"; };
467DE174FF993E9771FAEE5D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fr"; path = "Resources/fr.lproj/Localizable.strings"; sourceTree = "<group>"; };
2EA0435DFAEE685F04391B3B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es"; path = "Resources/es.lproj/Localizable.strings"; sourceTree = "<group>"; };
1C906F7AD7B701DB61B512D2 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "Resources/pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; };
B6189259C1AE18847A742A13 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt"; path = "Resources/pt.lproj/Localizable.strings"; sourceTree = "<group>"; };
23D5AD87A9BF0CBF3A6AADDF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en"; path = "Resources/en.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
2E83770B40B2D299796EB0CD /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "Resources/zh-Hans.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
36B135DFBFBD8F03E16FB09A /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "Resources/zh-Hant.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
56DE65D659C5D65945CF834F /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ru"; path = "Resources/ru.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
02A713C4B5A1623480A005D6 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ja"; path = "Resources/ja.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
EA650495031B45A6FE5892FD /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ko"; path = "Resources/ko.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
E653CAF5C4E87548BF6D8670 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "de"; path = "Resources/de.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
0BB7EC0F2A5A6A313F782DCA /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fr"; path = "Resources/fr.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
093D4362C938821DE02B9032 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es"; path = "Resources/es.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
125E3BF17EC58E43B32F2AC3 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "Resources/pt-BR.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
7DDF05F5D35AB063DB447879 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt"; path = "Resources/pt.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -125,6 +149,8 @@
200000000000000000000003 /* ContentView.swift */,
20000000000000000000000E /* ThirdPartyLicensesView.swift */,
20000000000000000000000F /* ThirdPartyLicenses.json */,
A0A3C0DA09EE562AE21DF986 /* InfoPlist.strings */,
5BD6CC3A43B86A2E2267994F /* Localizable.strings */,
200000000000000000000010 /* PrivacyInfo.xcprivacy */,
200000000000000000000004 /* RemoteSessionView.swift */,
400000000000000000000003 /* Bridge */,
@@ -206,6 +232,11 @@
};
/* End PBXNativeTarget section */
/* Begin PBXVariantGroup section */
5BD6CC3A43B86A2E2267994F /* Localizable.strings */ = {isa = PBXVariantGroup; children = (51B43C654308785E6FC27C98, C04C96DC6D837D5C45257B37, 4E23FD4A4331F613A7BF3C81, 10718835138E0FDDFDE9B567, BA8BCB85D00055B796EBB9E1, 10083BB5398965A4432CEC1E, 8CEF64DB2A646A3C710CAAE7, 467DE174FF993E9771FAEE5D, 2EA0435DFAEE685F04391B3B, 1C906F7AD7B701DB61B512D2, B6189259C1AE18847A742A13, ); name = Localizable.strings; sourceTree = "<group>"; };
A0A3C0DA09EE562AE21DF986 /* InfoPlist.strings */ = {isa = PBXVariantGroup; children = (23D5AD87A9BF0CBF3A6AADDF, 2E83770B40B2D299796EB0CD, 36B135DFBFBD8F03E16FB09A, 56DE65D659C5D65945CF834F, 02A713C4B5A1623480A005D6, EA650495031B45A6FE5892FD, E653CAF5C4E87548BF6D8670, 0BB7EC0F2A5A6A313F782DCA, 093D4362C938821DE02B9032, 125E3BF17EC58E43B32F2AC3, 7DDF05F5D35AB063DB447879, ); name = InfoPlist.strings; sourceTree = "<group>"; };
/* End PBXVariantGroup section */
/* Begin PBXProject section */
800000000000000000000001 /* Project object */ = {
isa = PBXProject;
@@ -221,13 +252,9 @@
};
buildConfigurationList = 900000000000000000000001 /* Build configuration list for PBXProject "CrossDeskMobile" */;
compatibilityVersion = "Xcode 15.0";
developmentRegion = zh_CN;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
Base,
en,
zh_CN,
);
knownRegions = (Base, "en", "zh-Hans", "zh-Hant", "ru", "ja", "ko", "de", "fr", "es", "pt-BR", "pt", );
mainGroup = 400000000000000000000001;
productRefGroup = 400000000000000000000007 /* Products */;
projectDirPath = "";
@@ -245,6 +272,8 @@
files = (
100000000000000000000008 /* Assets.xcassets in Resources */,
10000000000000000000000A /* ThirdPartyLicenses.json in Resources */,
4870B14C46F4C4B8F10FEF08 /* InfoPlist.strings in Resources */,
3C550ED141D4AEA30950BB7A /* Localizable.strings in Resources */,
10000000000000000000000B /* PrivacyInfo.xcprivacy in Resources */,
100000000000000000000015 /* PRIVACY.md in Resources */,
);
@@ -21,8 +21,8 @@ struct AnnouncementBadge: View {
}
}
.accessibilityElement(children: .ignore)
.accessibilityLabel("通知公告")
.accessibilityValue(inbox.state.unread > 0 ? "\(inbox.state.unread) 条未读" : "无未读公告")
.accessibilityLabel(NSLocalizedString("通知公告", comment: ""))
.accessibilityValue(inbox.state.unread > 0 ? String(format: NSLocalizedString("%1$@ 条未读", comment: ""), String(describing: inbox.state.unread)) : NSLocalizedString("无未读公告", comment: ""))
}
}
@@ -49,14 +49,14 @@ struct AnnouncementInboxView: View {
var body: some View {
List {
if inbox.state.deleteFailed {
Text("无法删除这条公告,请重试。")
Text(NSLocalizedString("无法删除这条公告,请重试。", comment: ""))
.foregroundStyle(.red)
}
if inbox.state.failed && session.announcementsConnected {
HStack {
Text("公告加载失败,请重试。")
Text(NSLocalizedString("公告加载失败,请重试。", comment: ""))
Spacer()
Button("重试") { session.refreshAnnouncements() }
Button(NSLocalizedString("重试", comment: "")) { session.refreshAnnouncements() }
.disabled(!session.announcementsConnected)
}
}
@@ -82,42 +82,42 @@ struct AnnouncementInboxView: View {
}
.padding(.vertical, 5)
.accessibilityElement(children: .combine)
.accessibilityValue(item.read ? "已读" : "未读")
.accessibilityValue(item.read ? NSLocalizedString("已读", comment: "") : NSLocalizedString("未读", comment: ""))
}
.swipeActions {
Button("删除", role: .destructive) { pendingDelete = item }
Button(NSLocalizedString("删除", comment: ""), role: .destructive) { pendingDelete = item }
}
.contextMenu {
Button("删除公告", role: .destructive) { pendingDelete = item }
Button(NSLocalizedString("删除公告", comment: ""), role: .destructive) { pendingDelete = item }
}
}
if inbox.state.loading {
HStack { Spacer(); ProgressView("加载中…"); Spacer() }
HStack { Spacer(); ProgressView(NSLocalizedString("加载中…", comment: "")); Spacer() }
} else if inbox.state.items.count < inbox.state.total && !inbox.state.failed {
Button("加载更多") { inbox.loadMore() }
Button(NSLocalizedString("加载更多", comment: "")) { inbox.loadMore() }
.frame(maxWidth: .infinity)
.disabled(!session.announcementsConnected)
.onAppear { inbox.loadMore() }
} else if inbox.state.loaded && inbox.state.total == 0 &&
!inbox.state.failed && session.announcementsConnected {
Text("暂无公告")
Text(NSLocalizedString("暂无公告", comment: ""))
.foregroundStyle(.secondary)
.frame(maxWidth: .infinity, minHeight: 120)
}
} header: {
Text("共 \(inbox.state.total) 条 · \(inbox.state.unread) 条未读")
Text(String(format: NSLocalizedString("共 %1$@ 条 · %2$@ 条未读", comment: ""), String(describing: inbox.state.total), String(describing: inbox.state.unread)))
}
}
.readableContentWidth()
.background(Color(.systemGroupedBackground).ignoresSafeArea())
.navigationTitle("通知公告")
.navigationTitle(NSLocalizedString("通知公告", comment: ""))
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button { session.refreshAnnouncements() } label: {
Image(systemName: "arrow.clockwise")
}
.accessibilityLabel("刷新公告")
.accessibilityLabel(NSLocalizedString("刷新公告", comment: ""))
.disabled(inbox.state.loading || !session.announcementsConnected)
}
}
@@ -128,17 +128,17 @@ struct AnnouncementInboxView: View {
}
}
.onAppear { session.refreshAnnouncements() }
.alert("删除公告", isPresented: Binding(
.alert(NSLocalizedString("删除公告", comment: ""), isPresented: Binding(
get: { pendingDelete != nil },
set: { if !$0 { pendingDelete = nil } }
)) {
Button("取消", role: .cancel) { pendingDelete = nil }
Button("删除", role: .destructive) {
Button(NSLocalizedString("取消", comment: ""), role: .cancel) { pendingDelete = nil }
Button(NSLocalizedString("删除", comment: ""), role: .destructive) {
if let item = pendingDelete { inbox.dismiss(item) }
pendingDelete = nil
}
} message: {
Text("删除这条公告?")
Text(NSLocalizedString("删除这条公告?", comment: ""))
}
}
}
@@ -158,13 +158,13 @@ struct AnnouncementDetailView: View {
VStack(alignment: .leading, spacing: 16) {
Text(verbatim: item.title)
.font(.title2.weight(.semibold))
Text("\(AnnouncementDate.string(item)) · \(item.read ? "已读" : "未读")")
Text("\(AnnouncementDate.string(item)) · \(NSLocalizedString(item.read ? "已读" : "未读", comment: ""))")
.font(.caption)
.foregroundStyle(.secondary)
if inbox.state.readSaveFailed {
Text("无法保存本地阅读状态,请重试。")
Text(NSLocalizedString("无法保存本地阅读状态,请重试。", comment: ""))
.foregroundStyle(.red)
Button("重试保存阅读状态") { inbox.markRead(item) }
Button(NSLocalizedString("重试保存阅读状态", comment: "")) { inbox.markRead(item) }
}
Text(AnnouncementText.format(item.body))
.textSelection(.enabled)
@@ -178,13 +178,13 @@ struct AnnouncementDetailView: View {
.padding(20)
.readableContentWidth()
} else {
Text("这条公告已更新或删除,请返回公告列表查看。")
Text(NSLocalizedString("这条公告已更新或删除,请返回公告列表查看。", comment: ""))
.foregroundStyle(.secondary)
.padding(20)
.readableContentWidth()
}
}
.navigationTitle("公告详情")
.navigationTitle(NSLocalizedString("公告详情", comment: ""))
.navigationBarTitleDisplayMode(.inline)
.onAppear {
if let item { inbox.markRead(item) }
+61 -68
View File
@@ -65,11 +65,11 @@ struct ContentView: View {
.presentationDragIndicator(.hidden)
.interactiveDismissDisabled()
}
.alert("连接提示", isPresented: Binding(
.alert(NSLocalizedString("连接提示", comment: ""), isPresented: Binding(
get: { session.connectionFailureMessage != nil },
set: { if !$0 { session.dismissConnectionFailure() } }
)) {
Button("确定", role: .cancel) { session.dismissConnectionFailure() }
Button(NSLocalizedString("确定", comment: ""), role: .cancel) { session.dismissConnectionFailure() }
} message: {
Text(session.connectionFailureMessage ?? "")
}
@@ -196,17 +196,8 @@ private struct ConnectionHomeView: View {
)
}
private var signalIsConnected: Bool {
session.signalStatus == "已连接服务器"
}
private var signalHasError: Bool {
session.signalStatus.contains("失败") ||
session.signalStatus.contains("无法") ||
session.signalStatus.contains("无效") ||
session.signalStatus.contains("关闭") ||
session.signalStatus.contains("未知")
}
private var signalIsConnected: Bool { session.signalConnected }
private var signalHasError: Bool { session.signalHasError }
private var signalTint: Color {
if signalIsConnected { return .green }
@@ -303,13 +294,13 @@ private struct ConnectionHomeView: View {
.presentationDetents([.height(340)])
.presentationDragIndicator(.visible)
}
.alert("设备离线", isPresented: Binding(
.alert(NSLocalizedString("设备离线", comment: ""), isPresented: Binding(
get: { session.deviceOfflineAlertVisible },
set: { visible in
if !visible { session.dismissDeviceOfflineAlert() }
}
)) {
Button("确定") {
Button(NSLocalizedString("确定", comment: "")) {
session.dismissDeviceOfflineAlert()
}
}
@@ -337,7 +328,7 @@ private struct ConnectionHomeView: View {
.fixedSize(horizontal: true, vertical: false)
}
.buttonStyle(.plain)
.accessibilityHint("打开隐私政策")
.accessibilityHint(NSLocalizedString("打开隐私政策", comment: ""))
}
}
ToolbarItem(placement: .navigationBarTrailing) {
@@ -369,7 +360,7 @@ private struct ConnectionHomeView: View {
}
.foregroundStyle(.primary)
.disabled(session.isConnecting)
.accessibilityLabel(appUpdates.updateAvailable ? "设置,有新版本" : "设置")
.accessibilityLabel(appUpdates.updateAvailable ? NSLocalizedString("设置,有新版本", comment: "") : NSLocalizedString("设置", comment: ""))
}
}
@@ -398,13 +389,13 @@ private struct ConnectionHomeView: View {
private var remoteConnectionPanel: some View {
VStack(alignment: .leading, spacing: 16) {
HStack {
Text("远程桌面")
Text(NSLocalizedString("远程桌面", comment: ""))
.font(.title3.weight(.bold))
Spacer()
}
HStack(spacing: 10) {
TextField("对端 ID", text: groupedRemoteID)
TextField(NSLocalizedString("对端 ID", comment: ""), text: groupedRemoteID)
.keyboardType(.numberPad)
.textContentType(.username)
.textInputAutocapitalization(.never)
@@ -431,8 +422,10 @@ private struct ConnectionHomeView: View {
Button {
presentPasswordPrompt(for: trimmedRemoteID)
} label: {
Text("连接")
Text(NSLocalizedString("连接", comment: ""))
.font(.system(size: 16, weight: .bold))
.lineLimit(1)
.minimumScaleFactor(0.65)
.frame(width: 96, height: 54)
.foregroundStyle(.white)
.background(LinearGradient(colors: [
@@ -447,7 +440,7 @@ private struct ConnectionHomeView: View {
.buttonStyle(.plain)
.disabled(trimmedRemoteID.isEmpty || session.isConnecting)
.opacity(trimmedRemoteID.isEmpty || session.isConnecting ? 0.45 : 1)
.accessibilityLabel("连接")
.accessibilityLabel(NSLocalizedString("连接", comment: ""))
}
}
.padding(18)
@@ -464,11 +457,11 @@ private struct ConnectionHomeView: View {
private func recentConnectionsPanel(windowWidth: CGFloat) -> some View {
VStack(alignment: .leading, spacing: 14) {
HStack(alignment: .firstTextBaseline) {
Text("最近连接")
Text(NSLocalizedString("最近连接", comment: ""))
.font(.title3.bold())
Spacer()
if !session.recentConnections.isEmpty {
Text("\(session.recentConnections.count) 台设备")
Text(String(format: NSLocalizedString("%1$@ 台设备", comment: ""), String(describing: session.recentConnections.count)))
.font(.caption)
.foregroundStyle(.secondary)
}
@@ -479,9 +472,9 @@ private struct ConnectionHomeView: View {
Image(systemName: "clock.arrow.circlepath")
.font(.system(size: 30, weight: .medium))
.foregroundStyle(.tertiary)
Text("还没有连接记录")
Text(NSLocalizedString("还没有连接记录", comment: ""))
.font(.headline)
Text("成功连接后,这里会显示远端桌面的缩略图。")
Text(NSLocalizedString("成功连接后,这里会显示远端桌面的缩略图。", comment: ""))
.font(.footnote)
.foregroundStyle(.secondary)
.multilineTextAlignment(.center)
@@ -532,7 +525,7 @@ private struct ConnectionHomeView: View {
.tint(connectionAccent)
VStack(spacing: 6) {
Text("正在连接")
Text(NSLocalizedString("正在连接", comment: ""))
.font(.title3.weight(.semibold))
.foregroundStyle(.primary)
Text(session.connectionStatus)
@@ -550,7 +543,7 @@ private struct ConnectionHomeView: View {
Divider()
Button(role: .cancel, action: session.disconnect) {
Text("取消连接")
Text(NSLocalizedString("取消连接", comment: ""))
.font(.subheadline.weight(.semibold))
.foregroundStyle(Color.red)
.frame(maxWidth: .infinity)
@@ -656,7 +649,7 @@ private struct RecentConnectionCard: View {
.minimumScaleFactor(0.8)
.foregroundStyle(.white)
.padding(8)
.accessibilityLabel("被控端平台:\(connection.platform.displayName)")
.accessibilityLabel(String(format: NSLocalizedString("被控端平台:%1$@", comment: ""), String(describing: connection.platform.displayName)))
}
}
.frame(maxWidth: .infinity)
@@ -678,12 +671,12 @@ private struct RecentConnectionCard: View {
Image(systemName: "key.fill")
.font(.system(size: 9, weight: .semibold))
.foregroundStyle(.secondary)
.accessibilityLabel("已保存密码")
.accessibilityLabel(NSLocalizedString("已保存密码", comment: ""))
}
Text(online ? "在线" : "离线")
Text(online ? NSLocalizedString("在线", comment: "") : NSLocalizedString("离线", comment: ""))
.font(.caption2.weight(.semibold))
.foregroundStyle(online ? Color.green : Color.secondary)
.accessibilityLabel(online ? "在线" : "离线")
.accessibilityLabel(online ? NSLocalizedString("在线", comment: "") : NSLocalizedString("离线", comment: ""))
}
}
.padding(9)
@@ -698,10 +691,10 @@ private struct RecentConnectionCard: View {
.buttonStyle(.plain)
.contextMenu {
Button(action: connect) {
Text("连接")
Text(NSLocalizedString("连接", comment: ""))
}
Button(role: .destructive, action: delete) {
Label("删除记录", systemImage: "trash")
Label(NSLocalizedString("删除记录", comment: ""), systemImage: "trash")
}
}
}
@@ -722,9 +715,9 @@ private struct PasswordPromptView: View {
VStack(alignment: .leading, spacing: 18) {
HStack {
VStack(alignment: .leading, spacing: 4) {
Text("连接远程桌面")
Text(NSLocalizedString("连接远程桌面", comment: ""))
.font(.title2.bold())
Text("对端 ID \(remoteID)")
Text(String(format: NSLocalizedString("对端 ID %1$@", comment: ""), String(describing: remoteID)))
.font(.subheadline.monospacedDigit())
.foregroundStyle(.secondary)
}
@@ -736,15 +729,15 @@ private struct PasswordPromptView: View {
.font(.title2)
.foregroundStyle(.secondary)
}
.accessibilityLabel("关闭")
.accessibilityLabel(NSLocalizedString("关闭", comment: ""))
}
HStack(spacing: 10) {
Group {
if passwordVisible {
TextField("访问密码", text: $password)
TextField(NSLocalizedString("访问密码", comment: ""), text: $password)
} else {
SecureField("访问密码", text: $password)
SecureField(NSLocalizedString("访问密码", comment: ""), text: $password)
}
}
.keyboardType(.asciiCapable)
@@ -759,7 +752,7 @@ private struct PasswordPromptView: View {
Image(systemName: passwordVisible ? "eye.slash" : "eye")
.foregroundStyle(.secondary)
}
.accessibilityLabel(passwordVisible ? "隐藏密码" : "显示密码")
.accessibilityLabel(passwordVisible ? NSLocalizedString("隐藏密码", comment: "") : NSLocalizedString("显示密码", comment: ""))
}
.padding(.horizontal, 13)
.frame(height: 50)
@@ -773,16 +766,16 @@ private struct PasswordPromptView: View {
Toggle(isOn: $rememberPassword) {
VStack(alignment: .leading, spacing: 2) {
Text("保存密码")
Text(NSLocalizedString("保存密码", comment: ""))
.font(.subheadline.weight(.semibold))
Text("密码将安全保存在本机 Keychain 中")
Text(NSLocalizedString("密码将安全保存在本机 Keychain 中", comment: ""))
.font(.caption)
.foregroundStyle(.secondary)
}
}
Button(action: connect) {
Text("连接")
Text(NSLocalizedString("连接", comment: ""))
.font(.headline)
.frame(maxWidth: .infinity)
.frame(height: 48)
@@ -823,16 +816,16 @@ private struct ServerSettingsView: View {
var body: some View {
Form {
Section("鼠标控制") {
Picker("控制模式", selection: $session.mouseControlMode) {
Section(NSLocalizedString("鼠标控制", comment: "")) {
Picker(NSLocalizedString("控制模式", comment: ""), selection: $session.mouseControlMode) {
ForEach(MouseControlMode.allCases) { mode in
Text(mode.title).tag(mode)
}
}
.pickerStyle(.segmented)
}
Section("画面偏好") {
Picker("偏好模式", selection: $session.videoAdaptationPolicy) {
Section(NSLocalizedString("画面偏好", comment: "")) {
Picker(NSLocalizedString("偏好模式", comment: ""), selection: $session.videoAdaptationPolicy) {
ForEach(VideoAdaptationPolicy.allCases) { policy in
Text(policy.title).tag(policy)
}
@@ -840,18 +833,18 @@ private struct ServerSettingsView: View {
.pickerStyle(.segmented)
}
Section {
Toggle("连接建立后锁定横屏", isOn: $session.autoLandscape)
Toggle(NSLocalizedString("连接建立后锁定横屏", comment: ""), isOn: $session.autoLandscape)
} header: {
Text("屏幕方向")
Text(NSLocalizedString("屏幕方向", comment: ""))
} footer: {
Text("默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。")
Text(NSLocalizedString("默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。", comment: ""))
}
Section {
DisclosureGroup(isExpanded: $serverConfigurationExpanded) {
Toggle("使用自定义服务器", isOn: $usesCustomServer)
Toggle(NSLocalizedString("使用自定义服务器", comment: ""), isOn: $usesCustomServer)
if usesCustomServer {
LabeledContent("地址") {
TextField("填写服务器地址", text: $customServerHost)
LabeledContent(NSLocalizedString("地址", comment: "")) {
TextField(NSLocalizedString("填写服务器地址", comment: ""), text: $customServerHost)
.textInputAutocapitalization(.never)
.autocorrectionDisabled()
.keyboardType(.URL)
@@ -859,21 +852,21 @@ private struct ServerSettingsView: View {
.focused($focusedServerField, equals: .host)
.submitLabel(.next)
.onSubmit { focusedServerField = .port }
.accessibilityLabel("服务器地址")
.accessibilityLabel(NSLocalizedString("服务器地址", comment: ""))
}
LabeledContent("端口") {
TextField("填写端口", text: $customServerPort)
LabeledContent(NSLocalizedString("端口", comment: "")) {
TextField(NSLocalizedString("填写端口", comment: ""), text: $customServerPort)
.keyboardType(.numberPad)
.multilineTextAlignment(.trailing)
.focused($focusedServerField, equals: .port)
.accessibilityLabel("服务器端口")
.accessibilityLabel(NSLocalizedString("服务器端口", comment: ""))
}
}
} label: {
HStack {
Text("服务器")
Text(NSLocalizedString("服务器", comment: ""))
Spacer()
Text(usesCustomServer ? "自定义" : "默认")
Text(usesCustomServer ? NSLocalizedString("自定义", comment: "") : NSLocalizedString("默认", comment: ""))
.foregroundStyle(.secondary)
}
}
@@ -886,9 +879,9 @@ private struct ServerSettingsView: View {
Text(warning)
.foregroundStyle(.orange)
}
Text(!session.hasNetworkConsent ? "完成隐私授权后登记本机身份" : session.localIdentity.isEmpty
? "正在获取本机 ID…"
: "本机 ID \(session.localIdentity)")
Text(!session.hasNetworkConsent ? NSLocalizedString("完成隐私授权后登记本机身份", comment: "") : session.localIdentity.isEmpty
? NSLocalizedString("正在获取本机 ID…", comment: "")
: String(format: NSLocalizedString("本机 ID %1$@", comment: ""), String(describing: session.localIdentity)))
.font(.caption2.monospacedDigit())
.foregroundStyle(.secondary)
.frame(maxWidth: .infinity, alignment: .center)
@@ -901,20 +894,20 @@ private struct ServerSettingsView: View {
ThirdPartyLicensesView(session: session)
} label: {
HStack {
Text("关于")
Text(NSLocalizedString("关于", comment: ""))
Spacer()
if appUpdates.updateAvailable {
Text("新版本").foregroundStyle(.secondary)
Text(NSLocalizedString("新版本", comment: "")).foregroundStyle(.secondary)
UpdateDot()
}
}
}
.accessibilityLabel(appUpdates.updateAvailable ? "关于,有新版本" : "关于")
.accessibilityLabel(appUpdates.updateAvailable ? NSLocalizedString("关于,有新版本", comment: "") : NSLocalizedString("关于", comment: ""))
}
}
.readableContentWidth()
.background(Color(.systemGroupedBackground).ignoresSafeArea())
.navigationTitle("设置")
.navigationTitle(NSLocalizedString("设置", comment: ""))
.navigationBarTitleDisplayMode(.inline)
.scrollDismissesKeyboard(.interactively)
.background {
@@ -943,7 +936,7 @@ private struct ServerSettingsView: View {
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Spacer()
Button("完成") {
Button(NSLocalizedString("完成", comment: "")) {
focusedServerField = nil
}
}
@@ -965,11 +958,11 @@ private struct ServerSettingsView: View {
let host = customServerHost.trimmingCharacters(in: .whitespacesAndNewlines)
let port = customServerPort.trimmingCharacters(in: .whitespacesAndNewlines)
guard !host.isEmpty else {
serverConfigurationError = "请输入服务器地址,或关闭“使用自定义服务器”。"
serverConfigurationError = NSLocalizedString("请输入服务器地址,或关闭“使用自定义服务器”。", comment: "")
return
}
guard let portNumber = Int(port), (1...65535).contains(portNumber) else {
serverConfigurationError = "请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。"
serverConfigurationError = NSLocalizedString("请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。", comment: "")
return
}
serverConfigurationError = nil
+1 -1
View File
@@ -5,7 +5,7 @@
<key>CFBundleDisplayName</key>
<string>CrossDesk</string>
<key>CFBundleDevelopmentRegion</key>
<string>zh_CN</string>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@@ -321,13 +321,13 @@ final class RemoteKeyboardInputBar: UIView {
heightConstraint.isActive = true
let computerButton = UIButton(type: .system)
computerButton.setTitle("电脑键盘", for: .normal)
computerButton.setTitle(NSLocalizedString("电脑键盘", comment: ""), for: .normal)
computerButton.titleLabel?.font = .systemFont(ofSize: 15, weight: .medium)
computerButton.accessibilityLabel = "切换到电脑键盘"
computerButton.accessibilityLabel = NSLocalizedString("切换到电脑键盘", comment: "")
computerButton.addTarget(self, action: #selector(switchToComputer), for: .touchUpInside)
let dismissButton = RemoteKeyboardDismissButton.makeButton()
dismissButton.accessibilityLabel = "收起系统键盘"
dismissButton.accessibilityLabel = NSLocalizedString("收起系统键盘", comment: "")
dismissButton.addTarget(self, action: #selector(hideKeyboard), for: .touchUpInside)
row.axis = .horizontal
@@ -64,8 +64,8 @@ private final class VirtualMouseKey: UIView {
isMultipleTouchEnabled = false
isAccessibilityElement = true
accessibilityTraits = kind == .wheel ? [.adjustable] : [.button]
accessibilityLabel = kind == .left ? "鼠标左键" : kind == .right ? "鼠标右键" : "鼠标滚轮"
accessibilityHint = kind == .wheel ? "上下滑动,可滑出按键范围" : "按住并拖动,可滑出按键范围,松开结束拖拽"
accessibilityLabel = kind == .left ? NSLocalizedString("鼠标左键", comment: "") : kind == .right ? NSLocalizedString("鼠标右键", comment: "") : NSLocalizedString("鼠标滚轮", comment: "")
accessibilityHint = kind == .wheel ? NSLocalizedString("上下滑动,可滑出按键范围", comment: "") : NSLocalizedString("按住并拖动,可滑出按键范围,松开结束拖拽", comment: "")
face.isUserInteractionEnabled = false
face.layer.mask = faceMask
addSubview(face)
+37 -35
View File
@@ -16,7 +16,7 @@ struct PrivacyConsentView: View {
.safeAreaInset(edge: .bottom, spacing: 0) {
consentActions
}
.navigationTitle("隐私政策")
.navigationTitle(NSLocalizedString("隐私政策", comment: ""))
.navigationBarTitleDisplayMode(.inline)
}
}
@@ -27,7 +27,7 @@ struct PrivacyConsentView: View {
VStack(spacing: 12) {
Toggle(isOn: $hasReadPolicy) {
Text("我已阅读并同意《隐私政策》")
Text(NSLocalizedString("我已阅读并同意《隐私政策》", comment: ""))
.font(.subheadline)
}
.toggleStyle(ConsentCheckboxStyle())
@@ -36,7 +36,7 @@ struct PrivacyConsentView: View {
guard hasReadPolicy else { return }
session.acceptNetworkConsent()
} label: {
Text("同意并继续")
Text(NSLocalizedString("同意并继续", comment: ""))
.font(.body.weight(.semibold))
.frame(maxWidth: .infinity, minHeight: 24)
}
@@ -48,7 +48,7 @@ struct PrivacyConsentView: View {
Button {
session.declineNetworkConsent()
} label: {
Text("暂不同意")
Text(NSLocalizedString("暂不同意", comment: ""))
.font(.body)
.frame(maxWidth: .infinity, minHeight: 44)
.contentShape(Rectangle())
@@ -81,8 +81,8 @@ private struct ConsentCheckboxStyle: ToggleStyle {
.contentShape(Rectangle())
}
.buttonStyle(.plain)
.accessibilityLabel("我已阅读并同意隐私政策")
.accessibilityValue(configuration.isOn ? "已勾选" : "未勾选")
.accessibilityLabel(NSLocalizedString("我已阅读并同意隐私政策", comment: ""))
.accessibilityValue(configuration.isOn ? NSLocalizedString("已勾选", comment: "") : NSLocalizedString("未勾选", comment: ""))
}
}
@@ -97,13 +97,13 @@ struct PrivacySettingsSection: View {
PrivacyAuthorizationView(session: session)
} label: {
HStack {
Text("隐私与授权")
Text(NSLocalizedString("隐私与授权", comment: ""))
Spacer()
Text(session.hasNetworkConsent ? "已授权" : "未授权")
Text(session.hasNetworkConsent ? NSLocalizedString("已授权", comment: "") : NSLocalizedString("未授权", comment: ""))
.foregroundStyle(.secondary)
}
}
Toggle("保存远程画面预览", isOn: Binding(
Toggle(NSLocalizedString("保存远程画面预览", comment: ""), isOn: Binding(
get: { session.savesConnectionThumbnails },
set: { enabled in
if enabled { confirmThumbnails = true }
@@ -111,7 +111,7 @@ struct PrivacySettingsSection: View {
}
))
.disabled(!session.hasNetworkConsent || session.thumbnailCleanupInProgress)
Button(session.thumbnailCleanupInProgress ? "正在清除…" : "清除预览图", role: .destructive) {
Button(session.thumbnailCleanupInProgress ? NSLocalizedString("正在清除…", comment: "") : NSLocalizedString("清除预览图", comment: ""), role: .destructive) {
confirmClear = true
}
.disabled(session.thumbnailCleanupInProgress)
@@ -119,21 +119,21 @@ struct PrivacySettingsSection: View {
Text(error).font(.footnote).foregroundStyle(.secondary)
}
} header: {
Text("隐私")
Text(NSLocalizedString("隐私", comment: ""))
}
.alert("保存远程画面预览?", isPresented: $confirmThumbnails) {
Button("开启保存") { session.setSavesConnectionThumbnails(true) }
Button("取消", role: .cancel) { }
.alert(NSLocalizedString("保存远程画面预览?", comment: ""), isPresented: $confirmThumbnails) {
Button(NSLocalizedString("开启保存", comment: "")) { session.setSavesConnectionThumbnails(true) }
Button(NSLocalizedString("取消", comment: ""), role: .cancel) { }
} message: {
Text("预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。")
Text(NSLocalizedString("预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。", comment: ""))
}
.alert("清除预览图?", isPresented: $confirmClear) {
Button("清除", role: .destructive) { session.clearConnectionThumbnails() }
Button("取消", role: .cancel) { }
.alert(NSLocalizedString("清除预览图?", comment: ""), isPresented: $confirmClear) {
Button(NSLocalizedString("清除", comment: ""), role: .destructive) { session.clearConnectionThumbnails() }
Button(NSLocalizedString("取消", comment: ""), role: .cancel) { }
} message: {
Text(session.savesConnectionThumbnails
? "将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。"
: "将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。")
? NSLocalizedString("将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。", comment: "")
: NSLocalizedString("将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。", comment: ""))
}
}
}
@@ -145,33 +145,33 @@ private struct PrivacyAuthorizationView: View {
var body: some View {
Form {
Section {
LabeledContent("授权状态", value: session.hasNetworkConsent ? "已授权" : "未授权")
NavigationLink("隐私政策") { PrivacyPolicyView() }
LabeledContent(NSLocalizedString("授权状态", comment: ""), value: session.hasNetworkConsent ? NSLocalizedString("已授权", comment: "") : NSLocalizedString("未授权", comment: ""))
NavigationLink(NSLocalizedString("隐私政策", comment: "")) { PrivacyPolicyView() }
} footer: {
if !session.hasNetworkConsent {
Text("授权后可使用远程连接。")
Text(NSLocalizedString("授权后可使用远程连接。", comment: ""))
}
}
Section {
if session.hasNetworkConsent {
Button("撤回隐私授权", role: .destructive) {
Button(NSLocalizedString("撤回隐私授权", comment: ""), role: .destructive) {
confirmWithdrawal = true
}
} else {
Button("阅读并授权") { session.showPrivacyNotice() }
Button(NSLocalizedString("阅读并授权", comment: "")) { session.showPrivacyNotice() }
}
}
}
.readableContentWidth()
.background(Color(.systemGroupedBackground).ignoresSafeArea())
.navigationTitle("隐私与授权")
.navigationTitle(NSLocalizedString("隐私与授权", comment: ""))
.navigationBarTitleDisplayMode(.inline)
.alert("是否撤回隐私授权?", isPresented: $confirmWithdrawal) {
Button("撤回授权", role: .destructive) { session.revokeNetworkConsent() }
Button("取消", role: .cancel) { }
.alert(NSLocalizedString("是否撤回隐私授权?", comment: ""), isPresented: $confirmWithdrawal) {
Button(NSLocalizedString("撤回授权", comment: ""), role: .destructive) { session.revokeNetworkConsent() }
Button(NSLocalizedString("取消", comment: ""), role: .cancel) { }
} message: {
Text("将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。")
Text(NSLocalizedString("将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。", comment: ""))
}
}
}
@@ -182,15 +182,17 @@ private struct PrivacyPolicyDocument: View {
guard let url = Bundle.main.url(forResource: "PRIVACY", withExtension: "md"),
let text = try? String(contentsOf: url, encoding: .utf8),
!text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return nil }
// The app's interface is Chinese; show the complete Chinese translation.
// Keep the published policy intact; use its English version outside Chinese locales.
if let start = text.range(of: "## 中文\n"),
let end = text.range(of: "## English", range: start.upperBound..<text.endIndex) {
return String(text[start.upperBound..<end.lowerBound])
let chinese = Bundle.main.preferredLocalizations.first?.hasPrefix("zh") == true
return chinese ? String(text[start.upperBound..<end.lowerBound])
: String(text[end.upperBound...])
}
return text
}()
static var isAvailable: Bool { text != nil }
private static let paragraphs = (text ?? "隐私政策暂时无法读取,请拒绝联网并重新安装应用。")
private static let paragraphs = (text ?? NSLocalizedString("隐私政策暂时无法读取,请拒绝联网并重新安装应用。", comment: ""))
.components(separatedBy: "\n\n")
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
.filter { !$0.isEmpty && $0 != "---" }
@@ -203,7 +205,7 @@ private struct PrivacyPolicyDocument: View {
Text(paragraph.trimmingCharacters(in: CharacterSet(charactersIn: "# ")))
.font(.headline)
.padding(.top, 4)
} else if paragraph.hasPrefix("更新日期:") {
} else if paragraph.hasPrefix("更新日期:") || paragraph.hasPrefix("Last updated:") {
Text(paragraph)
.font(.caption)
.foregroundStyle(.secondary)
@@ -226,7 +228,7 @@ struct PrivacyPolicyView: View {
ScrollView {
PrivacyPolicyDocument().padding().readableContentWidth()
}
.navigationTitle("隐私政策")
.navigationTitle(NSLocalizedString("隐私政策", comment: ""))
.navigationBarTitleDisplayMode(.inline)
}
}
@@ -9,7 +9,7 @@ enum RemoteHostPlatform: String, Codable {
case .macos: return "macOS"
case .linux: return "Linux"
case .ios: return "iOS"
case .unknown: return "未知"
case .unknown: return NSLocalizedString("未知", comment: "")
}
}
}
@@ -29,8 +29,8 @@ struct RemoteNetworkSnapshot {
var connectionMode: String {
switch report?.mode {
case .direct: return "P2P 直连"
case .relay: return "TURN 中继"
case .direct: return NSLocalizedString("P2P 直连", comment: "")
case .relay: return NSLocalizedString("TURN 中继", comment: "")
default: return "—"
}
}
@@ -37,11 +37,11 @@ struct RemotePrivacyScreen {
return fresh(at: now) && s.state == 3 && s.overlayActive && !s.remotePaused
}
func buttonTitle(at now: TimeInterval) -> String {
if enabled(at: now) { return "隐私屏已开启" }
if enabled(at: now) { return NSLocalizedString("隐私屏已开启", comment: "") }
if fresh(at: now), let s = snapshot, s.supported && s.state == 1 && !active {
return "隐私屏已关闭"
return NSLocalizedString("隐私屏已关闭", comment: "")
}
return "隐私屏"
return NSLocalizedString("隐私屏", comment: "")
}
func feedback(at now: TimeInterval) -> String {
if !desktopAvailable { return "" }
@@ -87,26 +87,26 @@ struct RemotePrivacyScreen {
return requestID
}
mutating func failed(request: UInt32) {
if pending && requestID == request { pending = false; failure = "指令发送失败,请重试" }
if pending && requestID == request { pending = false; failure = NSLocalizedString("指令发送失败,请重试", comment: "") }
}
mutating func tick(at now: TimeInterval) {
if pending && now - requestedAt >= 15 {
pending = false; failure = "请求超时,尚未确认电脑的隐私屏状态"
pending = false; failure = NSLocalizedString("请求超时,尚未确认电脑的隐私屏状态", comment: "")
}
}
func status(at now: TimeInterval) -> String {
if !failure.isEmpty { return failure }
guard let s = snapshot else { return "等待电脑返回隐私屏状态;旧版电脑端可能不支持" }
if !fresh(at: now) { return "隐私屏状态已过期,等待电脑确认" }
if s.state == 2 { return "正在开启隐私屏…" }
if s.state == 4 { return "正在关闭隐私屏…" }
if pending { return "指令已发送,等待电脑确认…" }
if s.state == 5 { return "隐私屏异常" }
if !s.supported || s.state == 0 { return "隐私屏暂不可用" }
guard let s = snapshot else { return NSLocalizedString("等待电脑返回隐私屏状态;旧版电脑端可能不支持", comment: "") }
if !fresh(at: now) { return NSLocalizedString("隐私屏状态已过期,等待电脑确认", comment: "") }
if s.state == 2 { return NSLocalizedString("正在开启隐私屏…", comment: "") }
if s.state == 4 { return NSLocalizedString("正在关闭隐私屏…", comment: "") }
if pending { return NSLocalizedString("指令已发送,等待电脑确认…", comment: "") }
if s.state == 5 { return NSLocalizedString("隐私屏异常", comment: "") }
if !s.supported || s.state == 0 { return NSLocalizedString("隐私屏暂不可用", comment: "") }
if s.state == 3 && s.overlayActive && !s.remotePaused {
return "隐私屏已开启"
return NSLocalizedString("隐私屏已开启", comment: "")
}
return s.state == 1 && !active ? "隐私屏已关闭" : "隐私屏状态待确认"
return s.state == 1 && !active ? NSLocalizedString("隐私屏已关闭", comment: "") : NSLocalizedString("隐私屏状态待确认", comment: "")
}
func detail(at now: TimeInterval) -> String {
guard let s = snapshot, fresh(at: now), s.state == 0 || s.state == 5 || !s.supported else { return "" }
@@ -15,17 +15,17 @@ enum MouseControlMode: String, CaseIterable, Identifiable {
var title: String {
switch self {
case .absolute: return "绝对位置"
case .relative: return "相对位置"
case .absolute: return NSLocalizedString("绝对位置", comment: "")
case .relative: return NSLocalizedString("相对位置", comment: "")
}
}
var detail: String {
switch self {
case .absolute:
return "触摸位置直接对应远端屏幕位置,适合快速定位。"
return NSLocalizedString("触摸位置直接对应远端屏幕位置,适合快速定位。", comment: "")
case .relative:
return "像触控板一样滑动光标,点击时操作当前光标位置。"
return NSLocalizedString("像触控板一样滑动光标,点击时操作当前光标位置。", comment: "")
}
}
@@ -53,20 +53,20 @@ enum VideoAdaptationPolicy: String, CaseIterable, Identifiable {
var title: String {
switch self {
case .frameRatePriority: return "帧率优先"
case .qualityPriority: return "画质优先"
case .balanced: return "平衡"
case .frameRatePriority: return NSLocalizedString("帧率优先", comment: "")
case .qualityPriority: return NSLocalizedString("画质优先", comment: "")
case .balanced: return NSLocalizedString("平衡", comment: "")
}
}
var detail: String {
switch self {
case .frameRatePriority:
return "优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。"
return NSLocalizedString("优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。", comment: "")
case .qualityPriority:
return "始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。"
return NSLocalizedString("始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。", comment: "")
case .balanced:
return "兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。"
return NSLocalizedString("兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。", comment: "")
}
}
@@ -321,8 +321,8 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
private var privacyTimer: Timer?
@Published var remoteID = ""
@Published var password = ""
@Published private(set) var signalStatus = "等待隐私授权"
@Published private(set) var connectionStatus = "未连接"
@Published private(set) var signalStatus = NSLocalizedString("等待隐私授权", comment: "")
@Published private(set) var connectionStatus = NSLocalizedString("未连接", comment: "")
@Published private(set) var localIdentity = ""
@Published private(set) var identityStorageWarning: String?
@Published private(set) var isConnecting = false
@@ -337,7 +337,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
@Published private(set) var hasRemoteCursorState = false
private var networkStatistics = RemoteNetworkStatistics()
private var videoFrameID: UInt64 = 0
@Published private(set) var displays: [String] = ["显示器 1"]
@Published private(set) var displays: [String] = [NSLocalizedString("显示器 1", comment: "")]
@Published private(set) var displaySizes: [CGSize] = []
@Published var selectedDisplay = 0
@Published var audioEnabled = true
@@ -368,7 +368,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
private var remoteVersionCheckAttempted = false
private var remoteVersionCheckGeneration = UUID()
private var remoteVersionCheckTask: URLSessionDataTask?
private static let remoteUpdateNotice = "被控端版本过低,请升级到最新版本。"
private static let remoteUpdateNotice = NSLocalizedString("被控端版本过低,请升级到最新版本。", comment: "")
private var pendingRememberPassword = false
private var connectionRecorded = false
private var shouldCaptureThumbnail = false
@@ -380,7 +380,8 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
private var videoSettingsTimeoutTask: Task<Void, Never>?
private var pendingPresenceRemoteID: String?
private var presenceProbeGeneration: UInt64 = 0
private var signalConnected = false
@Published private(set) var signalConnected = false
@Published private(set) var signalHasError = false
private var presenceIsForeground = false
private var awaitingPresenceSnapshot = true
private var presenceUpdatedAt: [String: ContinuousClock.Instant] = [:]
@@ -425,7 +426,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
self.audioPlayer.setEnabled(playing && self.audioEnabled)
}
pictureInPicture.failed = { [weak self] in
self?.controlStatus = "画中画未能开启,请保持应用在前台后重试。"
self?.controlStatus = NSLocalizedString("画中画未能开启,请保持应用在前台后重试。", comment: "")
}
announcements.send = { [weak bridge] data, requestID in
bridge?.sendAnnouncementRequest(data, requestID: requestID)
@@ -498,7 +499,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
announcements.reset()
bridgeConfiguration = nil
localIdentity = ""
signalStatus = "等待隐私授权"
signalStatus = NSLocalizedString("等待隐私授权", comment: ""); signalHasError = false
savesConnectionThumbnails = false
clearConnectionThumbnails()
}
@@ -526,7 +527,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
self.thumbnailCleanupInProgress = false
self.thumbnailCleanupError = success
? nil
: "部分预览图未能清除,请重试。"
: NSLocalizedString("部分预览图未能清除,请重试。", comment: "")
}
}
@@ -542,14 +543,14 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
@discardableResult
func configureBridge() -> Bool {
guard hasNetworkConsent else {
signalStatus = "等待隐私授权"
signalStatus = NSLocalizedString("等待隐私授权", comment: ""); signalHasError = false
return false
}
let host = signalHost.trimmingCharacters(in: .whitespacesAndNewlines)
guard let signal = Int(signalPort),
(1...65535).contains(signal),
!host.isEmpty else {
signalStatus = "服务器配置无效"
signalStatus = NSLocalizedString("服务器配置无效", comment: ""); signalHasError = true
return false
}
let configuration = BridgeConfiguration(host: host, signalPort: signal)
@@ -558,12 +559,12 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
signalConnected = false
localIdentity = ""
announcements.reset()
signalStatus = "正在连接信令服务"
signalStatus = NSLocalizedString("正在连接信令服务", comment: ""); signalHasError = false
stopPresenceMonitoring()
invalidatePresence()
cancelPendingPresenceConnection()
} else if signalConnected {
signalStatus = "已连接服务器"
signalStatus = NSLocalizedString("已连接服务器", comment: ""); signalHasError = false
}
bridge.setVideoAdaptationPolicy(videoAdaptationPolicy.bridgeValue)
bridge.configure(withSignalHost: host,
@@ -585,7 +586,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
connectionFailureMessage = nil
let identifier = remoteID.trimmingCharacters(in: .whitespacesAndNewlines)
guard !identifier.isEmpty else {
connectionStatus = "请输入远程设备 ID"
connectionStatus = NSLocalizedString("请输入远程设备 ID", comment: "")
return
}
remoteID = identifier
@@ -616,7 +617,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
isConnected = false
sessionVisible = false
resetRemoteCursorState()
connectionStatus = "正在准备连接…"
connectionStatus = NSLocalizedString("正在准备连接…", comment: "")
bridge.connect(toRemoteID: identifier, password: password)
}
@@ -632,7 +633,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
isConnecting = true
isConnected = false
sessionVisible = false
connectionStatus = "正在确认设备状态…"
connectionStatus = NSLocalizedString("正在确认设备状态…", comment: "")
requestPresenceProbe(identifier)
DispatchQueue.main.asyncAfter(deadline: .now() + 5) { [weak self] in
@@ -656,7 +657,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
guard pendingPresenceRemoteID != nil else { return }
cancelPresenceProbe()
isConnecting = false
connectionStatus = "未连接"
connectionStatus = NSLocalizedString("未连接", comment: "")
}
private func requestPresenceProbe(_ identifier: String) {
@@ -671,7 +672,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
isConnecting = false
isConnected = false
sessionVisible = false
connectionStatus = "设备离线"
connectionStatus = NSLocalizedString("设备离线", comment: "")
deviceOfflineAlertVisible = true
}
@@ -720,10 +721,10 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
resetRemoteCursorState()
frameCount = 0
networkStatistics = RemoteNetworkStatistics()
displays = ["显示器 1"]
displays = [NSLocalizedString("显示器 1", comment: "")]
displaySizes = []
selectedDisplay = 0
connectionStatus = "未连接"
connectionStatus = NSLocalizedString("未连接", comment: "")
audioPlayer.endSession()
AppOrientation.endSession()
appUpdates.checkNow()
@@ -1006,9 +1007,9 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
var videoSettingsFeedback: String {
if !canChangeVideoSettings {
return "连接建立后可调整,需被控端支持。"
return NSLocalizedString("连接建立后可调整,需被控端支持。", comment: "")
}
if videoSettings.failed { return "调整失败,请重试。" }
if videoSettings.failed { return NSLocalizedString("调整失败,请重试。", comment: "") }
return ""
}
@@ -1077,20 +1078,20 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
func sendClipboard() {
guard hasNetworkConsent, isConnected else { return }
guard let text = UIPasteboard.general.string, !text.isEmpty else {
clipboardStatus = "剪贴板中没有文本"
clipboardStatus = NSLocalizedString("剪贴板中没有文本", comment: "")
return
}
guard text.lengthOfBytes(using: .utf8) <= 128 * 1024 else {
clipboardStatus = "剪贴板文本超过 128 KiB"
clipboardStatus = NSLocalizedString("剪贴板文本超过 128 KiB", comment: "")
return
}
bridge.sendClipboardText(text)
clipboardStatus = "已发送本机剪贴板"
clipboardStatus = NSLocalizedString("已发送本机剪贴板", comment: "")
}
func sendFile(_ url: URL) {
guard hasNetworkConsent, isConnected else { return }
transferStatus = "正在发送 \(url.lastPathComponent)"
transferStatus = String(format: NSLocalizedString("正在发送 %1$@", comment: ""), String(describing: url.lastPathComponent))
transferProgress = 0
bridge.sendFile(at: url)
}
@@ -1129,15 +1130,15 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
func sendSecureAttention() {
guard hasNetworkConsent, isConnected, remotePlatform == .windows else { return }
guard remoteServiceAvailable else {
controlStatus = "Ctrl+Alt+Del 需要远端启用 Windows 系统服务"
controlStatus = NSLocalizedString("Ctrl+Alt+Del 需要远端启用 Windows 系统服务", comment: "")
return
}
bridge.sendSecureAttentionSequence()
controlStatus = "正在发送 Ctrl+Alt+Del…"
controlStatus = NSLocalizedString("正在发送 Ctrl+Alt+Del…", comment: "")
}
func fileImportFailed() {
transferStatus = "无法读取所选文件,请重试"
transferStatus = NSLocalizedString("无法读取所选文件,请重试", comment: "")
transferProgress = 0
}
@@ -1146,14 +1147,14 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
func sendSystemTextEdit(deleting count: Int, inserting text: String) -> Bool {
guard hasNetworkConsent, isConnected else { return false }
guard (0...16 * 1024).contains(count), text.utf8.count <= 16 * 1024, !text.unicodeScalars.contains(where: { $0.value == 0 }) else {
keyboardInputStatus = "单次输入最多 16 KiB,且不能包含空字符"
keyboardInputStatus = NSLocalizedString("单次输入最多 16 KiB,且不能包含空字符", comment: "")
return false
}
let isASCII = text.unicodeScalars.allSatisfy({
(0x20...0x7e).contains($0.value) || [9, 10, 13].contains($0.value)
})
guard supportsTextInput || isASCII else {
keyboardInputStatus = "被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴"
keyboardInputStatus = NSLocalizedString("被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴", comment: "")
return false
}
for _ in 0..<count { sendKeyStroke(0x08) }
@@ -1180,7 +1181,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
func rtcBridge(_ bridge: CrossDeskRTCBridge, didChangeIdentityStorageError hasError: Bool) {
identityStorageWarning = hasError
? "本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。"
? NSLocalizedString("本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。", comment: "")
: nil
}
@@ -1191,15 +1192,15 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
announcements.setConnected(signalConnected)
invalidatePresence()
switch state.rawValue {
case 0: signalStatus = "正在连接信令服务"
case 1: signalStatus = "已连接服务器"
case 2: signalStatus = "信令连接失败"
case 3: signalStatus = "信令连接已关闭"
case 4: signalStatus = "信令服务重连中"
case 5: signalStatus = "信令服务器已关闭连接"
case 6: signalStatus = "TLS 证书校验失败"
case 7: signalStatus = "无法访问本机登录凭据,请解锁后重试"
default: signalStatus = "未知信令状态"
case 0: signalStatus = NSLocalizedString("正在连接信令服务", comment: ""); signalHasError = false
case 1: signalStatus = NSLocalizedString("已连接服务器", comment: ""); signalHasError = false
case 2: signalStatus = NSLocalizedString("信令连接失败", comment: ""); signalHasError = true
case 3: signalStatus = NSLocalizedString("信令连接已关闭", comment: ""); signalHasError = true
case 4: signalStatus = NSLocalizedString("信令服务重连中", comment: ""); signalHasError = false
case 5: signalStatus = NSLocalizedString("信令服务器已关闭连接", comment: ""); signalHasError = true
case 6: signalStatus = NSLocalizedString("TLS 证书校验失败", comment: ""); signalHasError = true
case 7: signalStatus = NSLocalizedString("无法访问本机登录凭据,请解锁后重试", comment: ""); signalHasError = true
default: signalStatus = NSLocalizedString("未知信令状态", comment: ""); signalHasError = true
}
if signalConnected {
startPresenceMonitoring()
@@ -1226,9 +1227,9 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
}
isConnecting = [0, 2].contains(state.rawValue)
switch state.rawValue {
case 0: connectionStatus = "正在建立远程连接"
case 0: connectionStatus = NSLocalizedString("正在建立远程连接", comment: "")
case 1:
connectionStatus = "已连接"
connectionStatus = NSLocalizedString("已连接", comment: "")
startPrivacyMonitoring()
sessionVisible = true
pictureInPicture.beginSession()
@@ -1238,27 +1239,27 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
audioPlayer.setEnabled(audioEnabled)
bridge.setAudioEnabled(audioEnabled)
AppOrientation.beginSession(autoLandscape: autoLandscape)
case 2: connectionStatus = "正在收集 ICE 候选"
case 3: finishConnection(withError: "网络连接已中断,请重新连接。")
case 2: connectionStatus = NSLocalizedString("正在收集 ICE 候选", comment: "")
case 3: finishConnection(withError: NSLocalizedString("网络连接已中断,请重新连接。", comment: ""))
case 4:
finishConnection(withError: "P2P/TURN 建链失败,请检查网络后重试。")
finishConnection(withError: NSLocalizedString("P2P/TURN 建链失败,请检查网络后重试。", comment: ""))
case 5:
finishConnection(withError: "远程连接已结束。")
finishConnection(withError: NSLocalizedString("远程连接已结束。", comment: ""))
case 6:
finishConnection(withError: "访问密码错误,请重新输入。")
finishConnection(withError: NSLocalizedString("访问密码错误,请重新输入。", comment: ""))
case 7:
if !remoteID.isEmpty {
recentConnectionPresence[remoteID] = false
presenceUpdatedAt.removeValue(forKey: remoteID)
}
finishConnection(withError: "远程设备 ID 不存在,请检查设备 ID。")
finishConnection(withError: NSLocalizedString("远程设备 ID 不存在,请检查设备 ID。", comment: ""))
case 8:
if !remoteID.isEmpty {
recentConnectionPresence[remoteID] = false
presenceUpdatedAt.removeValue(forKey: remoteID)
}
finishConnection(withError: "远程设备当前不可用,请稍后重试。")
default: connectionStatus = "未知连接状态"
finishConnection(withError: NSLocalizedString("远程设备当前不可用,请稍后重试。", comment: ""))
default: connectionStatus = NSLocalizedString("未知连接状态", comment: "")
}
}
@@ -1383,7 +1384,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
updateActiveConnectionHostInfo(hostName)
let names = remoteDisplayNames.enumerated().map { index, displayName in
let name = displayName.trimmingCharacters(in: .whitespacesAndNewlines)
return name.isEmpty ? "显示器 \(index + 1)" : name
return name.isEmpty ? String(format: NSLocalizedString("显示器 %1$@", comment: ""), String(describing: index + 1)) : name
}
if !names.isEmpty {
displays = names
@@ -1437,7 +1438,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
func rtcBridge(_ bridge: CrossDeskRTCBridge, didReceiveClipboardText text: String) {
guard hasNetworkConsent, isConnected else { return }
UIPasteboard.general.string = text
clipboardStatus = "已接收远端剪贴板"
clipboardStatus = NSLocalizedString("已接收远端剪贴板", comment: "")
}
func rtcBridge(_ bridge: CrossDeskRTCBridge, didReceiveServiceAvailable available: Bool,
@@ -1449,7 +1450,7 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
func rtcBridge(_ bridge: CrossDeskRTCBridge, didSendSecureAttention success: Bool) {
guard hasNetworkConsent, isConnected else { return }
controlStatus = success ? "已发送 Ctrl+Alt+Del" : "指令发送失败,请重试"
controlStatus = success ? NSLocalizedString("已发送 Ctrl+Alt+Del", comment: "") : NSLocalizedString("指令发送失败,请重试", comment: "")
}
func rtcBridge(_ bridge: CrossDeskRTCBridge,
@@ -1458,19 +1459,19 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
sending: Bool) {
guard hasNetworkConsent, isConnected else { return }
if progress < 0 {
transferStatus = "\(fileName) 传输失败"
transferStatus = String(format: NSLocalizedString("%1$@ 传输失败", comment: ""), String(describing: fileName))
transferProgress = 0
return
}
transferProgress = progress
let percent = Int((progress * 100).rounded())
transferStatus = "\(sending ? "发送" : "接收") \(fileName) · \(percent)%"
transferStatus = "\(NSLocalizedString(sending ? "发送" : "接收", comment: "")) \(fileName) · \(percent)%"
}
func rtcBridge(_ bridge: CrossDeskRTCBridge, didReceiveFileAt fileURL: URL) {
guard hasNetworkConsent, isConnected else { return }
receivedFileURL = fileURL
transferStatus = "已接收 \(fileURL.lastPathComponent)"
transferStatus = String(format: NSLocalizedString("已接收 %1$@", comment: ""), String(describing: fileURL.lastPathComponent))
transferProgress = 1
}
@@ -1518,8 +1519,8 @@ final class RemoteSessionModel: NSObject, ObservableObject, CrossDeskRTCBridgeDe
var videoStatus: String {
if frameCount > 0 {
return "视频 \(Int(frameSize.width))×\(Int(frameSize.height)) · \(frameCount) 帧"
return String(format: NSLocalizedString("视频 %1$@×%2$@ · %3$@ 帧", comment: ""), String(describing: Int(frameSize.width)), String(describing: Int(frameSize.height)), String(describing: frameCount))
}
return isConnected ? "正在取回远程画面…" : "等待连接"
return isConnected ? NSLocalizedString("正在取回远程画面…", comment: "") : NSLocalizedString("等待连接", comment: "")
}
}
@@ -189,11 +189,11 @@ struct RemoteSessionView: View {
.zIndex(50)
}
}
.alert("升级提示", isPresented: Binding(
.alert(NSLocalizedString("升级提示", comment: ""), isPresented: Binding(
get: { !session.privacyScreen.unlockNotice && session.remoteUpdateMessage != nil },
set: { if !$0 && !session.privacyScreen.unlockNotice { session.dismissRemoteUpdate() } }
)) {
Button("知道了", role: .cancel) { session.dismissRemoteUpdate() }
Button(NSLocalizedString("知道了", comment: ""), role: .cancel) { session.dismissRemoteUpdate() }
} message: {
Text(session.remoteUpdateMessage ?? "")
}
@@ -282,18 +282,18 @@ struct RemoteSessionView: View {
Color.black.opacity(0.28).ignoresSafeArea().contentShape(Rectangle()).onTapGesture { }
VStack(spacing: 0) {
VStack(spacing: 12) {
Text("隐私屏已被解锁").font(.headline)
Text("被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。")
Text(NSLocalizedString("隐私屏已被解锁", comment: "")).font(.headline)
Text(NSLocalizedString("被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。", comment: ""))
.font(.subheadline).foregroundStyle(.secondary)
let feedback = session.privacyScreen.feedback(at: session.privacyClock)
if !feedback.isEmpty { Text(feedback).font(.caption).foregroundStyle(.secondary) }
}.padding(24)
Divider()
HStack(spacing: 0) {
Button("确认") { session.privacyScreen.unlockNotice = false }
Button(NSLocalizedString("确认", comment: "")) { session.privacyScreen.unlockNotice = false }
.frame(maxWidth: .infinity, minHeight: 48)
Divider().frame(height: 48)
Button("锁定") { session.lockPrivacyScreen() }
Button(NSLocalizedString("锁定", comment: "")) { session.lockPrivacyScreen() }
.fontWeight(.semibold).frame(maxWidth: .infinity, minHeight: 48)
.disabled(!session.privacyScreen.canLock(at: session.privacyClock))
}
@@ -320,11 +320,11 @@ struct RemoteSessionView: View {
VStack(spacing: 0) {
VStack(spacing: 4) {
Text("断开远程连接?")
Text(NSLocalizedString("断开远程连接?", comment: ""))
.font(.headline)
.foregroundStyle(Color.black.opacity(0.9))
Text("断开后将返回首页")
Text(NSLocalizedString("断开后将返回首页", comment: ""))
.font(.subheadline)
.foregroundStyle(Color.black.opacity(0.55))
}
@@ -337,7 +337,7 @@ struct RemoteSessionView: View {
disconnectConfirmationVisible = false
session.disconnect()
} label: {
Text("断开连接")
Text(NSLocalizedString("断开连接", comment: ""))
.font(.body.weight(.semibold))
.foregroundStyle(Color.red)
.frame(maxWidth: .infinity)
@@ -351,7 +351,7 @@ struct RemoteSessionView: View {
disconnectConfirmationVisible = false
}
} label: {
Text("取消")
Text(NSLocalizedString("取消", comment: ""))
.font(.body.weight(.semibold))
.foregroundStyle(Color.blue)
.frame(maxWidth: .infinity)
@@ -765,8 +765,8 @@ private struct RemoteComputerKey {
if let title { return title.replacingOccurrences(of: "\n", with: " ") }
switch symbol {
case "shift": return "Shift"
case "delete.left": return "退格"
default: return "键盘操作"
case "delete.left": return NSLocalizedString("退格", comment: "")
default: return NSLocalizedString("键盘操作", comment: "")
}
}
@@ -842,27 +842,27 @@ private struct RemoteComputerKeyboard: View {
.init("Ctrl", 0x11, isModifier: true),
.init("Win", 0x5B, isModifier: true),
.init("Alt", 0x12, isModifier: true),
.init("空格", 0x20, width: 2.6),
.init("回车", 0x0D, width: 1.4, style: .special)
.init(NSLocalizedString("空格", comment: ""), 0x20, width: 2.6),
.init(NSLocalizedString("回车", comment: ""), 0x0D, width: 1.4, style: .special)
]
var body: some View {
VStack(spacing: 0) {
HStack(spacing: 4) {
Button("系统键盘") {
Button(NSLocalizedString("系统键盘", comment: "")) {
feedback.keyPressed()
releaseModifiers()
switchKeyboard()
}
.font(.system(size: 15, weight: .medium))
.frame(width: 80, height: 44)
.accessibilityLabel("切换到系统键盘")
.accessibilityLabel(NSLocalizedString("切换到系统键盘", comment: ""))
if verticalSizeClass == .compact {
pageTabs
} else {
Spacer(minLength: 0)
}
RemoteKeyboardDismissButton(accessibilityLabel: "收起电脑键盘") {
RemoteKeyboardDismissButton(accessibilityLabel: NSLocalizedString("收起电脑键盘", comment: "")) {
feedback.keyPressed()
releaseModifiers()
dismiss()
@@ -943,14 +943,14 @@ private struct RemoteComputerKeyboard: View {
feedback.keyPressed()
page = item
} label: {
Text(item.rawValue)
Text(NSLocalizedString(item.rawValue, comment: ""))
.font(.system(size: 14, weight: page == item ? .semibold : .regular))
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(page == item ? RemoteKeyboardPalette.specialKey : .clear,
in: RoundedRectangle(cornerRadius: 6))
.contentShape(Rectangle())
}
.accessibilityLabel("\(item.rawValue)键盘页")
.accessibilityLabel(String(format: NSLocalizedString("%1$@键盘页", comment: ""), NSLocalizedString(item.rawValue, comment: "")))
.accessibilityAddTraits(page == item ? .isSelected : [])
}
}
@@ -1066,7 +1066,7 @@ private struct CrossDeskStatusOrb: View {
lineWidth: isExpanded ? 2 : 1)
}
.compositingGroup()
.accessibilityLabel(isExpanded ? "收起远程控制菜单" : "展开远程控制菜单")
.accessibilityLabel(isExpanded ? NSLocalizedString("收起远程控制菜单", comment: "") : NSLocalizedString("展开远程控制菜单", comment: ""))
}
}
@@ -1194,8 +1194,8 @@ private struct FloatingSessionMenu: View {
.frame(width: 28, height: 32)
}
.buttonStyle(.plain)
.accessibilityLabel("返回控制栏")
Text(page == .videoSettings ? "画面设置" : "网络状态")
.accessibilityLabel(NSLocalizedString("返回控制栏", comment: ""))
Text(page == .videoSettings ? NSLocalizedString("画面设置", comment: "") : NSLocalizedString("网络状态", comment: ""))
.font(.subheadline.weight(.semibold))
} else {
Circle()
@@ -1212,7 +1212,7 @@ private struct FloatingSessionMenu: View {
.foregroundStyle(.secondary)
}
.buttonStyle(.plain)
.accessibilityLabel("关闭控制栏")
.accessibilityLabel(NSLocalizedString("关闭控制栏", comment: ""))
}
if page == .videoSettings, !session.videoSettingsFeedback.isEmpty {
@@ -1232,12 +1232,12 @@ private struct FloatingSessionMenu: View {
} else {
VStack(spacing: 9) {
LazyVGrid(columns: columns, spacing: 7) {
FloatingControlButton(title: "键盘", symbol: "keyboard",
FloatingControlButton(title: NSLocalizedString("键盘", comment: ""), symbol: "keyboard",
action: showKeyboard)
FloatingControlButton(title: virtualMouseVisible ? "收起鼠标" : "虚拟鼠标",
FloatingControlButton(title: virtualMouseVisible ? NSLocalizedString("收起鼠标", comment: "") : NSLocalizedString("虚拟鼠标", comment: ""),
symbol: "computermouse", action: toggleMouse)
FloatingControlButton(
title: session.mouseControlMode == .relative ? "相对鼠标" : "绝对鼠标",
title: session.mouseControlMode == .relative ? NSLocalizedString("相对鼠标", comment: "") : NSLocalizedString("绝对鼠标", comment: ""),
symbol: "computermouse",
action: {
session.mouseControlMode = session.mouseControlMode == .relative
@@ -1259,22 +1259,22 @@ private struct FloatingSessionMenu: View {
}
}
} label: {
FloatingControlLabel(title: "显示器", symbol: "display")
FloatingControlLabel(title: NSLocalizedString("显示器", comment: ""), symbol: "display")
}
.buttonStyle(.plain)
FloatingControlButton(title: "画面设置", symbol: "slider.horizontal.3") {
FloatingControlButton(title: NSLocalizedString("画面设置", comment: ""), symbol: "slider.horizontal.3") {
page = .videoSettings
}
FloatingControlButton(
title: session.audioEnabled ? "声音" : "静音",
title: session.audioEnabled ? NSLocalizedString("声音", comment: "") : NSLocalizedString("静音", comment: ""),
symbol: session.audioEnabled ? "speaker.wave.2" : "speaker.slash",
action: session.toggleAudio
)
FloatingControlButton(title: "发送文件",
FloatingControlButton(title: NSLocalizedString("发送文件", comment: ""),
symbol: "folder.badge.plus",
action: chooseFile)
FloatingControlButton(title: "网络状态", symbol: "chart.bar.xaxis") {
FloatingControlButton(title: NSLocalizedString("网络状态", comment: ""), symbol: "chart.bar.xaxis") {
page = .networkStats
}
if session.remotePlatform == .windows {
@@ -1282,7 +1282,7 @@ private struct FloatingSessionMenu: View {
symbol: "lock.trianglebadge.exclamationmark",
action: session.sendSecureAttention)
}
FloatingControlButton(title: "剪贴板", symbol: "doc.on.clipboard",
FloatingControlButton(title: NSLocalizedString("剪贴板", comment: ""), symbol: "doc.on.clipboard",
action: session.sendClipboard)
if session.privacyScreen.desktopAvailable {
FloatingControlButton(
@@ -1293,9 +1293,9 @@ private struct FloatingSessionMenu: View {
)
.disabled(!session.isConnected || !session.privacyScreen.canToggle(at: session.privacyClock))
.opacity(session.isConnected && session.privacyScreen.canToggle(at: session.privacyClock) ? 1 : 0.45)
.accessibilityLabel("隐私屏")
.accessibilityLabel(NSLocalizedString("隐私屏", comment: ""))
.accessibilityValue(session.privacyScreen.status(at: session.privacyClock))
.accessibilityHint(session.privacyScreen.active ? "关闭隐私屏" : "开启隐私屏")
.accessibilityHint(session.privacyScreen.active ? NSLocalizedString("关闭隐私屏", comment: "") : NSLocalizedString("开启隐私屏", comment: ""))
}
}
@@ -1335,7 +1335,7 @@ private struct FloatingSessionMenu: View {
private var disconnectButton: some View {
Button(role: .destructive, action: disconnect) {
Text("断开连接")
Text(NSLocalizedString("断开连接", comment: ""))
.font(.subheadline.weight(.semibold))
.frame(maxWidth: .infinity)
.frame(height: 34)
@@ -1393,12 +1393,12 @@ private struct FloatingNetworkStatistics: View {
var body: some View {
VStack(spacing: 10) {
VStack(spacing: 0) {
trafficRow("", inbound: "接收", outbound: "发送", loss: "丢包率")
trafficRow("", inbound: NSLocalizedString("接收", comment: ""), outbound: NSLocalizedString("发送", comment: ""), loss: NSLocalizedString("丢包率", comment: ""))
.foregroundStyle(.secondary)
trafficRow("视频", statistics: snapshot.report?.video)
trafficRow("音频", statistics: snapshot.report?.audio)
trafficRow("数据", statistics: snapshot.report?.data)
trafficRow("合计", statistics: snapshot.report?.total)
trafficRow(NSLocalizedString("视频", comment: ""), statistics: snapshot.report?.video)
trafficRow(NSLocalizedString("音频", comment: ""), statistics: snapshot.report?.audio)
trafficRow(NSLocalizedString("数据", comment: ""), statistics: snapshot.report?.data)
trafficRow(NSLocalizedString("合计", comment: ""), statistics: snapshot.report?.total)
.fontWeight(.semibold)
.background(Color.blue.opacity(0.07), in: RoundedRectangle(cornerRadius: 5))
}
@@ -1407,17 +1407,17 @@ private struct FloatingNetworkStatistics: View {
Divider()
VStack(spacing: 7) {
detail("帧率", value: "\(snapshot.framesPerSecond) FPS")
detail("分辨率", value: resolution)
detail("画面延时", value: RemoteNetworkSnapshot.latency(snapshot.videoLatencyMilliseconds))
detail("连接延时(RTT)", value: RemoteNetworkSnapshot.latency(snapshot.rttMilliseconds))
detail("连接方式", value: snapshot.connectionMode)
detail(NSLocalizedString("帧率", comment: ""), value: "\(snapshot.framesPerSecond) FPS")
detail(NSLocalizedString("分辨率", comment: ""), value: resolution)
detail(NSLocalizedString("画面延时", comment: ""), value: RemoteNetworkSnapshot.latency(snapshot.videoLatencyMilliseconds))
detail(NSLocalizedString("连接延时(RTT)", comment: ""), value: RemoteNetworkSnapshot.latency(snapshot.rttMilliseconds))
detail(NSLocalizedString("连接方式", comment: ""), value: snapshot.connectionMode)
HStack {
Text("媒体加密")
Text(NSLocalizedString("媒体加密", comment: ""))
.foregroundStyle(.secondary)
Spacer(minLength: 8)
if let report = snapshot.report {
Label(report.srtpActive ? "SRTP 已启用" : "未启用",
Label(report.srtpActive ? NSLocalizedString("SRTP 已启用", comment: "") : NSLocalizedString("未启用", comment: ""),
systemImage: report.srtpActive ? "lock.shield" : "lock.open")
.foregroundStyle(report.srtpActive ? Color.green : Color.secondary)
} else {
@@ -1425,8 +1425,8 @@ private struct FloatingNetworkStatistics: View {
}
}
.accessibilityElement(children: .combine)
codec("被控端编码器", value: snapshot.remoteVideoEncoder)
codec("控制端解码器", value: snapshot.localVideoDecoder)
codec(NSLocalizedString("被控端编码器", comment: ""), value: snapshot.remoteVideoEncoder)
codec(NSLocalizedString("控制端解码器", comment: ""), value: snapshot.localVideoDecoder)
}
.font(.caption.monospacedDigit())
}
@@ -1460,13 +1460,13 @@ private struct FloatingNetworkStatistics: View {
inbound: RemoteNetworkSnapshot.bitrate(statistics?.inboundBitrate),
outbound: RemoteNetworkSnapshot.bitrate(statistics?.outboundBitrate),
loss: RemoteNetworkSnapshot.lossRate(statistics?.lossRate))
.accessibilityLabel("\(title),接收 \(RemoteNetworkSnapshot.bitrate(statistics?.inboundBitrate)),发送 \(RemoteNetworkSnapshot.bitrate(statistics?.outboundBitrate)),丢包率 \(RemoteNetworkSnapshot.lossRate(statistics?.lossRate))")
.accessibilityLabel(String(format: NSLocalizedString("%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@", comment: ""), String(describing: title), String(describing: RemoteNetworkSnapshot.bitrate(statistics?.inboundBitrate)), String(describing: RemoteNetworkSnapshot.bitrate(statistics?.outboundBitrate)), String(describing: RemoteNetworkSnapshot.lossRate(statistics?.lossRate))))
}
private func trafficRow(_ title: String, inbound: String,
outbound: String, loss: String) -> some View {
HStack(spacing: 4) {
Text(title).frame(width: 28, alignment: .leading)
Text(title).frame(width: 48, alignment: .leading)
Text(inbound).frame(maxWidth: .infinity, alignment: .trailing)
Text(outbound).frame(maxWidth: .infinity, alignment: .trailing)
Text(loss).frame(width: 46, alignment: .trailing)
@@ -1484,17 +1484,17 @@ private struct FloatingVideoSettings: View {
var body: some View {
VStack(alignment: .leading, spacing: 12) {
settingRow("画面质量", options: ["低", "中", "高"],
settingRow(NSLocalizedString("画面质量", comment: ""), options: [NSLocalizedString("低", comment: ""), NSLocalizedString("中", comment: ""), NSLocalizedString("高", comment: "")],
values: [0, 1, 2], selection: Binding(
get: { session.videoSettings.selection.quality },
set: { session.updateVideoSettings(quality: $0) }
))
settingRow("画面采集帧率", options: ["30 fps", "60 fps"],
settingRow(NSLocalizedString("画面采集帧率", comment: ""), options: ["30 fps", "60 fps"],
values: [30, 60], selection: Binding(
get: { session.videoSettings.selection.frameRate },
set: { session.updateVideoSettings(frameRate: $0) }
))
settingRow("画面偏好", options: VideoAdaptationPolicy.allCases.map(\.title),
settingRow(NSLocalizedString("画面偏好", comment: ""), options: VideoAdaptationPolicy.allCases.map(\.title),
values: VideoAdaptationPolicy.allCases.map { $0.bridgeValue.rawValue },
selection: Binding(
get: { session.videoSettings.selection.preference },
@@ -1546,7 +1546,8 @@ private struct FloatingControlLabel: View {
.font(.system(size: 16, weight: .semibold))
Text(title)
.font(.system(size: 9.5, weight: .medium))
.lineLimit(1)
.lineLimit(2)
.multilineTextAlignment(.center)
.minimumScaleFactor(0.72)
}
.foregroundStyle(.primary)
@@ -0,0 +1 @@
"NSLocalNetworkUsageDescription" = "CrossDesk nutzt das lokale Netzwerk, um native P2P-Fernsteuerungsverbindungen zu erkennen und aufzubauen.";
@@ -0,0 +1,283 @@
// Generated by localization/generate.py.
"%1$@ 传输失败" = "%1$@-Übertragung fehlgeschlagen";
"%1$@ 台设备" = "Geräte: %1$@";
"%1$@ 条未读" = "%1$@ ungelesene Elemente";
"%1$@键盘页" = "%1$@ Tastaturseite";
"%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@" = "%1$@, Empfangen von %2$@, Senden von %3$@, Paketverlustrate %4$@";
"CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。" = "CrossDesk nutzt das lokale Netzwerk, um native P2P-Fernsteuerungsverbindungen zu erkennen und aufzubauen.";
"Ctrl+Alt+Del 需要远端启用 Windows 系统服务" = "Ctrl+Alt+Del erfordert eine Remote-Aktivierung der Windows-Systemdienste";
"GNU GPL 第 3 版" = "GNU GPL Version 3";
"OpenFEC 告知" = "OpenFEC-Hinweis";
"OpenFEC 许可与源码" = "OpenFEC Lizenz und Quelle";
"P2P 直连" = "P2P-Direktverbindung";
"P2P/TURN 建链失败,请检查网络后重试。" = "P2P/TURN Verbindungsaufbau fehlgeschlagen, bitte überprüfen Sie das Netzwerk und versuchen Sie es erneut.";
"SRTP 已启用" = "SRTP enabled";
"TLS 证书校验失败" = "Die Überprüfung des TLS-Zertifikats ist fehlgeschlagen";
"TURN 中继" = "TURN-Relais";
"上下滑动,可滑出按键范围" = "Nach oben und unten schieben, um aus dem Tastenbereich herauszurutschen";
"丢包率" = "Verlustrate";
"中" = "Mittel";
"优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。" = "Priorisiert die Aufrechterhaltung eines flüssigen Bildes und reduziert die Auflösung stärker, wenn die Bandbreite oder der Codierungsdruck hoch ist.";
"低" = "Niedrig";
"使用自定义服务器" = "Verwendung eines benutzerdefinierten Servers";
"保存密码" = "Passwort speichern";
"保存远程画面预览" = "Remote-Bildschirmvorschauen speichern";
"保存远程画面预览?" = "Remote-Bildschirmvorschau speichern?";
"信令服务器已关闭连接" = "Der Signalisierungsserver hat die Verbindung geschlossen";
"信令服务重连中" = "Signalisierungsdienst stellt erneut Verbindung her";
"信令连接失败" = "Signalverbindung fehlgeschlagen";
"信令连接已关闭" = "Signalverbindung geschlossen";
"偏好模式" = "Präferenzmodus";
"像触控板一样滑动光标,点击时操作当前光标位置。" = "Bewegen Sie den Cursor wie ein Trackpad und bedienen Sie die aktuelle Cursorposition, wenn Sie darauf klicken.";
"公告加载失败,请重试。" = "Das Laden der Ankündigung ist fehlgeschlagen. Bitte versuchen Sie es erneut.";
"公告详情" = "Einzelheiten zur Ankündigung";
"共 %1$@ 条 · %2$@ 条未读" = "Insgesamt %1$@ Artikel ·%2$@ ungelesene Artikel";
"关于" = "Ungefähr";
"关于 CrossDesk" = "Über CrossDesk";
"关于,有新版本" = "Ungefähr, es gibt eine neue Version";
"关闭" = "Schließen";
"关闭控制栏" = "Bedienbügel schließen";
"关闭隐私屏" = "Privatsphäre-Bildschirm deaktivieren";
"兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。" = "Gleicht Klarheit und Glätte aus und verringert die Auflösung bei konstantem Druck nur allmählich.";
"分辨率" = "Auflösung";
"切换到电脑键盘" = "Zur Computertastatur wechseln";
"切换到系统键盘" = "Zur Systemtastatur wechseln";
"删除" = "Löschen";
"删除公告" = "Ansage löschen";
"删除记录" = "Datensatz löschen";
"删除这条公告?" = "Diese Ankündigung löschen?";
"刷新公告" = "Ankündigung aktualisieren";
"剪贴板" = "Zwischenablage";
"剪贴板中没有文本" = "Kein Text in der Zwischenablage";
"剪贴板文本超过 128 KiB" = "Der Text in der Zwischenablage ist größer als 128 KiB";
"加载中…" = "Laden…";
"加载更多" = "Mehr laden";
"升级提示" = "Update empfohlen";
"单次输入最多 16 KiB,且不能包含空字符" = "Eine einzelne Eingabe kann bis zu 16 KiB groß sein und darf keine Nullzeichen enthalten";
"发送" = "Senden";
"发送文件" = "Datei senden";
"取消" = "Abbrechen";
"取消连接" = "Verbindung abbrechen";
"各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。" = "Jede Komponente unterliegt der aufgeführten Open-Source-Lizenz und die gewährten Rechte unterliegen nicht den allgemeinen Nutzungsbedingungen dieser Anwendung. Für die Anzeige des Quellcodes ist eine Internetverbindung erforderlich.";
"合计" = "Insgesamt";
"同意并继续" = "Zustimmen und fortfahren";
"回车" = "Treten Sie ein";
"在线" = "Online";
"地址" = "Adresse";
"填写服务器地址" = "Geben Sie die Serveradresse ein";
"填写端口" = "Füllen Sie den Port aus";
"声音" = "Ton";
"失败" = "Fehlgeschlagen";
"始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。" = "Behalten Sie immer eine höhere Auflösung bei und reduzieren Sie die Bildrate, um die Bildschärfe zu gewährleisten, wenn die Bandbreite nicht ausreicht.";
"媒体加密" = "Medienverschlüsselung";
"字母数字" = "Buchstaben & Zahlen";
"完成" = "Fertig";
"完成隐私授权后可检查更新" = "Sie können nach Abschluss der Datenschutzautorisierung nach Updates suchen";
"完成隐私授权后登记本机身份" = "Registrieren Sie die lokale Identität, nachdem Sie die Datenschutzautorisierung abgeschlossen haben";
"密码将安全保存在本机 Keychain 中" = "Passwörter werden sicher im lokalen Schlüsselbund gespeichert";
"对端 ID" = "Remote-ID";
"对端 ID %1$@" = "Peer-ID %1$@";
"将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。" = "Stoppt die Remote-Verbindung, schließt die Bildschirmvorschau, speichert sie und löscht die vorhandene Vorschau. Verbindungsdatensätze und empfangene Dateien bleiben erhalten und vorhandene Serverdaten werden nicht gelöscht. Sie können sich jederzeit erneut autorisieren.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。" = "Alle auf diesem Computer gespeicherten Remote-Vorschauen werden gelöscht, während Verbindungsdatensätze, Passwörter und empfangene Dateien erhalten bleiben.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。" = "Alle auf diesem Computer gespeicherten Remote-Vorschauen werden gelöscht, während Verbindungsdatensätze, Passwörter und empfangene Dateien erhalten bleiben. Bei späteren Verbindungen werden weiterhin neue Vorschauen gespeichert.";
"屏幕方向" = "Bildschirmausrichtung";
"展开远程控制菜单" = "Fernbedienungsmenü erweitern";
"已保存密码" = "Passwort gespeichert";
"已勾选" = "Geprüft";
"已发送 Ctrl+Alt+Del" = "Ctrl+Alt+Del gesendet";
"已发送本机剪贴板" = "Lokale Zwischenablage gesendet";
"已授权" = "Zugegeben";
"已接收 %1$@" = "%1$@ erhalten";
"已接收远端剪贴板" = "Remote-Zwischenablage empfangen";
"已读" = "Lesen";
"已连接" = "Verbunden";
"已连接服务器" = "Mit Server verbunden";
"帧率" = "Bildrate";
"帧率优先" = "Flüssig";
"平衡" = "Balance";
"应用中的许可文件缺失或损坏,请重新安装应用。" = "Die Lizenzdatei in der Anwendung fehlt oder ist beschädigt. Bitte installieren Sie die Anwendung neu.";
"开发版本包含尚未发布的修改,以下链接为基础版本源码。" = "Die Entwicklungsversion enthält Änderungen, die noch nicht veröffentlicht wurden. Der folgende Link ist der Quellcode der Basisversion.";
"开启保存" = "Speichern aktivieren";
"开启隐私屏" = "Privatsphärenschutz aktivieren";
"开源组件" = "Open-Source-Komponenten";
"开源软件权利说明" = "Beschreibung der Open-Source-Softwarerechte";
"当前已是最新版本" = "Dies ist derzeit die neueste Version";
"成功连接后,这里会显示远端桌面的缩略图。" = "Nach erfolgreicher Verbindung wird hier eine Miniaturansicht des Remote-Desktops angezeigt.";
"我已阅读并同意《隐私政策》" = "Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden";
"我已阅读并同意隐私政策" = "Ich habe die Datenschutzbestimmungen gelesen und stimme ihnen zu";
"打开隐私政策" = "Datenschutzerklärung öffnen";
"指令发送失败,请重试" = "Das Senden des Befehls ist fehlgeschlagen. Bitte versuchen Sie es erneut";
"指令已发送,等待电脑确认…" = "Der Befehl wurde gesendet und wartet auf die Bestätigung des Computers ...";
"按住并拖动,可滑出按键范围,松开结束拖拽" = "Drücken und ziehen Sie, um aus dem Tastenbereich zu gleiten, und lassen Sie los, um das Ziehen zu beenden";
"授权后可使用远程连接。" = "Remote-Verbindungen sind nach Autorisierung verfügbar.";
"授权状态" = "Autorisierungsstatus";
"接收" = "Empfangen";
"控制模式" = "Steuermodus";
"控制端解码器" = "Lokaler Decoder";
"撤回授权" = "Autorisierung entziehen";
"撤回隐私授权" = "Datenschutzberechtigung entziehen";
"收起电脑键盘" = "PC-Tastatur ausblenden";
"收起系统键盘" = "Systemtastatur einklappen";
"收起远程控制菜单" = "Fernbedienungsmenü einklappen";
"收起鼠标" = "Maus ausblenden";
"数据" = "Daten";
"断开后将返回首页" = "Kehrt nach dem Trennen der Verbindung zur Startseite zurück";
"断开远程连接?" = "Remote-Verbindung trennen?";
"断开连接" = "Trennen";
"新版本" = "Neue Version";
"新版本可用:v%1$@" = "Neue Version verfügbar: v%1$@";
"无效" = "Ungültig";
"无未读公告" = "Keine ungelesenen Ankündigungen";
"无法" = "Unfähig";
"无法保存本地阅读状态,请重试。" = "Lesestatus kann nicht lokal gespeichert werden. Bitte versuchen Sie es erneut.";
"无法删除这条公告,请重试。" = "Diese Ankündigung kann nicht gelöscht werden. Bitte versuchen Sie es erneut.";
"无法访问本机登录凭据,请解锁后重试" = "Der Zugriff auf die lokalen Anmeldedaten ist nicht möglich. Bitte entsperren Sie die Sperre und versuchen Sie es erneut";
"无法读取开源许可" = "Open-Source-Lizenz kann nicht gelesen werden";
"无法读取所选文件,请重试" = "Die ausgewählte Datei konnte nicht gelesen werden. Bitte versuchen Sie es erneut";
"是否撤回隐私授权?" = "Datenschutzberechtigung entziehen?";
"显示器" = "Bildschirm";
"显示器 %1$@" = "Monitor %1$@";
"显示器 1" = "Monitor 1";
"显示密码" = "Passwort anzeigen";
"暂不同意" = "Jetzt nicht";
"暂无公告" = "Keine Ankündigungen";
"最近连接" = "Letzte Verbindungen";
"服务器" = "Server";
"服务器地址" = "Serveradresse";
"服务器端口" = "Server-Port";
"服务器配置无效" = "Ungültige Serverkonfiguration";
"未勾选" = "Nicht überprüft";
"未启用" = "Nicht aktiviert";
"未授权" = "Nicht autorisiert";
"未知" = "Unbekannt";
"未知信令状态" = "Unbekannter Signalisierungsstatus";
"未知连接状态" = "Unbekannter Verbindungsstatus";
"未读" = "Ungelesen";
"未连接" = "Nicht verbunden";
"本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。" = "Diese Anwendung verwendet OpenFEC zur Vorwärtsfehlerkorrektur unterCeCILL-C1.0, was eingeschränkte Garantien und Haftungsbeschränkungen bietet. Einzelheiten finden Sie in der vollständigen Lizenz.";
"本机 ID %1$@" = "Lokale ID %1$@";
"本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。" = "Die Anmeldeinformationen für diesen Computer sind vorübergehend unsicher. Bitte entsperren Sie Ihr Gerät und klicken Sie in den Einstellungen auf „Übernehmen“, um es erneut zu versuchen.";
"本版本源码与构建说明" = "Quellcode und Build-Anweisungen für diese Version";
"本版本源码信息暂不可用。" = "Die Quellrevision ist für diesen Build nicht verfügbar.";
"构建说明" = "Bauanleitung";
"构建配方与项目补丁" = "Erstellen Sie Rezepte und Projekt-Patches";
"查看源码" = "Quellcode anzeigen";
"检查失败,请稍后重试" = "Prüfung fehlgeschlagen. Bitte versuchen Sie es später noch einmal.";
"检查更新" = "Suchen Sie nach Updates";
"正在关闭隐私屏…" = "Sichtschutz wird geschlossen…";
"正在准备连接…" = "Verbindung wird vorbereitet...";
"正在发送 %1$@" = "Senden von %1$@";
"正在发送 Ctrl+Alt+Del…" = "Senden von Ctrl+Alt+Del…";
"正在取回远程画面…" = "Remote-Bildschirm abrufen...";
"正在建立远程连接" = "Remote-Verbindung aufbauen";
"正在开启隐私屏…" = "Privatsphärenschutz einschalten...";
"正在收集 ICE 候选" = "Sammeln von ICE-Kandidaten";
"正在检查更新…" = "Suche nach Updates…";
"正在清除…" = "Löschen...";
"正在确认设备状态…" = "Gerätestatus bestätigen...";
"正在获取本机 ID…" = "Lokale ID erhalten...";
"正在连接" = "Verbinden";
"正在连接信令服务" = "Verbindung zum Signalisierungsdienst herstellen";
"清除" = "Klar";
"清除预览图" = "Vorschaubilder löschen";
"清除预览图?" = "Vorschaubilder löschen?";
"源码与构建说明" = "Quellcode und Build-Anweisungen";
"源码版本" = "Quellcode-Version";
"版本" = "Version";
"版权与许可声明" = "Urheberrechts- und Lizenzerklärung";
"电脑键盘" = "Computertastatur";
"画中画未能开启,请保持应用在前台后重试。" = "Bild-in-Bild konnte nicht geöffnet werden. Bitte lassen Sie die Anwendung im Vordergrund und versuchen Sie es erneut.";
"画质优先" = "Qualität";
"画面偏好" = "Videopräferenz";
"画面延时" = "Videolatenz";
"画面设置" = "Videoeinstellungen";
"画面质量" = "Videoqualität";
"画面采集帧率" = "Bildrate der Videoaufnahme";
"相对位置" = "Touchpad";
"相对鼠标" = "Relative Maus";
"知道了" = "Verstanden";
"确定" = "Okay";
"确认" = "Bestätigen";
"离线" = "Offline";
"空格" = "Leertaste";
"端口" = "Hafen";
"符号功能" = "Symbole & Tasten";
"等待电脑返回隐私屏状态;旧版电脑端可能不支持" = "Warten Sie, bis der Computer in den Datenschutzstatus zurückkehrt. Ältere Computer unterstützen dies möglicherweise nicht.";
"等待连接" = "Warten auf Verbindung";
"等待隐私授权" = "Datenschutzzustimmung ausstehend";
"系统键盘" = "Systemtastatur";
"绝对位置" = "Direkte Berührung";
"绝对鼠标" = "Absolute Maus";
"网络状态" = "Netzwerk";
"网络连接已中断,请重新连接。" = "Die Netzwerkverbindung wurde unterbrochen. Bitte stellen Sie die Verbindung wieder her.";
"自定义" = "Benutzerdefiniert";
"虚拟鼠标" = "Virtuelle Maus";
"被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴" = "Das gesteuerte Terminal unterstützt keine direkte Eingabe von Chinesisch. Bitte aktualisieren Sie das von macOS gesteuerte Terminal. Sie können den Text auch zunächst kopieren, über die Zwischenablage des Fernbedienungsmenüs senden und dann einfügen";
"被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。" = "Der Remote-Datenschutzbildschirm wurde über die lokale Verknüpfung entsperrt. Sperren Sie es erneut, um die Privatsphäre wiederherzustellen und das Entsperren lokaler Verknüpfungen zu deaktivieren.";
"被控端平台:%1$@" = "Kontrollierte Terminalplattform:%1$@";
"被控端版本过低,请升级到最新版本。" = "Die kontrollierte Version ist zu niedrig, bitte aktualisieren Sie auf die neueste Version.";
"被控端编码器" = "Remote-Encoder";
"视频" = "Video";
"视频 %1$@×%2$@ · %3$@ 帧" = "Video %1$@×%2$@·%3$@-Frames";
"触摸位置直接对应远端屏幕位置,适合快速定位。" = "Die Berührungsposition entspricht direkt der Remote-Bildschirmposition, die für eine schnelle Positionierung geeignet ist.";
"许可" = "Lizenz";
"许可与版权声明" = "Lizenzen und Urheberrechtshinweise";
"许可与版权声明可离线查阅。" = "Die Lizenz- und Urheberrechtshinweise sind offline verfügbar.";
"设备离线" = "Gerät offline";
"设置" = "Einstellungen";
"设置,有新版本" = "Einstellungen, es gibt eine neue Version";
"访问密码" = "Zugangspasswort";
"访问密码错误,请重新输入。" = "Das Zugangspasswort ist falsch, bitte geben Sie es erneut ein.";
"请求超时,尚未确认电脑的隐私屏状态" = "Die Anfrage ist abgelaufen und der Datenschutzstatus des Computers wurde nicht bestätigt.";
"请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。" = "Bitte geben Sie einen Port im Bereich 1–65535 ein oder deaktivieren Sie „Benutzerdefinierten Server verwenden“.";
"请输入服务器地址,或关闭“使用自定义服务器”。" = "Bitte geben Sie die Serveradresse ein oder deaktivieren Sie „Benutzerdefinierten Server verwenden“.";
"请输入远程设备 ID" = "Bitte geben Sie die Remote-Geräte-ID ein";
"调整失败,请重试。" = "Einstellungen konnten nicht angewendet werden. Versuchen Sie es erneut.";
"软件许可" = "Softwarelizenz";
"返回控制栏" = "Zurück zur Steuerleiste";
"还没有连接记录" = "Noch kein Verbindungsdatensatz";
"这条公告已更新或删除,请返回公告列表查看。" = "Diese Ankündigung wurde aktualisiert oder gelöscht. Bitte kehren Sie zur Ankündigungsliste zurück, um sie anzuzeigen.";
"远程桌面" = "Remotedesktop";
"远程设备 ID 不存在,请检查设备 ID。" = "Remote-Geräte-ID existiert nicht, bitte überprüfen Sie die Geräte-ID.";
"远程设备当前不可用,请稍后重试。" = "Das Remote-Gerät ist derzeit nicht verfügbar. Bitte versuchen Sie es später erneut.";
"远程连接已结束。" = "Remote-Verbindung beendet.";
"连接" = "Verbinden";
"连接延时(RTT)" = "Verbindungsverzögerung (RTT)";
"连接建立后可调整,需被控端支持。" = "Verfügbar bei Verbindung mit einem unterstützten Remote-Gerät.";
"连接建立后锁定横屏" = "Querformatbildschirm sperren, nachdem die Verbindung hergestellt wurde";
"连接提示" = "Verbindungsaufforderung";
"连接方式" = "Verbindungsmethode";
"连接远程桌面" = "Mit Remote-Desktop verbinden";
"退格" = "Rücktaste";
"通知公告" = "Mitteilungen";
"部分预览图未能清除,请重试。" = "Einige Vorschauen konnten nicht gelöscht werden. Bitte versuchen Sie es erneut.";
"重试" = "Versuchen Sie es erneut";
"重试保存阅读状态" = "Versuchen Sie erneut, den Lesestatus zu speichern";
"锁定" = "Sperren";
"键盘" = "Tastatur";
"键盘操作" = "Tastaturbedienung";
"阅读并授权" = "Lesen und autorisieren";
"隐私" = "Datenschutz";
"隐私与授权" = "Datenschutz und Autorisierung";
"隐私屏" = "Sichtschutz";
"隐私屏已关闭" = "Sichtschutz aus";
"隐私屏已开启" = "Sichtschutz an";
"隐私屏已被解锁" = "Datenschutzbildschirm entsperrt";
"隐私屏异常" = "Anomalie des Sichtschutzbildschirms";
"隐私屏暂不可用" = "Der Datenschutzbildschirm ist vorübergehend nicht verfügbar";
"隐私屏状态已过期,等待电脑确认" = "Der Status des Datenschutzbildschirms ist abgelaufen und wartet auf Computerbestätigung";
"隐私屏状态待确认" = "Status des Datenschutzbildschirms muss bestätigt werden";
"隐私政策" = "Datenschutzrichtlinie";
"隐私政策暂时无法读取,请拒绝联网并重新安装应用。" = "Die Datenschutzerklärung kann vorübergehend nicht gelesen werden. Bitte verweigern Sie die Verbindung zum Internet und installieren Sie die Anwendung neu.";
"隐藏密码" = "Passwort verbergen";
"静音" = "Stumm";
"音频" = "Audio";
"项目主页" = "Projektwebsite";
"预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。" = "Vorschauen können persönliche oder geschäftliche Informationen vom Remote-Computer enthalten. Nach dem Einschalten speichert jede Verbindung automatisch ein Bild auf dem Gerät und zeigt es in den letzten Verbindungen an. Sie können jederzeit schließen und löschen.";
"高" = "Hoch";
"默认" = "Standard";
"默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。" = "Standardmäßig deaktiviert. Beim Einschalten wechselt das iPhone in die Querformatausrichtung und bleibt beim Anschließen im Querformat. Im ausgeschalteten Zustand folgt es der Ausrichtung des Geräts. iPads sind nicht betroffen.";
"鼠标右键" = "Rechte Maustaste";
"鼠标左键" = "Linke Maustaste";
"鼠标控制" = "Maussteuerung";
"鼠标滚轮" = "Mausrad";
@@ -0,0 +1 @@
"NSLocalNetworkUsageDescription" = "CrossDesk uses the local network to discover and establish native P2P remote control connections.";
@@ -0,0 +1,283 @@
// Generated by localization/generate.py.
"%1$@ 传输失败" = "%1$@ transmission failed";
"%1$@ 台设备" = "Devices: %1$@";
"%1$@ 条未读" = "%1$@ unread items";
"%1$@键盘页" = "%1$@ keyboard page";
"%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@" = "%1$@, receiving %2$@, sending %3$@, packet loss rate %4$@";
"CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。" = "CrossDesk uses the local network to discover and establish native P2P remote control connections.";
"Ctrl+Alt+Del 需要远端启用 Windows 系统服务" = "Ctrl+Alt+Del requires remote activation of Windows system services";
"GNU GPL 第 3 版" = "GNU GPL version 3";
"OpenFEC 告知" = "OpenFEC notice";
"OpenFEC 许可与源码" = "OpenFEC license and source";
"P2P 直连" = "P2P direct connection";
"P2P/TURN 建链失败,请检查网络后重试。" = "P2P/TURN Link establishment failed, please check the network and try again.";
"SRTP 已启用" = "SRTP enabled";
"TLS 证书校验失败" = "TLS certificate verification failed";
"TURN 中继" = "TURN relay";
"上下滑动,可滑出按键范围" = "Slide up and down to slide out of the key range";
"丢包率" = "Loss Rate";
"中" = "Medium";
"优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。" = "Prioritizes keeping the picture smooth, and will reduce resolution more aggressively when bandwidth or encoding pressure is high.";
"低" = "Low";
"使用自定义服务器" = "Using a custom server";
"保存密码" = "Save password";
"保存远程画面预览" = "Save remote screen previews";
"保存远程画面预览?" = "Save remote screen preview?";
"信令服务器已关闭连接" = "The signaling server has closed the connection";
"信令服务重连中" = "Signaling service reconnecting";
"信令连接失败" = "Signaling connection failed";
"信令连接已关闭" = "Signaling connection closed";
"偏好模式" = "Preference mode";
"像触控板一样滑动光标,点击时操作当前光标位置。" = "Slide the cursor like a trackpad and operate the current cursor position when clicked.";
"公告加载失败,请重试。" = "Announcement loading failed, please try again.";
"公告详情" = "Announcement details";
"共 %1$@ 条 · %2$@ 条未读" = "Total %1$@ items ·%2$@ unread items";
"关于" = "About";
"关于 CrossDesk" = "About CrossDesk";
"关于,有新版本" = "About, there is a new version";
"关闭" = "Close";
"关闭控制栏" = "Close control bar";
"关闭隐私屏" = "Disable privacy screen";
"兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。" = "Balances clarity and smoothness, only gradually reducing resolution under constant pressure.";
"分辨率" = "Resolution";
"切换到电脑键盘" = "Switch to computer keyboard";
"切换到系统键盘" = "Switch to system keyboard";
"删除" = "Delete";
"删除公告" = "Delete announcement";
"删除记录" = "Delete record";
"删除这条公告?" = "Delete this announcement?";
"刷新公告" = "Refresh announcement";
"剪贴板" = "Clipboard";
"剪贴板中没有文本" = "No text in clipboard";
"剪贴板文本超过 128 KiB" = "Clipboard text exceeds 128 KiB";
"加载中…" = "Loading…";
"加载更多" = "Load more";
"升级提示" = "Update recommended";
"单次输入最多 16 KiB,且不能包含空字符" = "A single input can be up to 16 KiB and cannot contain null characters";
"发送" = "Send";
"发送文件" = "Send file";
"取消" = "Cancel";
"取消连接" = "Cancel connection";
"各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。" = "Each component is subject to the listed open source license, and the rights granted are not subject to the general terms of use of this application. Viewing source code requires an internet connection.";
"合计" = "Total";
"同意并继续" = "Agree and continue";
"回车" = "Enter";
"在线" = "Online";
"地址" = "Address";
"填写服务器地址" = "Fill in the server address";
"填写端口" = "Fill in the port";
"声音" = "Sound";
"失败" = "Failed";
"始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。" = "Always maintain a higher resolution and reduce the frame rate to ensure picture clarity when bandwidth is insufficient.";
"媒体加密" = "Media encryption";
"字母数字" = "Letters & numbers";
"完成" = "Done";
"完成隐私授权后可检查更新" = "You can check for updates after completing privacy authorization";
"完成隐私授权后登记本机身份" = "Register the local identity after completing privacy authorization";
"密码将安全保存在本机 Keychain 中" = "Passwords will be safely stored in the local Keychain";
"对端 ID" = "Remote ID";
"对端 ID %1$@" = "Peer ID %1$@";
"将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。" = "Will stop the remote connection, close the screen preview save and clear the existing preview. Connection records and received files will be retained, and existing server data will not be deleted. You can reauthorize at any time.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。" = "All remote previews saved on this machine will be deleted, while connection records, passwords and received files will be retained.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。" = "All remote previews saved on this machine will be deleted, while connection records, passwords and received files will be retained. Subsequent connections will still save new previews.";
"屏幕方向" = "Screen orientation";
"展开远程控制菜单" = "Expand remote control menu";
"已保存密码" = "Password saved";
"已勾选" = "Checked";
"已发送 Ctrl+Alt+Del" = "Ctrl+Alt+Del sent";
"已发送本机剪贴板" = "Local clipboard sent";
"已授权" = "Granted";
"已接收 %1$@" = "Received %1$@";
"已接收远端剪贴板" = "Remote clipboard received";
"已读" = "Read";
"已连接" = "Connected";
"已连接服务器" = "Connected to server";
"帧率" = "Frame rate";
"帧率优先" = "Smooth";
"平衡" = "Balanced";
"应用中的许可文件缺失或损坏,请重新安装应用。" = "The license file in the application is missing or damaged, please reinstall the application.";
"开发版本包含尚未发布的修改,以下链接为基础版本源码。" = "The development version contains modifications that have not yet been released. The following link is the source code of the basic version.";
"开启保存" = "Enable saving";
"开启隐私屏" = "Enable privacy screen";
"开源组件" = "Open-source components";
"开源软件权利说明" = "Open source software rights description";
"当前已是最新版本" = "This is currently the latest version";
"成功连接后,这里会显示远端桌面的缩略图。" = "After a successful connection, a thumbnail of the remote desktop will be displayed here.";
"我已阅读并同意《隐私政策》" = "I have read and agreed to the Privacy Policy";
"我已阅读并同意隐私政策" = "I have read and agree to the privacy policy";
"打开隐私政策" = "Open privacy policy";
"指令发送失败,请重试" = "Command sending failed, please try again";
"指令已发送,等待电脑确认…" = "The command has been sent, waiting for computer confirmation...";
"按住并拖动,可滑出按键范围,松开结束拖拽" = "Press and drag to slide out of the key range, release to end dragging";
"授权后可使用远程连接。" = "Remote connections are available after authorization.";
"授权状态" = "Authorization status";
"接收" = "Receive";
"控制模式" = "Control mode";
"控制端解码器" = "Local decoder";
"撤回授权" = "Withdraw authorization";
"撤回隐私授权" = "Withdraw privacy authorization";
"收起电脑键盘" = "Hide computer keyboard";
"收起系统键盘" = "Collapse system keyboard";
"收起远程控制菜单" = "Collapse remote control menu";
"收起鼠标" = "Hide mouse";
"数据" = "Data";
"断开后将返回首页" = "Will return to the homepage after disconnecting";
"断开远程连接?" = "Disconnect remote connection?";
"断开连接" = "Disconnect";
"新版本" = "New version";
"新版本可用:v%1$@" = "New version available: v%1$@";
"无效" = "Invalid";
"无未读公告" = "No unread announcements";
"无法" = "Unable to";
"无法保存本地阅读状态,请重试。" = "Unable to save reading status locally. Please try again.";
"无法删除这条公告,请重试。" = "Unable to delete this announcement. Please try again.";
"无法访问本机登录凭据,请解锁后重试" = "Unable to access local login credentials, please unlock and try again";
"无法读取开源许可" = "Unable to read open source license";
"无法读取所选文件,请重试" = "Unable to read selected file, please try again";
"是否撤回隐私授权?" = "Withdraw privacy authorization?";
"显示器" = "Display";
"显示器 %1$@" = "Monitor %1$@";
"显示器 1" = "Monitor 1";
"显示密码" = "Show password";
"暂不同意" = "Not now";
"暂无公告" = "No announcements";
"最近连接" = "Recent connections";
"服务器" = "Server";
"服务器地址" = "Server Address";
"服务器端口" = "Server port";
"服务器配置无效" = "Invalid server configuration";
"未勾选" = "Not checked";
"未启用" = "Not enabled";
"未授权" = "Unauthorized";
"未知" = "Unknown";
"未知信令状态" = "Unknown signaling status";
"未知连接状态" = "Unknown connection status";
"未读" = "Unread";
"未连接" = "Not connected";
"本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。" = "This application uses OpenFEC for forward error correction under CeCILL-C 1.0, which provides limited warranties and limits liability. See the full license for details.";
"本机 ID %1$@" = "Local ID %1$@";
"本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。" = "The login credentials for this machine are temporarily insecure. Please unlock your device and click \"Apply\" in settings to try again.";
"本版本源码与构建说明" = "Source code and build instructions for this version";
"本版本源码信息暂不可用。" = "Source revision is unavailable for this build.";
"构建说明" = "Build instructions";
"构建配方与项目补丁" = "Build recipes and project patches";
"查看源码" = "View source code";
"检查失败,请稍后重试" = "Check failed. Please try again later.";
"检查更新" = "Check for updates";
"正在关闭隐私屏…" = "Closing privacy screen…";
"正在准备连接…" = "Preparing to connect...";
"正在发送 %1$@" = "Sending %1$@";
"正在发送 Ctrl+Alt+Del…" = "Sending Ctrl+Alt+Del…";
"正在取回远程画面…" = "Retrieving remote screen...";
"正在建立远程连接" = "Establishing remote connection";
"正在开启隐私屏…" = "Turning on privacy screen...";
"正在收集 ICE 候选" = "Collecting ICE candidates";
"正在检查更新…" = "Checking for updates…";
"正在清除…" = "Clearing...";
"正在确认设备状态…" = "Confirming device status...";
"正在获取本机 ID…" = "Obtaining local ID...";
"正在连接" = "Connecting";
"正在连接信令服务" = "Connecting to signaling service";
"清除" = "Clear";
"清除预览图" = "Clear previews";
"清除预览图?" = "Clear previews?";
"源码与构建说明" = "Source code and build instructions";
"源码版本" = "Source code version";
"版本" = "Version";
"版权与许可声明" = "Copyright and License Statement";
"电脑键盘" = "Computer keyboard";
"画中画未能开启,请保持应用在前台后重试。" = "Picture-in-picture failed to open, please keep the application in the foreground and try again.";
"画质优先" = "Quality";
"画面偏好" = "Video Preference";
"画面延时" = "Video latency";
"画面设置" = "Video settings";
"画面质量" = "Video Quality";
"画面采集帧率" = "Video Capture Frame Rate";
"相对位置" = "Trackpad";
"相对鼠标" = "Relative mouse";
"知道了" = "Got it";
"确定" = "OK";
"确认" = "Confirm";
"离线" = "Offline";
"空格" = "Space";
"端口" = "Port";
"符号功能" = "Symbols & keys";
"等待电脑返回隐私屏状态;旧版电脑端可能不支持" = "Wait for the computer to return to the privacy screen state; older computers may not support it.";
"等待连接" = "Waiting for connection";
"等待隐私授权" = "Waiting for privacy authorization";
"系统键盘" = "System keyboard";
"绝对位置" = "Direct touch";
"绝对鼠标" = "Absolute Mouse";
"网络状态" = "Network";
"网络连接已中断,请重新连接。" = "The network connection has been interrupted, please reconnect.";
"自定义" = "Custom";
"虚拟鼠标" = "Virtual mouse";
"被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴" = "The controlled terminal does not support direct input of Chinese, please update the macOS controlled terminal; you can also copy the text first, send it through the clipboard of the remote control menu and then paste it";
"被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。" = "The remote privacy screen was unlocked using the local shortcut. Lock it again to restore privacy and disable local shortcut unlocking.";
"被控端平台:%1$@" = "Controlled terminal platform:%1$@";
"被控端版本过低,请升级到最新版本。" = "The controlled version is too low, please upgrade to the latest version.";
"被控端编码器" = "Remote encoder";
"视频" = "Video";
"视频 %1$@×%2$@ · %3$@ 帧" = "Video %1$@×%2$@·%3$@ frames";
"触摸位置直接对应远端屏幕位置,适合快速定位。" = "The touch position directly corresponds to the remote screen position, which is suitable for quick positioning.";
"许可" = "License";
"许可与版权声明" = "Licenses and copyright notices";
"许可与版权声明可离线查阅。" = "The license and copyright notice are available offline.";
"设备离线" = "Device Offline";
"设置" = "Settings";
"设置,有新版本" = "Settings, there is a new version";
"访问密码" = "Access password";
"访问密码错误,请重新输入。" = "The access password is wrong, please re-enter it.";
"请求超时,尚未确认电脑的隐私屏状态" = "The request timed out and the computer's privacy screen status has not been confirmed.";
"请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。" = "Please enter a port in the range 1–65535, or turn off \"Use custom server\".";
"请输入服务器地址,或关闭“使用自定义服务器”。" = "Please enter the server address, or turn off \"Use a custom server\".";
"请输入远程设备 ID" = "Please enter the remote device ID";
"调整失败,请重试。" = "Could not apply settings. Try again.";
"软件许可" = "Software license";
"返回控制栏" = "Return to control bar";
"还没有连接记录" = "No connection record yet";
"这条公告已更新或删除,请返回公告列表查看。" = "This announcement has been updated or deleted, please return to the announcement list to view it.";
"远程桌面" = "Remote Desktop";
"远程设备 ID 不存在,请检查设备 ID。" = "Remote device ID does not exist, please check device ID.";
"远程设备当前不可用,请稍后重试。" = "The remote device is currently unavailable, please try again later.";
"远程连接已结束。" = "Remote connection ended.";
"连接" = "Connect";
"连接延时(RTT)" = "Connection delay (RTT)";
"连接建立后可调整,需被控端支持。" = "Available when connected to a supported remote device.";
"连接建立后锁定横屏" = "Lock landscape screen after connection is established";
"连接提示" = "Connection prompt";
"连接方式" = "Connection method";
"连接远程桌面" = "Connect to remote desktop";
"退格" = "Backspace";
"通知公告" = "Announcements";
"部分预览图未能清除,请重试。" = "Some previews could not be cleared, please try again.";
"重试" = "Try again";
"重试保存阅读状态" = "Retry saving reading status";
"锁定" = "Lock";
"键盘" = "Keyboard";
"键盘操作" = "Keyboard operation";
"阅读并授权" = "Read and authorize";
"隐私" = "Privacy";
"隐私与授权" = "Privacy and Authorization";
"隐私屏" = "Privacy screen";
"隐私屏已关闭" = "Privacy screen off";
"隐私屏已开启" = "Privacy screen on";
"隐私屏已被解锁" = "Privacy screen unlocked";
"隐私屏异常" = "Privacy screen abnormality";
"隐私屏暂不可用" = "Privacy screen is temporarily unavailable";
"隐私屏状态已过期,等待电脑确认" = "Privacy screen status has expired, waiting for computer confirmation";
"隐私屏状态待确认" = "Privacy screen status to be confirmed";
"隐私政策" = "Privacy Policy";
"隐私政策暂时无法读取,请拒绝联网并重新安装应用。" = "The privacy policy cannot be read temporarily. Please refuse to connect to the Internet and reinstall the application.";
"隐藏密码" = "Hide password";
"静音" = "Mute";
"音频" = "Audio";
"项目主页" = "Project website";
"预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。" = "Previews may contain personal or work information from the remote computer. After turning it on, each connection will automatically save a picture on the machine and display it in recent connections. You can close and clear at any time.";
"高" = "High";
"默认" = "Default";
"默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。" = "Off by default. When turned on, the iPhone goes into and stays in landscape orientation when connected; when turned off, it follows the device orientation. iPads are not affected.";
"鼠标右键" = "Right mouse button";
"鼠标左键" = "Left mouse button";
"鼠标控制" = "Mouse control";
"鼠标滚轮" = "Mouse wheel";
@@ -0,0 +1 @@
"NSLocalNetworkUsageDescription" = "CrossDesk utiliza la red local para descubrir y establecer conexiones nativas de control remoto P2P.";
@@ -0,0 +1,283 @@
// Generated by localization/generate.py.
"%1$@ 传输失败" = "Error en la transmisión %1$@";
"%1$@ 台设备" = "Dispositivos: %1$@";
"%1$@ 条未读" = "%1$@ elementos no leídos";
"%1$@键盘页" = "Página del teclado %1$@";
"%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@" = "%1$@, recepción de %2$@, envío de %3$@, tasa de pérdida de paquetes %4$@";
"CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。" = "CrossDesk utiliza la red local para descubrir y establecer conexiones nativas de control remoto P2P.";
"Ctrl+Alt+Del 需要远端启用 Windows 系统服务" = "Ctrl+Alt+Del requiere activación remota de los servicios del sistema Windows";
"GNU GPL 第 3 版" = "GNU GPL versión 3";
"OpenFEC 告知" = "Aviso OpenFEC";
"OpenFEC 许可与源码" = "Licencia y fuente OpenFEC";
"P2P 直连" = "Conexión directa P2P";
"P2P/TURN 建链失败,请检查网络后重试。" = "P2P/TURN Error al establecer el enlace, verifique la red e inténtelo nuevamente.";
"SRTP 已启用" = "SRTP habilitado";
"TLS 证书校验失败" = "Error en la verificación del certificado TLS";
"TURN 中继" = "Relé de GIRO";
"上下滑动,可滑出按键范围" = "Deslice hacia arriba y hacia abajo para salir del rango de teclas";
"丢包率" = "Tasa de pérdidas";
"中" = "Media";
"优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。" = "Da prioridad a mantener la imagen fluida y reducirá la resolución de manera más agresiva cuando el ancho de banda o la presión de codificación sean altos.";
"低" = "Baja";
"使用自定义服务器" = "Usando un servidor personalizado";
"保存密码" = "Guardar contraseña";
"保存远程画面预览" = "Guardar vistas previas de pantalla remotas";
"保存远程画面预览?" = "¿Guardar vista previa de pantalla remota?";
"信令服务器已关闭连接" = "El servidor de señalización ha cerrado la conexión.";
"信令服务重连中" = "Reconexión del servicio de señalización";
"信令连接失败" = "Error en la conexión de señalización";
"信令连接已关闭" = "Conexión de señalización cerrada";
"偏好模式" = "Modo de preferencia";
"像触控板一样滑动光标,点击时操作当前光标位置。" = "Deslice el cursor como un trackpad y opere la posición actual del cursor cuando se haga clic.";
"公告加载失败,请重试。" = "Error al cargar el anuncio, inténtelo de nuevo.";
"公告详情" = "Detalles del anuncio";
"共 %1$@ 条 · %2$@ 条未读" = "Total de elementos %1$@· Elementos no leídos %2$@";
"关于" = "Acerca de";
"关于 CrossDesk" = "Acerca de CrossDesk";
"关于,有新版本" = "Acerca de, hay una nueva versión.";
"关闭" = "Cerrar";
"关闭控制栏" = "Cerrar barra de control";
"关闭隐私屏" = "Desactivar la pantalla de privacidad";
"兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。" = "Equilibra la claridad y la suavidad, reduciendo solo gradualmente la resolución bajo presión constante.";
"分辨率" = "Resolución";
"切换到电脑键盘" = "Cambiar al teclado de la computadora";
"切换到系统键盘" = "Cambiar al teclado del sistema";
"删除" = "Eliminar";
"删除公告" = "Eliminar anuncio";
"删除记录" = "Eliminar registro";
"删除这条公告?" = "¿Eliminar este anuncio?";
"刷新公告" = "Actualizar anuncio";
"剪贴板" = "Portapapeles";
"剪贴板中没有文本" = "No hay texto en el portapapeles";
"剪贴板文本超过 128 KiB" = "El texto del portapapeles supera los 128 KiB";
"加载中…" = "Cargando…";
"加载更多" = "Cargar más";
"升级提示" = "Actualización recomendada";
"单次输入最多 16 KiB,且不能包含空字符" = "Una sola entrada puede tener hasta 16 KiB y no puede contener caracteres nulos";
"发送" = "Enviar";
"发送文件" = "Enviar archivo";
"取消" = "Cancelar";
"取消连接" = "Cancelar conexión";
"各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。" = "Cada componente está sujeto a la licencia de código abierto enumerada y los derechos otorgados no están sujetos a los términos generales de uso de esta aplicación. Para ver el código fuente se requiere una conexión a Internet.";
"合计" = "Total";
"同意并继续" = "Aceptar y continuar";
"回车" = "Entrar";
"在线" = "En línea";
"地址" = "Dirección";
"填写服务器地址" = "Complete la dirección del servidor";
"填写端口" = "Complete el puerto";
"声音" = "Sonido";
"失败" = "Fallido";
"始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。" = "Mantenga siempre una resolución más alta y reduzca la velocidad de fotogramas para garantizar la claridad de la imagen cuando el ancho de banda sea insuficiente.";
"媒体加密" = "Cifrado de medios";
"字母数字" = "Letras y números";
"完成" = "Hecho";
"完成隐私授权后可检查更新" = "Puede buscar actualizaciones después de completar la autorización de privacidad";
"完成隐私授权后登记本机身份" = "Registre la identidad local después de completar la autorización de privacidad";
"密码将安全保存在本机 Keychain 中" = "Las contraseñas se almacenarán de forma segura en el llavero local.";
"对端 ID" = "Identificación remota";
"对端 ID %1$@" = "ID de igual %1$@";
"将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。" = "Detendrá la conexión remota, cerrará la vista previa de la pantalla y borrará la vista previa existente. Los registros de conexión y los archivos recibidos se conservarán y los datos existentes del servidor no se eliminarán. Puede volver a autorizar en cualquier momento.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。" = "Se eliminarán todas las vistas previas remotas guardadas en esta máquina, mientras que se conservarán los registros de conexión, las contraseñas y los archivos recibidos.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。" = "Se eliminarán todas las vistas previas remotas guardadas en esta máquina, mientras que se conservarán los registros de conexión, las contraseñas y los archivos recibidos. Las conexiones posteriores seguirán guardando nuevas vistas previas.";
"屏幕方向" = "Orientación de la pantalla";
"展开远程控制菜单" = "Ampliar el menú del control remoto";
"已保存密码" = "Contraseña guardada";
"已勾选" = "Comprobado";
"已发送 Ctrl+Alt+Del" = "Ctrl+Alt+Del enviado";
"已发送本机剪贴板" = "Portapapeles local enviado";
"已授权" = "Concedido";
"已接收 %1$@" = "Recibido %1$@";
"已接收远端剪贴板" = "Portapapeles remoto recibido";
"已读" = "Leer";
"已连接" = "Conectado";
"已连接服务器" = "Conectado al servidor";
"帧率" = "Velocidad de fotogramas";
"帧率优先" = "Fluidez";
"平衡" = "Equilibrado";
"应用中的许可文件缺失或损坏,请重新安装应用。" = "El archivo de licencia de la aplicación falta o está dañado; reinstale la aplicación.";
"开发版本包含尚未发布的修改,以下链接为基础版本源码。" = "La versión de desarrollo contiene modificaciones que aún no han sido publicadas. El siguiente enlace es el código fuente de la versión básica.";
"开启保存" = "Activar guardado";
"开启隐私屏" = "Habilitar pantalla de privacidad";
"开源组件" = "Componentes de código abierto";
"开源软件权利说明" = "Descripción de los derechos del software de código abierto";
"当前已是最新版本" = "Esta es actualmente la última versión.";
"成功连接后,这里会显示远端桌面的缩略图。" = "Después de una conexión exitosa, aquí se mostrará una miniatura del escritorio remoto.";
"我已阅读并同意《隐私政策》" = "He leído y acepto la Política de Privacidad";
"我已阅读并同意隐私政策" = "He leído y acepto la política de privacidad";
"打开隐私政策" = "Abrir política de privacidad";
"指令发送失败,请重试" = "Error al enviar el comando, inténtelo de nuevo";
"指令已发送,等待电脑确认…" = "El comando ha sido enviado, esperando confirmación por computadora...";
"按住并拖动,可滑出按键范围,松开结束拖拽" = "Presione y arrastre para deslizarse fuera del rango de teclas, suelte para finalizar el arrastre";
"授权后可使用远程连接。" = "Las conexiones remotas están disponibles después de la autorización.";
"授权状态" = "Estado de autorización";
"接收" = "Recibir";
"控制模式" = "Modo de control";
"控制端解码器" = "Decodificador local";
"撤回授权" = "Retirar autorización";
"撤回隐私授权" = "Retirar la autorización de privacidad";
"收起电脑键盘" = "Ocultar teclado del PC";
"收起系统键盘" = "Contraer teclado del sistema";
"收起远程控制菜单" = "Contraer menú de control remoto";
"收起鼠标" = "Ocultar ratón";
"数据" = "Datos";
"断开后将返回首页" = "Volverá a la página de inicio después de desconectarse";
"断开远程连接?" = "¿Desconectar la conexión remota?";
"断开连接" = "Desconectar";
"新版本" = "Nueva versión";
"新版本可用:v%1$@" = "Nueva versión disponible: v%1$@";
"无效" = "Inválido";
"无未读公告" = "No hay anuncios no leídos";
"无法" = "No puedo";
"无法保存本地阅读状态,请重试。" = "No se puede guardar el estado de lectura localmente. Por favor inténtalo de nuevo.";
"无法删除这条公告,请重试。" = "No se puede eliminar este anuncio. Por favor inténtalo de nuevo.";
"无法访问本机登录凭据,请解锁后重试" = "No se puede acceder a las credenciales de inicio de sesión locales, desbloquee e intente nuevamente";
"无法读取开源许可" = "No se puede leer la licencia de código abierto";
"无法读取所选文件,请重试" = "No se puede leer el archivo seleccionado, inténtelo de nuevo";
"是否撤回隐私授权?" = "¿Retirar la autorización de privacidad?";
"显示器" = "Pantalla";
"显示器 %1$@" = "Monitorizar %1$@";
"显示器 1" = "Monitor 1";
"显示密码" = "Mostrar contraseña";
"暂不同意" = "Ahora no";
"暂无公告" = "Sin anuncios";
"最近连接" = "Conexiones recientes";
"服务器" = "Servidor";
"服务器地址" = "Dirección del servidor";
"服务器端口" = "Puerto del servidor";
"服务器配置无效" = "Configuración del servidor no válida";
"未勾选" = "No marcado";
"未启用" = "No habilitado";
"未授权" = "No autorizado";
"未知" = "Desconocido";
"未知信令状态" = "Estado de señalización desconocido";
"未知连接状态" = "Estado de conexión desconocido";
"未读" = "No leído";
"未连接" = "No conectado";
"本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。" = "Esta aplicación utiliza OpenFEC para la corrección de errores directos bajoCeCILL-C1.0, que proporciona garantías limitadas y limita la responsabilidad. Consulte la licencia completa para obtener más detalles.";
"本机 ID %1$@" = "ID local %1$@";
"本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。" = "Las credenciales de inicio de sesión para esta máquina son temporalmente inseguras. Desbloquee su dispositivo y haga clic en \"Aplicar\" en la configuración para volver a intentarlo.";
"本版本源码与构建说明" = "Código fuente e instrucciones de compilación para esta versión";
"本版本源码信息暂不可用。" = "La revisión fuente no está disponible para esta compilación.";
"构建说明" = "Instrucciones de construcción";
"构建配方与项目补丁" = "Crear recetas y parches de proyectos";
"查看源码" = "Ver código fuente";
"检查失败,请稍后重试" = "La verificación falló. Inténtelo de nuevo más tarde.";
"检查更新" = "Buscar actualizaciones";
"正在关闭隐私屏…" = "Cerrando la pantalla de privacidad...";
"正在准备连接…" = "Preparándose para conectarse...";
"正在发送 %1$@" = "Envío de %1$@";
"正在发送 Ctrl+Alt+Del…" = "Enviando Ctrl+Alt+Del…";
"正在取回远程画面…" = "Recuperando la pantalla remota...";
"正在建立远程连接" = "Establecer conexión remota";
"正在开启隐私屏…" = "Activando la pantalla de privacidad...";
"正在收集 ICE 候选" = "Recopilación de candidatos de ICE";
"正在检查更新…" = "Buscando actualizaciones...";
"正在清除…" = "Borrando...";
"正在确认设备状态…" = "Confirmando el estado del dispositivo...";
"正在获取本机 ID…" = "Obtención de identificación local...";
"正在连接" = "Conexión";
"正在连接信令服务" = "Conexión al servicio de señalización";
"清除" = "Borrar";
"清除预览图" = "Borrar vistas previas";
"清除预览图?" = "¿Borrar vistas previas?";
"源码与构建说明" = "Código fuente e instrucciones de compilación";
"源码版本" = "Versión del código fuente";
"版本" = "Versión";
"版权与许可声明" = "Declaración de derechos de autor y licencia";
"电脑键盘" = "Teclado de computadora";
"画中画未能开启,请保持应用在前台后重试。" = "No se pudo abrir la imagen en imagen. Mantenga la aplicación en primer plano e inténtelo nuevamente.";
"画质优先" = "Calidad";
"画面偏好" = "Preferencia de vídeo";
"画面延时" = "Latencia de vídeo";
"画面设置" = "Configuración de vídeo";
"画面质量" = "Calidad de vídeo";
"画面采集帧率" = "Velocidad de fotogramas de captura de vídeo";
"相对位置" = "Panel táctil";
"相对鼠标" = "Ratón relativo";
"知道了" = "Entendido";
"确定" = "Aceptar";
"确认" = "Confirmar";
"离线" = "Sin conexión";
"空格" = "Espacio";
"端口" = "Puerto";
"符号功能" = "Símbolos y teclas";
"等待电脑返回隐私屏状态;旧版电脑端可能不支持" = "Espere a que la computadora vuelva al estado de pantalla de privacidad; Es posible que las computadoras más antiguas no lo admitan.";
"等待连接" = "Esperando conexión";
"等待隐私授权" = "Esperando autorización de privacidad";
"系统键盘" = "Teclado del sistema";
"绝对位置" = "Toque directo";
"绝对鼠标" = "Ratón absoluto";
"网络状态" = "Red";
"网络连接已中断,请重新连接。" = "La conexión de red ha sido interrumpida, vuelva a conectarse.";
"自定义" = "Personalizado";
"虚拟鼠标" = "Ratón virtual";
"被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴" = "El terminal controlado no admite la entrada directa de chino; actualice el terminal controlado por macOS; También puedes copiar el texto primero, enviarlo a través del portapapeles del menú del control remoto y luego pegarlo.";
"被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。" = "La pantalla de privacidad remota se desbloqueó usando el acceso directo local. Bloquéelo nuevamente para restaurar la privacidad y deshabilitar el desbloqueo de accesos directos locales.";
"被控端平台:%1$@" = "Plataforma terminal controlada:%1$@";
"被控端版本过低,请升级到最新版本。" = "La versión controlada es demasiado baja; actualice a la última versión.";
"被控端编码器" = "Codificador remoto";
"视频" = "Vídeo";
"视频 %1$@×%2$@ · %3$@ 帧" = "Vídeo %1$@×%2$@· Cuadros %3$@";
"触摸位置直接对应远端屏幕位置,适合快速定位。" = "La posición táctil corresponde directamente a la posición de la pantalla remota, que es adecuada para un posicionamiento rápido.";
"许可" = "Licencia";
"许可与版权声明" = "Licencias y avisos de derechos de autor";
"许可与版权声明可离线查阅。" = "La licencia y el aviso de derechos de autor están disponibles sin conexión.";
"设备离线" = "Dispositivo sin conexión";
"设置" = "Ajustes";
"设置,有新版本" = "Configuración, hay una nueva versión.";
"访问密码" = "Contraseña de acceso";
"访问密码错误,请重新输入。" = "La contraseña de acceso es incorrecta, por favor vuelva a ingresarla.";
"请求超时,尚未确认电脑的隐私屏状态" = "Se agotó el tiempo de espera de la solicitud y no se ha confirmado el estado de la pantalla de privacidad de la computadora.";
"请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。" = "Ingrese un puerto en el rango 1–65535 o desactive \"Usar servidor personalizado\".";
"请输入服务器地址,或关闭“使用自定义服务器”。" = "Ingrese la dirección del servidor o desactive \"Usar un servidor personalizado\".";
"请输入远程设备 ID" = "Ingrese el ID del dispositivo remoto";
"调整失败,请重试。" = "No se pudieron aplicar las configuraciones. Intentar otra vez.";
"软件许可" = "Licencia de software";
"返回控制栏" = "Volver a la barra de control";
"还没有连接记录" = "Aún no hay registro de conexión";
"这条公告已更新或删除,请返回公告列表查看。" = "Este anuncio ha sido actualizado o eliminado, regrese a la lista de anuncios para verlo.";
"远程桌面" = "Escritorio remoto";
"远程设备 ID 不存在,请检查设备 ID。" = "La ID del dispositivo remoto no existe; verifique la ID del dispositivo.";
"远程设备当前不可用,请稍后重试。" = "El dispositivo remoto no está disponible actualmente; inténtelo nuevamente más tarde.";
"远程连接已结束。" = "La conexión remota finalizó.";
"连接" = "Conectar";
"连接延时(RTT)" = "Retardo de conexión (RTT)";
"连接建立后可调整,需被控端支持。" = "Disponible cuando se conecta a un dispositivo remoto compatible.";
"连接建立后锁定横屏" = "Bloquear la pantalla horizontal después de establecer la conexión";
"连接提示" = "Aviso de conexión";
"连接方式" = "Método de conexión";
"连接远程桌面" = "Conectarse al escritorio remoto";
"退格" = "Retroceso";
"通知公告" = "Anuncios";
"部分预览图未能清除,请重试。" = "Algunas vistas previas no se pudieron borrar, inténtalo de nuevo.";
"重试" = "Inténtalo de nuevo";
"重试保存阅读状态" = "Reintentar guardar el estado de lectura";
"锁定" = "Bloquear";
"键盘" = "Teclado";
"键盘操作" = "Operación del teclado";
"阅读并授权" = "Leer y autorizar";
"隐私" = "Privacidad";
"隐私与授权" = "Privacidad y autorización";
"隐私屏" = "Pantalla de privacidad";
"隐私屏已关闭" = "Privacidad desactivada";
"隐私屏已开启" = "Privacidad activada";
"隐私屏已被解锁" = "Pantalla de privacidad desbloqueada";
"隐私屏异常" = "Anormalidad en la pantalla de privacidad";
"隐私屏暂不可用" = "La pantalla de privacidad no está disponible temporalmente";
"隐私屏状态已过期,等待电脑确认" = "El estado de la pantalla de privacidad ha caducado, esperando confirmación por computadora";
"隐私屏状态待确认" = "Estado de la pantalla de privacidad por confirmar";
"隐私政策" = "Política de privacidad";
"隐私政策暂时无法读取,请拒绝联网并重新安装应用。" = "La política de privacidad no se puede leer temporalmente. Rechace conectarse a Internet y reinstale la aplicación.";
"隐藏密码" = "Ocultar contraseña";
"静音" = "Silencio";
"音频" = "Audio";
"项目主页" = "Sitio web del proyecto";
"预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。" = "Las vistas previas pueden contener información personal o laboral de la computadora remota. Después de encenderlo, cada conexión guardará automáticamente una imagen en la máquina y la mostrará en las conexiones recientes. Puedes cerrar y borrar en cualquier momento.";
"高" = "Alta";
"默认" = "Predeterminado";
"默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。" = "Desactivado de forma predeterminada. Cuando se enciende, el iPhone entra y permanece en orientación horizontal cuando está conectado; cuando está apagado, sigue la orientación del dispositivo. Los iPad no se ven afectados.";
"鼠标右键" = "Botón derecho del ratón";
"鼠标左键" = "Botón izquierdo del ratón";
"鼠标控制" = "Control del ratón";
"鼠标滚轮" = "Rueda del ratón";
@@ -0,0 +1 @@
"NSLocalNetworkUsageDescription" = "CrossDesk utilise le réseau local pour découvrir et établir des connexions de contrôle à distance P2P natives.";
@@ -0,0 +1,283 @@
// Generated by localization/generate.py.
"%1$@ 传输失败" = "Échec de la transmission %1$@";
"%1$@ 台设备" = "Appareils : %1$@";
"%1$@ 条未读" = "Éléments non lus %1$@";
"%1$@键盘页" = "Page du clavier %1$@";
"%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@" = "%1$@, réception de %2$@, envoi de %3$@, taux de perte de paquets %4$@";
"CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。" = "CrossDesk utilise le réseau local pour découvrir et établir des connexions de contrôle à distance P2P natives.";
"Ctrl+Alt+Del 需要远端启用 Windows 系统服务" = "Ctrl+Alt+Del nécessite l'activation à distance des services système Windows";
"GNU GPL 第 3 版" = "GNU GPL version 3";
"OpenFEC 告知" = "Avis OpenFEC";
"OpenFEC 许可与源码" = "Licence et source OpenFEC";
"P2P 直连" = "Connexion directe P2P";
"P2P/TURN 建链失败,请检查网络后重试。" = "Échec de l'établissement du lien P2P/TURN, veuillez vérifier le réseau et réessayer.";
"SRTP 已启用" = "SRTP activé";
"TLS 证书校验失败" = "La vérification du certificat TLS a échoué";
"TURN 中继" = "Relais TOUR";
"上下滑动,可滑出按键范围" = "Faites glisser vers le haut et vers le bas pour sortir de la plage de touches";
"丢包率" = "Taux de perte";
"中" = "Moyenne";
"优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。" = "Donne la priorité au maintien de la fluidité de l'image et réduira la résolution de manière plus agressive lorsque la bande passante ou la pression d'encodage est élevée.";
"低" = "Faible";
"使用自定义服务器" = "Utilisation d'un serveur personnalisé";
"保存密码" = "Enregistrer le mot de passe";
"保存远程画面预览" = "Enregistrer les aperçus de l'écran distant";
"保存远程画面预览?" = "Enregistrer l'aperçu de l'écran distant ?";
"信令服务器已关闭连接" = "Le serveur de signalisation a fermé la connexion";
"信令服务重连中" = "Reconnexion du service de signalisation";
"信令连接失败" = "Échec de la connexion de signalisation";
"信令连接已关闭" = "Connexion de signalisation fermée";
"偏好模式" = "Mode préférence";
"像触控板一样滑动光标,点击时操作当前光标位置。" = "Faites glisser le curseur comme un trackpad et actionnez la position actuelle du curseur lorsque vous cliquez dessus.";
"公告加载失败,请重试。" = "Le chargement de l'annonce a échoué, veuillez réessayer.";
"公告详情" = "Détails de l'annonce";
"共 %1$@ 条 · %2$@ 条未读" = "Total des éléments %1$@· Éléments non lus %2$@";
"关于" = "À propos";
"关于 CrossDesk" = "À propos de CrossDesk";
"关于,有新版本" = "À propos, il existe une nouvelle version";
"关闭" = "Fermer";
"关闭控制栏" = "Fermer la barre de contrôle";
"关闭隐私屏" = "Désactiver l'écran de confidentialité";
"兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。" = "Équilibre la clarté et la douceur, en réduisant seulement progressivement la résolution sous une pression constante.";
"分辨率" = "Résolution";
"切换到电脑键盘" = "Passer au clavier de l'ordinateur";
"切换到系统键盘" = "Passer au clavier système";
"删除" = "Supprimer";
"删除公告" = "Supprimer l'annonce";
"删除记录" = "Supprimer l'enregistrement";
"删除这条公告?" = "Supprimer cette annonce ?";
"刷新公告" = "Actualiser l'annonce";
"剪贴板" = "Presse-papiers";
"剪贴板中没有文本" = "Aucun texte dans le presse-papiers";
"剪贴板文本超过 128 KiB" = "Le texte du presse-papiers dépasse 128 Ko";
"加载中…" = "Chargement…";
"加载更多" = "Charger plus";
"升级提示" = "Mise à jour conseillée";
"单次输入最多 16 KiB,且不能包含空字符" = "Une seule entrée peut atteindre 16 Ko et ne peut pas contenir de caractères nuls";
"发送" = "Envoi";
"发送文件" = "Envoyer le fichier";
"取消" = "Annuler";
"取消连接" = "Annuler la connexion";
"各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。" = "Chaque composant est soumis à la licence open source répertoriée, et les droits accordés ne sont pas soumis aux conditions générales d'utilisation de cette application. La visualisation du code source nécessite une connexion Internet.";
"合计" = "Total";
"同意并继续" = "Accepter et continuer";
"回车" = "Entrez";
"在线" = "En ligne";
"地址" = "Adresse";
"填写服务器地址" = "Remplissez l'adresse du serveur";
"填写端口" = "Remplissez le port";
"声音" = "Son";
"失败" = "Échec";
"始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。" = "Maintenez toujours une résolution plus élevée et réduisez la fréquence d'images pour garantir la clarté de l'image lorsque la bande passante est insuffisante.";
"媒体加密" = "Cryptage multimédia";
"字母数字" = "Lettres et chiffres";
"完成" = "Terminé";
"完成隐私授权后可检查更新" = "Vous pouvez vérifier les mises à jour après avoir terminé l'autorisation de confidentialité";
"完成隐私授权后登记本机身份" = "Enregistrez l'identité locale après avoir terminé l'autorisation de confidentialité";
"密码将安全保存在本机 Keychain 中" = "Les mots de passe seront stockés en toute sécurité dans le trousseau local";
"对端 ID" = "ID à distance";
"对端 ID %1$@" = "ID homologue %1$@";
"将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。" = "Arrêtera la connexion à distance, fermera la sauvegarde de l'aperçu de l'écran et effacera l'aperçu existant. Les enregistrements de connexion et les fichiers reçus seront conservés et les données du serveur existantes ne seront pas supprimées. Vous pouvez réautoriser à tout moment.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。" = "Tous les aperçus à distance enregistrés sur cette machine seront supprimés, tandis que les enregistrements de connexion, les mots de passe et les fichiers reçus seront conservés.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。" = "Tous les aperçus à distance enregistrés sur cette machine seront supprimés, tandis que les enregistrements de connexion, les mots de passe et les fichiers reçus seront conservés. Les connexions ultérieures enregistreront toujours les nouveaux aperçus.";
"屏幕方向" = "Orientation de l'écran";
"展开远程控制菜单" = "Développer le menu de la télécommande";
"已保存密码" = "Mot de passe enregistré";
"已勾选" = "Vérifié";
"已发送 Ctrl+Alt+Del" = "Ctrl+Alt+Del envoyé";
"已发送本机剪贴板" = "Presse-papiers local envoyé";
"已授权" = "Accordé";
"已接收 %1$@" = "Reçu %1$@";
"已接收远端剪贴板" = "Presse-papiers distant reçu";
"已读" = "Lire";
"已连接" = "Connecté";
"已连接服务器" = "Connecté au serveur";
"帧率" = "Fréquence d'images";
"帧率优先" = "Fluidité";
"平衡" = "Équilibré";
"应用中的许可文件缺失或损坏,请重新安装应用。" = "Le fichier de licence dans l'application est manquant ou endommagé, veuillez réinstaller l'application.";
"开发版本包含尚未发布的修改,以下链接为基础版本源码。" = "La version de développement contient des modifications qui n'ont pas encore été publiées. Le lien suivant est le code source de la version de base.";
"开启保存" = "Activer l’enregistrement";
"开启隐私屏" = "Activer l'écran de confidentialité";
"开源组件" = "Composants open source";
"开源软件权利说明" = "Description des droits sur les logiciels open source";
"当前已是最新版本" = "Il s'agit actuellement de la dernière version";
"成功连接后,这里会显示远端桌面的缩略图。" = "Après une connexion réussie, une vignette du bureau distant s'affichera ici.";
"我已阅读并同意《隐私政策》" = "J'ai lu et accepté la politique de confidentialité";
"我已阅读并同意隐私政策" = "J'ai lu et j'accepte la politique de confidentialité";
"打开隐私政策" = "Ouvrir la politique de confidentialité";
"指令发送失败,请重试" = "L'envoi de la commande a échoué, veuillez réessayer";
"指令已发送,等待电脑确认…" = "La commande a été envoyée, en attente de confirmation informatique...";
"按住并拖动,可滑出按键范围,松开结束拖拽" = "Appuyez et faites glisser pour sortir de la plage de touches, relâchez pour terminer le glissement";
"授权后可使用远程连接。" = "Les connexions à distance sont disponibles après autorisation.";
"授权状态" = "Statut d'autorisation";
"接收" = "Réception";
"控制模式" = "Mode de contrôle";
"控制端解码器" = "Décodeur local";
"撤回授权" = "Retirer l'autorisation";
"撤回隐私授权" = "Retirer l'autorisation de confidentialité";
"收起电脑键盘" = "Masquer le clavier du PC";
"收起系统键盘" = "Réduire le clavier système";
"收起远程控制菜单" = "Réduire le menu de la télécommande";
"收起鼠标" = "Masquer la souris";
"数据" = "Données";
"断开后将返回首页" = "Reviendra à la page d'accueil après la déconnexion";
"断开远程连接?" = "Déconnecter la connexion à distance ?";
"断开连接" = "Déconnecter";
"新版本" = "Nouvelle version";
"新版本可用:v%1$@" = "Nouvelle version disponible : v%1$@";
"无效" = "Invalide";
"无未读公告" = "Aucune annonce non lue";
"无法" = "Impossible de";
"无法保存本地阅读状态,请重试。" = "Impossible d'enregistrer l'état de lecture localement. Veuillez réessayer.";
"无法删除这条公告,请重试。" = "Impossible de supprimer cette annonce. Veuillez réessayer.";
"无法访问本机登录凭据,请解锁后重试" = "Impossible d'accéder aux informations de connexion locales, veuillez déverrouiller et réessayer";
"无法读取开源许可" = "Impossible de lire la licence open source";
"无法读取所选文件,请重试" = "Impossible de lire le fichier sélectionné, veuillez réessayer";
"是否撤回隐私授权?" = "Retirer l'autorisation de confidentialité ?";
"显示器" = "Écran";
"显示器 %1$@" = "Moniteur %1$@";
"显示器 1" = "Moniteur 1";
"显示密码" = "Afficher le mot de passe";
"暂不同意" = "Pas maintenant";
"暂无公告" = "Aucune annonce";
"最近连接" = "Connexions récentes";
"服务器" = "Serveur";
"服务器地址" = "Adresse du serveur";
"服务器端口" = "Port du serveur";
"服务器配置无效" = "Configuration du serveur invalide";
"未勾选" = "Non coché";
"未启用" = "Non activé";
"未授权" = "Non autorisé";
"未知" = "Inconnu";
"未知信令状态" = "État de signalisation inconnu";
"未知连接状态" = "État de connexion inconnu";
"未读" = "Non lu";
"未连接" = "Non connecté";
"本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。" = "Cette application utilise OpenFEC pour la correction d'erreur directe sousCeCILL-C1.0, qui offre des garanties limitées et limite la responsabilité. Consultez la licence complète pour plus de détails.";
"本机 ID %1$@" = "ID local %1$@";
"本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。" = "Les informations de connexion pour cette machine ne sont temporairement pas sécurisées. Veuillez déverrouiller votre appareil et cliquer sur « Appliquer » dans les paramètres pour réessayer.";
"本版本源码与构建说明" = "Code source et instructions de construction pour cette version";
"本版本源码信息暂不可用。" = "La révision source n'est pas disponible pour cette version.";
"构建说明" = "Instructions de construction";
"构建配方与项目补丁" = "Créer des recettes et des correctifs de projet";
"查看源码" = "Afficher le code source";
"检查失败,请稍后重试" = "La vérification a échoué. Veuillez réessayer plus tard.";
"检查更新" = "Rechercher des mises à jour";
"正在关闭隐私屏…" = "Fermeture de l'écran de confidentialité…";
"正在准备连接…" = "Préparation de la connexion...";
"正在发送 %1$@" = "Envoi de %1$@";
"正在发送 Ctrl+Alt+Del…" = "Envoi de Ctrl+Alt+Del…";
"正在取回远程画面…" = "Récupération de l'écran distant...";
"正在建立远程连接" = "Établissement d'une connexion à distance";
"正在开启隐私屏…" = "Activation de l'écran de confidentialité...";
"正在收集 ICE 候选" = "Collecte des candidats ICE";
"正在检查更新…" = "Vérification des mises à jour…";
"正在清除…" = "Effacement...";
"正在确认设备状态…" = "Confirmation de l'état de l'appareil...";
"正在获取本机 ID…" = "Obtention d'une pièce d'identité locale...";
"正在连接" = "Connexion";
"正在连接信令服务" = "Connexion au service de signalisation";
"清除" = "Effacer";
"清除预览图" = "Supprimer les aperçus";
"清除预览图?" = "Supprimer les aperçus ?";
"源码与构建说明" = "Code source et instructions de construction";
"源码版本" = "Version du code source";
"版本" = "Version";
"版权与许可声明" = "Déclaration de droits d'auteur et de licence";
"电脑键盘" = "Clavier d'ordinateur";
"画中画未能开启,请保持应用在前台后重试。" = "L'image dans l'image n'a pas pu s'ouvrir. Veuillez conserver l'application au premier plan et réessayer.";
"画质优先" = "Qualité";
"画面偏好" = "Préférence vidéo";
"画面延时" = "Latence vidéo";
"画面设置" = "Paramètres vidéo";
"画面质量" = "Qualité vidéo";
"画面采集帧率" = "Fréquence d'images de capture vidéo";
"相对位置" = "Pavé tactile";
"相对鼠标" = "Souris relative";
"知道了" = "Compris";
"确定" = "D'accord";
"确认" = "Confirmer";
"离线" = "Hors ligne";
"空格" = "Espace";
"端口" = "Port";
"符号功能" = "Symboles et touches";
"等待电脑返回隐私屏状态;旧版电脑端可能不支持" = "Attendez que l'ordinateur revienne à l'état de l'écran de confidentialité ; les ordinateurs plus anciens peuvent ne pas le prendre en charge.";
"等待连接" = "En attente de connexion";
"等待隐私授权" = "En attente d'une autorisation de confidentialité";
"系统键盘" = "Clavier système";
"绝对位置" = "Toucher direct";
"绝对鼠标" = "Souris absolue";
"网络状态" = "Réseau";
"网络连接已中断,请重新连接。" = "La connexion réseau a été interrompue, veuillez vous reconnecter.";
"自定义" = "Personnalisé";
"虚拟鼠标" = "Souris virtuelle";
"被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴" = "Le terminal contrôlé ne prend pas en charge la saisie directe du chinois, veuillez mettre à jour le terminal contrôlé par macOS ; vous pouvez également d'abord copier le texte, l'envoyer via le presse-papiers du menu de la télécommande, puis le coller";
"被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。" = "L'écran de confidentialité à distance a été déverrouillé à l'aide du raccourci local. Verrouillez-le à nouveau pour restaurer la confidentialité et désactiver le déverrouillage des raccourcis locaux.";
"被控端平台:%1$@" = "Plateforme terminale contrôlée :%1$@";
"被控端版本过低,请升级到最新版本。" = "La version contrôlée est trop basse, veuillez mettre à niveau vers la dernière version.";
"被控端编码器" = "Encodeur déporté";
"视频" = "Vidéo";
"视频 %1$@×%2$@ · %3$@ 帧" = "Vidéo %1$@×%2$@· Images %3$@";
"触摸位置直接对应远端屏幕位置,适合快速定位。" = "La position tactile correspond directement à la position de l'écran distant, ce qui convient à un positionnement rapide.";
"许可" = "Licence";
"许可与版权声明" = "Licences et mentions de droits d'auteur";
"许可与版权声明可离线查阅。" = "La licence et la notice de copyright sont disponibles hors ligne.";
"设备离线" = "Appareil hors ligne";
"设置" = "Réglages";
"设置,有新版本" = "Paramètres, il existe une nouvelle version";
"访问密码" = "Mot de passe d'accès";
"访问密码错误,请重新输入。" = "Le mot de passe d'accès est erroné, veuillez le saisir à nouveau.";
"请求超时,尚未确认电脑的隐私屏状态" = "Le délai de demande a expiré et l'état de l'écran de confidentialité de l'ordinateur n'a pas été confirmé.";
"请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。" = "Veuillez saisir un port compris entre 1 et 65 535 ou désactivez « Utiliser un serveur personnalisé ».";
"请输入服务器地址,或关闭“使用自定义服务器”。" = "Veuillez saisir l'adresse du serveur ou désactiver « Utiliser un serveur personnalisé ».";
"请输入远程设备 ID" = "Veuillez saisir l'ID de l'appareil distant";
"调整失败,请重试。" = "Impossible d'appliquer les paramètres. Essayer à nouveau.";
"软件许可" = "Licence du logiciel";
"返回控制栏" = "Retour à la barre de contrôle";
"还没有连接记录" = "Aucun enregistrement de connexion pour l'instant";
"这条公告已更新或删除,请返回公告列表查看。" = "Cette annonce a été mise à jour ou supprimée, veuillez revenir à la liste des annonces pour la consulter.";
"远程桌面" = "Bureau à distance";
"远程设备 ID 不存在,请检查设备 ID。" = "L'ID de l'appareil distant n'existe pas, veuillez vérifier l'ID de l'appareil.";
"远程设备当前不可用,请稍后重试。" = "L'appareil distant est actuellement indisponible, veuillez réessayer plus tard.";
"远程连接已结束。" = "Connexion à distance terminée.";
"连接" = "Connecter";
"连接延时(RTT)" = "Délai de connexion (RTT)";
"连接建立后可调整,需被控端支持。" = "Disponible lors de la connexion à un appareil distant pris en charge.";
"连接建立后锁定横屏" = "Verrouiller l'écran paysage une fois la connexion établie";
"连接提示" = "Invite de connexion";
"连接方式" = "Méthode de connexion";
"连接远程桌面" = "Connectez-vous au bureau à distance";
"退格" = "Retour arrière";
"通知公告" = "Annonces";
"部分预览图未能清除,请重试。" = "Certains aperçus n'ont pas pu être effacés, veuillez réessayer.";
"重试" = "Réessayez";
"重试保存阅读状态" = "Réessayez d'enregistrer l'état de lecture";
"锁定" = "Verrouillage";
"键盘" = "Clavier";
"键盘操作" = "Fonctionnement du clavier";
"阅读并授权" = "Lire et autoriser";
"隐私" = "Confidentialité";
"隐私与授权" = "Confidentialité et autorisation";
"隐私屏" = "Écran de confidentialité";
"隐私屏已关闭" = "Confidentialité inactive";
"隐私屏已开启" = "Confidentialité active";
"隐私屏已被解锁" = "Écran de confidentialité déverrouillé";
"隐私屏异常" = "Anomalie de l'écran de confidentialité";
"隐私屏暂不可用" = "L'écran de confidentialité est temporairement indisponible";
"隐私屏状态已过期,等待电脑确认" = "L'état de l'écran de confidentialité a expiré, en attente de confirmation par l'ordinateur";
"隐私屏状态待确认" = "Statut de l'écran de confidentialité à confirmer";
"隐私政策" = "Politique de confidentialité";
"隐私政策暂时无法读取,请拒绝联网并重新安装应用。" = "La politique de confidentialité ne peut pas être lue temporairement. Veuillez refuser de vous connecter à Internet et réinstaller l'application.";
"隐藏密码" = "Masquer le mot de passe";
"静音" = "Muet";
"音频" = "Audio";
"项目主页" = "Site Web du projet";
"预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。" = "Les aperçus peuvent contenir des informations personnelles ou professionnelles provenant de l'ordinateur distant. Après l'avoir allumé, chaque connexion enregistrera automatiquement une image sur la machine et l'affichera dans les connexions récentes. Vous pouvez fermer et effacer à tout moment.";
"高" = "Élevée";
"默认" = "Par défaut";
"默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。" = "Désactivé par défaut. Lorsqu'il est allumé, l'iPhone passe et reste en orientation paysage lorsqu'il est connecté ; lorsqu'il est éteint, il suit l'orientation de l'appareil. Les iPad ne sont pas concernés.";
"鼠标右键" = "Bouton droit de la souris";
"鼠标左键" = "Bouton gauche de la souris";
"鼠标控制" = "Contrôle de la souris";
"鼠标滚轮" = "Molette de la souris";
@@ -0,0 +1 @@
"NSLocalNetworkUsageDescription" = "CrossDeskは、ローカル ネットワークを使用してネイティブ P2P リモート コントロール接続を検出し、確立します。";
@@ -0,0 +1,283 @@
// Generated by localization/generate.py.
"%1$@ 传输失败" = "%1$@送信失敗";
"%1$@ 台设备" = "デバイス数: %1$@";
"%1$@ 条未读" = "%1$@の未読アイテム";
"%1$@键盘页" = "%1$@キーボードページ";
"%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@" = "%1$@、受信%2$@、送信%3$@、パケットロス率%4$@";
"CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。" = "CrossDeskは、ローカル ネットワークを使用してネイティブ P2P リモート コントロール接続を検出し、確立します。";
"Ctrl+Alt+Del 需要远端启用 Windows 系统服务" = "Ctrl+Alt+Delでは Windows システム サービスのリモート アクティベーションが必要です";
"GNU GPL 第 3 版" = "GNU GPL バージョン 3";
"OpenFEC 告知" = "OpenFEC通知";
"OpenFEC 许可与源码" = "OpenFECライセンスとソース";
"P2P 直连" = "P2P直接接続";
"P2P/TURN 建链失败,请检查网络后重试。" = "P2P/TURNリンクの確立に失敗しました。ネットワークを確認して再試行してください。";
"SRTP 已启用" = "SRT有効";
"TLS 证书校验失败" = "TLS証明書の検証に失敗しました";
"TURN 中继" = "ターンリレー";
"上下滑动,可滑出按键范围" = "上下にスライドしてキー範囲外にスライドします";
"丢包率" = "損失率";
"中" = "中";
"优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。" = "画像を滑らかに保つことを優先し、帯域幅やエンコード圧力が高い場合には、より積極的に解像度を下げます。";
"低" = "低";
"使用自定义服务器" = "カスタムサーバーの使用";
"保存密码" = "パスワードの保存";
"保存远程画面预览" = "リモート画面のプレビューを保存する";
"保存远程画面预览?" = "リモート画面のプレビューを保存しますか?";
"信令服务器已关闭连接" = "シグナリングサーバーが接続を閉じました";
"信令服务重连中" = "シグナリング サービスの再接続";
"信令连接失败" = "シグナリング接続に失敗しました";
"信令连接已关闭" = "信号接続が閉じられています";
"偏好模式" = "プリファレンスモード";
"像触控板一样滑动光标,点击时操作当前光标位置。" = "トラックパッドのようにカーソルをスライドさせ、クリックすると現在のカーソル位置を操作します。";
"公告加载失败,请重试。" = "お知らせを読み込めませんでした。再試行してください。";
"公告详情" = "発表内容";
"共 %1$@ 条 · %2$@ 条未读" = "合計%1$@個のアイテム ·%2$@個の未読アイテム";
"关于" = "概要";
"关于 CrossDesk" = "CrossDesk について";
"关于,有新版本" = "について、新しいバージョンがあります";
"关闭" = "閉じる";
"关闭控制栏" = "コントロールバーを閉じる";
"关闭隐私屏" = "プライバシー画面を無効にする";
"兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。" = "明瞭さと滑らかさのバランスを保ち、一定の圧力下で解像度を徐々に低下させるだけです。";
"分辨率" = "解像度";
"切换到电脑键盘" = "コンピューターのキーボードに切り替える";
"切换到系统键盘" = "システムキーボードに切り替える";
"删除" = "削除";
"删除公告" = "お知らせの削除";
"删除记录" = "レコードの削除";
"删除这条公告?" = "このお知らせを削除しますか?";
"刷新公告" = "リフレッシュのお知らせ";
"剪贴板" = "クリップボード";
"剪贴板中没有文本" = "クリップボードにテキストがありません";
"剪贴板文本超过 128 KiB" = "クリップボードのテキストが 128 KiB を超えています";
"加载中…" = "読み込み中…";
"加载更多" = "さらに読み込む";
"升级提示" = "更新のご案内";
"单次输入最多 16 KiB,且不能包含空字符" = "1 つの入力は最大 16 KiB であり、null 文字を含めることはできません";
"发送" = "送信";
"发送文件" = "ファイル送信";
"取消" = "キャンセル";
"取消连接" = "接続をキャンセルする";
"各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。" = "各コンポーネントは、リストされているオープン ソース ライセンスの対象となり、付与された権利は、このアプリケーションの一般的な使用条件の対象ではありません。ソース コードを表示するには、インターネット接続が必要です。";
"合计" = "合計";
"同意并继续" = "同意して続行";
"回车" = "入る";
"在线" = "オンライン";
"地址" = "住所";
"填写服务器地址" = "サーバーアドレスを入力します";
"填写端口" = "ポートを記入します";
"声音" = "サウンド";
"失败" = "失敗しました";
"始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。" = "帯域幅が不十分な場合は、常に高い解像度を維持し、フレーム レートを下げて画像の鮮明さを確保します。";
"媒体加密" = "メディアの暗号化";
"字母数字" = "英数字";
"完成" = "完了";
"完成隐私授权后可检查更新" = "プライバシー認証を完了すると、アップデートを確認できます";
"完成隐私授权后登记本机身份" = "プライバシー認証完了後、ローカル ID を登録します";
"密码将安全保存在本机 Keychain 中" = "パスワードはローカルのキーチェーンに安全に保存されます";
"对端 ID" = "リモートID";
"对端 ID %1$@" = "ピアID%1$@";
"将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。" = "リモート接続を停止し、画面プレビューの保存を閉じて、既存のプレビューをクリアします。接続記録と受信したファイルは保持され、既存のサーバー データは削除されません。いつでも再認証できます。";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。" = "本機に保存されているリモートプレビューはすべて削除されますが、接続記録、パスワード、受信したファイルは保持されます。";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。" = "本機に保存されているリモート プレビューはすべて削除されますが、接続記録、パスワード、受信したファイルは保持されます。後続の接続でも新しいプレビューが保存されます。";
"屏幕方向" = "画面の向き";
"展开远程控制菜单" = "リモコンメニューを展開する";
"已保存密码" = "パスワード保存済み";
"已勾选" = "チェックあり";
"已发送 Ctrl+Alt+Del" = "Ctrl+Alt+Delを送信しました";
"已发送本机剪贴板" = "ローカルのクリップボードを送信しました";
"已授权" = "認められる";
"已接收 %1$@" = "%1$@を受け取りました";
"已接收远端剪贴板" = "リモートクリップボードを受信しました";
"已读" = "読む";
"已连接" = "接続されました";
"已连接服务器" = "サーバーに接続しました";
"帧率" = "フレームレート";
"帧率优先" = "滑らかさ";
"平衡" = "バランス";
"应用中的许可文件缺失或损坏,请重新安装应用。" = "アプリケーション内のライセンス ファイルが見つからないか破損しています。アプリケーションを再インストールしてください。";
"开发版本包含尚未发布的修改,以下链接为基础版本源码。" = "開発バージョンには、まだリリースされていない修正が含まれています。以下のリンクは基本バージョンのソースコードです。";
"开启保存" = "保存を有効にする";
"开启隐私屏" = "プライバシー画面を有効にする";
"开源组件" = "オープンソースコンポーネント";
"开源软件权利说明" = "オープンソース ソフトウェアの権利の説明";
"当前已是最新版本" = "これが現在の最新バージョンです";
"成功连接后,这里会显示远端桌面的缩略图。" = "接続に成功すると、ここにリモート デスクトップのサムネイルが表示されます。";
"我已阅读并同意《隐私政策》" = "プライバシーポリシーを読んで同意します";
"我已阅读并同意隐私政策" = "プライバシーポリシーを読んで同意します";
"打开隐私政策" = "オープンなプライバシーポリシー";
"指令发送失败,请重试" = "コマンドの送信に失敗しました。もう一度お試しください。";
"指令已发送,等待电脑确认…" = "コマンドが送信され、コンピューターの確認を待っています...";
"按住并拖动,可滑出按键范围,松开结束拖拽" = "押してドラッグするとキー範囲からスライドし、放すとドラッグが終了します";
"授权后可使用远程连接。" = "認証後、リモート接続が可能になります。";
"授权状态" = "認可ステータス";
"接收" = "受信";
"控制模式" = "制御モード";
"控制端解码器" = "ローカルデコーダ";
"撤回授权" = "認可の撤回";
"撤回隐私授权" = "プライバシー認証の撤回";
"收起电脑键盘" = "PC キーボードを隠す";
"收起系统键盘" = "システムキーボードを折りたたむ";
"收起远程控制菜单" = "リモコンメニューを折りたたむ";
"收起鼠标" = "マウスを隠す";
"数据" = "データ";
"断开后将返回首页" = "切断後ホームページに戻ります";
"断开远程连接?" = "リモート接続を切断しますか?";
"断开连接" = "切断";
"新版本" = "新しいバージョン";
"新版本可用:v%1$@" = "利用可能な新しいバージョン: v%1$@";
"无效" = "無効";
"无未读公告" = "未読のお知らせはありません";
"无法" = "できません";
"无法保存本地阅读状态,请重试。" = "読み取りステータスをローカルに保存できません。もう一度試してください。";
"无法删除这条公告,请重试。" = "このお知らせは削除できません。もう一度試してください。";
"无法访问本机登录凭据,请解锁后重试" = "ローカル ログイン資格情報にアクセスできません。ロックを解除して再試行してください。";
"无法读取开源许可" = "オープンソースライセンスを読み取れません";
"无法读取所选文件,请重试" = "選択したファイルを読み取れません。もう一度お試しください。";
"是否撤回隐私授权?" = "プライバシー認証を取り消しますか?";
"显示器" = "ディスプレイ";
"显示器 %1$@" = "モニター%1$@";
"显示器 1" = "モニター1";
"显示密码" = "パスワードを表示";
"暂不同意" = "今は同意しない";
"暂无公告" = "アナウンスはありません";
"最近连接" = "最近の接続";
"服务器" = "サーバー";
"服务器地址" = "サーバーアドレス";
"服务器端口" = "サーバーポート";
"服务器配置无效" = "無効なサーバー構成";
"未勾选" = "チェックなし";
"未启用" = "有効ではありません";
"未授权" = "無許可";
"未知" = "不明";
"未知信令状态" = "不明な信号ステータス";
"未知连接状态" = "不明な接続ステータス";
"未读" = "未読";
"未连接" = "接続されていません";
"本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。" = "このアプリケーションは、限定保証を提供し、責任を制限するCeCILL-C1.0 に基づく前方誤り訂正にOpenFECを使用します。詳細については、完全なライセンスを参照してください。";
"本机 ID %1$@" = "ローカルID%1$@";
"本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。" = "このマシンのログイン資格情報は一時的に安全ではありません。デバイスのロックを解除し、設定で「適用」をクリックして再試行してください。";
"本版本源码与构建说明" = "このバージョンのソース コードとビルド手順";
"本版本源码信息暂不可用。" = "このビルドではソース リビジョンが利用できません。";
"构建说明" = "組み立て説明書";
"构建配方与项目补丁" = "ビルドレシピとプロジェクトパッチ";
"查看源码" = "ソースコードを表示する";
"检查失败,请稍后重试" = "チェックに失敗しました。後でもう一度試してください。";
"检查更新" = "アップデートを確認する";
"正在关闭隐私屏…" = "プライバシー画面を閉じています…";
"正在准备连接…" = "接続準備中...";
"正在发送 %1$@" = "%1$@の送信";
"正在发送 Ctrl+Alt+Del…" = "Ctrl+Alt+Delを送信中 …";
"正在取回远程画面…" = "リモート画面を取得中...";
"正在建立远程连接" = "リモート接続の確立";
"正在开启隐私屏…" = "プライバシー画面を有効化中…";
"正在收集 ICE 候选" = "ICE 候補を収集中";
"正在检查更新…" = "アップデートを確認しています…";
"正在清除…" = "クリア中...";
"正在确认设备状态…" = "機器の状態を確認しています...";
"正在获取本机 ID…" = "ローカルIDを取得中...";
"正在连接" = "接続する";
"正在连接信令服务" = "シグナリングサービスへの接続";
"清除" = "クリア";
"清除预览图" = "プレビューを削除";
"清除预览图?" = "プレビューを削除しますか?";
"源码与构建说明" = "ソースコードとビルド手順";
"源码版本" = "ソースコードのバージョン";
"版本" = "バージョン";
"版权与许可声明" = "著作権およびライセンスに関する声明";
"电脑键盘" = "コンピューターのキーボード";
"画中画未能开启,请保持应用在前台后重试。" = "ピクチャーインピクチャーを開けませんでした。アプリケーションをフォアグラウンドに保ち、もう一度お試しください。";
"画质优先" = "画質";
"画面偏好" = "ビデオ設定";
"画面延时" = "映像遅延";
"画面设置" = "ビデオ設定";
"画面质量" = "ビデオ品質";
"画面采集帧率" = "ビデオキャプチャフレームレート";
"相对位置" = "トラックパッド";
"相对鼠标" = "相対マウス";
"知道了" = "分かりました";
"确定" = "OK";
"确认" = "確認する";
"离线" = "オフライン";
"空格" = "スペース";
"端口" = "港";
"符号功能" = "記号・機能";
"等待电脑返回隐私屏状态;旧版电脑端可能不支持" = "コンピューターがプライバシー画面の状態に戻るまで待ちます。古いコンピューターではサポートされていない可能性があります。";
"等待连接" = "接続待ち";
"等待隐私授权" = "プライバシー認証待ち";
"系统键盘" = "システムキーボード";
"绝对位置" = "直接タッチ";
"绝对鼠标" = "アブソリュートマウス";
"网络状态" = "ネットワーク";
"网络连接已中断,请重新连接。" = "ネットワーク接続が切断されました。再接続してください。";
"自定义" = "カスタム";
"虚拟鼠标" = "仮想マウス";
"被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴" = "制御端末は中国語の直接入力をサポートしていません。macOS 制御端末を更新してください。最初にテキストをコピーし、リモート コントロール メニューのクリップボード経由で送信してから貼り付けることもできます。";
"被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。" = "ローカル ショートカットを使用してリモート プライバシー画面のロックが解除されました。再度ロックするとプライバシーが回復され、ローカル ショートカットのロック解除が無効になります。";
"被控端平台:%1$@" = "制御端末プラットフォーム:%1$@";
"被控端版本过低,请升级到最新版本。" = "管理されているバージョンが低すぎるため、最新バージョンにアップグレードしてください。";
"被控端编码器" = "リモートエンコーダー";
"视频" = "ビデオ";
"视频 %1$@×%2$@ · %3$@ 帧" = "ビデオ%1$@×%2$@・%3$@フレーム";
"触摸位置直接对应远端屏幕位置,适合快速定位。" = "タッチ位置はリモート画面位置に直接対応するため、素早い位置決めに適しています。";
"许可" = "ライセンス";
"许可与版权声明" = "ライセンスと著作権表示";
"许可与版权声明可离线查阅。" = "ライセンスと著作権表示はオフラインでも利用できます。";
"设备离线" = "デバイスがオフライン";
"设置" = "設定";
"设置,有新版本" = "設定、新しいバージョンがあります";
"访问密码" = "アクセスパスワード";
"访问密码错误,请重新输入。" = "アクセスパスワードが間違っていますので、再度入力してください。";
"请求超时,尚未确认电脑的隐私屏状态" = "リクエストがタイムアウトし、コンピュータのプライバシー画面の状態が確認できませんでした。";
"请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。" = "1 ~ 65535 の範囲でポートを入力するか、「カスタム サーバーを使用する」をオフにしてください。";
"请输入服务器地址,或关闭“使用自定义服务器”。" = "サーバーアドレスを入力するか、「カスタムサーバーを使用する」をオフにしてください。";
"请输入远程设备 ID" = "リモートデバイスIDを入力してください";
"调整失败,请重试。" = "設定を適用できませんでした。もう一度やり直してください。";
"软件许可" = "ソフトウェアライセンス";
"返回控制栏" = "コントロールバーに戻る";
"还没有连接记录" = "まだ接続実績がありません";
"这条公告已更新或删除,请返回公告列表查看。" = "このお知らせは更新または削除されました。表示するにはお知らせリストに戻ってください。";
"远程桌面" = "リモートデスクトップ";
"远程设备 ID 不存在,请检查设备 ID。" = "リモートデバイス ID が存在しません。デバイス ID を確認してください。";
"远程设备当前不可用,请稍后重试。" = "リモート デバイスは現在利用できません。後でもう一度試してください。";
"远程连接已结束。" = "リモート接続が終了しました。";
"连接" = "接続";
"连接延时(RTT)" = "接続遅延 (RTT)";
"连接建立后可调整,需被控端支持。" = "サポートされているリモート デバイスに接続されている場合に使用できます。";
"连接建立后锁定横屏" = "接続完了後、横画面をロックする";
"连接提示" = "接続プロンプト";
"连接方式" = "接続方法";
"连接远程桌面" = "リモートデスクトップに接続する";
"退格" = "バックスペース";
"通知公告" = "お知らせ";
"部分预览图未能清除,请重试。" = "一部のプレビューをクリアできませんでした。もう一度お試しください。";
"重试" = "もう一度お試しください";
"重试保存阅读状态" = "読み取りステータスの保存をリトライする";
"锁定" = "ロック";
"键盘" = "キーボード";
"键盘操作" = "キーボード操作";
"阅读并授权" = "読んで承認する";
"隐私" = "プライバシー";
"隐私与授权" = "プライバシーと認証";
"隐私屏" = "プライバシー画面";
"隐私屏已关闭" = "プライバシー画面:オフ";
"隐私屏已开启" = "プライバシー画面:オン";
"隐私屏已被解锁" = "プライバシー画面のロックが解除されました";
"隐私屏异常" = "プライバシー画面異常";
"隐私屏暂不可用" = "プライバシー画面が一時的に利用できなくなります";
"隐私屏状态已过期,等待电脑确认" = "プライバシー画面のステータスが期限切れになり、コンピュータの確認を待っています";
"隐私屏状态待确认" = "プライバシー画面のステータスを確認する";
"隐私政策" = "プライバシーポリシー";
"隐私政策暂时无法读取,请拒绝联网并重新安装应用。" = "一時的にプライバシーポリシーが閲覧できなくなります。インターネットへの接続を拒否し、アプリケーションを再インストールしてください。";
"隐藏密码" = "パスワードを隠す";
"静音" = "ミュート";
"音频" = "オーディオ";
"项目主页" = "プロジェクトWebサイト";
"预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。" = "プレビューには、リモート コンピューターからの個人情報または仕事情報が含まれる場合があります。オンにすると、接続するたびにマシンに写真が自動的に保存され、最近の接続で表示されます。いつでも閉じてクリアできます。";
"高" = "高";
"默认" = "デフォルト";
"默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。" = "デフォルトではオフです。オンにすると、iPhone は接続時に横向きになり、横向きのままになります。オフにすると、デバイスの向きに従います。 iPad は影響を受けません。";
"鼠标右键" = "マウスの右ボタン";
"鼠标左键" = "マウスの左ボタン";
"鼠标控制" = "マウスコントロール";
"鼠标滚轮" = "マウスホイール";
@@ -0,0 +1 @@
"NSLocalNetworkUsageDescription" = "CrossDesk는 로컬 네트워크를 사용하여 기본 P2P 원격 제어 연결을 검색하고 설정합니다.";
@@ -0,0 +1,283 @@
// Generated by localization/generate.py.
"%1$@ 传输失败" = "%1$@전송 실패";
"%1$@ 台设备" = "기기: %1$@";
"%1$@ 条未读" = "%1$@읽지 않은 항목";
"%1$@键盘页" = "%1$@키보드 페이지";
"%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@" = "%1$@, 수신%2$@, 송신%3$@, 패킷 손실률%4$@";
"CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。" = "CrossDesk는 로컬 네트워크를 사용하여 기본 P2P 원격 제어 연결을 검색하고 설정합니다.";
"Ctrl+Alt+Del 需要远端启用 Windows 系统服务" = "Ctrl+Alt+Del에는 Windows 시스템 서비스의 원격 활성화가 필요합니다.";
"GNU GPL 第 3 版" = "GNU GPL 버전 3";
"OpenFEC 告知" = "OpenFEC공지";
"OpenFEC 许可与源码" = "OpenFEC라이선스 및 소스";
"P2P 直连" = "P2P 직접 연결";
"P2P/TURN 建链失败,请检查网络后重试。" = "P2P/TURN링크 설정에 실패했습니다. 네트워크를 확인하고 다시 시도하십시오.";
"SRTP 已启用" = "SRTP 활성화됨";
"TLS 证书校验失败" = "TLS인증서 확인 실패";
"TURN 中继" = "TURN 릴레이";
"上下滑动,可滑出按键范围" = "키 범위에서 벗어나려면 위아래로 슬라이드하세요.";
"丢包率" = "손실률";
"中" = "중간";
"优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。" = "영상을 부드럽게 유지하는 데 우선 순위를 두며 대역폭이나 인코딩 압력이 높을 때 해상도를 더욱 적극적으로 줄입니다.";
"低" = "낮음";
"使用自定义服务器" = "커스텀 서버 이용하기";
"保存密码" = "비밀번호 저장";
"保存远程画面预览" = "원격 화면 미리보기 저장";
"保存远程画面预览?" = "원격 화면 미리보기를 저장하시겠습니까?";
"信令服务器已关闭连接" = "시그널링 서버가 연결을 종료했습니다.";
"信令服务重连中" = "시그널링 서비스 재접속";
"信令连接失败" = "시그널링 연결 실패";
"信令连接已关闭" = "신호 연결이 닫혔습니다.";
"偏好模式" = "선호 모드";
"像触控板一样滑动光标,点击时操作当前光标位置。" = "커서를 트랙패드처럼 밀어서 클릭하면 현재 커서 위치를 조작합니다.";
"公告加载失败,请重试。" = "공지사항 로딩에 실패했습니다. 다시 시도해주세요.";
"公告详情" = "공지사항";
"共 %1$@ 条 · %2$@ 条未读" = "총%1$@항목 ·%2$@읽지 않은 항목";
"关于" = "소개";
"关于 CrossDesk" = "CrossDesk 정보";
"关于,有新版本" = "새 버전이 있습니다.";
"关闭" = "닫기";
"关闭控制栏" = "컨트롤 바 닫기";
"关闭隐私屏" = "개인 정보 보호 화면 비활성화";
"兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。" = "선명도와 부드러움의 균형을 유지하며 일정한 압력을 가하면 해상도가 점차 감소합니다.";
"分辨率" = "해상도";
"切换到电脑键盘" = "컴퓨터 키보드로 전환";
"切换到系统键盘" = "시스템 키보드로 전환";
"删除" = "삭제";
"删除公告" = "공지사항 삭제";
"删除记录" = "기록 삭제";
"删除这条公告?" = "이 공지를 삭제하시겠습니까?";
"刷新公告" = "새로고침 안내";
"剪贴板" = "클립보드";
"剪贴板中没有文本" = "클립보드에 텍스트가 없습니다.";
"剪贴板文本超过 128 KiB" = "클립보드 텍스트가 128KiB를 초과합니다.";
"加载中…" = "로드 중…";
"加载更多" = "더 로드하기";
"升级提示" = "업데이트 안내";
"单次输入最多 16 KiB,且不能包含空字符" = "단일 입력은 최대 16KiB일 수 있으며 null 문자를 포함할 수 없습니다.";
"发送" = "송신";
"发送文件" = "파일 보내기";
"取消" = "취소";
"取消连接" = "연결 취소";
"各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。" = "각 구성 요소에는 나열된 오픈 소스 라이선스가 적용되며 부여된 권리에는 이 애플리케이션의 일반 사용 약관이 적용되지 않습니다. 소스 코드를 보려면 인터넷 연결이 필요합니다.";
"合计" = "합계";
"同意并继续" = "동의하고 계속하기";
"回车" = "들어가다";
"在线" = "온라인";
"地址" = "주소";
"填写服务器地址" = "서버 주소를 입력하세요";
"填写端口" = "포트를 채워주세요";
"声音" = "소리";
"失败" = "실패";
"始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。" = "대역폭이 부족할 때 영상 선명도를 보장하려면 항상 더 높은 해상도를 유지하고 프레임 속도를 낮추십시오.";
"媒体加密" = "미디어 암호화";
"字母数字" = "문자·숫자";
"完成" = "완료";
"完成隐私授权后可检查更新" = "개인정보 동의 완료 후 업데이트 내용을 확인할 수 있습니다.";
"完成隐私授权后登记本机身份" = "개인정보 인증 완료 후 로컬 신원 등록";
"密码将安全保存在本机 Keychain 中" = "비밀번호는 로컬 키체인에 안전하게 저장됩니다.";
"对端 ID" = "원격 ID";
"对端 ID %1$@" = "피어 ID%1$@";
"将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。" = "원격 연결을 중지하고 화면 미리보기 저장을 닫은 후 기존 미리보기를 지웁니다. 접속 기록 및 수신 파일은 그대로 유지되며, 기존 서버 데이터는 삭제되지 않습니다. 언제든지 재승인할 수 있습니다.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。" = "이 기기에 저장된 원격 미리보기는 모두 삭제되지만 연결 기록, 비밀번호 및 수신된 파일은 유지됩니다.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。" = "이 기기에 저장된 원격 미리보기는 모두 삭제되지만 연결 기록, 비밀번호 및 수신된 파일은 유지됩니다. 후속 연결에서는 계속해서 새로운 미리보기가 저장됩니다.";
"屏幕方向" = "화면 방향";
"展开远程控制菜单" = "원격제어 메뉴 확장";
"已保存密码" = "비밀번호 저장됨";
"已勾选" = "확인됨";
"已发送 Ctrl+Alt+Del" = "Ctrl+Alt+Del가 전송되었습니다.";
"已发送本机剪贴板" = "로컬 클립보드 전송됨";
"已授权" = "승인됨";
"已接收 %1$@" = "%1$@수신됨";
"已接收远端剪贴板" = "원격 클립보드 수신됨";
"已读" = "읽기";
"已连接" = "연결됨";
"已连接服务器" = "서버에 연결됨";
"帧率" = "프레임 속도";
"帧率优先" = "부드러움";
"平衡" = "균형";
"应用中的许可文件缺失或损坏,请重新安装应用。" = "애플리케이션의 라이센스 파일이 없거나 손상되었습니다. 애플리케이션을 다시 설치하십시오.";
"开发版本包含尚未发布的修改,以下链接为基础版本源码。" = "개발 버전에는 아직 출시되지 않은 수정 사항이 포함되어 있습니다. 다음 링크는 기본 버전의 소스 코드입니다.";
"开启保存" = "저장 사용";
"开启隐私屏" = "개인 정보 보호 화면 활성화";
"开源组件" = "오픈 소스 구성 요소";
"开源软件权利说明" = "오픈소스 소프트웨어 권리 설명";
"当前已是最新版本" = "현재 최신 버전입니다.";
"成功连接后,这里会显示远端桌面的缩略图。" = "성공적으로 연결되면 원격 데스크톱의 썸네일이 여기에 표시됩니다.";
"我已阅读并同意《隐私政策》" = "개인정보 보호정책을 읽었으며 이에 동의합니다.";
"我已阅读并同意隐私政策" = "개인정보취급방침을 읽었으며 이에 동의합니다.";
"打开隐私政策" = "공개 개인 정보 보호 정책";
"指令发送失败,请重试" = "명령 전송에 실패했습니다. 다시 시도해 주세요.";
"指令已发送,等待电脑确认…" = "명령이 전송되었으며 컴퓨터 확인을 기다리고 있습니다...";
"按住并拖动,可滑出按键范围,松开结束拖拽" = "누르고 드래그하여 키 범위 밖으로 슬라이드하고, 드래그를 종료하려면 놓습니다.";
"授权后可使用远程连接。" = "인증 후 원격접속이 가능합니다.";
"授权状态" = "인증상태";
"接收" = "수신";
"控制模式" = "제어 모드";
"控制端解码器" = "로컬 디코더";
"撤回授权" = "철회 승인";
"撤回隐私授权" = "개인정보 승인 철회";
"收起电脑键盘" = "PC 키보드 숨기기";
"收起系统键盘" = "시스템 키보드 축소";
"收起远程控制菜单" = "리모컨 메뉴 접기";
"收起鼠标" = "마우스 숨기기";
"数据" = "데이터";
"断开后将返回首页" = "연결을 끊으면 홈페이지로 돌아갑니다.";
"断开远程连接?" = "원격 연결을 끊으시겠습니까?";
"断开连接" = "연결 해제";
"新版本" = "새 버전";
"新版本可用:v%1$@" = "새 버전 사용 가능: v%1$@";
"无效" = "유효하지 않음";
"无未读公告" = "읽지 않은 공지사항 없음";
"无法" = "할 수 없다";
"无法保存本地阅读状态,请重试。" = "읽기 상태를 로컬에 저장할 수 없습니다. 다시 시도해 주세요.";
"无法删除这条公告,请重试。" = "이 공지를 삭제할 수 없습니다. 다시 시도해 주세요.";
"无法访问本机登录凭据,请解锁后重试" = "로컬 로그인 자격 증명에 액세스할 수 없습니다. 잠금을 해제하고 다시 시도하십시오.";
"无法读取开源许可" = "오픈소스 라이선스를 읽을 수 없습니다.";
"无法读取所选文件,请重试" = "선택한 파일을 읽을 수 없습니다. 다시 시도해 주세요.";
"是否撤回隐私授权?" = "개인정보 보호 승인을 철회하시겠습니까?";
"显示器" = "디스플레이";
"显示器 %1$@" = "모니터%1$@";
"显示器 1" = "모니터 1";
"显示密码" = "비밀번호 표시";
"暂不同意" = "나중에";
"暂无公告" = "공지 없음";
"最近连接" = "최근 연결";
"服务器" = "서버";
"服务器地址" = "서버 주소";
"服务器端口" = "서버 포트";
"服务器配置无效" = "잘못된 서버 구성";
"未勾选" = "체크하지 않음";
"未启用" = "활성화되지 않음";
"未授权" = "무단";
"未知" = "알 수 없음";
"未知信令状态" = "알 수 없는 신호 상태";
"未知连接状态" = "알 수 없는 연결 상태";
"未读" = "읽지 않음";
"未连接" = "연결되지 않음";
"本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。" = "이 애플리케이션은 제한된 보증과 책임 제한을 제공하는CeCILL-C1.0에 따라 순방향 오류 수정을 위해OpenFEC를 사용합니다. 자세한 내용은 전체 라이센스를 참조하세요.";
"本机 ID %1$@" = "로컬 ID%1$@";
"本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。" = "이 시스템의 로그인 자격 증명은 일시적으로 안전하지 않습니다. 기기를 잠금 해제하고 설정에서 '적용'을 클릭하여 다시 시도하세요.";
"本版本源码与构建说明" = "이 버전의 소스 코드 및 빌드 지침";
"本版本源码信息暂不可用。" = "이 빌드에는 소스 개정을 사용할 수 없습니다.";
"构建说明" = "빌드 지침";
"构建配方与项目补丁" = "레시피 및 프로젝트 패치 빌드";
"查看源码" = "소스코드 보기";
"检查失败,请稍后重试" = "확인에 실패했습니다. 나중에 다시 시도해 주세요.";
"检查更新" = "업데이트 확인";
"正在关闭隐私屏…" = "개인정보 보호 화면을 닫는 중…";
"正在准备连接…" = "연결 준비 중...";
"正在发送 %1$@" = "%1$@보내기";
"正在发送 Ctrl+Alt+Del…" = "Ctrl+Alt+Del를 보내는 중…";
"正在取回远程画面…" = "원격 화면을 검색하는 중...";
"正在建立远程连接" = "원격 연결 설정";
"正在开启隐私屏…" = "개인정보 보호 화면을 켜는 중...";
"正在收集 ICE 候选" = "ICE후보 수집";
"正在检查更新…" = "업데이트 확인 중…";
"正在清除…" = "지우는 중...";
"正在确认设备状态…" = "기기 상태를 확인하는 중...";
"正在获取本机 ID…" = "로컬 ID를 얻는 중...";
"正在连接" = "연결 중";
"正在连接信令服务" = "시그널링 서비스 연결";
"清除" = "클리어";
"清除预览图" = "미리보기 삭제";
"清除预览图?" = "미리보기를 삭제할까요?";
"源码与构建说明" = "소스 코드 및 빌드 지침";
"源码版本" = "소스코드 버전";
"版本" = "버전";
"版权与许可声明" = "저작권 및 라이선스 정책";
"电脑键盘" = "컴퓨터 키보드";
"画中画未能开启,请保持应用在前台后重试。" = "PIP(Picture-in-Picture)를 열지 못했습니다. 애플리케이션을 포그라운드에 두고 다시 시도하십시오.";
"画质优先" = "화질";
"画面偏好" = "영상 선호도";
"画面延时" = "영상 지연";
"画面设置" = "영상 설정";
"画面质量" = "비디오 품질";
"画面采集帧率" = "비디오 캡처 프레임 속도";
"相对位置" = "트랙패드";
"相对鼠标" = "상대 마우스";
"知道了" = "알겠습니다";
"确定" = "알았어";
"确认" = "확인";
"离线" = "오프라인";
"空格" = "스페이스";
"端口" = "포트";
"符号功能" = "기호·기능";
"等待电脑返回隐私屏状态;旧版电脑端可能不支持" = "컴퓨터가 개인 정보 보호 화면 상태로 돌아갈 때까지 기다립니다. 오래된 컴퓨터에서는 이를 지원하지 않을 수 있습니다.";
"等待连接" = "연결 대기 중";
"等待隐私授权" = "개인정보 인증 대기 중";
"系统键盘" = "시스템 키보드";
"绝对位置" = "직접 터치";
"绝对鼠标" = "앱솔루트 마우스";
"网络状态" = "네트워크";
"网络连接已中断,请重新连接。" = "네트워크 연결이 중단되었습니다. 다시 연결해 주세요.";
"自定义" = "커스텀";
"虚拟鼠标" = "가상마우스";
"被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴" = "제어 터미널은 중국어 직접 입력을 지원하지 않습니다. macOS 제어 터미널을 업데이트하세요. 텍스트를 먼저 복사한 후 리모컨 메뉴의 클립보드를 통해 전송한 후 붙여넣을 수도 있습니다.";
"被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。" = "로컬 단축키를 사용하여 원격 개인정보 보호 화면을 잠금 해제했습니다. 개인정보 보호를 복원하고 로컬 바로가기 잠금 해제를 비활성화하려면 다시 잠그세요.";
"被控端平台:%1$@" = "제어 터미널 플랫폼:%1$@";
"被控端版本过低,请升级到最新版本。" = "제어 버전이 너무 낮습니다. 최신 버전으로 업그레이드하세요.";
"被控端编码器" = "리모트 엔코더";
"视频" = "영상";
"视频 %1$@×%2$@ · %3$@ 帧" = "비디오%1$@×%2$@·%3$@프레임";
"触摸位置直接对应远端屏幕位置,适合快速定位。" = "터치 위치는 원격 화면 위치와 직접적으로 일치하므로 빠른 위치 지정에 적합합니다.";
"许可" = "라이센스";
"许可与版权声明" = "라이센스 및 저작권 고지";
"许可与版权声明可离线查阅。" = "라이센스 및 저작권 고지는 오프라인에서 확인할 수 있습니다.";
"设备离线" = "장치 오프라인";
"设置" = "설정";
"设置,有新版本" = "설정, 새 버전이 있습니다";
"访问密码" = "접속 비밀번호";
"访问密码错误,请重新输入。" = "접속비밀번호가 잘못되었습니다. 다시 입력해 주세요.";
"请求超时,尚未确认电脑的隐私屏状态" = "요청 시간이 초과되어 컴퓨터의 개인 정보 보호 화면 상태가 확인되지 않았습니다.";
"请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。" = "1~65535 범위의 포트를 입력하거나 \"사용자 정의 서버 사용\"을 꺼주세요.";
"请输入服务器地址,或关闭“使用自定义服务器”。" = "서버 주소를 입력하시거나, \"커스텀 서버 사용\"을 꺼주세요.";
"请输入远程设备 ID" = "원격장치 ID를 입력해주세요.";
"调整失败,请重试。" = "설정을 적용할 수 없습니다. 다시 시도해 보세요.";
"软件许可" = "소프트웨어 라이센스";
"返回控制栏" = "컨트롤 바로 돌아가기";
"还没有连接记录" = "아직 접속기록이 없습니다";
"这条公告已更新或删除,请返回公告列表查看。" = "본 공지사항은 업데이트 또는 삭제되었습니다. 공지사항 목록으로 돌아가서 확인하시기 바랍니다.";
"远程桌面" = "원격 데스크톱";
"远程设备 ID 不存在,请检查设备 ID。" = "원격 장치 ID가 존재하지 않습니다. 장치 ID를 확인하십시오.";
"远程设备当前不可用,请稍后重试。" = "현재 원격 장치를 사용할 수 없습니다. 나중에 다시 시도하십시오.";
"远程连接已结束。" = "원격 연결이 종료되었습니다.";
"连接" = "연결";
"连接延时(RTT)" = "연결 지연(RTT)";
"连接建立后可调整,需被控端支持。" = "지원되는 원격 장치에 연결된 경우 사용할 수 있습니다.";
"连接建立后锁定横屏" = "연결 완료 후 가로 화면 잠금";
"连接提示" = "연결 프롬프트";
"连接方式" = "연결 방법";
"连接远程桌面" = "원격 데스크톱에 연결";
"退格" = "백스페이스";
"通知公告" = "공지사항";
"部分预览图未能清除,请重试。" = "일부 미리보기를 삭제할 수 없습니다. 다시 시도해 주세요.";
"重试" = "다시 시도해 보세요";
"重试保存阅读状态" = "읽은 상태 저장 다시 시도";
"锁定" = "잠금";
"键盘" = "키보드";
"键盘操作" = "키보드 조작";
"阅读并授权" = "읽기 및 승인";
"隐私" = "개인 정보 보호";
"隐私与授权" = "개인 정보 보호 및 승인";
"隐私屏" = "개인정보 보호 화면";
"隐私屏已关闭" = "화면 보호 꺼짐";
"隐私屏已开启" = "화면 보호 켜짐";
"隐私屏已被解锁" = "개인정보 보호 화면 잠금 해제됨";
"隐私屏异常" = "개인정보 화면 이상";
"隐私屏暂不可用" = "개인 정보 보호 화면을 일시적으로 사용할 수 없습니다.";
"隐私屏状态已过期,等待电脑确认" = "개인 정보 보호 화면 상태가 만료되어 컴퓨터 확인을 기다리는 중입니다.";
"隐私屏状态待确认" = "개인정보 보호 화면 상태 확인 예정";
"隐私政策" = "개인정보 보호정책";
"隐私政策暂时无法读取,请拒绝联网并重新安装应用。" = "개인정보취급방침은 일시적으로 열람할 수 없습니다. 인터넷 연결을 거부하고 애플리케이션을 다시 설치하십시오.";
"隐藏密码" = "비밀번호 숨기기";
"静音" = "음소거";
"音频" = "오디오";
"项目主页" = "프로젝트 홈페이지";
"预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。" = "미리보기에는 원격 컴퓨터의 개인 정보나 업무 정보가 포함될 수 있습니다. 전원을 켜면 각 연결이 자동으로 기기에 사진을 저장하고 최근 연결에 표시됩니다. 언제든지 닫고 지울 수 있습니다.";
"高" = "높음";
"默认" = "기본값";
"默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。" = "기본적으로 꺼져 있습니다. iPhone을 켜면 연결 시 iPhone이 가로 방향으로 전환되어 유지됩니다. 꺼지면 장치 방향을 따릅니다. iPad는 영향을 받지 않습니다.";
"鼠标右键" = "마우스 오른쪽 버튼";
"鼠标左键" = "마우스 왼쪽 버튼";
"鼠标控制" = "마우스 제어";
"鼠标滚轮" = "마우스 휠";
@@ -0,0 +1 @@
"NSLocalNetworkUsageDescription" = "CrossDesk usa a rede local para descobrir e estabelecer conexões de controle remoto P2P nativas.";
@@ -0,0 +1,283 @@
// Generated by localization/generate.py.
"%1$@ 传输失败" = "Falha na transmissão %1$@";
"%1$@ 台设备" = "Dispositivos: %1$@";
"%1$@ 条未读" = "Itens não lidos %1$@";
"%1$@键盘页" = "Página do teclado %1$@";
"%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@" = "%1$@, recebendo %2$@, enviando %3$@, taxa de perda de pacotes %4$@";
"CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。" = "CrossDesk usa a rede local para descobrir e estabelecer conexões de controle remoto P2P nativas.";
"Ctrl+Alt+Del 需要远端启用 Windows 系统服务" = "Ctrl+Alt+Del requer ativação remota dos serviços do sistema Windows";
"GNU GPL 第 3 版" = "GNU GPL versão 3";
"OpenFEC 告知" = "Aviso OpenFEC";
"OpenFEC 许可与源码" = "Licença e fonte OpenFEC";
"P2P 直连" = "Conexão direta P2P";
"P2P/TURN 建链失败,请检查网络后重试。" = "P2P/TURN Falha no estabelecimento do link, verifique a rede e tente novamente.";
"SRTP 已启用" = "SRT habilitado";
"TLS 证书校验失败" = "Falha na verificação do certificado TLS";
"TURN 中继" = "GIRAR relé";
"上下滑动,可滑出按键范围" = "Deslize para cima e para baixo para sair do intervalo de teclas";
"丢包率" = "Taxa de perda";
"中" = "Média";
"优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。" = "Prioriza manter a imagem suave e reduzirá a resolução de forma mais agressiva quando a largura de banda ou a pressão de codificação forem altas.";
"低" = "Baixa";
"使用自定义服务器" = "Usando um servidor personalizado";
"保存密码" = "Salvar senha";
"保存远程画面预览" = "Salvar visualizações de tela remotas";
"保存远程画面预览?" = "Salvar visualização remota da tela?";
"信令服务器已关闭连接" = "O servidor de sinalização fechou a conexão";
"信令服务重连中" = "Reconexão do serviço de sinalização";
"信令连接失败" = "Falha na conexão de sinalização";
"信令连接已关闭" = "Conexão de sinalização fechada";
"偏好模式" = "Modo de preferência";
"像触控板一样滑动光标,点击时操作当前光标位置。" = "Deslize o cursor como um trackpad e opere a posição atual do cursor quando clicado.";
"公告加载失败,请重试。" = "Falha ao carregar o anúncio. Tente novamente.";
"公告详情" = "Detalhes do anúncio";
"共 %1$@ 条 · %2$@ 条未读" = "Total de itens %1$@· Itens não lidos %2$@";
"关于" = "Sobre";
"关于 CrossDesk" = "Sobre o CrossDesk";
"关于,有新版本" = "Sobre, há uma nova versão";
"关闭" = "Fechar";
"关闭控制栏" = "Fechar barra de controle";
"关闭隐私屏" = "Desativar tela de privacidade";
"兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。" = "Equilibra clareza e suavidade, reduzindo apenas gradualmente a resolução sob pressão constante.";
"分辨率" = "Resolução";
"切换到电脑键盘" = "Mudar para o teclado do computador";
"切换到系统键盘" = "Mudar para o teclado do sistema";
"删除" = "Excluir";
"删除公告" = "Excluir anúncio";
"删除记录" = "Excluir registro";
"删除这条公告?" = "Excluir este anúncio?";
"刷新公告" = "Anúncio de atualização";
"剪贴板" = "Área de transferência";
"剪贴板中没有文本" = "Nenhum texto na área de transferência";
"剪贴板文本超过 128 KiB" = "O texto da área de transferência excede 128 KiB";
"加载中…" = "Carregando…";
"加载更多" = "Carregue mais";
"升级提示" = "Atualização recomendada";
"单次输入最多 16 KiB,且不能包含空字符" = "Uma única entrada pode ter até 16 KiB e não pode conter caracteres nulos";
"发送" = "Enviar";
"发送文件" = "Enviar arquivo";
"取消" = "Cancelar";
"取消连接" = "Cancelar conexão";
"各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。" = "Cada componente está sujeito à licença de código aberto listada e os direitos concedidos não estão sujeitos aos termos gerais de uso deste aplicativo. A visualização do código-fonte requer uma conexão com a Internet.";
"合计" = "Total";
"同意并继续" = "Concorde e continue";
"回车" = "Entrar";
"在线" = "On-line";
"地址" = "Endereço";
"填写服务器地址" = "Preencha o endereço do servidor";
"填写端口" = "Preencha a porta";
"声音" = "Som";
"失败" = "Falhou";
"始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。" = "Sempre mantenha uma resolução mais alta e reduza a taxa de quadros para garantir a clareza da imagem quando a largura de banda for insuficiente.";
"媒体加密" = "Criptografia de mídia";
"字母数字" = "Letras e números";
"完成" = "Feito";
"完成隐私授权后可检查更新" = "Você pode verificar se há atualizações após concluir a autorização de privacidade";
"完成隐私授权后登记本机身份" = "Registre a identidade local após concluir a autorização de privacidade";
"密码将安全保存在本机 Keychain 中" = "As senhas serão armazenadas com segurança no chaveiro local";
"对端 ID" = "ID remoto";
"对端 ID %1$@" = "ID de par %1$@";
"将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。" = "Interromperá a conexão remota, fechará o salvamento da visualização da tela e limpará a visualização existente. Os registros de conexão e os arquivos recebidos serão retidos e os dados existentes do servidor não serão excluídos. Você pode reautorizar a qualquer momento.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。" = "Todas as visualizações remotas salvas nesta máquina serão excluídas, enquanto os registros de conexão, senhas e arquivos recebidos serão mantidos.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。" = "Todas as visualizações remotas salvas nesta máquina serão excluídas, enquanto os registros de conexão, senhas e arquivos recebidos serão mantidos. As conexões subsequentes ainda salvarão novas visualizações.";
"屏幕方向" = "Orientação da tela";
"展开远程控制菜单" = "Expandir menu de controle remoto";
"已保存密码" = "Senha salva";
"已勾选" = "Verificado";
"已发送 Ctrl+Alt+Del" = "Ctrl+Alt+Del enviado";
"已发送本机剪贴板" = "Área de transferência local enviada";
"已授权" = "Concedido";
"已接收 %1$@" = "%1$@ recebido";
"已接收远端剪贴板" = "Área de transferência remota recebida";
"已读" = "Leia";
"已连接" = "Conectado";
"已连接服务器" = "Conectado ao servidor";
"帧率" = "Taxa de quadros";
"帧率优先" = "Fluidez";
"平衡" = "Equilibrado";
"应用中的许可文件缺失或损坏,请重新安装应用。" = "O arquivo de licença do aplicativo está ausente ou danificado. Reinstale o aplicativo.";
"开发版本包含尚未发布的修改,以下链接为基础版本源码。" = "A versão de desenvolvimento contém modificações que ainda não foram lançadas. O link a seguir é o código fonte da versão básica.";
"开启保存" = "Ativar salvamento";
"开启隐私屏" = "Habilitar tela de privacidade";
"开源组件" = "Componentes de código aberto";
"开源软件权利说明" = "Descrição dos direitos de software de código aberto";
"当前已是最新版本" = "Esta é atualmente a versão mais recente";
"成功连接后,这里会显示远端桌面的缩略图。" = "Após uma conexão bem-sucedida, uma miniatura da área de trabalho remota será exibida aqui.";
"我已阅读并同意《隐私政策》" = "Li e concordo com a Política de Privacidade";
"我已阅读并同意隐私政策" = "Li e concordo com a política de privacidade";
"打开隐私政策" = "Política de privacidade aberta";
"指令发送失败,请重试" = "Falha no envio do comando, tente novamente";
"指令已发送,等待电脑确认…" = "O comando foi enviado, aguardando confirmação do computador...";
"按住并拖动,可滑出按键范围,松开结束拖拽" = "Pressione e arraste para deslizar para fora do intervalo de teclas, solte para encerrar o arrasto";
"授权后可使用远程连接。" = "Conexões remotas estão disponíveis após autorização.";
"授权状态" = "Status de autorização";
"接收" = "Receber";
"控制模式" = "Modo de controle";
"控制端解码器" = "Decodificador local";
"撤回授权" = "Retirar autorização";
"撤回隐私授权" = "Retirar autorização de privacidade";
"收起电脑键盘" = "Ocultar teclado do PC";
"收起系统键盘" = "Recolher o teclado do sistema";
"收起远程控制菜单" = "Recolher menu de controle remoto";
"收起鼠标" = "Ocultar mouse";
"数据" = "Dados";
"断开后将返回首页" = "Retornará à página inicial após desconectar";
"断开远程连接?" = "Desconectar a conexão remota?";
"断开连接" = "Desconectar";
"新版本" = "Nova versão";
"新版本可用:v%1$@" = "Nova versão disponível: v%1$@";
"无效" = "Inválido";
"无未读公告" = "Nenhum anúncio não lido";
"无法" = "Incapaz de";
"无法保存本地阅读状态,请重试。" = "Não é possível salvar o status de leitura localmente. Por favor, tente novamente.";
"无法删除这条公告,请重试。" = "Não é possível excluir este anúncio. Por favor, tente novamente.";
"无法访问本机登录凭据,请解锁后重试" = "Não é possível acessar as credenciais de login locais, desbloqueie e tente novamente";
"无法读取开源许可" = "Não é possível ler a licença de código aberto";
"无法读取所选文件,请重试" = "Não foi possível ler o arquivo selecionado, tente novamente";
"是否撤回隐私授权?" = "Retirar autorização de privacidade?";
"显示器" = "Tela";
"显示器 %1$@" = "Monitor %1$@";
"显示器 1" = "Monitor 1";
"显示密码" = "Mostrar senha";
"暂不同意" = "Agora não";
"暂无公告" = "Sem anúncios";
"最近连接" = "Conexões recentes";
"服务器" = "Servidor";
"服务器地址" = "Endereço do servidor";
"服务器端口" = "Porta do servidor";
"服务器配置无效" = "Configuração de servidor inválida";
"未勾选" = "Não verificado";
"未启用" = "Não habilitado";
"未授权" = "Não autorizado";
"未知" = "Desconhecido";
"未知信令状态" = "Status de sinalização desconhecido";
"未知连接状态" = "Status de conexão desconhecido";
"未读" = "Não lido";
"未连接" = "Não conectado";
"本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。" = "Este aplicativo usa OpenFEC para correção direta de erros noCeCILL-C1.0, que fornece garantias limitadas e limita a responsabilidade. Veja a licença completa para detalhes.";
"本机 ID %1$@" = "ID local %1$@";
"本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。" = "As credenciais de login desta máquina são temporariamente inseguras. Desbloqueie seu dispositivo e clique em \"Aplicar\" nas configurações para tentar novamente.";
"本版本源码与构建说明" = "Código-fonte e instruções de construção para esta versão";
"本版本源码信息暂不可用。" = "A revisão fonte não está disponível para esta compilação.";
"构建说明" = "Instruções de construção";
"构建配方与项目补丁" = "Crie receitas e patches de projeto";
"查看源码" = "Ver código-fonte";
"检查失败,请稍后重试" = "Falha na verificação. Por favor, tente novamente mais tarde.";
"检查更新" = "Verifique se há atualizações";
"正在关闭隐私屏…" = "Fechando a tela de privacidade…";
"正在准备连接…" = "Preparando para conectar...";
"正在发送 %1$@" = "Enviando %1$@";
"正在发送 Ctrl+Alt+Del…" = "Enviando Ctrl+Alt+Del…";
"正在取回远程画面…" = "Recuperando tela remota...";
"正在建立远程连接" = "Estabelecendo conexão remota";
"正在开启隐私屏…" = "Ativando a tela de privacidade...";
"正在收集 ICE 候选" = "Coletando candidatos do ICE";
"正在检查更新…" = "Verificando atualizações…";
"正在清除…" = "Limpando...";
"正在确认设备状态…" = "Confirmando o status do dispositivo...";
"正在获取本机 ID…" = "Obtendo ID local...";
"正在连接" = "Conectando";
"正在连接信令服务" = "Conectando-se ao serviço de sinalização";
"清除" = "Limpar";
"清除预览图" = "Limpar prévias";
"清除预览图?" = "Limpar prévias?";
"源码与构建说明" = "Código-fonte e instruções de construção";
"源码版本" = "Versão do código-fonte";
"版本" = "Versão";
"版权与许可声明" = "Declaração de direitos autorais e licença";
"电脑键盘" = "Teclado de computador";
"画中画未能开启,请保持应用在前台后重试。" = "Falha ao abrir o Picture-in-picture. Mantenha o aplicativo em primeiro plano e tente novamente.";
"画质优先" = "Qualidade";
"画面偏好" = "Preferência de vídeo";
"画面延时" = "Latência do vídeo";
"画面设置" = "Configurações de vídeo";
"画面质量" = "Qualidade de vídeo";
"画面采集帧率" = "Taxa de quadros de captura de vídeo";
"相对位置" = "Touchpad";
"相对鼠标" = "Rato relativo";
"知道了" = "Entendi";
"确定" = "OK";
"确认" = "Confirmar";
"离线" = "Off-line";
"空格" = "Espaço";
"端口" = "Porto";
"符号功能" = "Símbolos e teclas";
"等待电脑返回隐私屏状态;旧版电脑端可能不支持" = "Aguarde o computador retornar ao estado da tela de privacidade; computadores mais antigos podem não suportá-lo.";
"等待连接" = "Aguardando conexão";
"等待隐私授权" = "Aguardando autorização de privacidade";
"系统键盘" = "Teclado do sistema";
"绝对位置" = "Toque direto";
"绝对鼠标" = "Rato Absoluto";
"网络状态" = "Rede";
"网络连接已中断,请重新连接。" = "A conexão de rede foi interrompida, reconecte.";
"自定义" = "Personalizado";
"虚拟鼠标" = "Rato virtual";
"被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴" = "O terminal controlado não suporta entrada direta de chinês. Atualize o terminal controlado pelo macOS; você também pode copiar o texto primeiro, enviá-lo pela área de transferência do menu do controle remoto e depois colá-lo";
"被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。" = "A tela de privacidade remota foi desbloqueada usando o atalho local. Bloqueie-o novamente para restaurar a privacidade e desativar o desbloqueio de atalhos locais.";
"被控端平台:%1$@" = "Plataforma de terminal controlada:%1$@";
"被控端版本过低,请升级到最新版本。" = "A versão controlada é muito baixa, atualize para a versão mais recente.";
"被控端编码器" = "Codificador remoto";
"视频" = "Vídeo";
"视频 %1$@×%2$@ · %3$@ 帧" = "Vídeo %1$@×%2$@· Quadros %3$@";
"触摸位置直接对应远端屏幕位置,适合快速定位。" = "A posição de toque corresponde diretamente à posição da tela remota, que é adequada para posicionamento rápido.";
"许可" = "Licença";
"许可与版权声明" = "Licenças e avisos de direitos autorais";
"许可与版权声明可离线查阅。" = "A licença e o aviso de direitos autorais estão disponíveis offline.";
"设备离线" = "Dispositivo off-line";
"设置" = "Configurações";
"设置,有新版本" = "Configurações, há uma nova versão";
"访问密码" = "Senha de acesso";
"访问密码错误,请重新输入。" = "A senha de acesso está errada, digite-a novamente.";
"请求超时,尚未确认电脑的隐私屏状态" = "A solicitação expirou e o status da tela de privacidade do computador não foi confirmado.";
"请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。" = "Insira uma porta no intervalo de 1 a 65535 ou desative \"Usar servidor personalizado\".";
"请输入服务器地址,或关闭“使用自定义服务器”。" = "Insira o endereço do servidor ou desative \"Usar um servidor personalizado\".";
"请输入远程设备 ID" = "Insira o ID do dispositivo remoto";
"调整失败,请重试。" = "Não foi possível aplicar as configurações. Tente novamente.";
"软件许可" = "Licença de software";
"返回控制栏" = "Retornar à barra de controle";
"还没有连接记录" = "Ainda não há registro de conexão";
"这条公告已更新或删除,请返回公告列表查看。" = "Este anúncio foi atualizado ou excluído. Volte à lista de anúncios para visualizá-lo.";
"远程桌面" = "Área de Trabalho Remota";
"远程设备 ID 不存在,请检查设备 ID。" = "O ID do dispositivo remoto não existe, verifique o ID do dispositivo.";
"远程设备当前不可用,请稍后重试。" = "O dispositivo remoto não está disponível no momento. Tente novamente mais tarde.";
"远程连接已结束。" = "A conexão remota foi encerrada.";
"连接" = "Conectar";
"连接延时(RTT)" = "Atraso de conexão (RTT)";
"连接建立后可调整,需被控端支持。" = "Disponível quando conectado a um dispositivo remoto compatível.";
"连接建立后锁定横屏" = "Bloqueie a tela paisagem após a conexão ser estabelecida";
"连接提示" = "Solicitação de conexão";
"连接方式" = "Método de conexão";
"连接远程桌面" = "Conecte-se à área de trabalho remota";
"退格" = "Retrocesso";
"通知公告" = "Avisos";
"部分预览图未能清除,请重试。" = "Não foi possível limpar algumas visualizações. Tente novamente.";
"重试" = "Tente novamente";
"重试保存阅读状态" = "Tente salvar novamente o status de leitura";
"锁定" = "Bloqueio";
"键盘" = "Teclado";
"键盘操作" = "Operação do teclado";
"阅读并授权" = "Ler e autorizar";
"隐私" = "Privacidade";
"隐私与授权" = "Privacidade e Autorização";
"隐私屏" = "Tela de privacidade";
"隐私屏已关闭" = "Privacidade desativada";
"隐私屏已开启" = "Privacidade ativada";
"隐私屏已被解锁" = "Tela de privacidade desbloqueada";
"隐私屏异常" = "Anormalidade na tela de privacidade";
"隐私屏暂不可用" = "A tela de privacidade está temporariamente indisponível";
"隐私屏状态已过期,等待电脑确认" = "O status da tela de privacidade expirou, aguardando confirmação do computador";
"隐私屏状态待确认" = "Status da tela de privacidade a ser confirmado";
"隐私政策" = "Política de Privacidade";
"隐私政策暂时无法读取,请拒绝联网并重新安装应用。" = "A política de privacidade não pode ser lida temporariamente. Recuse-se a se conectar à Internet e reinstale o aplicativo.";
"隐藏密码" = "Ocultar senha";
"静音" = "Mudo";
"音频" = "Áudio";
"项目主页" = "Site do projeto";
"预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。" = "As visualizações podem conter informações pessoais ou de trabalho do computador remoto. Após ligá-lo, cada conexão salvará automaticamente uma imagem na máquina e a exibirá nas conexões recentes. Você pode fechar e limpar a qualquer momento.";
"高" = "Alta";
"默认" = "Padrão";
"默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。" = "Desligado por padrão. Quando ligado, o iPhone entra e permanece na orientação paisagem quando conectado; quando desligado, segue a orientação do dispositivo. Os iPads não são afetados.";
"鼠标右键" = "Botão direito do mouse";
"鼠标左键" = "Botão esquerdo do mouse";
"鼠标控制" = "Controle do mouse";
"鼠标滚轮" = "Roda do mouse";
@@ -0,0 +1 @@
"NSLocalNetworkUsageDescription" = "CrossDesk usa a rede local para descobrir e estabelecer conexões de controle remoto P2P nativas.";
@@ -0,0 +1,283 @@
// Generated by localization/generate.py.
"%1$@ 传输失败" = "Falha na transmissão %1$@";
"%1$@ 台设备" = "Dispositivos: %1$@";
"%1$@ 条未读" = "Itens não lidos %1$@";
"%1$@键盘页" = "Página do teclado %1$@";
"%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@" = "%1$@, recebendo %2$@, enviando %3$@, taxa de perda de pacotes %4$@";
"CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。" = "CrossDesk usa a rede local para descobrir e estabelecer conexões de controle remoto P2P nativas.";
"Ctrl+Alt+Del 需要远端启用 Windows 系统服务" = "Ctrl+Alt+Del requer ativação remota dos serviços do sistema Windows";
"GNU GPL 第 3 版" = "GNU GPL versão 3";
"OpenFEC 告知" = "Aviso OpenFEC";
"OpenFEC 许可与源码" = "Licença e fonte OpenFEC";
"P2P 直连" = "Conexão direta P2P";
"P2P/TURN 建链失败,请检查网络后重试。" = "P2P/TURN Falha no estabelecimento do link, verifique a rede e tente novamente.";
"SRTP 已启用" = "SRT habilitado";
"TLS 证书校验失败" = "Falha na verificação do certificado TLS";
"TURN 中继" = "GIRAR relé";
"上下滑动,可滑出按键范围" = "Deslize para cima e para baixo para sair do intervalo de teclas";
"丢包率" = "Taxa de perda";
"中" = "Média";
"优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。" = "Prioriza manter a imagem suave e reduzirá a resolução de forma mais agressiva quando a largura de banda ou a pressão de codificação forem altas.";
"低" = "Baixa";
"使用自定义服务器" = "Usando um servidor personalizado";
"保存密码" = "Salvar senha";
"保存远程画面预览" = "Salvar visualizações de tela remotas";
"保存远程画面预览?" = "Salvar visualização remota da tela?";
"信令服务器已关闭连接" = "O servidor de sinalização fechou a conexão";
"信令服务重连中" = "Reconexão do serviço de sinalização";
"信令连接失败" = "Falha na conexão de sinalização";
"信令连接已关闭" = "Conexão de sinalização fechada";
"偏好模式" = "Modo de preferência";
"像触控板一样滑动光标,点击时操作当前光标位置。" = "Deslize o cursor como um trackpad e opere a posição atual do cursor quando clicado.";
"公告加载失败,请重试。" = "Falha ao carregar o anúncio. Tente novamente.";
"公告详情" = "Detalhes do anúncio";
"共 %1$@ 条 · %2$@ 条未读" = "Total de itens %1$@· Itens não lidos %2$@";
"关于" = "Sobre";
"关于 CrossDesk" = "Sobre o CrossDesk";
"关于,有新版本" = "Sobre, há uma nova versão";
"关闭" = "Fechar";
"关闭控制栏" = "Fechar barra de controle";
"关闭隐私屏" = "Desativar tela de privacidade";
"兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。" = "Equilibra clareza e suavidade, reduzindo apenas gradualmente a resolução sob pressão constante.";
"分辨率" = "Resolução";
"切换到电脑键盘" = "Mudar para o teclado do computador";
"切换到系统键盘" = "Mudar para o teclado do sistema";
"删除" = "Excluir";
"删除公告" = "Excluir anúncio";
"删除记录" = "Excluir registro";
"删除这条公告?" = "Excluir este anúncio?";
"刷新公告" = "Anúncio de atualização";
"剪贴板" = "Área de transferência";
"剪贴板中没有文本" = "Nenhum texto na área de transferência";
"剪贴板文本超过 128 KiB" = "O texto da área de transferência excede 128 KiB";
"加载中…" = "Carregando…";
"加载更多" = "Carregue mais";
"升级提示" = "Atualização recomendada";
"单次输入最多 16 KiB,且不能包含空字符" = "Uma única entrada pode ter até 16 KiB e não pode conter caracteres nulos";
"发送" = "Enviar";
"发送文件" = "Enviar arquivo";
"取消" = "Cancelar";
"取消连接" = "Cancelar conexão";
"各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。" = "Cada componente está sujeito à licença de código aberto listada e os direitos concedidos não estão sujeitos aos termos gerais de uso deste aplicativo. A visualização do código-fonte requer uma conexão com a Internet.";
"合计" = "Total";
"同意并继续" = "Concorde e continue";
"回车" = "Entrar";
"在线" = "On-line";
"地址" = "Endereço";
"填写服务器地址" = "Preencha o endereço do servidor";
"填写端口" = "Preencha a porta";
"声音" = "Som";
"失败" = "Falhou";
"始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。" = "Sempre mantenha uma resolução mais alta e reduza a taxa de quadros para garantir a clareza da imagem quando a largura de banda for insuficiente.";
"媒体加密" = "Criptografia de mídia";
"字母数字" = "Letras e números";
"完成" = "Feito";
"完成隐私授权后可检查更新" = "Você pode verificar se há atualizações após concluir a autorização de privacidade";
"完成隐私授权后登记本机身份" = "Registre a identidade local após concluir a autorização de privacidade";
"密码将安全保存在本机 Keychain 中" = "As senhas serão armazenadas com segurança no chaveiro local";
"对端 ID" = "ID remoto";
"对端 ID %1$@" = "ID de par %1$@";
"将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。" = "Interromperá a conexão remota, fechará o salvamento da visualização da tela e limpará a visualização existente. Os registros de conexão e os arquivos recebidos serão retidos e os dados existentes do servidor não serão excluídos. Você pode reautorizar a qualquer momento.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。" = "Todas as visualizações remotas salvas nesta máquina serão excluídas, enquanto os registros de conexão, senhas e arquivos recebidos serão mantidos.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。" = "Todas as visualizações remotas salvas nesta máquina serão excluídas, enquanto os registros de conexão, senhas e arquivos recebidos serão mantidos. As conexões subsequentes ainda salvarão novas visualizações.";
"屏幕方向" = "Orientação da tela";
"展开远程控制菜单" = "Expandir menu de controle remoto";
"已保存密码" = "Senha salva";
"已勾选" = "Verificado";
"已发送 Ctrl+Alt+Del" = "Ctrl+Alt+Del enviado";
"已发送本机剪贴板" = "Área de transferência local enviada";
"已授权" = "Concedido";
"已接收 %1$@" = "%1$@ recebido";
"已接收远端剪贴板" = "Área de transferência remota recebida";
"已读" = "Leia";
"已连接" = "Conectado";
"已连接服务器" = "Conectado ao servidor";
"帧率" = "Taxa de quadros";
"帧率优先" = "Fluidez";
"平衡" = "Equilibrado";
"应用中的许可文件缺失或损坏,请重新安装应用。" = "O arquivo de licença do aplicativo está ausente ou danificado. Reinstale o aplicativo.";
"开发版本包含尚未发布的修改,以下链接为基础版本源码。" = "A versão de desenvolvimento contém modificações que ainda não foram lançadas. O link a seguir é o código fonte da versão básica.";
"开启保存" = "Ativar salvamento";
"开启隐私屏" = "Habilitar tela de privacidade";
"开源组件" = "Componentes de código aberto";
"开源软件权利说明" = "Descrição dos direitos de software de código aberto";
"当前已是最新版本" = "Esta é atualmente a versão mais recente";
"成功连接后,这里会显示远端桌面的缩略图。" = "Após uma conexão bem-sucedida, uma miniatura da área de trabalho remota será exibida aqui.";
"我已阅读并同意《隐私政策》" = "Li e concordo com a Política de Privacidade";
"我已阅读并同意隐私政策" = "Li e concordo com a política de privacidade";
"打开隐私政策" = "Política de privacidade aberta";
"指令发送失败,请重试" = "Falha no envio do comando, tente novamente";
"指令已发送,等待电脑确认…" = "O comando foi enviado, aguardando confirmação do computador...";
"按住并拖动,可滑出按键范围,松开结束拖拽" = "Pressione e arraste para deslizar para fora do intervalo de teclas, solte para encerrar o arrasto";
"授权后可使用远程连接。" = "Conexões remotas estão disponíveis após autorização.";
"授权状态" = "Status de autorização";
"接收" = "Receber";
"控制模式" = "Modo de controle";
"控制端解码器" = "Decodificador local";
"撤回授权" = "Retirar autorização";
"撤回隐私授权" = "Retirar autorização de privacidade";
"收起电脑键盘" = "Ocultar teclado do PC";
"收起系统键盘" = "Recolher o teclado do sistema";
"收起远程控制菜单" = "Recolher menu de controle remoto";
"收起鼠标" = "Ocultar mouse";
"数据" = "Dados";
"断开后将返回首页" = "Retornará à página inicial após desconectar";
"断开远程连接?" = "Desconectar a conexão remota?";
"断开连接" = "Desconectar";
"新版本" = "Nova versão";
"新版本可用:v%1$@" = "Nova versão disponível: v%1$@";
"无效" = "Inválido";
"无未读公告" = "Nenhum anúncio não lido";
"无法" = "Incapaz de";
"无法保存本地阅读状态,请重试。" = "Não é possível salvar o status de leitura localmente. Por favor, tente novamente.";
"无法删除这条公告,请重试。" = "Não é possível excluir este anúncio. Por favor, tente novamente.";
"无法访问本机登录凭据,请解锁后重试" = "Não é possível acessar as credenciais de login locais, desbloqueie e tente novamente";
"无法读取开源许可" = "Não é possível ler a licença de código aberto";
"无法读取所选文件,请重试" = "Não foi possível ler o arquivo selecionado, tente novamente";
"是否撤回隐私授权?" = "Retirar autorização de privacidade?";
"显示器" = "Tela";
"显示器 %1$@" = "Monitor %1$@";
"显示器 1" = "Monitor 1";
"显示密码" = "Mostrar senha";
"暂不同意" = "Agora não";
"暂无公告" = "Sem anúncios";
"最近连接" = "Conexões recentes";
"服务器" = "Servidor";
"服务器地址" = "Endereço do servidor";
"服务器端口" = "Porta do servidor";
"服务器配置无效" = "Configuração de servidor inválida";
"未勾选" = "Não verificado";
"未启用" = "Não habilitado";
"未授权" = "Não autorizado";
"未知" = "Desconhecido";
"未知信令状态" = "Status de sinalização desconhecido";
"未知连接状态" = "Status de conexão desconhecido";
"未读" = "Não lido";
"未连接" = "Não conectado";
"本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。" = "Este aplicativo usa OpenFEC para correção direta de erros noCeCILL-C1.0, que fornece garantias limitadas e limita a responsabilidade. Veja a licença completa para detalhes.";
"本机 ID %1$@" = "ID local %1$@";
"本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。" = "As credenciais de login desta máquina são temporariamente inseguras. Desbloqueie seu dispositivo e clique em \"Aplicar\" nas configurações para tentar novamente.";
"本版本源码与构建说明" = "Código-fonte e instruções de construção para esta versão";
"本版本源码信息暂不可用。" = "A revisão fonte não está disponível para esta compilação.";
"构建说明" = "Instruções de construção";
"构建配方与项目补丁" = "Crie receitas e patches de projeto";
"查看源码" = "Ver código-fonte";
"检查失败,请稍后重试" = "Falha na verificação. Por favor, tente novamente mais tarde.";
"检查更新" = "Verifique se há atualizações";
"正在关闭隐私屏…" = "Fechando a tela de privacidade…";
"正在准备连接…" = "Preparando para conectar...";
"正在发送 %1$@" = "Enviando %1$@";
"正在发送 Ctrl+Alt+Del…" = "Enviando Ctrl+Alt+Del…";
"正在取回远程画面…" = "Recuperando tela remota...";
"正在建立远程连接" = "Estabelecendo conexão remota";
"正在开启隐私屏…" = "Ativando a tela de privacidade...";
"正在收集 ICE 候选" = "Coletando candidatos do ICE";
"正在检查更新…" = "Verificando atualizações…";
"正在清除…" = "Limpando...";
"正在确认设备状态…" = "Confirmando o status do dispositivo...";
"正在获取本机 ID…" = "Obtendo ID local...";
"正在连接" = "Conectando";
"正在连接信令服务" = "Conectando-se ao serviço de sinalização";
"清除" = "Limpar";
"清除预览图" = "Limpar prévias";
"清除预览图?" = "Limpar prévias?";
"源码与构建说明" = "Código-fonte e instruções de construção";
"源码版本" = "Versão do código-fonte";
"版本" = "Versão";
"版权与许可声明" = "Declaração de direitos autorais e licença";
"电脑键盘" = "Teclado de computador";
"画中画未能开启,请保持应用在前台后重试。" = "Falha ao abrir o Picture-in-picture. Mantenha o aplicativo em primeiro plano e tente novamente.";
"画质优先" = "Qualidade";
"画面偏好" = "Preferência de vídeo";
"画面延时" = "Latência do vídeo";
"画面设置" = "Configurações de vídeo";
"画面质量" = "Qualidade de vídeo";
"画面采集帧率" = "Taxa de quadros de captura de vídeo";
"相对位置" = "Touchpad";
"相对鼠标" = "Rato relativo";
"知道了" = "Entendi";
"确定" = "OK";
"确认" = "Confirmar";
"离线" = "Off-line";
"空格" = "Espaço";
"端口" = "Porto";
"符号功能" = "Símbolos e teclas";
"等待电脑返回隐私屏状态;旧版电脑端可能不支持" = "Aguarde o computador retornar ao estado da tela de privacidade; computadores mais antigos podem não suportá-lo.";
"等待连接" = "Aguardando conexão";
"等待隐私授权" = "Aguardando autorização de privacidade";
"系统键盘" = "Teclado do sistema";
"绝对位置" = "Toque direto";
"绝对鼠标" = "Rato Absoluto";
"网络状态" = "Rede";
"网络连接已中断,请重新连接。" = "A conexão de rede foi interrompida, reconecte.";
"自定义" = "Personalizado";
"虚拟鼠标" = "Rato virtual";
"被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴" = "O terminal controlado não suporta entrada direta de chinês. Atualize o terminal controlado pelo macOS; você também pode copiar o texto primeiro, enviá-lo pela área de transferência do menu do controle remoto e depois colá-lo";
"被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。" = "A tela de privacidade remota foi desbloqueada usando o atalho local. Bloqueie-o novamente para restaurar a privacidade e desativar o desbloqueio de atalhos locais.";
"被控端平台:%1$@" = "Plataforma de terminal controlada:%1$@";
"被控端版本过低,请升级到最新版本。" = "A versão controlada é muito baixa, atualize para a versão mais recente.";
"被控端编码器" = "Codificador remoto";
"视频" = "Vídeo";
"视频 %1$@×%2$@ · %3$@ 帧" = "Vídeo %1$@×%2$@· Quadros %3$@";
"触摸位置直接对应远端屏幕位置,适合快速定位。" = "A posição de toque corresponde diretamente à posição da tela remota, que é adequada para posicionamento rápido.";
"许可" = "Licença";
"许可与版权声明" = "Licenças e avisos de direitos autorais";
"许可与版权声明可离线查阅。" = "A licença e o aviso de direitos autorais estão disponíveis offline.";
"设备离线" = "Dispositivo off-line";
"设置" = "Configurações";
"设置,有新版本" = "Configurações, há uma nova versão";
"访问密码" = "Senha de acesso";
"访问密码错误,请重新输入。" = "A senha de acesso está errada, digite-a novamente.";
"请求超时,尚未确认电脑的隐私屏状态" = "A solicitação expirou e o status da tela de privacidade do computador não foi confirmado.";
"请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。" = "Insira uma porta no intervalo de 1 a 65535 ou desative \"Usar servidor personalizado\".";
"请输入服务器地址,或关闭“使用自定义服务器”。" = "Insira o endereço do servidor ou desative \"Usar um servidor personalizado\".";
"请输入远程设备 ID" = "Insira o ID do dispositivo remoto";
"调整失败,请重试。" = "Não foi possível aplicar as configurações. Tente novamente.";
"软件许可" = "Licença de software";
"返回控制栏" = "Retornar à barra de controle";
"还没有连接记录" = "Ainda não há registro de conexão";
"这条公告已更新或删除,请返回公告列表查看。" = "Este anúncio foi atualizado ou excluído. Volte à lista de anúncios para visualizá-lo.";
"远程桌面" = "Área de Trabalho Remota";
"远程设备 ID 不存在,请检查设备 ID。" = "O ID do dispositivo remoto não existe, verifique o ID do dispositivo.";
"远程设备当前不可用,请稍后重试。" = "O dispositivo remoto não está disponível no momento. Tente novamente mais tarde.";
"远程连接已结束。" = "A conexão remota foi encerrada.";
"连接" = "Conectar";
"连接延时(RTT)" = "Atraso de conexão (RTT)";
"连接建立后可调整,需被控端支持。" = "Disponível quando conectado a um dispositivo remoto compatível.";
"连接建立后锁定横屏" = "Bloqueie a tela paisagem após a conexão ser estabelecida";
"连接提示" = "Solicitação de conexão";
"连接方式" = "Método de conexão";
"连接远程桌面" = "Conecte-se à área de trabalho remota";
"退格" = "Retrocesso";
"通知公告" = "Avisos";
"部分预览图未能清除,请重试。" = "Não foi possível limpar algumas visualizações. Tente novamente.";
"重试" = "Tente novamente";
"重试保存阅读状态" = "Tente salvar novamente o status de leitura";
"锁定" = "Bloqueio";
"键盘" = "Teclado";
"键盘操作" = "Operação do teclado";
"阅读并授权" = "Ler e autorizar";
"隐私" = "Privacidade";
"隐私与授权" = "Privacidade e Autorização";
"隐私屏" = "Tela de privacidade";
"隐私屏已关闭" = "Privacidade desativada";
"隐私屏已开启" = "Privacidade ativada";
"隐私屏已被解锁" = "Tela de privacidade desbloqueada";
"隐私屏异常" = "Anormalidade na tela de privacidade";
"隐私屏暂不可用" = "A tela de privacidade está temporariamente indisponível";
"隐私屏状态已过期,等待电脑确认" = "O status da tela de privacidade expirou, aguardando confirmação do computador";
"隐私屏状态待确认" = "Status da tela de privacidade a ser confirmado";
"隐私政策" = "Política de Privacidade";
"隐私政策暂时无法读取,请拒绝联网并重新安装应用。" = "A política de privacidade não pode ser lida temporariamente. Recuse-se a se conectar à Internet e reinstale o aplicativo.";
"隐藏密码" = "Ocultar senha";
"静音" = "Mudo";
"音频" = "Áudio";
"项目主页" = "Site do projeto";
"预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。" = "As visualizações podem conter informações pessoais ou de trabalho do computador remoto. Após ligá-lo, cada conexão salvará automaticamente uma imagem na máquina e a exibirá nas conexões recentes. Você pode fechar e limpar a qualquer momento.";
"高" = "Alta";
"默认" = "Padrão";
"默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。" = "Desligado por padrão. Quando ligado, o iPhone entra e permanece na orientação paisagem quando conectado; quando desligado, segue a orientação do dispositivo. Os iPads não são afetados.";
"鼠标右键" = "Botão direito do mouse";
"鼠标左键" = "Botão esquerdo do mouse";
"鼠标控制" = "Controle do mouse";
"鼠标滚轮" = "Roda do mouse";
@@ -0,0 +1 @@
"NSLocalNetworkUsageDescription" = "CrossDesk использует локальную сеть для обнаружения и установления собственных P2P-соединений удаленного управления.";
@@ -0,0 +1,283 @@
// Generated by localization/generate.py.
"%1$@ 传输失败" = "Передача %1$@ не удалась.";
"%1$@ 台设备" = "Устройства: %1$@";
"%1$@ 条未读" = "%1$@ непрочитанные элементы";
"%1$@键盘页" = "Страница клавиатуры %1$@";
"%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@" = "%1$@, прием %2$@, отправка %3$@, скорость потери пакетов %4$@";
"CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。" = "CrossDesk использует локальную сеть для обнаружения и установления собственных P2P-соединений удаленного управления.";
"Ctrl+Alt+Del 需要远端启用 Windows 系统服务" = "Ctrl+Alt+Del требует удаленной активации системных служб Windows.";
"GNU GPL 第 3 版" = "GNU GPL версия 3";
"OpenFEC 告知" = "Уведомление OpenFEC";
"OpenFEC 许可与源码" = "Лицензия и исходный код OpenFEC";
"P2P 直连" = "Прямое соединение P2P";
"P2P/TURN 建链失败,请检查网络后重试。" = "P2P/TURN Не удалось установить соединение. Проверьте сеть и повторите попытку.";
"SRTP 已启用" = "SRTP включен";
"TLS 证书校验失败" = "Проверка TLS certificate не удалась.";
"TURN 中继" = "Реле ПОВОРОТА";
"上下滑动,可滑出按键范围" = "Сдвиньте вверх и вниз, чтобы выйти за пределы диапазона клавиш.";
"丢包率" = "Потери пакетов";
"中" = "Среднее";
"优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。" = "Отдает приоритет сохранению плавности изображения и более агрессивно снижает разрешение при высокой пропускной способности или нагрузке на кодирование.";
"低" = "Низкое";
"使用自定义服务器" = "Использование пользовательского сервера";
"保存密码" = "Сохранить пароль";
"保存远程画面预览" = "Сохранять превью удалённого экрана";
"保存远程画面预览?" = "Сохранить предварительный просмотр удаленного экрана?";
"信令服务器已关闭连接" = "Сервер сигнализации закрыл соединение.";
"信令服务重连中" = "Повторное подключение услуги сигнализации";
"信令连接失败" = "Не удалось установить сигнальное соединение.";
"信令连接已关闭" = "Сигнальное соединение закрыто";
"偏好模式" = "Режим предпочтений";
"像触控板一样滑动光标,点击时操作当前光标位置。" = "Перемещайте курсор, как трекпад, и управляйте текущим положением курсора при нажатии.";
"公告加载失败,请重试。" = "Не удалось загрузить объявление. Повторите попытку.";
"公告详情" = "Подробности объявления";
"共 %1$@ 条 · %2$@ 条未读" = "Всего элементов %1$@· Непрочитанные элементы %2$@";
"关于" = "О программе";
"关于 CrossDesk" = "О CrossDesk";
"关于,有新版本" = "О, вышла новая версия";
"关闭" = "Закрыть";
"关闭控制栏" = "Закрыть панель управления";
"关闭隐私屏" = "Выключить приватный экран";
"兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。" = "Балансирует четкость и плавность изображения, постепенно снижая разрешение под постоянным давлением.";
"分辨率" = "Разрешение";
"切换到电脑键盘" = "Переключение на клавиатуру компьютера.";
"切换到系统键盘" = "Переключение на системную клавиатуру";
"删除" = "Удалить";
"删除公告" = "Удалить объявление";
"删除记录" = "Удалить запись";
"删除这条公告?" = "Удалить это объявление?";
"刷新公告" = "Обновить объявление";
"剪贴板" = "Буфер обмена";
"剪贴板中没有文本" = "Нет текста в буфере обмена.";
"剪贴板文本超过 128 KiB" = "Размер текста в буфере обмена превышает 128 КиБ.";
"加载中…" = "Загрузка…";
"加载更多" = "Загрузить еще";
"升级提示" = "Рекомендуется обновление";
"单次输入最多 16 KiB,且不能包含空字符" = "Один ввод может иметь размер до 16 КиБ и не может содержать нулевые символы.";
"发送" = "Отправка";
"发送文件" = "Отправить файл";
"取消" = "Отмена";
"取消连接" = "Отмена соединения";
"各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。" = "На каждый компонент распространяется действие указанной лицензии с открытым исходным кодом, а предоставленные права не подпадают под действие общих условий использования этого приложения. Для просмотра исходного кода требуется подключение к Интернету.";
"合计" = "Итого";
"同意并继续" = "Согласитесь и продолжайте.";
"回车" = "Ввести";
"在线" = "В сети";
"地址" = "Адрес";
"填写服务器地址" = "Введите адрес сервера";
"填写端口" = "Заполните порт";
"声音" = "Звук";
"失败" = "Ошибка";
"始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。" = "Всегда поддерживайте более высокое разрешение и уменьшайте частоту кадров, чтобы обеспечить четкость изображения при недостаточной полосе пропускания.";
"媒体加密" = "Шифрование мультимедиа";
"字母数字" = "Буквы и цифры";
"完成" = "Готово";
"完成隐私授权后可检查更新" = "Вы можете проверить наличие обновлений после завершения авторизации конфиденциальности.";
"完成隐私授权后登记本机身份" = "Зарегистрируйте локальную личность после завершения авторизации конфиденциальности.";
"密码将安全保存在本机 Keychain 中" = "Пароли будут безопасно храниться в локальной связке ключей.";
"对端 ID" = "Удаленный ID";
"对端 ID %1$@" = "Идентификатор узла %1$@";
"将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。" = "Остановит удаленное соединение, закроет сохранение предварительного просмотра экрана и очистит существующий предварительный просмотр. Записи подключений и полученные файлы сохранятся, а существующие данные сервера не будут удалены. Вы можете повторно авторизоваться в любое время.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。" = "Все удаленные предварительные просмотры, сохраненные на этом компьютере, будут удалены, а записи подключений, пароли и полученные файлы сохранятся.";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。" = "Все удаленные предварительные просмотры, сохраненные на этом компьютере, будут удалены, а записи подключений, пароли и полученные файлы сохранятся. Последующие подключения по-прежнему будут сохранять новые предварительные просмотры.";
"屏幕方向" = "Ориентация экрана";
"展开远程控制菜单" = "Развернуть меню пульта дистанционного управления";
"已保存密码" = "Пароль сохранён";
"已勾选" = "Проверено";
"已发送 Ctrl+Alt+Del" = "Ctrl+Alt+Del отправлено";
"已发送本机剪贴板" = "Локальный буфер отправлен";
"已授权" = "Разрешено";
"已接收 %1$@" = "Получено %1$@";
"已接收远端剪贴板" = "Получен удаленный буфер обмена.";
"已读" = "Прочитано";
"已连接" = "Подключено";
"已连接服务器" = "Подключено к серверу";
"帧率" = "Частота кадров";
"帧率优先" = "Плавность";
"平衡" = "Баланс";
"应用中的许可文件缺失或损坏,请重新安装应用。" = "Файл лицензии в приложении отсутствует или поврежден, переустановите приложение.";
"开发版本包含尚未发布的修改,以下链接为基础版本源码。" = "Версия для разработки содержит модификации, которые еще не были выпущены. По следующей ссылке приведен исходный код базовой версии.";
"开启保存" = "Включить сохранение";
"开启隐私屏" = "Включить приватный экран";
"开源组件" = "Компоненты с открытым кодом";
"开源软件权利说明" = "Описание прав на программное обеспечение с открытым исходным кодом.";
"当前已是最新版本" = "На данный момент это последняя версия.";
"成功连接后,这里会显示远端桌面的缩略图。" = "После успешного подключения здесь отобразится миниатюра удаленного рабочего стола.";
"我已阅读并同意《隐私政策》" = "Я прочитал и согласен с Политикой конфиденциальности.";
"我已阅读并同意隐私政策" = "Я прочитал и согласен с политикой конфиденциальности.";
"打开隐私政策" = "Открытая политика конфиденциальности";
"指令发送失败,请重试" = "Не удалось отправить команду. Повторите попытку.";
"指令已发送,等待电脑确认…" = "Команда отправлена, ждём подтверждения от компьютера...";
"按住并拖动,可滑出按键范围,松开结束拖拽" = "Нажмите и перетащите, чтобы выйти за пределы диапазона клавиш, отпустите, чтобы завершить перетаскивание.";
"授权后可使用远程连接。" = "Удаленные подключения доступны после авторизации.";
"授权状态" = "Статус авторизации";
"接收" = "Приём";
"控制模式" = "Режим управления";
"控制端解码器" = "Локальный декодер";
"撤回授权" = "Отозвать разрешение";
"撤回隐私授权" = "Отозвать разрешение на конфиденциальность";
"收起电脑键盘" = "Скрыть клавиатуру ПК";
"收起系统键盘" = "Свернуть системную клавиатуру";
"收起远程控制菜单" = "Свернуть меню пульта дистанционного управления";
"收起鼠标" = "Скрыть мышь";
"数据" = "Данные";
"断开后将返回首页" = "Вернется на домашнюю страницу после отключения.";
"断开远程连接?" = "Отключить удаленное соединение?";
"断开连接" = "Отключить";
"新版本" = "Новая версия";
"新版本可用:v%1$@" = "Доступна новая версия: v%1$@";
"无效" = "Недействительно";
"无未读公告" = "Нет непрочитанных объявлений";
"无法" = "Невозможно";
"无法保存本地阅读状态,请重试。" = "Не удалось сохранить статус чтения локально. Повторите попытку.";
"无法删除这条公告,请重试。" = "Не удалось удалить объявление. Повторите попытку.";
"无法访问本机登录凭据,请解锁后重试" = "Невозможно получить доступ к локальным учетным данным для входа. Разблокируйте и повторите попытку.";
"无法读取开源许可" = "Невозможно прочитать лицензию с открытым исходным кодом.";
"无法读取所选文件,请重试" = "Невозможно прочитать выбранный файл, попробуйте еще раз.";
"是否撤回隐私授权?" = "Отозвать разрешение на конфиденциальность?";
"显示器" = "Экран";
"显示器 %1$@" = "Монитор %1$@";
"显示器 1" = "Монитор 1";
"显示密码" = "Показать пароль";
"暂不同意" = "Не сейчас";
"暂无公告" = "Нет объявлений";
"最近连接" = "Недавние связи";
"服务器" = "Сервер";
"服务器地址" = "Адрес сервера";
"服务器端口" = "Порт сервера";
"服务器配置无效" = "Неверная конфигурация сервера.";
"未勾选" = "Не отмечено";
"未启用" = "Не включено";
"未授权" = "Несанкционированное";
"未知" = "Неизвестно";
"未知信令状态" = "Неизвестный статус сигнализации";
"未知连接状态" = "Неизвестный статус соединения";
"未读" = "Не прочитано";
"未连接" = "Нет соединения";
"本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。" = "Приложение использует OpenFEC для прямого исправления ошибок по лицензии CeCILL-C 1.0 с ограниченной гарантией и ответственностью. Подробности — в тексте лицензии.";
"本机 ID %1$@" = "Локальный идентификатор %1$@";
"本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。" = "Учетные данные для входа на этот компьютер временно небезопасны. Пожалуйста, разблокируйте свое устройство и нажмите «Применить» в настройках, чтобы повторить попытку.";
"本版本源码与构建说明" = "Исходный код и инструкции по сборке этой версии.";
"本版本源码信息暂不可用。" = "Ревизия исходного кода этой сборки недоступна.";
"构建说明" = "Инструкции по сборке";
"构建配方与项目补丁" = "Рецепты сборки и исправления проектов.";
"查看源码" = "Открыть исходный код";
"检查失败,请稍后重试" = "Не удалось проверить обновления. Повторите позже.";
"检查更新" = "Проверить обновления";
"正在关闭隐私屏…" = "Закрытие экрана конфиденциальности…";
"正在准备连接…" = "Подготовка к подключению...";
"正在发送 %1$@" = "Отправка %1$@";
"正在发送 Ctrl+Alt+Del…" = "Отправка Ctrl+Alt+Del…";
"正在取回远程画面…" = "Получение удаленного экрана...";
"正在建立远程连接" = "Установление удаленного соединения";
"正在开启隐私屏…" = "Включение экрана конфиденциальности...";
"正在收集 ICE 候选" = "Сбор кандидатов ICE";
"正在检查更新…" = "Проверка обновлений…";
"正在清除…" = "Очистка...";
"正在确认设备状态…" = "Подтверждение статуса устройства...";
"正在获取本机 ID…" = "Получение локального идентификатора...";
"正在连接" = "Подключение";
"正在连接信令服务" = "Подключение к службе сигнализации";
"清除" = "Очистить";
"清除预览图" = "Удалить превью";
"清除预览图?" = "Удалить превью?";
"源码与构建说明" = "Исходный код и сборка";
"源码版本" = "Версия исходного кода";
"版本" = "Версия";
"版权与许可声明" = "Положение об авторских правах и лицензии.";
"电脑键盘" = "Компьютерная клавиатура";
"画中画未能开启,请保持应用在前台后重试。" = "Не удалось открыть функцию «Картинка в картинке». Оставьте приложение на переднем плане и повторите попытку.";
"画质优先" = "Качество";
"画面偏好" = "Режим видео";
"画面延时" = "Задержка видео";
"画面设置" = "Настройки видео";
"画面质量" = "Качество видео";
"画面采集帧率" = "Частота захвата видео";
"相对位置" = "Тачпад";
"相对鼠标" = "Родственная мышь";
"知道了" = "Понятно";
"确定" = "ОК";
"确认" = "Подтвердить";
"离线" = "Не в сети";
"空格" = "Пробел";
"端口" = "Порт";
"符号功能" = "Символы и клавиши";
"等待电脑返回隐私屏状态;旧版电脑端可能不支持" = "Подождите, пока компьютер вернется в состояние экрана конфиденциальности; старые компьютеры могут его не поддерживать.";
"等待连接" = "Ожидание соединения";
"等待隐私授权" = "Ожидание разрешения на конфиденциальность.";
"系统键盘" = "Системная клавиатура";
"绝对位置" = "Касание";
"绝对鼠标" = "Абсолютная мышь";
"网络状态" = "Сеть";
"网络连接已中断,请重新连接。" = "Сетевое соединение прервано, подключитесь заново.";
"自定义" = "Пользовательский";
"虚拟鼠标" = "Виртуальная мышь";
"被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴" = "Управляемый терминал не поддерживает прямой ввод китайского языка, обновите управляемый терминал macOS; вы также можете сначала скопировать текст, отправить его через буфер обмена меню пульта дистанционного управления, а затем вставить";
"被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。" = "Приватный экран отключён локальным сочетанием клавиш. Заблокируйте его снова, чтобы восстановить защиту и запретить локальную разблокировку.";
"被控端平台:%1$@" = "Управляемая терминальная платформа:%1$@.";
"被控端版本过低,请升级到最新版本。" = "Управляемая версия слишком низкая, обновите ее до последней версии.";
"被控端编码器" = "Кодер удалённой стороны";
"视频" = "Видео";
"视频 %1$@×%2$@ · %3$@ 帧" = "Видео %1$@×%2$@·%3$@ кадры";
"触摸位置直接对应远端屏幕位置,适合快速定位。" = "Положение касания напрямую соответствует положению удаленного экрана, что подходит для быстрого позиционирования.";
"许可" = "Лицензия";
"许可与版权声明" = "Лицензии и авторские права";
"许可与版权声明可离线查阅。" = "Лицензия и уведомление об авторских правах доступны в автономном режиме.";
"设备离线" = "Устройство не в сети";
"设置" = "Настройки";
"设置,有新版本" = "Настройки, есть новая версия";
"访问密码" = "Пароль доступа";
"访问密码错误,请重新输入。" = "Неверный пароль доступа, пожалуйста, введите его еще раз.";
"请求超时,尚未确认电脑的隐私屏状态" = "Время ожидания запроса истекло, а состояние экрана конфиденциальности компьютера не подтверждено.";
"请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。" = "Введите порт в диапазоне 1–65535 или отключите параметр «Использовать собственный сервер».";
"请输入服务器地址,或关闭“使用自定义服务器”。" = "Введите адрес сервера или отключите параметр «Использовать собственный сервер».";
"请输入远程设备 ID" = "Введите идентификатор удаленного устройства.";
"调整失败,请重试。" = "Не удалось применить настройки. Повторите попытку.";
"软件许可" = "Лицензия программы";
"返回控制栏" = "Возврат к панели управления.";
"还没有连接记录" = "Пока нет записей о подключении";
"这条公告已更新或删除,请返回公告列表查看。" = "Это объявление было обновлено или удалено. Чтобы просмотреть его, вернитесь к списку объявлений.";
"远程桌面" = "Удаленный рабочий стол";
"远程设备 ID 不存在,请检查设备 ID。" = "Идентификатор удаленного устройства не существует, проверьте идентификатор устройства.";
"远程设备当前不可用,请稍后重试。" = "Удаленное устройство в настоящее время недоступно. Повторите попытку позже.";
"远程连接已结束。" = "Удаленное соединение прервано.";
"连接" = "Подключиться";
"连接延时(RTT)" = "Задержка соединения (RTT)";
"连接建立后可调整,需被控端支持。" = "Доступно при подключении к поддерживаемому устройству.";
"连接建立后锁定横屏" = "Блокировка горизонтального экрана после установления соединения.";
"连接提示" = "Запрос на подключение";
"连接方式" = "Способ подключения";
"连接远程桌面" = "Подключение к удаленному рабочему столу";
"退格" = "Возврат";
"通知公告" = "Объявления";
"部分预览图未能清除,请重试。" = "Некоторые предварительные просмотры не удалось удалить. Повторите попытку.";
"重试" = "Попробуйте еще раз";
"重试保存阅读状态" = "Повторить попытку сохранения статуса чтения.";
"锁定" = "Заблокировать";
"键盘" = "Клавиатура";
"键盘操作" = "Работа с клавиатурой";
"阅读并授权" = "Прочитать и авторизоваться";
"隐私" = "Конфиденциальность";
"隐私与授权" = "Конфиденциальность и авторизация";
"隐私屏" = "Приватный экран";
"隐私屏已关闭" = "Приватный экран выкл.";
"隐私屏已开启" = "Приватный экран вкл.";
"隐私屏已被解锁" = "Приватный экран разблокирован";
"隐私屏异常" = "Неисправность экрана конфиденциальности.";
"隐私屏暂不可用" = "Экран конфиденциальности временно недоступен.";
"隐私屏状态已过期,等待电脑确认" = "Срок действия статуса экрана конфиденциальности истек, ожидание подтверждения от компьютера.";
"隐私屏状态待确认" = "Статус экрана конфиденциальности подлежит подтверждению.";
"隐私政策" = "Политика конфиденциальности";
"隐私政策暂时无法读取,请拒绝联网并重新安装应用。" = "Политику конфиденциальности временно невозможно прочитать. Пожалуйста, откажитесь от подключения к Интернету и переустановите приложение.";
"隐藏密码" = "Скрыть пароль";
"静音" = "Без звука";
"音频" = "Аудио";
"项目主页" = "Сайт проекта";
"预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。" = "Предварительный просмотр может содержать личную или рабочую информацию с удаленного компьютера. После его включения каждое подключение будет автоматически сохранять изображение на устройстве и отображать его при последних подключениях. Вы можете закрыть и очистить в любое время.";
"高" = "Высокое";
"默认" = "По умолчанию";
"默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。" = "По умолчанию выключено. При включении iPhone переходит в альбомную ориентацию и остается при подключении; в выключенном состоянии он следует ориентации устройства. iPad не затрагивается.";
"鼠标右键" = "Правая кнопка мыши";
"鼠标左键" = "Левая кнопка мыши";
"鼠标控制" = "Управление мышью";
"鼠标滚轮" = "Колесо мыши";
@@ -0,0 +1 @@
"NSLocalNetworkUsageDescription" = "CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。";
@@ -0,0 +1,283 @@
// Generated by localization/generate.py.
"%1$@ 传输失败" = "%1$@ 传输失败";
"%1$@ 台设备" = "%1$@ 台设备";
"%1$@ 条未读" = "%1$@ 条未读";
"%1$@键盘页" = "%1$@键盘页";
"%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@" = "%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@";
"CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。" = "CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。";
"Ctrl+Alt+Del 需要远端启用 Windows 系统服务" = "Ctrl+Alt+Del 需要远端启用 Windows 系统服务";
"GNU GPL 第 3 版" = "GNU GPL 第 3 版";
"OpenFEC 告知" = "OpenFEC 告知";
"OpenFEC 许可与源码" = "OpenFEC 许可与源码";
"P2P 直连" = "P2P 直连";
"P2P/TURN 建链失败,请检查网络后重试。" = "P2P/TURN 建链失败,请检查网络后重试。";
"SRTP 已启用" = "SRTP 已启用";
"TLS 证书校验失败" = "TLS 证书校验失败";
"TURN 中继" = "TURN 中继";
"上下滑动,可滑出按键范围" = "上下滑动,可滑出按键范围";
"丢包率" = "丢包率";
"中" = "中";
"优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。" = "优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。";
"低" = "低";
"使用自定义服务器" = "使用自定义服务器";
"保存密码" = "保存密码";
"保存远程画面预览" = "保存远程画面预览";
"保存远程画面预览?" = "保存远程画面预览?";
"信令服务器已关闭连接" = "信令服务器已关闭连接";
"信令服务重连中" = "信令服务重连中";
"信令连接失败" = "信令连接失败";
"信令连接已关闭" = "信令连接已关闭";
"偏好模式" = "偏好模式";
"像触控板一样滑动光标,点击时操作当前光标位置。" = "像触控板一样滑动光标,点击时操作当前光标位置。";
"公告加载失败,请重试。" = "公告加载失败,请重试。";
"公告详情" = "公告详情";
"共 %1$@ 条 · %2$@ 条未读" = "共 %1$@ 条 · %2$@ 条未读";
"关于" = "关于";
"关于 CrossDesk" = "关于 CrossDesk";
"关于,有新版本" = "关于,有新版本";
"关闭" = "关闭";
"关闭控制栏" = "关闭控制栏";
"关闭隐私屏" = "关闭隐私屏";
"兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。" = "兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。";
"分辨率" = "分辨率";
"切换到电脑键盘" = "切换到电脑键盘";
"切换到系统键盘" = "切换到系统键盘";
"删除" = "删除";
"删除公告" = "删除公告";
"删除记录" = "删除记录";
"删除这条公告?" = "删除这条公告?";
"刷新公告" = "刷新公告";
"剪贴板" = "剪贴板";
"剪贴板中没有文本" = "剪贴板中没有文本";
"剪贴板文本超过 128 KiB" = "剪贴板文本超过 128 KiB";
"加载中…" = "加载中…";
"加载更多" = "加载更多";
"升级提示" = "升级提示";
"单次输入最多 16 KiB,且不能包含空字符" = "单次输入最多 16 KiB,且不能包含空字符";
"发送" = "发送";
"发送文件" = "发送文件";
"取消" = "取消";
"取消连接" = "取消连接";
"各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。" = "各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。";
"合计" = "合计";
"同意并继续" = "同意并继续";
"回车" = "回车";
"在线" = "在线";
"地址" = "地址";
"填写服务器地址" = "填写服务器地址";
"填写端口" = "填写端口";
"声音" = "声音";
"失败" = "失败";
"始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。" = "始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。";
"媒体加密" = "媒体加密";
"字母数字" = "字母数字";
"完成" = "完成";
"完成隐私授权后可检查更新" = "完成隐私授权后可检查更新";
"完成隐私授权后登记本机身份" = "完成隐私授权后登记本机身份";
"密码将安全保存在本机 Keychain 中" = "密码将安全保存在本机 Keychain 中";
"对端 ID" = "对端 ID";
"对端 ID %1$@" = "对端 ID %1$@";
"将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。" = "将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。" = "将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。" = "将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。";
"屏幕方向" = "屏幕方向";
"展开远程控制菜单" = "展开远程控制菜单";
"已保存密码" = "已保存密码";
"已勾选" = "已勾选";
"已发送 Ctrl+Alt+Del" = "已发送 Ctrl+Alt+Del";
"已发送本机剪贴板" = "已发送本机剪贴板";
"已授权" = "已授权";
"已接收 %1$@" = "已接收 %1$@";
"已接收远端剪贴板" = "已接收远端剪贴板";
"已读" = "已读";
"已连接" = "已连接";
"已连接服务器" = "已连接服务器";
"帧率" = "帧率";
"帧率优先" = "帧率优先";
"平衡" = "平衡";
"应用中的许可文件缺失或损坏,请重新安装应用。" = "应用中的许可文件缺失或损坏,请重新安装应用。";
"开发版本包含尚未发布的修改,以下链接为基础版本源码。" = "开发版本包含尚未发布的修改,以下链接为基础版本源码。";
"开启保存" = "开启保存";
"开启隐私屏" = "开启隐私屏";
"开源组件" = "开源组件";
"开源软件权利说明" = "开源软件权利说明";
"当前已是最新版本" = "当前已是最新版本";
"成功连接后,这里会显示远端桌面的缩略图。" = "成功连接后,这里会显示远端桌面的缩略图。";
"我已阅读并同意《隐私政策》" = "我已阅读并同意《隐私政策》";
"我已阅读并同意隐私政策" = "我已阅读并同意隐私政策";
"打开隐私政策" = "打开隐私政策";
"指令发送失败,请重试" = "指令发送失败,请重试";
"指令已发送,等待电脑确认…" = "指令已发送,等待电脑确认…";
"按住并拖动,可滑出按键范围,松开结束拖拽" = "按住并拖动,可滑出按键范围,松开结束拖拽";
"授权后可使用远程连接。" = "授权后可使用远程连接。";
"授权状态" = "授权状态";
"接收" = "接收";
"控制模式" = "控制模式";
"控制端解码器" = "控制端解码器";
"撤回授权" = "撤回授权";
"撤回隐私授权" = "撤回隐私授权";
"收起电脑键盘" = "收起电脑键盘";
"收起系统键盘" = "收起系统键盘";
"收起远程控制菜单" = "收起远程控制菜单";
"收起鼠标" = "收起鼠标";
"数据" = "数据";
"断开后将返回首页" = "断开后将返回首页";
"断开远程连接?" = "断开远程连接?";
"断开连接" = "断开连接";
"新版本" = "新版本";
"新版本可用:v%1$@" = "新版本可用:v%1$@";
"无效" = "无效";
"无未读公告" = "无未读公告";
"无法" = "无法";
"无法保存本地阅读状态,请重试。" = "无法保存本地阅读状态,请重试。";
"无法删除这条公告,请重试。" = "无法删除这条公告,请重试。";
"无法访问本机登录凭据,请解锁后重试" = "无法访问本机登录凭据,请解锁后重试";
"无法读取开源许可" = "无法读取开源许可";
"无法读取所选文件,请重试" = "无法读取所选文件,请重试";
"是否撤回隐私授权?" = "是否撤回隐私授权?";
"显示器" = "显示器";
"显示器 %1$@" = "显示器 %1$@";
"显示器 1" = "显示器 1";
"显示密码" = "显示密码";
"暂不同意" = "暂不同意";
"暂无公告" = "暂无公告";
"最近连接" = "最近连接";
"服务器" = "服务器";
"服务器地址" = "服务器地址";
"服务器端口" = "服务器端口";
"服务器配置无效" = "服务器配置无效";
"未勾选" = "未勾选";
"未启用" = "未启用";
"未授权" = "未授权";
"未知" = "未知";
"未知信令状态" = "未知信令状态";
"未知连接状态" = "未知连接状态";
"未读" = "未读";
"未连接" = "未连接";
"本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。" = "本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。";
"本机 ID %1$@" = "本机 ID %1$@";
"本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。" = "本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。";
"本版本源码与构建说明" = "本版本源码与构建说明";
"本版本源码信息暂不可用。" = "本版本源码信息暂不可用。";
"构建说明" = "构建说明";
"构建配方与项目补丁" = "构建配方与项目补丁";
"查看源码" = "查看源码";
"检查失败,请稍后重试" = "检查失败,请稍后重试";
"检查更新" = "检查更新";
"正在关闭隐私屏…" = "正在关闭隐私屏…";
"正在准备连接…" = "正在准备连接…";
"正在发送 %1$@" = "正在发送 %1$@";
"正在发送 Ctrl+Alt+Del…" = "正在发送 Ctrl+Alt+Del…";
"正在取回远程画面…" = "正在取回远程画面…";
"正在建立远程连接" = "正在建立远程连接";
"正在开启隐私屏…" = "正在开启隐私屏…";
"正在收集 ICE 候选" = "正在收集 ICE 候选";
"正在检查更新…" = "正在检查更新…";
"正在清除…" = "正在清除…";
"正在确认设备状态…" = "正在确认设备状态…";
"正在获取本机 ID…" = "正在获取本机 ID…";
"正在连接" = "正在连接";
"正在连接信令服务" = "正在连接信令服务";
"清除" = "清除";
"清除预览图" = "清除预览图";
"清除预览图?" = "清除预览图?";
"源码与构建说明" = "源码与构建说明";
"源码版本" = "源码版本";
"版本" = "版本";
"版权与许可声明" = "版权与许可声明";
"电脑键盘" = "电脑键盘";
"画中画未能开启,请保持应用在前台后重试。" = "画中画未能开启,请保持应用在前台后重试。";
"画质优先" = "画质优先";
"画面偏好" = "画面偏好";
"画面延时" = "画面延时";
"画面设置" = "画面设置";
"画面质量" = "画面质量";
"画面采集帧率" = "画面采集帧率";
"相对位置" = "相对位置";
"相对鼠标" = "相对鼠标";
"知道了" = "知道了";
"确定" = "确定";
"确认" = "确认";
"离线" = "离线";
"空格" = "空格";
"端口" = "端口";
"符号功能" = "符号功能";
"等待电脑返回隐私屏状态;旧版电脑端可能不支持" = "等待电脑返回隐私屏状态;旧版电脑端可能不支持";
"等待连接" = "等待连接";
"等待隐私授权" = "等待隐私授权";
"系统键盘" = "系统键盘";
"绝对位置" = "绝对位置";
"绝对鼠标" = "绝对鼠标";
"网络状态" = "网络状态";
"网络连接已中断,请重新连接。" = "网络连接已中断,请重新连接。";
"自定义" = "自定义";
"虚拟鼠标" = "虚拟鼠标";
"被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴" = "被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴";
"被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。" = "被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。";
"被控端平台:%1$@" = "被控端平台:%1$@";
"被控端版本过低,请升级到最新版本。" = "被控端版本过低,请升级到最新版本。";
"被控端编码器" = "被控端编码器";
"视频" = "视频";
"视频 %1$@×%2$@ · %3$@ 帧" = "视频 %1$@×%2$@ · %3$@ 帧";
"触摸位置直接对应远端屏幕位置,适合快速定位。" = "触摸位置直接对应远端屏幕位置,适合快速定位。";
"许可" = "许可";
"许可与版权声明" = "许可与版权声明";
"许可与版权声明可离线查阅。" = "许可与版权声明可离线查阅。";
"设备离线" = "设备离线";
"设置" = "设置";
"设置,有新版本" = "设置,有新版本";
"访问密码" = "访问密码";
"访问密码错误,请重新输入。" = "访问密码错误,请重新输入。";
"请求超时,尚未确认电脑的隐私屏状态" = "请求超时,尚未确认电脑的隐私屏状态";
"请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。" = "请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。";
"请输入服务器地址,或关闭“使用自定义服务器”。" = "请输入服务器地址,或关闭“使用自定义服务器”。";
"请输入远程设备 ID" = "请输入远程设备 ID";
"调整失败,请重试。" = "调整失败,请重试。";
"软件许可" = "软件许可";
"返回控制栏" = "返回控制栏";
"还没有连接记录" = "还没有连接记录";
"这条公告已更新或删除,请返回公告列表查看。" = "这条公告已更新或删除,请返回公告列表查看。";
"远程桌面" = "远程桌面";
"远程设备 ID 不存在,请检查设备 ID。" = "远程设备 ID 不存在,请检查设备 ID。";
"远程设备当前不可用,请稍后重试。" = "远程设备当前不可用,请稍后重试。";
"远程连接已结束。" = "远程连接已结束。";
"连接" = "连接";
"连接延时(RTT)" = "连接延时(RTT)";
"连接建立后可调整,需被控端支持。" = "连接建立后可调整,需被控端支持。";
"连接建立后锁定横屏" = "连接建立后锁定横屏";
"连接提示" = "连接提示";
"连接方式" = "连接方式";
"连接远程桌面" = "连接远程桌面";
"退格" = "退格";
"通知公告" = "通知公告";
"部分预览图未能清除,请重试。" = "部分预览图未能清除,请重试。";
"重试" = "重试";
"重试保存阅读状态" = "重试保存阅读状态";
"锁定" = "锁定";
"键盘" = "键盘";
"键盘操作" = "键盘操作";
"阅读并授权" = "阅读并授权";
"隐私" = "隐私";
"隐私与授权" = "隐私与授权";
"隐私屏" = "隐私屏";
"隐私屏已关闭" = "隐私屏已关闭";
"隐私屏已开启" = "隐私屏已开启";
"隐私屏已被解锁" = "隐私屏已被解锁";
"隐私屏异常" = "隐私屏异常";
"隐私屏暂不可用" = "隐私屏暂不可用";
"隐私屏状态已过期,等待电脑确认" = "隐私屏状态已过期,等待电脑确认";
"隐私屏状态待确认" = "隐私屏状态待确认";
"隐私政策" = "隐私政策";
"隐私政策暂时无法读取,请拒绝联网并重新安装应用。" = "隐私政策暂时无法读取,请拒绝联网并重新安装应用。";
"隐藏密码" = "隐藏密码";
"静音" = "静音";
"音频" = "音频";
"项目主页" = "项目主页";
"预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。" = "预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。";
"高" = "高";
"默认" = "默认";
"默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。" = "默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。";
"鼠标右键" = "鼠标右键";
"鼠标左键" = "鼠标左键";
"鼠标控制" = "鼠标控制";
"鼠标滚轮" = "鼠标滚轮";
@@ -0,0 +1 @@
"NSLocalNetworkUsageDescription" = "CrossDesk 使用區域網發現並建立原生 P2P 遠端控制連線。";
@@ -0,0 +1,283 @@
// Generated by localization/generate.py.
"%1$@ 传输失败" = "%1$@ 傳輸失敗";
"%1$@ 台设备" = "%1$@ 臺裝置";
"%1$@ 条未读" = "%1$@ 條未讀";
"%1$@键盘页" = "%1$@鍵盤頁";
"%1$@,接收 %2$@,发送 %3$@,丢包率 %4$@" = "%1$@,接收 %2$@,傳送 %3$@,丟包率 %4$@";
"CrossDesk 使用局域网发现并建立原生 P2P 远程控制连接。" = "CrossDesk 使用區域網發現並建立原生 P2P 遠端控制連線。";
"Ctrl+Alt+Del 需要远端启用 Windows 系统服务" = "Ctrl+Alt+Del 需要遠端啟用 Windows 系統服務";
"GNU GPL 第 3 版" = "GNU GPL 第 3 版";
"OpenFEC 告知" = "OpenFEC 告知";
"OpenFEC 许可与源码" = "OpenFEC 許可與原始碼";
"P2P 直连" = "P2P 直連";
"P2P/TURN 建链失败,请检查网络后重试。" = "P2P/TURN 建鏈失敗,請檢查網路後重試。";
"SRTP 已启用" = "SRTP 已啟用";
"TLS 证书校验失败" = "TLS 證書校驗失敗";
"TURN 中继" = "TURN 中繼";
"上下滑动,可滑出按键范围" = "上下滑動,可滑出按鍵範圍";
"丢包率" = "丟包率";
"中" = "中";
"优先保持画面流畅,带宽或编码压力较大时会更积极地降低分辨率。" = "優先保持畫面流暢,頻寬或編碼壓力較大時會更積極地降低解析度。";
"低" = "低";
"使用自定义服务器" = "使用自定義伺服器";
"保存密码" = "儲存密碼";
"保存远程画面预览" = "儲存遠端畫面預覽";
"保存远程画面预览?" = "儲存遠端畫面預覽?";
"信令服务器已关闭连接" = "信令伺服器已關閉連線";
"信令服务重连中" = "信令服務重連中";
"信令连接失败" = "信令連線失敗";
"信令连接已关闭" = "信令連線已關閉";
"偏好模式" = "偏好模式";
"像触控板一样滑动光标,点击时操作当前光标位置。" = "像觸控板一樣滑動游標,點選時操作當前游標位置。";
"公告加载失败,请重试。" = "公告載入失敗,請重試。";
"公告详情" = "公告詳情";
"共 %1$@ 条 · %2$@ 条未读" = "共 %1$@ 條 · %2$@ 條未讀";
"关于" = "關於";
"关于 CrossDesk" = "關於 CrossDesk";
"关于,有新版本" = "關於,有新版本";
"关闭" = "關閉";
"关闭控制栏" = "關閉控制欄";
"关闭隐私屏" = "關閉隱私屏";
"兼顾清晰度和流畅度,只在持续压力下逐步降低分辨率。" = "兼顧清晰度和流暢度,只在持續壓力下逐步降低解析度。";
"分辨率" = "解析度";
"切换到电脑键盘" = "切換到電腦鍵盤";
"切换到系统键盘" = "切換到系統鍵盤";
"删除" = "刪除";
"删除公告" = "刪除公告";
"删除记录" = "刪除記錄";
"删除这条公告?" = "刪除這條公告?";
"刷新公告" = "重新整理公告";
"剪贴板" = "剪貼簿";
"剪贴板中没有文本" = "剪貼簿中沒有文字";
"剪贴板文本超过 128 KiB" = "剪貼簿文字超過 128 KiB";
"加载中…" = "載入中…";
"加载更多" = "載入更多";
"升级提示" = "更新提示";
"单次输入最多 16 KiB,且不能包含空字符" = "單次輸入最多 16 KiB,且不能包含空字元";
"发送" = "傳送";
"发送文件" = "傳送檔案";
"取消" = "取消";
"取消连接" = "取消連線";
"各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。" = "各元件遵循所列開源許可證,其授予的權利不受本應用普通使用條款限制。檢視原始碼需要網路連線。";
"合计" = "合計";
"同意并继续" = "同意並繼續";
"回车" = "回車";
"在线" = "線上";
"地址" = "地址";
"填写服务器地址" = "填寫伺服器地址";
"填写端口" = "填寫埠";
"声音" = "聲音";
"失败" = "失敗";
"始终保持较高分辨率,带宽不足时通过降低帧率来保证画面清晰度。" = "始終保持較高解析度,頻寬不足時透過降低幀率來保證畫面清晰度。";
"媒体加密" = "媒體加密";
"字母数字" = "字母數字";
"完成" = "完成";
"完成隐私授权后可检查更新" = "完成隱私授權後可檢查更新";
"完成隐私授权后登记本机身份" = "完成隱私授權後登記本機身份";
"密码将安全保存在本机 Keychain 中" = "密碼將安全儲存在本機 Keychain 中";
"对端 ID" = "對端 ID";
"对端 ID %1$@" = "對端 ID %1$@";
"将停止远程连接、关闭画面预览保存并清除已有预览。连接记录和接收文件会保留,已有服务端数据不会删除。您可随时重新授权。" = "將停止遠端連線、關閉畫面預覽儲存並清除已有預覽。連線記錄和接收檔案會保留,已有服務端資料不會刪除。您可隨時重新授權。";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。" = "將刪除本機儲存的所有遠端預覽圖,保留連線記錄、密碼和接收的檔案。";
"将删除本机保存的所有远程预览图,保留连接记录、密码和接收的文件。后续连接仍会保存新的预览图。" = "將刪除本機儲存的所有遠端預覽圖,保留連線記錄、密碼和接收的檔案。後續連線仍會儲存新的預覽圖。";
"屏幕方向" = "螢幕方向";
"展开远程控制菜单" = "展開遠端控制選單";
"已保存密码" = "已儲存密碼";
"已勾选" = "已勾選";
"已发送 Ctrl+Alt+Del" = "已傳送 Ctrl+Alt+Del";
"已发送本机剪贴板" = "已傳送本機剪貼簿";
"已授权" = "已授權";
"已接收 %1$@" = "已接收 %1$@";
"已接收远端剪贴板" = "已接收遠端剪貼簿";
"已读" = "已讀";
"已连接" = "已連線";
"已连接服务器" = "已連線伺服器";
"帧率" = "幀率";
"帧率优先" = "影格率優先";
"平衡" = "平衡";
"应用中的许可文件缺失或损坏,请重新安装应用。" = "應用中的許可檔案缺失或損壞,請重新安裝應用。";
"开发版本包含尚未发布的修改,以下链接为基础版本源码。" = "開發版本包含尚未釋出的修改,以下連結為基礎版本原始碼。";
"开启保存" = "啟用儲存";
"开启隐私屏" = "開啟隱私屏";
"开源组件" = "開源元件";
"开源软件权利说明" = "開源軟體權利說明";
"当前已是最新版本" = "當前已是最新版本";
"成功连接后,这里会显示远端桌面的缩略图。" = "成功連線後,這裡會顯示遠端桌面的縮圖。";
"我已阅读并同意《隐私政策》" = "我已閱讀並同意《隱私政策》";
"我已阅读并同意隐私政策" = "我已閱讀並同意隱私政策";
"打开隐私政策" = "開啟隱私政策";
"指令发送失败,请重试" = "指令傳送失敗,請重試";
"指令已发送,等待电脑确认…" = "指令已傳送,等待電腦確認…";
"按住并拖动,可滑出按键范围,松开结束拖拽" = "按住並拖動,可滑出按鍵範圍,鬆開結束拖拽";
"授权后可使用远程连接。" = "授權後可使用遠端連線。";
"授权状态" = "授權狀態";
"接收" = "接收";
"控制模式" = "控制模式";
"控制端解码器" = "控制端解碼器";
"撤回授权" = "撤回授權";
"撤回隐私授权" = "撤回隱私授權";
"收起电脑键盘" = "收起電腦鍵盤";
"收起系统键盘" = "收起系統鍵盤";
"收起远程控制菜单" = "收起遠端控制選單";
"收起鼠标" = "收起滑鼠";
"数据" = "資料";
"断开后将返回首页" = "斷開後將返回首頁";
"断开远程连接?" = "斷開遠端連線?";
"断开连接" = "中斷連線";
"新版本" = "新版本";
"新版本可用:v%1$@" = "新版本可用:v%1$@";
"无效" = "無效";
"无未读公告" = "無未讀公告";
"无法" = "無法";
"无法保存本地阅读状态,请重试。" = "無法儲存本地閱讀狀態,請重試。";
"无法删除这条公告,请重试。" = "無法刪除這條公告,請重試。";
"无法访问本机登录凭据,请解锁后重试" = "無法訪問本機登入憑據,請解鎖後重試";
"无法读取开源许可" = "無法讀取開源許可";
"无法读取所选文件,请重试" = "無法讀取所選檔案,請重試";
"是否撤回隐私授权?" = "是否撤回隱私授權?";
"显示器" = "顯示器";
"显示器 %1$@" = "顯示器 %1$@";
"显示器 1" = "顯示器 1";
"显示密码" = "顯示密碼";
"暂不同意" = "暫不同意";
"暂无公告" = "暫無公告";
"最近连接" = "最近連線";
"服务器" = "伺服器";
"服务器地址" = "伺服器地址";
"服务器端口" = "伺服器埠";
"服务器配置无效" = "伺服器配置無效";
"未勾选" = "未勾選";
"未启用" = "未啟用";
"未授权" = "未授權";
"未知" = "未知";
"未知信令状态" = "未知信令狀態";
"未知连接状态" = "未知連線狀態";
"未读" = "未讀";
"未连接" = "未連線";
"本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。" = "本應用使用 OpenFEC 提供前向糾錯功能,遵循 CeCILL-C 1.0 許可。該許可規定了有限保證及責任限制,詳情見許可全文。";
"本机 ID %1$@" = "本機 ID %1$@";
"本机登录凭据暂时无法安全存取。请解锁设备后,在设置中点击“应用”重试。" = "本機登入憑據暫時無法安全存取。請解鎖裝置後,在設定中點選“應用”重試。";
"本版本源码与构建说明" = "本版本原始碼與構建說明";
"本版本源码信息暂不可用。" = "本版本原始碼資訊暫不可用。";
"构建说明" = "構建說明";
"构建配方与项目补丁" = "構建配方與專案補丁";
"查看源码" = "檢視原始碼";
"检查失败,请稍后重试" = "檢查失敗,請稍後重試";
"检查更新" = "檢查更新";
"正在关闭隐私屏…" = "正在關閉隱私屏…";
"正在准备连接…" = "正在準備連線…";
"正在发送 %1$@" = "正在傳送 %1$@";
"正在发送 Ctrl+Alt+Del…" = "正在傳送 Ctrl+Alt+Del…";
"正在取回远程画面…" = "正在取回遠端畫面…";
"正在建立远程连接" = "正在建立遠端連線";
"正在开启隐私屏…" = "正在開啟隱私屏…";
"正在收集 ICE 候选" = "正在收集 ICE 候選";
"正在检查更新…" = "正在檢查更新…";
"正在清除…" = "正在清除…";
"正在确认设备状态…" = "正在確認裝置狀態…";
"正在获取本机 ID…" = "正在獲取本機 ID…";
"正在连接" = "正在連線";
"正在连接信令服务" = "正在連線信令服務";
"清除" = "清除";
"清除预览图" = "清除預覽圖";
"清除预览图?" = "清除預覽圖?";
"源码与构建说明" = "原始碼與構建說明";
"源码版本" = "原始碼版本";
"版本" = "版本";
"版权与许可声明" = "版權與許可宣告";
"电脑键盘" = "電腦鍵盤";
"画中画未能开启,请保持应用在前台后重试。" = "畫中畫未能開啟,請保持應用在前臺後重試。";
"画质优先" = "畫質優先";
"画面偏好" = "畫面偏好";
"画面延时" = "畫面延遲";
"画面设置" = "畫面設定";
"画面质量" = "畫面質量";
"画面采集帧率" = "畫面採集幀率";
"相对位置" = "相對位置";
"相对鼠标" = "相對滑鼠";
"知道了" = "知道了";
"确定" = "確定";
"确认" = "確認";
"离线" = "離線";
"空格" = "空白鍵";
"端口" = "埠";
"符号功能" = "符號功能";
"等待电脑返回隐私屏状态;旧版电脑端可能不支持" = "等待電腦返回隱私屏狀態;舊版電腦端可能不支援";
"等待连接" = "等待連線";
"等待隐私授权" = "等待隱私授權";
"系统键盘" = "系統鍵盤";
"绝对位置" = "絕對位置";
"绝对鼠标" = "絕對滑鼠";
"网络状态" = "網路狀態";
"网络连接已中断,请重新连接。" = "網路連線已中斷,請重新連線。";
"自定义" = "自定義";
"虚拟鼠标" = "虛擬滑鼠";
"被控端不支持直接输入中文,请更新 macOS 被控端;也可先复制文字,通过远控菜单的剪贴板发送后粘贴" = "被控端不支援直接輸入中文,請更新 macOS 被控端;也可先複製文字,透過遠控選單的剪貼簿傳送後貼上";
"被控端已通过组合键解除隐私屏。点击“锁定”将重新开启隐私屏,并禁止本机使用组合键解锁。" = "被控端已透過組合鍵解除隱私屏。點選“鎖定”將重新開啟隱私屏,並禁止本機使用組合鍵解鎖。";
"被控端平台:%1$@" = "被控端平臺:%1$@";
"被控端版本过低,请升级到最新版本。" = "被控端版本過低,請升級到最新版本。";
"被控端编码器" = "被控端編碼器";
"视频" = "影片";
"视频 %1$@×%2$@ · %3$@ 帧" = "影片 %1$@×%2$@ · %3$@ 幀";
"触摸位置直接对应远端屏幕位置,适合快速定位。" = "觸控位置直接對應遠端螢幕位置,適合快速定位。";
"许可" = "許可";
"许可与版权声明" = "許可與版權宣告";
"许可与版权声明可离线查阅。" = "許可與版權宣告可離線查閱。";
"设备离线" = "裝置離線";
"设置" = "設定";
"设置,有新版本" = "設定,有新版本";
"访问密码" = "訪問密碼";
"访问密码错误,请重新输入。" = "訪問密碼錯誤,請重新輸入。";
"请求超时,尚未确认电脑的隐私屏状态" = "請求超時,尚未確認電腦的隱私屏狀態";
"请输入 1–65535 范围内的端口,或关闭“使用自定义服务器”。" = "請輸入 1–65535 範圍內的埠,或關閉“使用自定義伺服器”。";
"请输入服务器地址,或关闭“使用自定义服务器”。" = "請輸入伺服器地址,或關閉“使用自定義伺服器”。";
"请输入远程设备 ID" = "請輸入遠端裝置 ID";
"调整失败,请重试。" = "調整失敗,請重試。";
"软件许可" = "軟體許可";
"返回控制栏" = "返回控制欄";
"还没有连接记录" = "還沒有連線記錄";
"这条公告已更新或删除,请返回公告列表查看。" = "這條公告已更新或刪除,請返回公告列表檢視。";
"远程桌面" = "遠端桌面";
"远程设备 ID 不存在,请检查设备 ID。" = "遠端裝置 ID 不存在,請檢查裝置 ID。";
"远程设备当前不可用,请稍后重试。" = "遠端裝置當前不可用,請稍後重試。";
"远程连接已结束。" = "遠端連線已結束。";
"连接" = "連線";
"连接延时(RTT)" = "連線延時(RTT)";
"连接建立后可调整,需被控端支持。" = "連線建立後可調整,需被控端支援。";
"连接建立后锁定横屏" = "連線建立後鎖定橫屏";
"连接提示" = "連線提示";
"连接方式" = "連線方式";
"连接远程桌面" = "連線遠端桌面";
"退格" = "退格";
"通知公告" = "通知公告";
"部分预览图未能清除,请重试。" = "部分預覽圖未能清除,請重試。";
"重试" = "重試";
"重试保存阅读状态" = "重試儲存閱讀狀態";
"锁定" = "鎖定";
"键盘" = "鍵盤";
"键盘操作" = "鍵盤操作";
"阅读并授权" = "閱讀並授權";
"隐私" = "隱私";
"隐私与授权" = "隱私與授權";
"隐私屏" = "隱私屏";
"隐私屏已关闭" = "隱私屏已關閉";
"隐私屏已开启" = "隱私屏已開啟";
"隐私屏已被解锁" = "隱私屏已被解鎖";
"隐私屏异常" = "隱私屏異常";
"隐私屏暂不可用" = "隱私屏暫不可用";
"隐私屏状态已过期,等待电脑确认" = "隱私屏狀態已過期,等待電腦確認";
"隐私屏状态待确认" = "隱私屏狀態待確認";
"隐私政策" = "隱私政策";
"隐私政策暂时无法读取,请拒绝联网并重新安装应用。" = "隱私政策暫時無法讀取,請拒絕聯網並重新安裝應用。";
"隐藏密码" = "隱藏密碼";
"静音" = "靜音";
"音频" = "音訊";
"项目主页" = "專案主頁";
"预览可能包含远程电脑上的个人或工作信息。开启后,每次连接会自动将一张画面保存在本机并显示在最近连接中。你可以随时关闭并清除。" = "預覽可能包含遠端電腦上的個人或工作資訊。開啟後,每次連線會自動將一張畫面儲存在本機並顯示在最近連線中。你可以隨時關閉並清除。";
"高" = "高";
"默认" = "預設";
"默认关闭。开启后,iPhone 连接时进入并保持横屏;关闭时跟随设备方向。iPad 不受影响。" = "預設關閉。開啟後,iPhone 連線時進入並保持橫屏;關閉時跟隨裝置方向。iPad 不受影響。";
"鼠标右键" = "滑鼠右鍵";
"鼠标左键" = "滑鼠左鍵";
"鼠标控制" = "滑鼠控制";
"鼠标滚轮" = "滑鼠滾輪";
@@ -82,27 +82,27 @@ struct ThirdPartyLicensesView: View {
var body: some View {
List {
Section {
LabeledContent("版本", value: appUpdates.currentVersion)
LabeledContent(NSLocalizedString("版本", comment: ""), value: appUpdates.currentVersion)
if appUpdates.updateAvailable {
Link(destination: URL(string: "https://crossdesk.cn")!) {
HStack {
UpdateDot()
Text("新版本可用:v\(appUpdates.availableVersion)")
Text(String(format: NSLocalizedString("新版本可用:v%1$@", comment: ""), String(describing: appUpdates.availableVersion)))
Spacer()
Image(systemName: "arrow.up.right")
}
}
}
if !session.hasNetworkConsent {
Text("完成隐私授权后可检查更新").foregroundStyle(.secondary)
Text(NSLocalizedString("完成隐私授权后可检查更新", comment: "")).foregroundStyle(.secondary)
} else if appUpdates.status == .checking {
Text("正在检查更新…").foregroundStyle(.secondary)
Text(NSLocalizedString("正在检查更新…", comment: "")).foregroundStyle(.secondary)
} else if appUpdates.status == .upToDate {
Text("当前已是最新版本").foregroundStyle(.secondary)
Text(NSLocalizedString("当前已是最新版本", comment: "")).foregroundStyle(.secondary)
} else if appUpdates.status == .failed {
Text("检查失败,请稍后重试").foregroundStyle(.red)
Text(NSLocalizedString("检查失败,请稍后重试", comment: "")).foregroundStyle(.red)
}
Button("检查更新") {
Button(NSLocalizedString("检查更新", comment: "")) {
if session.hasNetworkConsent { appUpdates.checkNow() }
else { session.showPrivacyNotice() }
}
@@ -112,26 +112,26 @@ struct ThirdPartyLicensesView: View {
case .success(let catalog):
if let application = catalog.components.first(where: { $0.id == "crossdesk" }) {
Section {
NavigationLink("软件许可") {
NavigationLink(NSLocalizedString("软件许可", comment: "")) {
ComponentLicenseView(component: application)
}
NavigationLink("开源组件") {
NavigationLink(NSLocalizedString("开源组件", comment: "")) {
OpenSourceComponentsView(catalog: catalog)
}
NavigationLink("源码与构建说明") {
NavigationLink(NSLocalizedString("源码与构建说明", comment: "")) {
SourceCodeView(application: application)
}
} footer: {
Text("许可与版权声明可离线查阅。")
Text(NSLocalizedString("许可与版权声明可离线查阅。", comment: ""))
}
}
case .failure:
VStack(spacing: 12) {
Image(systemName: "doc.text.magnifyingglass")
.font(.largeTitle)
Text("无法读取开源许可")
Text(NSLocalizedString("无法读取开源许可", comment: ""))
.font(.headline)
Text("应用中的许可文件缺失或损坏,请重新安装应用。")
Text(NSLocalizedString("应用中的许可文件缺失或损坏,请重新安装应用。", comment: ""))
.foregroundStyle(.secondary)
.multilineTextAlignment(.center)
}
@@ -140,7 +140,7 @@ struct ThirdPartyLicensesView: View {
}
.readableContentWidth()
.background(Color(.systemGroupedBackground).ignoresSafeArea())
.navigationTitle("关于 CrossDesk")
.navigationTitle(NSLocalizedString("关于 CrossDesk", comment: ""))
.navigationBarTitleDisplayMode(.inline)
.onChange(of: session.hasNetworkConsent) { allowed in
if allowed { appUpdates.checkNow() }
@@ -163,13 +163,13 @@ private struct OpenSourceComponentsView: View {
var body: some View {
List {
if let openFEC = catalog.components.first(where: { $0.id == "openfec" }) {
Section("OpenFEC 告知") {
Text("本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。")
Section(NSLocalizedString("OpenFEC 告知", comment: "")) {
Text(NSLocalizedString("本应用使用 OpenFEC 提供前向纠错功能,遵循 CeCILL-C 1.0 许可。该许可规定了有限保证及责任限制,详情见许可全文。", comment: ""))
.font(.footnote)
.foregroundStyle(.secondary)
Text("(c) Copyright 2009 - 2012 INRIA - All rights reserved")
.font(.footnote)
NavigationLink("OpenFEC 许可与源码") {
NavigationLink(NSLocalizedString("OpenFEC 许可与源码", comment: "")) {
ComponentLicenseView(component: openFEC)
}
}
@@ -188,12 +188,12 @@ private struct OpenSourceComponentsView: View {
}
}
} footer: {
Text("各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。")
Text(NSLocalizedString("各组件遵循所列开源许可证,其授予的权利不受本应用普通使用条款限制。查看源码需要网络连接。", comment: ""))
}
}
.readableContentWidth()
.background(Color(.systemGroupedBackground).ignoresSafeArea())
.navigationTitle("开源组件")
.navigationTitle(NSLocalizedString("开源组件", comment: ""))
.navigationBarTitleDisplayMode(.inline)
}
}
@@ -203,27 +203,27 @@ private struct SourceCodeView: View {
var body: some View {
List {
Section("本版本源码与构建说明") {
Section(NSLocalizedString("本版本源码与构建说明", comment: "")) {
if let source = SourceMetadata.bundled {
LabeledContent("源码版本", value: source.tag ?? String(source.revision.prefix(12)))
LabeledContent(NSLocalizedString("源码版本", comment: ""), value: source.tag ?? String(source.revision.prefix(12)))
.textSelection(.enabled)
if source.isModified {
Text("开发版本包含尚未发布的修改,以下链接为基础版本源码。")
Text(NSLocalizedString("开发版本包含尚未发布的修改,以下链接为基础版本源码。", comment: ""))
.font(.footnote)
.foregroundStyle(.secondary)
}
Link("查看源码", destination: source.sourceURL)
Link("构建说明", destination: source.buildInstructionsURL)
Link(NSLocalizedString("查看源码", comment: ""), destination: source.sourceURL)
Link(NSLocalizedString("构建说明", comment: ""), destination: source.buildInstructionsURL)
} else {
Text("本版本源码信息暂不可用。")
Text(NSLocalizedString("本版本源码信息暂不可用。", comment: ""))
.foregroundStyle(.secondary)
Link("项目主页", destination: application.sourceURL)
Link(NSLocalizedString("项目主页", comment: ""), destination: application.sourceURL)
}
}
}
.readableContentWidth()
.background(Color(.systemGroupedBackground).ignoresSafeArea())
.navigationTitle("源码与构建说明")
.navigationTitle(NSLocalizedString("源码与构建说明", comment: ""))
.navigationBarTitleDisplayMode(.inline)
}
}
@@ -234,15 +234,15 @@ private struct ComponentLicenseView: View {
var body: some View {
List {
Section {
LabeledContent("版本", value: component.displayVersion)
LabeledContent(NSLocalizedString("版本", comment: ""), value: component.displayVersion)
.textSelection(.enabled)
LabeledContent("许可", value: component.license)
Link("查看源码", destination: component.resolvedSourceURL)
LabeledContent(NSLocalizedString("许可", comment: ""), value: component.license)
Link(NSLocalizedString("查看源码", comment: ""), destination: component.resolvedSourceURL)
if let buildSourceURL = component.resolvedBuildSourceURL {
Link("构建配方与项目补丁", destination: buildSourceURL)
Link(NSLocalizedString("构建配方与项目补丁", comment: ""), destination: buildSourceURL)
}
}
Section("许可与版权声明") {
Section(NSLocalizedString("许可与版权声明", comment: "")) {
ForEach(component.documents) { document in
NavigationLink {
LicenseTextView(text: document.text)
@@ -263,9 +263,9 @@ private struct ComponentLicenseView: View {
private func documentTitle(_ title: String) -> String {
switch title {
case "Source copyright and license notices": return "版权与许可声明"
case "apps/ios/licenses/OPEN_SOURCE_NOTICE.txt": return "开源软件权利说明"
case "LICENSE" where component.id == "crossdesk": return "GNU GPL 第 3 版"
case "Source copyright and license notices": return NSLocalizedString("版权与许可声明", comment: "")
case "apps/ios/licenses/OPEN_SOURCE_NOTICE.txt": return NSLocalizedString("开源软件权利说明", comment: "")
case "LICENSE" where component.id == "crossdesk": return NSLocalizedString("GNU GPL 第 3 版", comment: "")
default: return title
}
}