mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-11-04 00:33:12 +00:00
* fix web break introduced in 38f130071 fix(linux): enable mouse side buttons in remote sessions (#14848)
* feat(shortcuts): user-configurable keyboard shortcuts for session actions
Adds a keyboard shortcut feature (Rust matcher + Dart UI + cross-language
parity tests) that lets users bind combinations like Ctrl+Alt+Shift+P to
session actions. Bindings are stored in LocalConfig under
`keyboard-shortcuts`; the matcher gates dispatch on `enabled` and
`pass_through` flags so flipping the master switch off is a hard stop.
Wire-up summary:
- src/keyboard/shortcuts.rs: matcher, default bindings, parity test against
flutter/test/fixtures/default_keyboard_shortcuts.json
- src/keyboard.rs: shortcut intercept in process_event{,_with_session},
feature-gated to `flutter`; runs before key swapping so users bind to
physical keys
- src/flutter_ffi.rs: main_reload_keyboard_shortcuts +
main_get_default_keyboard_shortcuts; reload_from_config seeded in main_init
- flutter/lib/common/widgets/keyboard_shortcuts/: shared config page body,
recording dialog, shortcut display formatter, action group registry
- flutter/lib/desktop/pages/desktop_keyboard_shortcuts_page.dart and
flutter/lib/mobile/pages/mobile_keyboard_shortcuts_page.dart: platform
shells around the shared body
- flutter/lib/models/shortcut_model.dart: per-session ShortcutModel +
registerSessionShortcutActions for actions with no toolbar TToggleMenu /
TRadioMenu (fullscreen, switch display/tab, close tab, voice call, etc.)
- flutter/lib/common/widgets/toolbar.dart: optional `actionId` field on
TToggleMenu / TRadioMenu, plus per-helper auto-register pass that wires
tagged entries' existing onChanged into the ShortcutModel
- flutter/test/keyboard_shortcuts_test.dart + fixtures: cross-language
parity (default bindings, supported key vocabulary)
Design principles applied during review:
1. Additions are fine; modifications to original logic must be deliberate.
Tagging an existing TToggleMenu entry with `actionId:` is an addition.
Rewriting its onChanged to satisfy a new contract is a modification —
and was reverted for every case where the original click behavior was
working. Four closures were touched and then reverted (mobile View
Mode, Privacy mode multi-impl, Relative mouse mode, Reverse mouse
wheel); their shortcuts are wired via standalone closures in
shortcut_model.dart instead.
2. Toolbar auto-register is reserved for entries whose onChanged is
inherently self-flipping — typically `sessionToggleOption(name)` where
the named option is flipped in place and the input bool is unused. The
register pass passes `!menu.value` from registration time, which is
harmless under self-flipping but wrong for closures that consume the
input bool directly. Tagging a non-self-flipping entry forces a closure
rewrite; choose non-toolbar registration in that case.
3. When shortcuts are disabled, toolbar behavior must be bit-for-bit
unchanged. The matcher's `enabled`-gate already guarantees no
dispatch; the auto-register pass is left unconditional (its only effect
is HashMap operations on a separate ShortcutModel) so mid-session
enable works without a reconnect. The trade-off is intentional and
documented at the top of toolbarControls.
4. Comments stay terse. Rationale lives in one place — the doc comment of
the helper or registration site, not duplicated at every call site.
5. Where an existing helper needs a new optional behavior (e.g.
`_OptionCheckBox` gaining a tooltip slot), the new branch must reduce
to byte-identical output for existing callers (`trailing == null`
case → original `Expanded(Text)` layout). Verified.
6. Action IDs and labels stay consistent. Renamed `reset_cursor` →
`reset_canvas` so the action ID matches its user-facing label
("Reset canvas") and capability flag.
Out-of-scope but included:
- AGENTS.md: documents flutter_rust_bridge no-codegen workflow and the
Web target's hand-written TS client, since both are load-bearing for
any new FFI work.
- remote_toolbar.dart: i18n fix for the per-monitor tooltip ("All
monitors" / "Monitor #N"), unrelated to shortcuts but kept here.
* langs
* fix(keyboard): shortcuts, harden config and callback lifecycle
Signed-off-by: fufesou <linlong1266@gmail.com>
* feat(keyboard): shortcuts, color of "Reset to defaults"
Signed-off-by: fufesou <linlong1266@gmail.com>
* feat(keyboard): shortcuts, release keys before shortcut callback
Signed-off-by: fufesou <linlong1266@gmail.com>
* feat(keyboard): shortcuts, debug web
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(keyboard): iPad, icon
Signed-off-by: fufesou <linlong1266@gmail.com>
* langs: add shortcut keys to az, gl, ur
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ra4my61t8q1FN5n59wB16D
* fix(keyboard): shortcuts, keep local modifiers and release keys on the right session
When a chord fired, the shortcut path reused release_remote_keys(), which
replays synthetic releases through process_event(). That cleared the local
MODIFIERS_STATE while the user still held the modifiers, so the next key of
a held chord no longer matched and leaked to the remote, and it sent the
releases to the globally current session instead of the one that typed the
chord.
The shortcut path now releases the remote keys itself: it sends through the
caller's session, and restores the modifiers it released on the remote as
still held locally. The press that fired is remembered until its release,
so its auto repeats and its release are consumed instead of reaching the
remote.
Also state the contract for unavailable actions: a bound chord always
belongs to RustDesk and is a no-op when the session has no handler.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ra4my61t8q1FN5n59wB16D
* fix(keyboard): shortcuts, record the physical key
The recording dialog and the Web Flutter matcher named keys by
LogicalKeyboardKey, while the native matcher sees the physical key through
its USB HID usage and the Web JS matcher through KeyboardEvent.code. On
AZERTY, QWERTZ, Dvorak and similar layouts a recorded binding then did not
fire, or fired from another key.
Name keys by their physical position everywhere: physicalKeyName maps the
USB HID usage to the stored name. A new fixture pins every name to its USB
HID usage, checked on the Dart side and against rdev::usb_hid_key_from_code
on the Rust side, and a test covers AZERTY and QWERTZ events.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ra4my61t8q1FN5n59wB16D
* fix(keyboard): shortcuts, keep an empty binding list on re-enable
setEnabled seeded the defaults whenever the binding list was empty, so a
user who cleared every binding got all defaults back after disable and
enable. Seed only when the config has never held a bindings list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ra4my61t8q1FN5n59wB16D
* fix(keyboard): shortcuts, track every fired key until its release
FIRED_KEY held a single key, so overlapping shortcut keys broke it: with the
chord held, P then C overwrote P, P's release reached the remote, and a P
repeat could fire the screenshot again. A repeat after the modifiers were
released was also treated as a new press and leaked to the remote.
Keep a set of fired keys instead. Once a press fires, every event of that
key belongs to RustDesk until its release: repeats are consumed without
dispatching, whatever the modifiers do, and the release removes the key.
Entries whose release never arrives are dropped when a session view is
entered or a session is closed, not by guessing from the modifiers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ra4my61t8q1FN5n59wB16D
* fix(keyboard): shortcuts, keep fired keys per session
FIRED_KEYS was process-global while dispatch is per session. Closing or
entering any session cleared the fired keys of all of them, so a key still
held in another session leaked its release to that remote, and a key fired
in one session made the same key in another session look like a repeat.
Key the fired set by session: try_dispatch resolves the session first and
only looks at that session's keys, and session_close clears only the
closing session. Entering a session view no longer clears anything: it is
a pointer enter, and a fired key may still be physically held across it.
A key whose release is missed otherwise heals itself: its next press is
consumed as a repeat and that release removes it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ra4my61t8q1FN5n59wB16D
* fix(shortcuts): preserve input state and refresh action availability
* fix(keyboard): shortcuts, keep a fired key owned across session close
Close tab is itself a shortcut, so the session that consumed the key press
is gone before the key is released. Both matchers dropped the key with the
session: the Flutter dispatcher removed its own entries in clear(), and the
Rust set was keyed by session and cleared in session_close. The release,
and the repeats while the key stayed held, then reached the next session's
remote as ordinary input.
Ownership of a fired key is physical, so it is now one set shared by every
session on each side, and closing a session no longer touches it: clear()
only drops the pending action and modifier replay, and the Rust session
state only tracks released modifiers. A key whose release is missed heals
itself on its next press. Entering view-only with the Flutter input source
still clears the Rust set, since that source stops routing key events to it.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ra4my61t8q1FN5n59wB16D
* fix(keyboard): shortcuts, drop the Toggle Input Source action
The action switches the key capture backend between key down and key up.
Fired-key ownership lives in whichever matcher saw the press, the Flutter
dispatcher or the Rust set, and there is no handoff between them: after the
switch the repeats and the release of the held key reach the other backend,
which forwards them to the remote and, while the chord is held, matches the
action again and toggles the source back. Remove the shortcut instead of
building a handoff for one action. The toolbar radio menu is unchanged.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ra4my61t8q1FN5n59wB16D
* perf(keyboard): shortcuts, parse the config once per stored value
The Flutter matcher read the local config three times and parsed its JSON
three times on every key press in legacy mode, on Web and in view-only.
Keep one parsed snapshot keyed by the raw stored string, so a key press
costs one config read and no parsing while the config is unchanged. The
existing readers are thin views of the same snapshot.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ra4my61t8q1FN5n59wB16D
* fix(keyboard): shortcuts, run focus-changing actions on key release
Close tab and tab switching move keyboard focus to another session before
the key that fired them is released. On Linux the Flutter input source
routes map-mode sessions through the Rust matcher and legacy-mode sessions
through the Dart matcher, and neither knows the other's fired keys, so
after such an action the repeats and the release of the held key reached
the next session's remote, and the key stayed recorded as fired in the
matcher that saw the press.
Routing Linux legacy mode through the Rust FFI path instead is not a drop-in
change: the raw key handler builds its event with no unicode, so Rust's
legacy mode would fall back to US key names and lose the layout-aware
characters the Dart path sends today, and it would take modifiers from the
X11 key state instead of Flutter's.
Run these three actions when the fired key is released. The matcher that
consumed the press then also sees the repeats and the release, the remote
modifiers are still released on the press, and a session that closes drops
the action it owed. Both matchers keep the same list of actions.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ra4my61t8q1FN5n59wB16D
* test(keyboard): shortcuts, pin the key-up action list on both sides
kShortcutActionsRunOnKeyUp and runs_on_release are two hand-kept lists of
the actions that run on key release. Add a shared fixture and check each
side against it, the way the key vocabulary and the default bindings are
already checked, so adding a focus-changing action on one side breaks a
test until the other side follows. The Dart test also checks that every
listed id is a configurable action.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ra4my61t8q1FN5n59wB16D
* fix: prevent lost input after remote session shortcuts
Avoid synthetic Alt presses that activate the Windows system menu
and swallow the next character.
Trigger restart, switch-sides, and chat actions on key release so
focus changes cannot leave subsequent shortcut presses ignored.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(mobile): correct Chat keyboard and input helper behavior
- Keep soft keyboard and helper hidden when Chat opens via shortcut
- Restore soft input on touch and remote focus after Chat closes
- Handle modifier releases while Chat owns focus
- Clear hidden virtual modifiers while preserving held keys and Pin behavior
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(shortcuts): prevent recording non-simultaneous key combinations
Build new captures from currently held keys instead of reusing released
letters. Preserve the last valid chord after release so it can be saved.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(shortcuts): isolate window actions and prevent duplicate Alt presses
- Dispatch shortcut actions only to the originating session window.
- Clear local modifier state on focus loss without resending modifiers
already released to Windows peers, preventing lost following input.
- Strengthen the regression assertion against extra Alt keydown events
Signed-off-by: fufesou <linlong1266@gmail.com>
* refact(shortcuts): empty default shortcuts for Cmd+Option+Shift+Del on macOS and iOS
Because Del may be ambiguous for new macOS users.
Cmd+Option+Shift+Backspace is "Empty Trash without confirmation" shortcut on macOS.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: use session peer platform for Ctrl+Alt+Del events
Fix Android-to-Linux Ctrl+Alt+Del delivery by using the session's peer
platform instead of the desktop global session, which defaults to Windows
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: hide relative mouse mode shortcuts on Wayland
Separate relative mouse mode availability from screenshot support.
Filter unsupported actions and defaults while preserving saved bindings
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: align shortcut availability with platform support
- Hide unsupported mobile and web shortcut actions
- Enable mobile scaling and Android voice call shortcuts
- Use openMonitorInTheSameTab() for display switching
- Preserve cursor position when switching displays on desktop and web
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: prevent held-key shortcut recording bypass
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: preserve keyboard input after shortcut dialogs
Run native clipboard shortcuts on key release and wait for remote modifier releases before dispatching.
Release remote modifiers when mobile local UI takes focus, and document the tested iPad Bluetooth Mute shortcut limitation.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: preserve remote key state during local shortcuts
Keep unrelated held keys pressed for session actions that retain input. Preserve key release when focus or input handling changes, and avoid synthetic Alt taps during shortcut dispatch.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: suspend saved relative mouse shortcuts on Wayland
Filter the native active binding cache without changing stored configuration, so the binding becomes available again under X11.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: exclude unsupported Wayland shortcuts from Flutter matching
Keep saved bindings intact while filtering the active config used by the Flutter matcher. Cover stored bindings and enable/pass-through flags in the existing shortcut tests.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: retain forwarded key ownership across shortcut repeats
Ignore repeat presses for keys already forwarded to the peer, and release ordinary held keys before Show My Cursor enables view-only. Cover both paths with converter-level regressions.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: release Flutter-held keys before view-only shortcuts
Track ordinary keys forwarded by the Dart matcher paths and await their releases before View Only or Show My Cursor disables input. Keep Mute key ownership and existing empty-cleanup timing unchanged.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: filter active Flutter shortcuts by platform capabilities
Reuse the Settings action filter for saved bindings while preserving storage, default-seeding behavior and configurable Apple Ctrl+Alt+Del bindings.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: filter native shortcut caches for mobile controllers
Suspend saved desktop-only actions on Android and iOS and hide unavailable iOS actions without changing persisted bindings. Keep native cache filtering aligned with Flutter platform capabilities.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: share filtered shortcut bindings with the Web matcher
Pass the active platform config to JavaScript at startup and after settings changes, preserving unsupported saved bindings in local storage.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: release Flutter-held keys before focus-changing shortcuts
Drain ordinary keys owned by the original session before run-on-key-up
actions and native clipboard callbacks. Preserve Mute holds, pending-action
cancellation and Web clipboard key-down activation.
Document the required Web matcher counterpart in the bridge:
rustdesk/rustdesk-web-js@94abe431d6
Validation: 61 native Flutter tests, 32 Chrome/HTML tests, targeted analysis
and Windows debug build.
Signed-off-by: fufesou <linlong1266@gmail.com>
* refact: remove the useless comments
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: prevent Windows menu activation from Alt-only shortcuts
Neutralize the forwarded Alt with a balanced temporary Ctrl press when a consumed local shortcut releases its only modifier in Windows Map mode. Keep physical modifier tracking and normal Alt pass-through unchanged.
Add a regression covering both Alt keys, trigger repeats and the eventual physical release. Verified with 36 native shortcut tests and real Windows menu/input checks.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: prevent Alt menu activation in all keyboard modes
Extend Windows Alt-only shortcut neutralization to Translate and Legacy. Keep the temporary Ctrl packets in Map mode so Legacy modifier synchronization cannot release Alt before Ctrl.
Extend the existing regression across keyboard modes and decode scan, virtual and control-key events. Verify 36 native tests and 34 Windows menu replay cases.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: initialize outgoing chat before shortcut dispatch
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: guard Windows Alt release in Flutter legacy shortcuts
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: coordinate Web shortcut dispatch and Alt modifier cleanup
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: distinguish AltGraph from ordinary Alt shortcuts
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: dispatch macOS Web shortcuts without waiting for keyup
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: support legacy peers in privacy mode shortcut
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: exclude AltGraph from Flutter shortcut matching
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix: exclude GTK AltGr input from raw shortcut matching
Signed-off-by: fufesou <linlong1266@gmail.com>
* test: trim redundant keyboard shortcut coverage
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(keyboard): prevent Cmd shortcuts from opening remote Start
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(shortcuts): guard Windows menu keys after Ctrl/Cmd swapping
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(shortcuts): align recording and display routing
Reject non-Apple AltGraph captures to match runtime filtering. Honor individual-display windows for next, previous, and all-display shortcuts.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(shortcuts): reject GTK AltGr chords in recorder
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(android): restore keyboard focus for modifier-first input
Focus the existing FlutterView when a modifier is pressed without native view focus. This restores shortcut-first input after returning to RustDesk while preserving focused inputs and normal key dispatch.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(shortcuts): release held keys before keyboard mode changes
Drain Flutter-forwarded keys before keyboard-mode shortcut actions so releases use the original encoding. This prevents held keys from remaining down after a Web Input source 2 mode change.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(i18n): use sentence case for shortcut labels
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(mobile): preserve touch modifiers in the input helper
Keep touch-selected modifiers visible after hiding the keyboard. Clear physical modifier releases locally in view-only mode so they do not reopen the helper.
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(web): preserve modifiers across Legacy-to-Map shortcuts
Signed-off-by: fufesou <linlong1266@gmail.com>
* fix(shortcuts): check support before registering all displays view
Signed-off-by: fufesou <linlong1266@gmail.com>
---------
Signed-off-by: fufesou <linlong1266@gmail.com>
Co-authored-by: fufesou <linlong1266@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
818 lines
50 KiB
Rust
818 lines
50 KiB
Rust
lazy_static::lazy_static! {
|
||
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||
[
|
||
("Status", "状态"),
|
||
("Your Desktop", "你的桌面"),
|
||
("desk_tip", "你的桌面可以通过下面的 ID 和密码访问。"),
|
||
("Password", "密码"),
|
||
("Ready", "就绪"),
|
||
("Established", "已建立"),
|
||
("connecting_status", "正在接入 RustDesk 网络..."),
|
||
("Enable service", "允许服务"),
|
||
("Start service", "启动服务"),
|
||
("Service is running", "服务正在运行"),
|
||
("Service is not running", "服务未运行"),
|
||
("not_ready_status", "未就绪,请检查网络连接"),
|
||
("Control Remote Desktop", "控制远程桌面"),
|
||
("Transfer file", "传输文件"),
|
||
("Connect", "连接"),
|
||
("Recent sessions", "最近访问过"),
|
||
("Address book", "地址簿"),
|
||
("Confirmation", "确认"),
|
||
("TCP tunneling", "TCP 隧道"),
|
||
("Remove", "删除"),
|
||
("Refresh random password", "刷新随机密码"),
|
||
("Set your own password", "设置密码"),
|
||
("Enable keyboard/mouse", "允许控制键盘/鼠标"),
|
||
("Enable clipboard", "允许同步剪贴板"),
|
||
("Enable file transfer", "允许传输文件"),
|
||
("Enable TCP tunneling", "允许建立 TCP 隧道"),
|
||
("IP Whitelisting", "IP 白名单"),
|
||
("ID/Relay Server", "ID/中继服务器"),
|
||
("Import server config", "导入服务器配置"),
|
||
("Export Server Config", "导出服务器配置"),
|
||
("Import server configuration successfully", "导入服务器配置信息成功"),
|
||
("Export server configuration successfully", "导出服务器配置信息成功"),
|
||
("Invalid server configuration", "服务器配置无效,请修改后重新复制配置信息到剪贴板,然后点击此按钮"),
|
||
("Clipboard is empty", "复制配置信息到剪贴板后点击此按钮,可以自动导入配置"),
|
||
("Stop service", "停止服务"),
|
||
("Change ID", "更改 ID"),
|
||
("Your new ID", "你的新 ID"),
|
||
("length %min% to %max%", "长度在 %min% 与 %max% 之间"),
|
||
("starts with a letter", "以字母开头"),
|
||
("allowed characters", "使用允许的字符"),
|
||
("id_change_tip", "只可以使用字母 a-z, A-Z, 0-9, - (dash), _ (下划线)。首字母必须是 a-z, A-Z。长度在 6 与 16 之间。"),
|
||
("Website", "网站"),
|
||
("About", "关于"),
|
||
("Slogan_tip", "在这个混乱的世界中,用心制作!"),
|
||
("Privacy Statement", "隐私声明"),
|
||
("Mute", "静音"),
|
||
("Build Date", "构建日期"),
|
||
("Version", "版本"),
|
||
("Home", "主页"),
|
||
("Audio Input", "音频输入"),
|
||
("Enhancements", "增强功能"),
|
||
("Hardware Codec", "硬件编解码"),
|
||
("Adaptive bitrate", "自适应码率"),
|
||
("ID Server", "ID 服务器"),
|
||
("Relay Server", "中继服务器"),
|
||
("API Server", "API 服务器"),
|
||
("invalid_http", "必须以 http:// 或者 https:// 开头"),
|
||
("Invalid IP", "无效 IP"),
|
||
("Invalid format", "无效格式"),
|
||
("server_not_support", "服务器暂不支持"),
|
||
("Not available", "不可用"),
|
||
("Too frequent", "修改太频繁,请稍后再试"),
|
||
("Cancel", "取消"),
|
||
("Skip", "跳过"),
|
||
("Close", "关闭"),
|
||
("Retry", "再试"),
|
||
("OK", "确认"),
|
||
("Password Required", "需要密码"),
|
||
("Please enter your password", "请输入密码"),
|
||
("Remember password", "记住密码"),
|
||
("Wrong Password", "密码错误"),
|
||
("Do you want to enter again?", "是否要再次输入?"),
|
||
("Connection Error", "连接错误"),
|
||
("Error", "错误"),
|
||
("Reset by the peer", "连接被对方关闭"),
|
||
("Connecting...", "正在连接..."),
|
||
("Connection in progress. Please wait.", "正在进行连接,请稍候。"),
|
||
("Please try 1 minute later", "一分钟后再试"),
|
||
("Login Error", "登录错误"),
|
||
("Successful", "成功"),
|
||
("Connected, waiting for image...", "已连接,等待画面传输..."),
|
||
("Name", "名称"),
|
||
("Type", "类型"),
|
||
("Modified", "修改时间"),
|
||
("Size", "大小"),
|
||
("Show Hidden Files", "显示隐藏文件"),
|
||
("Receive", "接受"),
|
||
("Send", "发送"),
|
||
("Refresh File", "刷新文件"),
|
||
("Local", "本地"),
|
||
("Remote", "远程"),
|
||
("Remote Computer", "远程电脑"),
|
||
("Local Computer", "本地电脑"),
|
||
("Confirm Delete", "确认删除"),
|
||
("Delete", "删除"),
|
||
("Properties", "属性"),
|
||
("Multi Select", "多选"),
|
||
("Select All", "全选"),
|
||
("Unselect All", "取消全选"),
|
||
("Empty Directory", "空文件夹"),
|
||
("Not an empty directory", "这不是一个空文件夹"),
|
||
("Are you sure you want to delete this file?", "是否删除此文件?"),
|
||
("Are you sure you want to delete this empty directory?", "是否删除此空文件夹?"),
|
||
("Are you sure you want to delete the file of this directory?", "是否删除此文件夹下的文件?"),
|
||
("Do this for all conflicts", "应用于其它冲突"),
|
||
("This is irreversible!", "此操作不可逆!"),
|
||
("Deleting", "正在删除"),
|
||
("files", "文件"),
|
||
("Waiting", "正在等待..."),
|
||
("Finished", "完成"),
|
||
("Speed", "速度"),
|
||
("Custom Image Quality", "设置画面质量"),
|
||
("Privacy mode", "隐私模式"),
|
||
("Block user input", "阻止用户输入"),
|
||
("Unblock user input", "取消阻止用户输入"),
|
||
("Adjust Window", "调节窗口"),
|
||
("Original", "原始比例"),
|
||
("Shrink", "收缩"),
|
||
("Stretch", "伸展"),
|
||
("Scrollbar", "滚动条"),
|
||
("ScrollAuto", "自动滚动"),
|
||
("Good image quality", "画质最优化"),
|
||
("Balanced", "平衡"),
|
||
("Optimize reaction time", "速度最优化"),
|
||
("Custom", "自定义"),
|
||
("Show remote cursor", "显示远程光标"),
|
||
("Show quality monitor", "显示质量监测"),
|
||
("Disable clipboard", "禁用剪贴板"),
|
||
("Lock after session end", "会话结束后锁定远程电脑"),
|
||
("Insert Ctrl + Alt + Del", "插入 Ctrl + Alt + Del"),
|
||
("Insert Lock", "锁定远程电脑"),
|
||
("Refresh", "刷新画面"),
|
||
("ID does not exist", "ID 不存在"),
|
||
("Failed to connect to rendezvous server", "连接注册服务器失败"),
|
||
("Please try later", "请稍后再试"),
|
||
("Remote desktop is offline", "远程电脑处于离线状态"),
|
||
("Key mismatch", "Key 不匹配"),
|
||
("Timeout", "连接超时"),
|
||
("Failed to connect to relay server", "无法连接到中继服务器"),
|
||
("Failed to connect via rendezvous server", "无法通过注册服务器建立连接"),
|
||
("Failed to connect via relay server", "无法通过中继服务器建立连接"),
|
||
("Failed to make direct connection to remote desktop", "无法直接连接到远程桌面"),
|
||
("Set Password", "设置密码"),
|
||
("OS Password", "操作系统密码"),
|
||
("install_tip", "你正在运行未安装版本,由于 UAC 限制,作为被控端,会在某些情况下无法控制鼠标键盘,或者录制屏幕,请点击下面的按钮将 RustDesk 安装到系统,从而规避上述问题。"),
|
||
("Click to upgrade", "点击这里升级"),
|
||
("Configure", "配置"),
|
||
("config_acc", "为了能够远程控制你的桌面, 请给予 RustDesk \"辅助功能\" 权限。"),
|
||
("config_screen", "为了能够远程访问你的桌面, 请给予 RustDesk \"屏幕录制\" 权限。"),
|
||
("Installing ...", "安装中..."),
|
||
("Install", "安装"),
|
||
("Installation", "安装"),
|
||
("Installation Path", "安装路径"),
|
||
("Create start menu shortcuts", "创建启动菜单快捷方式"),
|
||
("Create desktop icon", "创建桌面图标"),
|
||
("agreement_tip", "开始安装即表示接受许可协议。"),
|
||
("Accept and Install", "同意并安装"),
|
||
("End-user license agreement", "用户协议"),
|
||
("Generating ...", "正在生成..."),
|
||
("Your installation is lower version.", "你安装的版本比当前运行的低。"),
|
||
("not_close_tcp_tip", "请在使用隧道的时候,不要关闭本窗口"),
|
||
("Listening ...", "正在等待隧道连接..."),
|
||
("Remote Host", "远程主机"),
|
||
("Remote Port", "远程端口"),
|
||
("Action", "动作"),
|
||
("Add", "添加"),
|
||
("Local Port", "本地端口"),
|
||
("Local Address", "当前地址"),
|
||
("Change Local Port", "修改本地端口"),
|
||
("setup_server_tip", "如果需要更快连接速度,你可以选择自建服务器"),
|
||
("Too short, at least 6 characters.", "太短了,至少 6 个字符"),
|
||
("The confirmation is not identical.", "两次输入不匹配"),
|
||
("Permissions", "权限"),
|
||
("Accept", "接受"),
|
||
("Dismiss", "拒绝"),
|
||
("Disconnect", "断开连接"),
|
||
("Enable file copy and paste", "允许复制粘贴文件"),
|
||
("Connected", "已连接"),
|
||
("Direct and encrypted connection", "加密直连"),
|
||
("Relayed and encrypted connection", "加密中继连接"),
|
||
("Direct and unencrypted connection", "非加密直连"),
|
||
("Relayed and unencrypted connection", "非加密中继连接"),
|
||
("Enter Remote ID", "输入对方 ID"),
|
||
("Enter your password", "输入密码"),
|
||
("Logging in...", "正在登录..."),
|
||
("Enable RDP session sharing", "允许 RDP 会话共享"),
|
||
("Auto Login", "自动登录(设置断开后锁定才有效)"),
|
||
("Enable direct IP access", "允许 IP 直接访问"),
|
||
("Rename", "重命名"),
|
||
("Space", "空格"),
|
||
("Create desktop shortcut", "创建桌面快捷方式"),
|
||
("Change Path", "更改路径"),
|
||
("Create Folder", "创建文件夹"),
|
||
("Please enter the folder name", "请输入文件夹名称"),
|
||
("Fix it", "修复"),
|
||
("Warning", "警告"),
|
||
("Login screen using Wayland is not supported", "不支持使用 Wayland 登录界面"),
|
||
("Reboot required", "重启后才能生效"),
|
||
("Unsupported display server", "不支持当前显示服务器"),
|
||
("x11 expected", "请切换到 x11"),
|
||
("Port", "端口"),
|
||
("Settings", "设置"),
|
||
("Username", "用户名"),
|
||
("Invalid port", "无效端口"),
|
||
("Closed manually by the peer", "被对方手动关闭"),
|
||
("Enable remote configuration modification", "允许远程修改配置"),
|
||
("Run without install", "不安装直接运行"),
|
||
("Connect via relay", "中继连接"),
|
||
("Always connect via relay", "强制走中继连接"),
|
||
("whitelist_tip", "只有白名单里的 IP 才能访问本机"),
|
||
("Login", "登录"),
|
||
("Verify", "验证"),
|
||
("Remember me", "记住我"),
|
||
("Trust this device", "信任此设备"),
|
||
("Verification code", "验证码"),
|
||
("verification_tip", "已向注册邮箱发送了登录验证码,请输入验证码继续登录"),
|
||
("Logout", "登出"),
|
||
("Tags", "标签"),
|
||
("Search ID", "查找 ID"),
|
||
("whitelist_sep", "可以使用逗号,分号,空格或者换行符作为分隔符"),
|
||
("Add ID", "增加 ID"),
|
||
("Add Tag", "增加标签"),
|
||
("Unselect all tags", "取消选择所有标签"),
|
||
("Network error", "网络错误"),
|
||
("Username missed", "用户名没有填写"),
|
||
("Password missed", "密码没有填写"),
|
||
("Wrong credentials", "提供的登录信息错误"),
|
||
("The verification code is incorrect or has expired", "验证码错误或已超时"),
|
||
("Edit Tag", "修改标签"),
|
||
("Forget Password", "忘记密码"),
|
||
("Favorites", "收藏"),
|
||
("Add to Favorites", "加入到收藏"),
|
||
("Remove from Favorites", "从收藏中删除"),
|
||
("Empty", "空空如也"),
|
||
("Invalid folder name", "无效文件夹名称"),
|
||
("Socks5 Proxy", "Socks5 代理"),
|
||
("Socks5/Http(s) Proxy", "Socks5/Http(s) 代理"),
|
||
("Discovered", "已发现"),
|
||
("install_daemon_tip", "为了开机启动,请安装系统服务。"),
|
||
("Remote ID", "远程 ID"),
|
||
("Paste", "粘贴"),
|
||
("Paste here?", "粘贴到这里?"),
|
||
("Are you sure to close the connection?", "是否确认关闭连接?"),
|
||
("Download new version", "下载新版本"),
|
||
("Touch mode", "触屏模式"),
|
||
("Mouse mode", "鼠标模式"),
|
||
("One-Finger Tap", "单指轻触"),
|
||
("Left Mouse", "鼠标左键"),
|
||
("One-Long Tap", "单指长按"),
|
||
("Two-Finger Tap", "双指轻触"),
|
||
("Right Mouse", "鼠标右键"),
|
||
("One-Finger Move", "单指移动"),
|
||
("Double Tap & Move", "双击并移动"),
|
||
("Mouse Drag", "鼠标选中拖动"),
|
||
("Three-Finger vertically", "三指垂直滑动"),
|
||
("Mouse Wheel", "鼠标滚轮"),
|
||
("Two-Finger Move", "双指移动"),
|
||
("Canvas Move", "移动画布"),
|
||
("Pinch to Zoom", "双指缩放"),
|
||
("Canvas Zoom", "缩放画布"),
|
||
("Reset canvas", "重置画布"),
|
||
("No permission of file transfer", "没有文件传输权限"),
|
||
("Note", "备注"),
|
||
("Connection", "连接"),
|
||
("Share screen", "共享屏幕"),
|
||
("Chat", "聊天消息"),
|
||
("Total", "总计"),
|
||
("items", "个项目"),
|
||
("Selected", "已选择"),
|
||
("Screen Capture", "屏幕录制"),
|
||
("Input Control", "输入控制"),
|
||
("Audio Capture", "音频录制"),
|
||
("Do you accept?", "是否接受?"),
|
||
("Open System Setting", "打开系统设置"),
|
||
("How to get Android input permission?", "如何获取安卓的输入权限?"),
|
||
("android_input_permission_tip1", "为了让远程设备通过鼠标或触屏控制您的安卓设备,你需要允许 RustDesk 使用\"无障碍\"服务。"),
|
||
("android_input_permission_tip2", "请在接下来的系统设置页面里,找到并进入 [已安装的服务] 页面,将 [RustDesk Input] 服务开启。"),
|
||
("android_new_connection_tip", "收到新的连接控制请求,对方想要控制你当前的设备。"),
|
||
("android_service_will_start_tip", "开启录屏权限将自动开启服务,允许其他设备向此设备请求建立连接。"),
|
||
("android_stop_service_tip", "关闭服务将自动关闭所有已建立的连接。"),
|
||
("android_version_audio_tip", "当前安卓版本不支持音频录制,请升级至安卓 10 或更高。"),
|
||
("android_start_service_tip", "点击开始服务或启用屏幕捕获权限,即可启动屏幕共享服务"),
|
||
("android_permission_may_not_change_tip", "对于已建立的连接,权限可能不会立即发生改变,除非重新建立连接。"),
|
||
("Account", "账户"),
|
||
("Overwrite", "覆盖"),
|
||
("This file exists, skip or overwrite this file?", "这个文件/文件夹已存在,跳过/覆盖?"),
|
||
("Quit", "退出"),
|
||
("Help", "帮助"),
|
||
("Failed", "失败"),
|
||
("Succeeded", "成功"),
|
||
("Someone turns on privacy mode, exit", "其他用户使用隐私模式,退出"),
|
||
("Unsupported", "不支持"),
|
||
("Peer denied", "被控端拒绝"),
|
||
("Peer exit", "被控端退出"),
|
||
("Failed to turn off", "退出失败"),
|
||
("Turned off", "退出"),
|
||
("Language", "语言"),
|
||
("Keep RustDesk background service", "保持 RustDesk 后台服务"),
|
||
("Ignore Battery Optimizations", "忽略电池优化"),
|
||
("android_open_battery_optimizations_tip", "如需关闭此功能,请在接下来的 RustDesk 应用设置页面中,找到并进入 [电源] 页面,取消勾选 [不受限制]"),
|
||
("Start on boot", "开机自启动"),
|
||
("Start the screen sharing service on boot, requires special permissions", "开机自动启动屏幕共享服务,此功能需要一些特殊权限。"),
|
||
("Connection not allowed", "对方不允许连接"),
|
||
("Legacy mode", "传统模式"),
|
||
("Map mode", "1:1 传输"),
|
||
("Translate mode", "翻译模式"),
|
||
("Use permanent password", "使用固定密码"),
|
||
("Use both passwords", "同时使用两种密码"),
|
||
("Set permanent password", "设置固定密码"),
|
||
("Enable remote restart", "允许远程重启"),
|
||
("Restart remote device", "重启远程电脑"),
|
||
("Are you sure you want to restart", "确定要重启"),
|
||
("Restarting remote device", "正在重启远程设备"),
|
||
("remote_restarting_tip", "远程设备正在重启, 请关闭当前提示框, 并在一段时间后使用永久密码重新连接"),
|
||
("Copied", "已复制"),
|
||
("Exit Fullscreen", "退出全屏"),
|
||
("Fullscreen", "全屏"),
|
||
("Mobile Actions", "移动端操作"),
|
||
("Select Monitor", "选择监视器"),
|
||
("Control Actions", "控制操作"),
|
||
("Display Settings", "显示设置"),
|
||
("Ratio", "比例"),
|
||
("Image Quality", "画质"),
|
||
("Scroll Style", "滚屏方式"),
|
||
("Show Toolbar", "显示工具栏"),
|
||
("Hide Toolbar", "隐藏工具栏"),
|
||
("Direct Connection", "直接连接"),
|
||
("Relay Connection", "中继连接"),
|
||
("Secure Connection", "安全连接"),
|
||
("Insecure Connection", "非安全连接"),
|
||
("Scale original", "原始尺寸"),
|
||
("Scale adaptive", "适应窗口"),
|
||
("General", "常规"),
|
||
("Security", "安全"),
|
||
("Theme", "主题"),
|
||
("Dark Theme", "暗黑主题"),
|
||
("Light Theme", "明亮主题"),
|
||
("Dark", "黑暗"),
|
||
("Light", "明亮"),
|
||
("Follow System", "跟随系统"),
|
||
("Enable hardware codec", "启用硬件编解码"),
|
||
("Unlock Security Settings", "解锁安全设置"),
|
||
("Enable audio", "允许传输音频"),
|
||
("Unlock Network Settings", "解锁网络设置"),
|
||
("Server", "服务器"),
|
||
("Direct IP Access", "IP 直接访问"),
|
||
("Proxy", "代理"),
|
||
("Apply", "应用"),
|
||
("Disconnect all devices?", "断开所有远程连接?"),
|
||
("Clear", "清空"),
|
||
("Audio Input Device", "音频输入设备"),
|
||
("Use IP Whitelisting", "只允许白名单上的 IP 访问"),
|
||
("Network", "网络"),
|
||
("Pin Toolbar", "固定工具栏"),
|
||
("Unpin Toolbar", "取消固定工具栏"),
|
||
("Recording", "录屏"),
|
||
("Directory", "目录"),
|
||
("Automatically record incoming sessions", "自动录制传入会话"),
|
||
("Automatically record outgoing sessions", "自动录制传出会话"),
|
||
("Change", "更改"),
|
||
("Start session recording", "开始录屏"),
|
||
("Stop session recording", "结束录屏"),
|
||
("Enable recording session", "允许录制会话"),
|
||
("Enable LAN discovery", "允许局域网发现"),
|
||
("Deny LAN discovery", "拒绝局域网发现"),
|
||
("Write a message", "输入聊天消息"),
|
||
("Prompt", "提示"),
|
||
("Please wait for confirmation of UAC...", "请等待对方确认 UAC..."),
|
||
("elevated_foreground_window_tip", "远端桌面的当前窗口需要更高的权限才能操作, 暂时无法使用鼠标键盘, 可以请求对方最小化当前窗口, 或者在连接管理窗口点击提升。为避免这个问题,建议在远端设备上安装本软件。"),
|
||
("Disconnected", "会话已结束"),
|
||
("Other", "其他"),
|
||
("Confirm before closing multiple tabs", "关闭多个标签页时向您确认"),
|
||
("Keyboard Settings", "键盘设置"),
|
||
("Full Access", "完全访问"),
|
||
("Screen Share", "仅共享屏幕"),
|
||
("ubuntu-21-04-required", "Wayland 需要 Ubuntu 21.04 或更高版本。"),
|
||
("wayland-requires-higher-linux-version", "Wayland 需要更高版本的 linux 发行版。 请尝试 X11 桌面或更改您的操作系统。"),
|
||
("xdp-portal-unavailable", "Wayland 屏幕捕获失败。XDG Desktop Portal 可能已崩溃或不可用。请尝试使用 `systemctl --user restart xdg-desktop-portal` 重启它。"),
|
||
("JumpLink", "查看"),
|
||
("Please Select the screen to be shared(Operate on the peer side).", "请选择要分享的画面(对端操作)。"),
|
||
("Show RustDesk", "显示 RustDesk"),
|
||
("This PC", "此电脑"),
|
||
("or", "或"),
|
||
("Elevate", "提权"),
|
||
("Zoom cursor", "缩放光标"),
|
||
("Accept sessions via password", "只允许密码访问"),
|
||
("Accept sessions via click", "只允许点击访问"),
|
||
("Accept sessions via both", "允许密码或点击访问"),
|
||
("Please wait for the remote side to accept your session request...", "请等待对方接受你的连接..."),
|
||
("One-time Password", "一次性密码"),
|
||
("Use one-time password", "使用一次性密码"),
|
||
("One-time password length", "一次性密码长度"),
|
||
("Request access to your device", "请求访问你的设备"),
|
||
("Hide connection management window", "隐藏连接管理窗口"),
|
||
("hide_cm_tip", "在只允许密码连接并且只用固定密码的情况下才允许隐藏"),
|
||
("wayland_experiment_tip", "Wayland 支持处于实验阶段,如果你需要使用无人值守访问,请使用 X11。"),
|
||
("Right click to select tabs", "右键选择选项卡"),
|
||
("Skipped", "已跳过"),
|
||
("Add to address book", "添加到地址簿"),
|
||
("Group", "小组"),
|
||
("Search", "搜索"),
|
||
("Closed manually by web console", "被 web 控制台手动关闭"),
|
||
("Local keyboard type", "本地键盘类型"),
|
||
("Select local keyboard type", "请选择本地键盘类型"),
|
||
("software_render_tip", "如果你使用英伟达显卡, 并且远程窗口在会话建立后会立刻关闭, 那么安装 nouveau 驱动并且选择使用软件渲染可能会有帮助。重启软件后生效。"),
|
||
("Always use software rendering", "始终使用软件渲染"),
|
||
("config_input", "为了能够通过键盘控制远程桌面, 请给予 RustDesk \"输入监控\" 权限。"),
|
||
("config_microphone", "为了支持通过麦克风进行音频传输,请给予 RustDesk \"录音\"权限。"),
|
||
("request_elevation_tip", "如果对面有人, 也可以请求提升权限。"),
|
||
("Wait", "等待"),
|
||
("Elevation Error", "提权失败"),
|
||
("Ask the remote user for authentication", "请求远端用户授权"),
|
||
("Choose this if the remote account is administrator", "当对面电脑是管理员账号时选择该选项"),
|
||
("Transmit the username and password of administrator", "发送管理员账号的用户名密码"),
|
||
("still_click_uac_tip", "依然需要被控端用户在运行 RustDesk 的 UAC 窗口点击确认。"),
|
||
("Request Elevation", "请求提权"),
|
||
("wait_accept_uac_tip", "请等待远端用户确认 UAC 对话框。"),
|
||
("Elevate successfully", "提权成功"),
|
||
("uppercase", "大写字母"),
|
||
("lowercase", "小写字母"),
|
||
("digit", "数字"),
|
||
("special character", "特殊字符"),
|
||
("length>=8", "长度不小于 8"),
|
||
("Weak", "弱"),
|
||
("Medium", "中"),
|
||
("Strong", "强"),
|
||
("Switch Sides", "反转访问方向"),
|
||
("Please confirm if you want to share your desktop?", "请确认是否要让对方访问你的桌面?"),
|
||
("Display", "显示"),
|
||
("Default View Style", "默认显示方式"),
|
||
("Default Scroll Style", "默认滚动方式"),
|
||
("Default Image Quality", "默认图像质量"),
|
||
("Default Codec", "默认编解码"),
|
||
("Bitrate", "码率"),
|
||
("FPS", "帧率"),
|
||
("Auto", "自动"),
|
||
("Other Default Options", "其它默认选项"),
|
||
("Voice call", "语音通话"),
|
||
("Text chat", "文字聊天"),
|
||
("Stop voice call", "停止语音通话"),
|
||
("relay_hint_tip", "可能无法直连,可以尝试中继连接。\n另外,如果想直接使用中继连接,可以在 ID 后面添加/r,如果最近访问里存在该卡片,也可以在卡片选项里选择强制走中继连接。"),
|
||
("Reconnect", "重连"),
|
||
("Codec", "编解码"),
|
||
("Resolution", "分辨率"),
|
||
("No transfers in progress", "无进行中的传输"),
|
||
("Set one-time password length", "设置一次性密码长度"),
|
||
("RDP Settings", "RDP 设置"),
|
||
("Sort by", "排序方式"),
|
||
("New Connection", "新连接"),
|
||
("Restore", "恢复"),
|
||
("Minimize", "最小化"),
|
||
("Maximize", "最大化"),
|
||
("Your Device", "你的设备"),
|
||
("empty_recent_tip", "无最近会话,是时候开始新会话了!"),
|
||
("empty_favorite_tip", "还没有收藏的被控端?找一个人连接并将其添加到收藏吧!"),
|
||
("empty_lan_tip", "情况不妙,似乎未发现任何被控端!"),
|
||
("empty_address_book_tip", "似乎目前地址簿内无被控端"),
|
||
("Empty Username", "空用户名"),
|
||
("Empty Password", "空密码"),
|
||
("Me", "我"),
|
||
("identical_file_tip", "此文件与对方的一致"),
|
||
("show_monitors_tip", "在工具栏上显示监视器"),
|
||
("View Mode", "浏览模式"),
|
||
("verify_rustdesk_password_tip", "验证 RustDesk 密码"),
|
||
("No need to elevate", "无需提升权限"),
|
||
("System Sound", "系统音频"),
|
||
("Default", "默认"),
|
||
("New RDP", "新 RDP 连接"),
|
||
("Fingerprint", "指纹"),
|
||
("Copy Fingerprint", "复制指纹"),
|
||
("no fingerprints", "没有指纹"),
|
||
("Update", "更新"),
|
||
("resolution_original_tip", "原始分辨率"),
|
||
("resolution_fit_local_tip", "适应本地分辨率"),
|
||
("resolution_custom_tip", "自定义分辨率"),
|
||
("Collapse toolbar", "折叠工具栏"),
|
||
("Accept and Elevate", "接受并提权"),
|
||
("accept_and_elevate_btn_tooltip", "接受连接并提升 UAC 权限"),
|
||
("clipboard_wait_response_timeout_tip", "等待拷贝响应超时"),
|
||
("Incoming connection", "收到的连接"),
|
||
("Outgoing connection", "发起的连接"),
|
||
("Exit", "退出"),
|
||
("Open", "打开"),
|
||
("logout_tip", "确定要退出登录吗?"),
|
||
("Service", "服务"),
|
||
("Start", "启动"),
|
||
("Stop", "停止"),
|
||
("exceed_max_devices", "管理的设备数已达到最大值"),
|
||
("Sync with recent sessions", "同步最近会话"),
|
||
("Sort tags", "对标签进行排序"),
|
||
("Open connection in new tab", "在选项卡中打开新连接"),
|
||
("Move tab to new window", "将标签页移至新窗口"),
|
||
("Can not be empty", "不能为空"),
|
||
("Already exists", "已经存在"),
|
||
("Change Password", "更改密码"),
|
||
("Refresh Password", "刷新密码"),
|
||
("ID", "ID"),
|
||
("Grid View", "网格视图"),
|
||
("List View", "列表视图"),
|
||
("Select", "选择"),
|
||
("Toggle Tags", "切换标签"),
|
||
("pull_ab_failed_tip", "获取地址簿失败"),
|
||
("push_ab_failed_tip", "上传地址簿失败"),
|
||
("synced_peer_readded_tip", "最近会话中存在的设备将会被重新同步到地址簿。"),
|
||
("Change Color", "更改颜色"),
|
||
("Primary Color", "基本色"),
|
||
("HSV Color", "HSV 色"),
|
||
("Installation Successful!", "安装成功!"),
|
||
("Installation failed!", "安装失败!"),
|
||
("Reverse mouse wheel", "鼠标滚轮反向"),
|
||
("{} sessions", "{} 个会话"),
|
||
("scam_title", "你可能被骗了!"),
|
||
("scam_text1", "如果你正在和素不相识的人通话,而对方要求你使用 RustDesk 启动服务,请勿继续操作并立刻挂断电话。"),
|
||
("scam_text2", "他们很可能是骗子,试图窃取您的钱财或其他个人信息。"),
|
||
("Don't show again", "下次不再显示"),
|
||
("I Agree", "同意"),
|
||
("Decline", "拒绝"),
|
||
("Timeout in minutes", "超时(分钟)"),
|
||
("auto_disconnect_option_tip", "自动关闭不活跃的会话"),
|
||
("Connection failed due to inactivity", "由于长时间无操作, 连接被自动断开"),
|
||
("Check for software update on startup", "启动时检查软件更新"),
|
||
("upgrade_rustdesk_server_pro_to_{}_tip", "请升级专业版服务器到{}或更高版本!"),
|
||
("pull_group_failed_tip", "获取组信息失败"),
|
||
("Filter by intersection", "按交集过滤"),
|
||
("Remove wallpaper during incoming sessions", "接受会话时移除桌面壁纸"),
|
||
("Test", "测试"),
|
||
("display_is_plugged_out_msg", "显示器被拔出,切换到第一个显示器。"),
|
||
("No displays", "没有显示器。"),
|
||
("Open in new window", "在新的窗口中打开"),
|
||
("Show displays as individual windows", "在单个窗口中打开显示器"),
|
||
("Use all my displays for the remote session", "将我的所有显示器用于远程会话"),
|
||
("selinux_tip", "SELinux 处于启用状态,RustDesk 可能无法作为被控正常运行。"),
|
||
("Change view", "更改视图"),
|
||
("Big tiles", "大磁贴"),
|
||
("Small tiles", "小磁贴"),
|
||
("List", "列表"),
|
||
("Virtual display", "虚拟显示器"),
|
||
("Plug out all", "拔出所有"),
|
||
("True color (4:4:4)", "真彩模式(4:4:4)"),
|
||
("Enable blocking user input", "允许阻止用户输入"),
|
||
("id_input_tip", "可以输入 ID、直连 IP,或域名和端口号(<域名>:<端口号>)。\n要访问另一台服务器上的设备,请附加服务器地址(<ID>@<服务器地址>?key=<密钥>)。比如,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=。\n要访问公共服务器上的设备,请输入 \"<ID>@public\",无需密钥。\n\n如果您想要在首次连接时,强制走中继连接,请在 ID 的后面添加 \"/r\",例如,\"9123456234/r\"。"),
|
||
("privacy_mode_impl_mag_tip", "模式 1"),
|
||
("privacy_mode_impl_virtual_display_tip", "模式 2"),
|
||
("Enter privacy mode", "进入隐私模式"),
|
||
("Exit privacy mode", "退出隐私模式"),
|
||
("idd_not_support_under_win10_2004_tip", "不支持 Indirect display driver 。需要 Windows 10 版本 2004 及更高的版本。"),
|
||
("input_source_1_tip", "输入源 1"),
|
||
("input_source_2_tip", "输入源 2"),
|
||
("Swap control-command key", "交换 Control 键和 Command 键"),
|
||
("swap-left-right-mouse", "交换鼠标左右键"),
|
||
("2FA code", "双重认证代码"),
|
||
("More", "更多"),
|
||
("enable-2fa-title", "启用双重认证"),
|
||
("enable-2fa-desc", "现在请设置身份验证器。您可以在手机或台式电脑上使用 Authy、Microsoft 或 Google Authenticator 等验证器。用验证器扫描二维码,然后输入显示的验证码以启用双重认证。"),
|
||
("wrong-2fa-code", "无法验证此验证码。请检查验证码和本地时间设置是否正确。"),
|
||
("enter-2fa-title", "双重认证"),
|
||
("Email verification code must be 6 characters.", "Email 验证码必须是 6 个字符。"),
|
||
("2FA code must be 6 digits.", "双重认证代码必须是 6 位数字。"),
|
||
("Multiple Windows sessions found", "发现多个 Windows 会话"),
|
||
("Please select the session you want to connect to", "请选择您要连接的会话"),
|
||
("powered_by_me", "由 RustDesk 提供支持"),
|
||
("outgoing_only_desk_tip", "当前版本的软件是定制版本。\n您可以连接至其他设备,但是其他设备无法连接至您的设备。"),
|
||
("preset_password_warning", "此定制版本附有预设密码。 任何知晓此密码的人都能完全控制您的设备。如果这不是您所预期的,请立即卸载此软件。"),
|
||
("Security Alert", "安全警告"),
|
||
("My address book", "我的地址簿"),
|
||
("Personal", "个人的"),
|
||
("Owner", "所有者"),
|
||
("Set shared password", "设置共享密码"),
|
||
("Exist in", "存在于"),
|
||
("Read-only", "只读"),
|
||
("Read/Write", "读写"),
|
||
("Full Control", "完全控制"),
|
||
("share_warning_tip", "上述的字段為共享且对其他人可见。"),
|
||
("Everyone", "所有人"),
|
||
("ab_web_console_tip", "打开 Web 控制台以执行更多操作"),
|
||
("allow-only-conn-window-open-tip", "仅当 RustDesk 窗口打开时允许连接"),
|
||
("no_need_privacy_mode_no_physical_displays_tip", "没有物理显示器,没必要使用隐私模式。"),
|
||
("Follow remote cursor", "跟随远程光标"),
|
||
("Follow remote window focus", "跟随远程窗口焦点"),
|
||
("default_proxy_tip", "默认代理协议及端口为 Socks5 和 1080"),
|
||
("no_audio_input_device_tip", "未找到音频输入设备"),
|
||
("Incoming", "被控"),
|
||
("Outgoing", "主控"),
|
||
("Clear Wayland screen selection", "清除 Wayland 的屏幕选择"),
|
||
("clear_Wayland_screen_selection_tip", "清除 Wayland 的屏幕选择后,您可以重新选择分享的屏幕。"),
|
||
("confirm_clear_Wayland_screen_selection_tip", "是否确认清除 Wayland 的分享屏幕选择?"),
|
||
("android_new_voice_call_tip", "收到新的语音呼叫请求。如果您接受,音频将切换为语音通信。"),
|
||
("texture_render_tip", "使用纹理渲染,使图片更加流畅。 如果您遭遇渲染问题,可尝试关闭此选项。"),
|
||
("Use texture rendering", "使用纹理渲染"),
|
||
("Floating window", "悬浮窗"),
|
||
("floating_window_tip", "有助于保持 RustDesk 后台服务"),
|
||
("Keep screen on", "保持屏幕开启"),
|
||
("Never", "从不"),
|
||
("During controlled", "被控期间"),
|
||
("During service is on", "服务开启期间"),
|
||
("Capture screen using DirectX", "使用 DirectX 捕获屏幕"),
|
||
("Back", "回退"),
|
||
("Apps", "应用"),
|
||
("Volume up", "提升音量"),
|
||
("Volume down", "降低音量"),
|
||
("Power", "电源"),
|
||
("Telegram bot", "Telegram 机器人"),
|
||
("enable-bot-tip", "如果您启用此功能,您可以从您的机器人接收双重认证码,亦可作为连线通知之用。"),
|
||
("enable-bot-desc", "1. 开启与 @BotFather 的对话。\n2. 发送命令 \"/newbot\"。 您将在完成此步骤后收到权杖 (Token)。\n3. 开始与您刚创建的机器人的对话。发送一则以正斜杠 (\"/\") 开头的消息来启用它,例如 \"/hello\"。"),
|
||
("cancel-2fa-confirm-tip", "确定要取消双重认证吗?"),
|
||
("cancel-bot-confirm-tip", "确定要取消 Telegram 机器人吗?"),
|
||
("About RustDesk", "关于 RustDesk"),
|
||
("Send clipboard keystrokes", "发送剪贴板按键"),
|
||
("network_error_tip", "请检查网络连接,然后点击再试"),
|
||
("Unlock with PIN", "使用 PIN 码解锁设置"),
|
||
("Requires at least {} characters", "不少于{}个字符"),
|
||
("Wrong PIN", "PIN 码错误"),
|
||
("Set PIN", "设置 PIN 码"),
|
||
("Enable trusted devices", "启用信任设备"),
|
||
("Manage trusted devices", "管理信任设备"),
|
||
("Platform", "平台"),
|
||
("Days remaining", "剩余天数"),
|
||
("enable-trusted-devices-tip", "允许受信任的设备跳过 2FA 验证"),
|
||
("Parent directory", "父目录"),
|
||
("Resume", "继续"),
|
||
("Invalid file name", "无效文件名"),
|
||
("one-way-file-transfer-tip", "被控端启用了单向文件传输"),
|
||
("Authentication Required", "需要身份验证"),
|
||
("Authenticate", "认证"),
|
||
("web_id_input_tip", "可以输入同一个服务器内的 ID,web 客户端不支持直接 IP 访问。\n要访问另一台服务器上的设备,请附加服务器地址(<ID>@<服务器地址>?key=<密钥>)。比如,\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=。\n要访问公共服务器上的设备,请输入 \"<ID>@public\",无需密钥。"),
|
||
("Download", "下载"),
|
||
("Upload folder", "上传文件夹"),
|
||
("Upload files", "上传文件"),
|
||
("Clipboard is synchronized", "剪贴板已同步"),
|
||
("Update client clipboard", "更新客户端的剪贴板"),
|
||
("Untagged", "无标签"),
|
||
("new-version-of-{}-tip", "{} 版本更新"),
|
||
("Accessible devices", "可访问的设备"),
|
||
("upgrade_remote_rustdesk_client_to_{}_tip", "请在远程端将 RustDesk 客户端升级至版本 {} 或更新版本!"),
|
||
("d3d_render_tip", "当启用 D3D 渲染时,某些机器可能无法显示远程画面。"),
|
||
("Use D3D rendering", "使用 D3D 渲染"),
|
||
("Printer", "打印机"),
|
||
("printer-os-requirement-tip", "打印机的传出功能需要 Windows 10 或更高版本。"),
|
||
("printer-requires-installed-{}-client-tip", "请先安装 {} 客户端。"),
|
||
("printer-{}-not-installed-tip", "未安装 {} 打印机。"),
|
||
("printer-{}-ready-tip", "{} 打印机已安装,您可以使用打印功能了。"),
|
||
("Install {} Printer", "安装 {} 打印机"),
|
||
("Outgoing Print Jobs", "传出的打印任务"),
|
||
("Incoming Print Jobs", "传入的打印任务"),
|
||
("Incoming Print Job", "传入的打印任务"),
|
||
("use-the-default-printer-tip", "使用默认的打印机执行"),
|
||
("use-the-selected-printer-tip", "使用选择的打印机执行"),
|
||
("auto-print-tip", "使用选择的打印机自动执行"),
|
||
("print-incoming-job-confirm-tip", "您收到一个远程打印任务,您想在本地执行它吗?"),
|
||
("remote-printing-disallowed-tile-tip", "不允许远程打印"),
|
||
("remote-printing-disallowed-text-tip", "被控端的权限设置拒绝了远程打印。"),
|
||
("save-settings-tip", "保存设置"),
|
||
("dont-show-again-tip", "不再显示此信息"),
|
||
("Take screenshot", "截屏"),
|
||
("Taking screenshot", "正在截屏"),
|
||
("screenshot-merged-screen-not-supported-tip", "当前不支持多个屏幕的合并截屏,请切换到单个屏幕重试。"),
|
||
("screenshot-action-tip", "请选择如何继续截屏。"),
|
||
("Save as", "另存为"),
|
||
("Export", "导出"),
|
||
("Export Logs", "导出日志"),
|
||
("Import Folder", "导入文件夹"),
|
||
("Copy to clipboard", "复制到剪贴板"),
|
||
("Enable remote printer", "启用远程打印机"),
|
||
("Downloading {}", "正在下载 {}"),
|
||
("{} Update", "{} 更新"),
|
||
("{}-to-update-tip", "即将关闭 {} ,并安装新版本。"),
|
||
("download-new-version-failed-tip", "下载失败,您可以重试或者点击\"下载\"按钮,从发布网址下载,并手动升级。"),
|
||
("Auto update", "自动更新"),
|
||
("update-failed-check-msi-tip", "安装方式检测失败。请点击\"下载\"按钮,从发布网址下载,并手动升级。"),
|
||
("websocket_tip", "使用 WebSocket 时,仅支持中继连接。"),
|
||
("Use WebSocket", "使用 WebSocket"),
|
||
("Trackpad speed", "触控板速度"),
|
||
("Default trackpad speed", "默认触控板速度"),
|
||
("Numeric one-time password", "一次性密码为数字"),
|
||
("Enable IPv6 P2P connection", "启用 IPv6 P2P 连接"),
|
||
("Enable UDP hole punching", "启用 UDP 打洞"),
|
||
("View camera", "查看摄像头"),
|
||
("Enable camera", "允许查看摄像头"),
|
||
("No cameras", "没有摄像头"),
|
||
("view_camera_unsupported_tip", "您的远程端不支持查看摄像头。"),
|
||
("Terminal", "终端"),
|
||
("Enable terminal", "启用终端"),
|
||
("New tab", "新建选项卡"),
|
||
("Keep terminal sessions on disconnect", "断开连接时保持终端会话"),
|
||
("Terminal (Run as administrator)", "终端(以管理员身份运行)"),
|
||
("terminal-admin-login-tip", "请输入被控端的管理员账号密码。"),
|
||
("Failed to get user token.", "获取用户令牌时出错。"),
|
||
("Incorrect username or password.", "用户名或密码不正确。"),
|
||
("The user is not an administrator.", "用户不是管理员。"),
|
||
("Failed to check if the user is an administrator.", "检查用户是否为管理员时出错。"),
|
||
("Supported only in the installed version.", "仅在以安装版本受支持。"),
|
||
("elevation_username_tip", "输入用户名或域名\\用户名"),
|
||
("Preparing for installation ...", "准备安装..."),
|
||
("Show my cursor", "显示我的光标"),
|
||
("Scale custom", "自定义缩放"),
|
||
("Custom scale slider", "自定义缩放滑块"),
|
||
("Decrease", "缩小"),
|
||
("Increase", "放大"),
|
||
("Show virtual mouse", "显示虚拟鼠标"),
|
||
("Virtual mouse size", "虚拟鼠标大小"),
|
||
("Small", "小"),
|
||
("Large", "大"),
|
||
("Show virtual joystick", "显示虚拟摇杆"),
|
||
("Edit note", "编辑备注"),
|
||
("Alias", "别名"),
|
||
("ScrollEdge", "边缘滚动"),
|
||
("Allow insecure TLS fallback", "允许回退到不安全的 TLS 连接"),
|
||
("allow-insecure-tls-fallback-tip", "默认情况下,对于使用 TLS 的协议,RustDesk 会验证服务器证书。\n启用此选项后,在验证失败时,RustDesk 将转为跳过验证步骤并继续连接。"),
|
||
("Disable UDP", "禁用 UDP"),
|
||
("disable-udp-tip", "控制是否仅使用 TCP。\n启用此选项后,RustDesk 将不再使用 UDP 21116,而是使用 TCP 21116。"),
|
||
("server-oss-not-support-tip", "注意:RustDesk 开源服务器 (OSS server) 不包含此功能。"),
|
||
("input note here", "输入备注"),
|
||
("note-at-conn-end-tip", "在连接结束时请求备注"),
|
||
("Show terminal extra keys", "显示终端扩展键"),
|
||
("Relative mouse mode", "相对鼠标模式"),
|
||
("rel-mouse-not-supported-peer-tip", "被控端不支持相对鼠标模式"),
|
||
("rel-mouse-not-ready-tip", "相对鼠标模式尚未准备好,请稍后再试"),
|
||
("rel-mouse-lock-failed-tip", "无法锁定鼠标,相对鼠标模式已禁用"),
|
||
("rel-mouse-exit-{}-tip", "按下 {} 退出"),
|
||
("rel-mouse-permission-lost-tip", "键盘权限被撤销。相对鼠标模式已被禁用。"),
|
||
("Changelog", "更新日志"),
|
||
("keep-awake-during-outgoing-sessions-label", "传出会话期间保持屏幕常亮"),
|
||
("keep-awake-during-incoming-sessions-label", "传入会话期间保持屏幕常亮"),
|
||
("Continue with {}", "使用 {} 登录"),
|
||
("Display Name", "显示名称"),
|
||
("password-hidden-tip", "永久密码已设置(已隐藏)"),
|
||
("preset-password-in-use-tip", "当前使用预设密码"),
|
||
("Enable privacy mode", "允许隐私模式"),
|
||
("allow-remote-toolbar-docking-any-edge", "允许将远程工具栏停靠到任意窗口边缘"),
|
||
("API Token", "API 令牌"),
|
||
("Deploy", "部署"),
|
||
("Custom ID (optional)", "自定义 ID(可选)"),
|
||
("server_requires_deployment_tip", "服务器要求显式部署此设备。是否立即部署?"),
|
||
("The server does not require explicit deployment.", "服务器不需要显式部署。"),
|
||
("Unknown response.", "未知响应。"),
|
||
("wayland-keyboard-input-disabled-tip", "允许键盘输入?"),
|
||
("wayland-keyboard-input-consent-tip", "你在这台远程电脑上输入的内容(包括密码)可能被远程电脑上的其他程序读取。"),
|
||
("wayland-keyboard-input-applies-to-tip", "此选择适用于:"),
|
||
("wayland-soft-keyboard-input-label", "软键盘输入"),
|
||
("wayland-keyboard-input-reset-choice-tip", "重置键盘输入选择"),
|
||
("remember-wayland-keyboard-choice-tip", "以后对这台远程电脑不再询问"),
|
||
("Why this happens", "了解原因"),
|
||
("Switch display", "切换显示器"),
|
||
("Show monitor switch button on the main toolbar", "在主工具栏上显示显示器切换按钮"),
|
||
("Show on the minimized toolbar", "在最小化工具栏上显示"),
|
||
("All monitors", "所有显示器"),
|
||
("#{} monitor", "{}号显示器"),
|
||
("conn-e2ee-unavailable-tip", "无法验证端到端加密。\n远程设备可能仍在准备中,请稍后重试。\n如果此问题持续出现,服务器可能不受信任。\n仍要继续吗?"),
|
||
("ID whitelisting", "ID 白名单"),
|
||
("Use ID whitelisting", "只允许白名单上的 ID 访问"),
|
||
("id_whitelist_tip", "只有白名单里的 ID 才能访问本机"),
|
||
("id_whitelist_wildcard_tip", "支持通配符:'*' 匹配任意数量的字符,'?' 匹配单个字符"),
|
||
("Invalid ID", "无效 ID"),
|
||
("Your ID is blocked by the peer", "你的 ID 已被对方阻止"),
|
||
("Your ip is blocked by the peer", "你的 IP 已被对方阻止"),
|
||
("id_whitelist_caveat_tip", "ID 由对端客户端上报,白名单用于减少暴露面,不能替代密码或 2FA"),
|
||
("whitelist_cidr_tip", "支持 CIDR 写法,例如 192.168.1.0/24"),
|
||
("Continue", "继续"),
|
||
("Browser didn't open? Use the url below to sign in.", "浏览器未打开?请使用下方网址登录。"),
|
||
("Lock canvas", "锁定画布"),
|
||
("Sync clipboard between sessions", "在会话间同步剪贴板"),
|
||
("sync-clipboard-between-sessions-tip", "在一个远程会话中复制的文本或图片也会发送到其他已连接会话的剪贴板。"),
|
||
("terminal-clipboard-write-tip", "终端中的一个应用希望将文本复制到此设备的剪贴板。如果授权,此权限将适用于所有连接中的终端应用,直到您在设置中关闭为止。手动复制和粘贴不受影响。"),
|
||
("Allow terminal apps to copy to clipboard", "允许终端应用复制到剪贴板"),
|
||
("Enable", "启用"),
|
||
("Reuse one connection for port forwarding", "端口转发复用同一条连接"),
|
||
("port-forward-mux-tip", "同一条端口转发规则上的所有连接共用一条到对方的连接,而不是每条连接都重新连接并登录一次。"),
|
||
("Enable WebRTC P2P connection", "启用 WebRTC P2P 连接"),
|
||
("Enable TCP hole punching", "启用 TCP 打洞"),
|
||
("The screen sharing request was declined on the remote device", "远程设备上的用户拒绝了屏幕共享请求"),
|
||
("The screen sharing request timed out on the remote device", "远程设备上的屏幕共享请求超时了"),
|
||
("RustDesk cannot reach the desktop session on the remote device, check that a desktop session is running and that RustDesk can use it", "RustDesk 无法访问远程设备的桌面会话,请确认桌面会话已启动并且 RustDesk 可以使用它"),
|
||
("The desktop portal on the remote device is missing a capability needed for screen sharing or remote control, its backend may not be installed", "远程设备上的桌面门户缺少屏幕共享或远程控制所需的功能,可能没有安装它的后端"),
|
||
("Screen sharing was approved on the remote device, but the PipeWire connection could not be opened", "远程设备上已批准屏幕共享,但无法打开 PipeWire 连接"),
|
||
("The screen sharing request ended without completing on the remote device", "远程设备上的屏幕共享请求已结束,但未完成"),
|
||
("RustDesk could not obtain a usable screen from the XDG Desktop Portal, the PipeWire library may be too old", "RustDesk 无法从 XDG Desktop Portal 获取可用的屏幕,PipeWire 库可能过旧"),
|
||
("RustDesk could not load a GStreamer component needed for screen capture ({})", "RustDesk 无法加载屏幕捕获所需的 GStreamer 组件 ({})"),
|
||
("Relay fallback delay in seconds", "回落到中继前的等待时间(秒)"),
|
||
("relay-fallback-delay-tip", "已经建立的中继连接会等待直连的 WebRTC 多久,超过这个时间就改用中继。调大可以让较慢的直连有更多机会胜出;调小则在无法直连的网络上更快回落到中继。留空表示使用默认值 2.5 秒。"),
|
||
("To start a voice call, enable \"Audio capture\" on the \"Share screen\" page.", "开始语音通话前请在\"共享屏幕\"页面启用\"音频录制\"。"),
|
||
("Keyboard shortcuts", "键盘快捷键"),
|
||
("Configure shortcuts...", "配置快捷键..."),
|
||
("Enable keyboard shortcuts in remote session", "在远程会话中启用键盘快捷键"),
|
||
("shortcut-page-description", "为下列每项会话操作绑定一个组合键。每个绑定至少需要包含一个修饰符。"),
|
||
("shortcut-passthrough-tip", "开启后,所有已绑定的组合键都会原样转发到远端。适合在某个组合键与远端需要使用的快捷键冲突时打开。"),
|
||
("Pass-through to remote", "穿透到远端"),
|
||
("Reset to defaults", "恢复默认设置"),
|
||
("shortcut-reset-confirm-tip", "这将以默认快捷键替换所有当前绑定。是否继续?"),
|
||
("Monitor", "显示器"),
|
||
("Keyboard", "键盘"),
|
||
("Toggle fullscreen", "切换全屏"),
|
||
("Switch to next display", "切换到下一个显示器"),
|
||
("Switch to previous display", "切换到上一个显示器"),
|
||
("Switch to next tab", "切换到下一个标签"),
|
||
("Switch to previous tab", "切换到上一个标签"),
|
||
("Toggle session recording", "切换会话录制"),
|
||
("Close tab", "关闭标签页"),
|
||
("Toggle toolbar", "切换工具栏可见性"),
|
||
("Toggle input source", "切换输入源"),
|
||
("Edit", "编辑"),
|
||
("Save", "保存"),
|
||
("Set shortcut", "设置快捷键"),
|
||
("shortcut-recording-instruction", "请按下您想使用的组合键。"),
|
||
("shortcut-recording-press-keys-tip", "请按下组合键..."),
|
||
("shortcut-must-include-modifiers", "必须至少包含一个修饰符:{}"),
|
||
("shortcut-already-bound-to", "已绑定到"),
|
||
("Replace", "替换"),
|
||
("Valid", "有效"),
|
||
("shortcut-mobile-physical-keyboard-tip", "录制需要使用物理键盘,不支持软键盘。"),
|
||
("shortcut-key-not-supported", "“{}” 不能用作快捷键。"),
|
||
("On", "开"),
|
||
("Off", "关"),
|
||
].iter().cloned().collect();
|
||
}
|