feat: 完善 Web 界面国际化支持

- 将包含数字的无意义 i18n 键名替换为语义化名称 (如 kvm_text1 → about_title)
- 为缺失多语言支持的界面文本添加中英文翻译
- 修复不准确的翻译内容和 HTML 标签格式错误
- 更新所有 Pug 模板文件以使用新的 i18n 键名
- 新增登录页面"记住我"、USB 连接确认等功能的多语言支持
- 统一翻译键命名规范,提升代码可维护性
This commit is contained in:
mofeng-git 2025-08-21 13:23:33 +08:00
parent 2c056ca3e3
commit 19d1c52ac4
21 changed files with 459 additions and 444 deletions

View File

@ -81,17 +81,17 @@
</div> </div>
<div id="app-keyboard-warning"> <div id="app-keyboard-warning">
<hr> <hr>
<p class="text" i18n="index_text_1"> <p class="text" i18n="keyboard_limitation_note">
Please note that when you are working with a KVM session or another application that captures the keyboard, Please note that when you are working with a KVM session or another application that captures the keyboard,
you can't use some keyboard shortcuts such as Ctrl+Alt+Del (which will be caught by your OS) or Ctrl+W (caught by your browser). you can't use some keyboard shortcuts such as Ctrl+Alt+Del (which will be caught by your OS) or Ctrl+W (caught by your browser).
</p> </p>
<p class="text" i18n="index_text_2">To override this limitation you can use <a target="_blank" href="https://google.com/chrome">Google Chrome</a> <p class="text" i18n="browser_solution_note">To override this limitation you can use <a target="_blank" href="https://google.com/chrome">Google Chrome</a>
or <a target="_blank" href="https://chromium.org/Home">Chromium</a> in application mode. or <a target="_blank" href="https://chromium.org/Home">Chromium</a> in application mode.
</p> </p>
<div class="code" id="app-text"></div> <div class="code hidden" id="app-text"></div>
</div> </div>
<hr> <hr>
<p class="text credits"><a target="_blank" href="https://github.com/mofeng-git/One-KVM" i18n="index_text_12">One-KVM Project</a>&nbsp; | &nbsp;<a target="_blank" href="https://one-kvm.mofeng.run" i18n="index_text_13">One-KVM Documentation</a></p> <p class="text credits"><a target="_blank" href="https://github.com/mofeng-git/One-KVM" i18n="onekvm_project_link">One-KVM Project</a>&nbsp; | &nbsp;<a target="_blank" href="https://one-kvm.mofeng.run" i18n="onekvm_documentation_link">One-KVM Documentation</a></p>
</div> </div>
</div> </div>
</body> </body>

View File

@ -30,16 +30,16 @@ block start
#app-keyboard-warning #app-keyboard-warning
hr hr
p.text(i18n="index_text_1") p.text(i18n="keyboard_limitation_note")
| Please note that when you are working with a KVM session or another application that captures the keyboard, | Please note that when you are working with a KVM session or another application that captures the keyboard,
| you can't use some keyboard shortcuts such as Ctrl+Alt+Del (which will be caught by your OS) or Ctrl+W (caught by your browser). | you can't use some keyboard shortcuts such as Ctrl+Alt+Del (which will be caught by your OS) or Ctrl+W (caught by your browser).
p.text(i18n="index_text_2") p.text(i18n="browser_solution_note")
| To override this limitation you can use #[a(target="_blank" href="https://google.com/chrome") Google Chrome] | To override this limitation you can use #[a(target="_blank" href="https://google.com/chrome") Google Chrome]
| or #[a(target="_blank" href="https://chromium.org/Home") Chromium] in application mode. | or #[a(target="_blank" href="https://chromium.org/Home") Chromium] in application mode.
.code#app-text .code#app-text.hidden
hr hr
p.text.credits p.text.credits
a(target="_blank" href="https://github.com/mofeng-git/One-KVM" i18n="index_text_12") One-KVM Project a(target="_blank" href="https://github.com/mofeng-git/One-KVM" i18n="onekvm_project_link") One-KVM Project
| &nbsp; | &nbsp; | &nbsp; | &nbsp;
a(target="_blank" href="https://one-kvm.mofeng.run" i18n="index_text_13") One-KVM Documentation a(target="_blank" href="https://one-kvm.mofeng.run" i18n="onekvm_documentation_link") One-KVM Documentation

View File

@ -51,15 +51,15 @@
<div class="start-box"> <div class="start-box">
<div class="start"><a style="display:inline-block; margin-top:4px; color:#5c90bc; text-decoration:none" href="../" i18n="index">&nbsp;&nbsp;&larr;&nbsp;&nbsp; [ One-KVM Index ]</a> <div class="start"><a style="display:inline-block; margin-top:4px; color:#5c90bc; text-decoration:none" href="../" i18n="index">&nbsp;&nbsp;&larr;&nbsp;&nbsp; [ One-KVM Index ]</a>
<hr> <hr>
<p class="text" i18n="ipmi_text1">This PiKVM device has running <b>kvmd-ipmi</b> daemon and provides IPMI 2.0 interface for some basic <p class="text" i18n="ipmi_daemon_running">This PiKVM device has running <b>kvmd-ipmi</b> daemon and provides IPMI 2.0 interface for some basic
BMC operations like on/off/reset the server. BMC operations like on/off/reset the server.
</p> </p>
<p class="text" i18n="ipmi_text2"><b>WARNING!</b> We strongly don't recommend you to use IPMI in untrusted networks because <p class="text" i18n="ipmi_security_warning"><b>WARNING!</b> We strongly don't recommend you to use IPMI in untrusted networks because
this protocol is completely unsafe by design. In short, the authentication process for IPMI mandates this protocol is completely unsafe by design. In short, the authentication process for IPMI mandates
that the server send a salted SHA1 or MD5 hash of the requested user's password to the client, that the server send a salted SHA1 or MD5 hash of the requested user's password to the client,
prior to the client authenticating. prior to the client authenticating.
</p> </p>
<p class="tetx" i18n="ipmi_text3"><b>NEVER</b> use the same passwords for KVMD and IPMI users. And even better not to use IPMI. <p class="text" i18n="ipmi_password_recommendation"><b>NEVER</b> use the same passwords for KVMD and IPMI users. And even better not to use IPMI.
Instead, you can directly use KVMD API via curl. Here some examples: Instead, you can directly use KVMD API via curl. Here some examples:
</p> </p>
<div class="code" id="ipmi-text" style="max-height:200px"></div> <div class="code" id="ipmi-text" style="max-height:200px"></div>

View File

@ -9,15 +9,15 @@ append vars
index_link = true index_link = true
block start block start
p.text(i18n="ipmi_text1") p.text(i18n="ipmi_daemon_running")
| This PiKVM device has running #[b kvmd-ipmi] daemon and provides IPMI 2.0 interface for some basic | This PiKVM device has running #[b kvmd-ipmi] daemon and provides IPMI 2.0 interface for some basic
| BMC operations like on/off/reset the server. | BMC operations like on/off/reset the server.
p.text(i18n="ipmi_text2") p.text(i18n="ipmi_security_warning")
| #[b WARNING!] We strongly don't recommend you to use IPMI in untrusted networks because | #[b WARNING!] We strongly don't recommend you to use IPMI in untrusted networks because
| this protocol is completely unsafe by design. In short, the authentication process for IPMI mandates | this protocol is completely unsafe by design. In short, the authentication process for IPMI mandates
| that the server send a salted SHA1 or MD5 hash of the requested user's password to the client, | that the server send a salted SHA1 or MD5 hash of the requested user's password to the client,
| prior to the client authenticating. | prior to the client authenticating.
p.tetx(i18n="ipmi_text3") p.text(i18n="ipmi_password_recommendation")
| #[b NEVER] use the same passwords for KVMD and IPMI users. And even better not to use IPMI. | #[b NEVER] use the same passwords for KVMD and IPMI users. And even better not to use IPMI.
| Instead, you can directly use KVMD API via curl. Here some examples: | Instead, you can directly use KVMD API via curl. Here some examples:
.code#ipmi-text(style="max-height:200px") .code#ipmi-text(style="max-height:200px")

View File

@ -144,22 +144,22 @@
</div> </div>
</li> </li>
</div> </div>
<li class="right" id="system-dropdown"><a class="menu-button" href="#"><img class="led-gray" id="link-led" src="../share/svg/led-link.svg"><img class="led-gray" id="stream-led" src="../share/svg/led-video.svg"><img class="led-gray" id="hid-keyboard-led" src="../share/svg/led-hid-keyboard.svg"><img class="led-gray" id="hid-mouse-led" src="../share/svg/led-hid-mouse.svg"><span i18n="kvm_text3">System</span></a> <li class="right" id="system-dropdown"><a class="menu-button" href="#"><img class="led-gray" id="link-led" src="../share/svg/led-link.svg"><img class="led-gray" id="stream-led" src="../share/svg/led-video.svg"><img class="led-gray" id="hid-keyboard-led" src="../share/svg/led-hid-keyboard.svg"><img class="led-gray" id="hid-mouse-led" src="../share/svg/led-hid-mouse.svg"><span i18n="system_menu">System</span></a>
<div class="menu" id="system-menu"> <div class="menu" id="system-menu">
<table class="kv"> <table class="kv">
<tr> <tr>
<td class="value" i18n="kvm_text4">Runtime settings &amp; tools</td> <td class="value" i18n="system_runtime_settings">Runtime settings &amp; tools</td>
<td class="feature-disabled" id="system-tool-webterm"> <td class="feature-disabled" id="system-tool-webterm">
<button class="small" data-force-hide-menu data-show-window="webterm-window" i18n="kvm_text5">&bull; Term</button> <button class="small" data-force-hide-menu data-show-window="webterm-window" i18n="system_terminal">&bull; Term</button>
</td> </td>
<td id="system-tool-about"> <td id="system-tool-about">
<button class="small" data-force-hide-menu data-show-window="about-window" i18n="kvm_text6">&bull; About</button> <button class="small" data-force-hide-menu data-show-window="about-window" i18n="system_about">&bull; About</button>
</td> </td>
<td id="system-tool-log"> <td id="system-tool-log">
<button class="small" id="open-log-button" data-force-hide-menu i18n="kvm_text7">&bull; Log</button> <button class="small" id="open-log-button" data-force-hide-menu i18n="system_log">&bull; Log</button>
</td> </td>
<td class="feature-disabled" id="system-tool-wol"> <td class="feature-disabled" id="system-tool-wol">
<button class="__gpio-button-__wol__ __gpio-button small" data-force-hide-menu data-channel="__wol__" data-confirm="Are you sure to send Wake-on-LAN packet to the server?" i18n="kvm_text8">&bull; WoL</button> <button class="__gpio-button-__wol__ __gpio-button small" data-force-hide-menu data-channel="__wol__" data-confirm="Are you sure to send Wake-on-LAN packet to the server?" i18n="system_wol">&bull; WoL</button>
</td> </td>
</tr> </tr>
</table> </table>
@ -199,13 +199,13 @@
</div> </div>
<table class="kv"> <table class="kv">
<tr class="feature-disabled" id="stream-resolution"> <tr class="feature-disabled" id="stream-resolution">
<td i18n="kvm_text9">Resolution:</td> <td i18n="video_resolution">Resolution:</td>
<td> <td>
<select id="stream-resolution-selector" disabled></select> <select id="stream-resolution-selector" disabled></select>
</td> </td>
</tr> </tr>
<tr class="feature-disabled" id="stream-quality"> <tr class="feature-disabled" id="stream-quality">
<td>JPEG quality: <td i18n="video_jpeg_quality">JPEG quality:
</td> </td>
<td class="value-slider"> <td class="value-slider">
<input type="range" id="stream-quality-slider"> <input type="range" id="stream-quality-slider">
@ -213,7 +213,7 @@
<td class="value-number" id="stream-quality-value"></td> <td class="value-number" id="stream-quality-value"></td>
</tr> </tr>
<tr> <tr>
<td>JPEG max fps: <td i18n="video_jpeg_fps">JPEG max fps:
</td> </td>
<td class="value-slider"> <td class="value-slider">
<input type="range" id="stream-desired-fps-slider"> <input type="range" id="stream-desired-fps-slider">
@ -221,7 +221,7 @@
<td class="value-number" id="stream-desired-fps-value"></td> <td class="value-number" id="stream-desired-fps-value"></td>
</tr> </tr>
<tr class="feature-disabled" id="stream-h264-bitrate"> <tr class="feature-disabled" id="stream-h264-bitrate">
<td>H.264 kbps: <td i18n="video_h264_bitrate">H.264 kbps:
</td> </td>
<td class="value-slider"> <td class="value-slider">
<input type="range" id="stream-h264-bitrate-slider"> <input type="range" id="stream-h264-bitrate-slider">
@ -229,7 +229,7 @@
<td class="value-number" id="stream-h264-bitrate-value"></td> <td class="value-number" id="stream-h264-bitrate-value"></td>
</tr> </tr>
<tr class="feature-disabled" id="stream-h264-gop"> <tr class="feature-disabled" id="stream-h264-gop">
<td>H.264 gop: <td i18n="video_h264_gop">H.264 gop:
</td> </td>
<td class="value-slider"> <td class="value-slider">
<input type="range" id="stream-h264-gop-slider"> <input type="range" id="stream-h264-gop-slider">
@ -237,7 +237,7 @@
<td class="value-number" id="stream-h264-gop-value"></td> <td class="value-number" id="stream-h264-gop-value"></td>
</tr> </tr>
<tr class="feature-disabled" id="stream-mode"> <tr class="feature-disabled" id="stream-mode">
<td><a target="_blank" href="https://docs.pikvm.org/webrtc">Video mode</a>: <td><a target="_blank" href="https://docs.pikvm.org/webrtc" i18n="video_mode">Video mode</a>:
</td> </td>
<td> <td>
<div class="radio-box"> <div class="radio-box">
@ -267,7 +267,7 @@
</td> </td>
</tr> </tr>
<tr class="feature-disabled" id="stream-audio"> <tr class="feature-disabled" id="stream-audio">
<td>Audio volume: <td i18n="audio_volume">Audio volume:
</td> </td>
<td class="value-slider"> <td class="value-slider">
<input type="range" id="stream-audio-volume-slider"> <input type="range" id="stream-audio-volume-slider">
@ -287,37 +287,37 @@
</table> </table>
<hr> <hr>
<div class="buttons buttons-row"> <div class="buttons buttons-row">
<button class="row33" data-force-hide-menu data-show-window="stream-window" i18n="kvm_text20">&bull; Show stream</button> <button class="row33" data-force-hide-menu data-show-window="stream-window" i18n="stream_show">&bull; Show stream</button>
<button class="row33" id="stream-screenshot-button" data-force-hide-menu i18n="kvm_text21">&bull; Screenshot</button> <button class="row33" id="stream-screenshot-button" data-force-hide-menu i18n="stream_screenshot">&bull; Screenshot</button>
<button class="row33" id="stream-reset-button" i18n="kvm_text22">Reset stream</button> <button class="row33" id="stream-reset-button" i18n="stream_reset">Reset stream</button>
</div> </div>
<hr> <hr>
<div class="text"><b i18n="kvm_text79">Video Record<br></b><sub i18n="kvm_text80">Record video using the browser API, and will be downloaded automatically</sub></div> <div class="text"><b i18n="video_record_title">Video Record<br></b><sub i18n="video_record_description">Record video using the browser API, and will be downloaded automatically</sub></div>
<div class="buttons buttons-row"> <div class="buttons buttons-row">
<button class="row50" id="stream-record-start-button" data-force-hide-menu i18n="kvm_text81">&bull; Start recording</button> <button class="row50" id="stream-record-start-button" data-force-hide-menu i18n="video_record_start">&bull; Start recording</button>
<button class="row50" id="stream-record-stop-button" data-force-hide-menu i18n="kvm_text82">&bull; End recording</button> <button class="row50" id="stream-record-stop-button" data-force-hide-menu i18n="video_record_stop">&bull; End recording</button>
</div> </div>
<hr> <hr>
<table class="kv"> <table class="kv">
<tr class="feature-disabled" id="hid-outputs-keyboard"> <tr class="feature-disabled" id="hid-outputs-keyboard">
<td i18n="kvm_text23">Keyboard mode:</td> <td i18n="hid_keyboard_mode">Keyboard mode:</td>
<td> <td>
<div class="radio-box" id="hid-outputs-keyboard-box"></div> <div class="radio-box" id="hid-outputs-keyboard-box"></div>
</td> </td>
</tr> </tr>
<tr class="feature-disabled" id="hid-outputs-mouse"> <tr class="feature-disabled" id="hid-outputs-mouse">
<td><a target="_blank" href="https://docs.pikvm.org/mouse" i18n="kvm_text24">Mouse mode</a>:</td> <td><a target="_blank" href="https://docs.pikvm.org/mouse" i18n="hid_mouse_mode">Mouse mode</a>:</td>
<td> <td>
<div class="radio-box" id="hid-outputs-mouse-box"></div> <div class="radio-box" id="hid-outputs-mouse-box"></div>
</td> </td>
</tr> </tr>
</table> </table>
<details> <details>
<summary>Keyboard &amp; mouse (HID) settings</summary> <summary i18n="hid_settings">Keyboard &amp; mouse (HID) settings</summary>
<div class="spoiler"> <div class="spoiler">
<table class="kv"> <table class="kv">
<tr> <tr>
<td>Swap Left Ctrl and Caps keys: <td i18n="hid-keyboard-swap-cc-switch">Swap Left Ctrl and Caps keys:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -330,7 +330,7 @@
<hr> <hr>
<table class="kv"> <table class="kv">
<tr> <tr>
<td>Mouse polling: <td i18n="hid_mouse_polling">Mouse polling:
</td> </td>
<td class="value-slider"> <td class="value-slider">
<input type="range" id="hid-mouse-rate-slider"> <input type="range" id="hid-mouse-rate-slider">
@ -338,7 +338,7 @@
<td class="value-number" id="hid-mouse-rate-value"></td> <td class="value-number" id="hid-mouse-rate-value"></td>
</tr> </tr>
<tr class="feature-disabled" id="hid-mouse-sens"> <tr class="feature-disabled" id="hid-mouse-sens">
<td>Relative sensitivity: <td i18n="hid_mouse_sensitivity">Relative sensitivity:
</td> </td>
<td class="value-slider"> <td class="value-slider">
<input type="range" id="hid-mouse-sens-slider"> <input type="range" id="hid-mouse-sens-slider">
@ -346,21 +346,21 @@
<td class="value-number" id="hid-mouse-sens-value"></td> <td class="value-number" id="hid-mouse-sens-value"></td>
</tr> </tr>
<tr class="feature-disabled" id="hid-mouse-squash"> <tr class="feature-disabled" id="hid-mouse-squash">
<td>Squash relative moves: <td i18n="hid-mouse-squash-switch">Squash relative moves:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
<input checked="hid-mouse-squash-switch" disabled type="checkbox" id="hid-mouse-squash-switch"> <input disabled type="checkbox" id="hid-mouse-squash-switch">
<label for="hid-mouse-squash-switch"><span class="switch-inner"></span><span class="switch"></span></label> <label for="hid-mouse-squash-switch"><span class="switch-inner"></span><span class="switch"></span></label>
</div> </div>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Reverse scrolling:</td> <td i18n="hid_mouse_reverse_scroll">Reverse scrolling:</td>
<td> <td>
<table> <table>
<tr> <tr>
<td>Y: <td i18n="hid-mouse-reverse-scrolling-switch">Y:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -369,7 +369,7 @@
</div> </div>
</td> </td>
<td>&nbsp;&nbsp;</td> <td>&nbsp;&nbsp;</td>
<td>X: <td i18n="hid-mouse-reverse-panning-switch">X:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -382,7 +382,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Cumulative scrolling: <td i18n="hid-mouse-cumulative-scrolling-switch">Cumulative scrolling:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -392,7 +392,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Scroll rate: <td i18n="hid_mouse_scroll_rate">Scroll rate:
</td> </td>
<td class="value-slider"> <td class="value-slider">
<input type="range" id="hid-mouse-scroll-slider"> <input type="range" id="hid-mouse-scroll-slider">
@ -400,7 +400,7 @@
<td class="value-number" id="hid-mouse-scroll-value"></td> <td class="value-number" id="hid-mouse-scroll-value"></td>
</tr> </tr>
<tr> <tr>
<td>Show the blue dot: <td i18n="hid-mouse-dot-switch">Show the blue dot:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -413,11 +413,11 @@
</div> </div>
</details> </details>
<details> <details>
<summary>Web UI settings</summary> <summary i18n="web_ui_settings">Web UI settings</summary>
<div class="spoiler"> <div class="spoiler">
<table class="kv"> <table class="kv">
<tr> <tr>
<td>Ask page close confirmation: <td i18n="page-close-ask-switch">Ask page close confirmation:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -427,7 +427,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Expand for the entire tab by default: <td i18n="page-full-tab-stream-switch">Expand for the entire tab by default:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -437,7 +437,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Suspend stream when tab is not active: <td i18n="stream-suspend-switch">Suspend stream when tab is not active:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -451,7 +451,7 @@
</details> </details>
<table class="kv"> <table class="kv">
<tr> <tr>
<td>Bad link mode (release keys immediately): <td i18n="hid-keyboard-bad-link-switch">Bad link mode (release keys immediately):
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -461,7 +461,7 @@
</td> </td>
</tr> </tr>
<tr class="feature-disabled" id="hid-connect"> <tr class="feature-disabled" id="hid-connect">
<td>Connect HID to Server: <td i18n="hid-connect-switch">Connect HID to Server:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -471,7 +471,7 @@
</td> </td>
</tr> </tr>
<tr class="feature-disabled" id="hid-jiggler"> <tr class="feature-disabled" id="hid-jiggler">
<td><a target="_blank" href="https://docs.pikvm.org/mouse_jiggler">Mouse jiggler</a>: <td i18n="hid-jiggler-switch"><a target="_blank" href="https://docs.pikvm.org/mouse_jiggler">Mouse jiggler</a>:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -481,7 +481,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Mute all input HID events: <td i18n="hid-mute-switch">Mute all input HID events:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -491,7 +491,7 @@
</td> </td>
</tr> </tr>
<tr class="feature-disabled" id="v3-usb-breaker"> <tr class="feature-disabled" id="v3-usb-breaker">
<td>Connect main USB to Server: <td i18n="usb_breaker_confirm"><span i18n="usb_connect_main">Connect main USB to Server:</span>
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -501,7 +501,7 @@
</td> </td>
</tr> </tr>
<tr class="feature-disabled" id="v4-locator"> <tr class="feature-disabled" id="v4-locator">
<td>Enable locator LED: <td i18n="locator_led_enable"><span i18n="locator_led_enable">Enable locator LED:</span>
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -513,8 +513,8 @@
</table> </table>
<hr> <hr>
<div class="buttons buttons-row"> <div class="buttons buttons-row">
<button class="row50" data-force-hide-menu data-show-window="keyboard-window" i18n="kvm_text30">&bull; Show keyboard</button> <button class="row50" data-force-hide-menu data-show-window="keyboard-window" i18n="hid_show_keyboard">&bull; Show keyboard</button>
<button class="row50" id="hid-reset-button" disabled i18n="kvm_text31">Reset HID</button> <button class="row50" id="hid-reset-button" disabled i18n="hid_reset">Reset HID</button>
</div> </div>
</div> </div>
</li> </li>
@ -543,9 +543,9 @@
</div> </div>
</div> </div>
</li> </li>
<li class="right feature-disabled" id="msd-dropdown"><a class="menu-button" href="#"><img class="led-gray" id="msd-led" src="../share/svg/led-msd.svg"><span i18n="kvm_text60">Drive</span></a> <li class="right feature-disabled" id="msd-dropdown"><a class="menu-button" href="#"><img class="led-gray" id="msd-led" src="../share/svg/led-msd.svg"><span i18n="drive_menu">Drive</span></a>
<div class="menu" id="msd-menu"> <div class="menu" id="msd-menu">
<div class="text"><b i18n="kvm_text61">Mass Storage Drive: </b><span id="msd-status"></span><br></div> <div class="text"><b i18n="drive_title">Mass Storage Drive: </b><span id="msd-status"></span><br></div>
<hr> <hr>
<div class="hidden" id="msd-message-offline"> <div class="hidden" id="msd-message-offline">
<div class="text"> <div class="text">
@ -632,7 +632,7 @@
</div> </div>
<table class="kv"> <table class="kv">
<tr> <tr>
<td i18n="kvm_text62">Image:</td> <td i18n="drive_image">Image:</td>
<td width="100%"> <td width="100%">
<select id="msd-image-selector" disabled></select> <select id="msd-image-selector" disabled></select>
</td> </td>
@ -667,13 +667,13 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td i18n="kvm_text84">Files</td> <td i18n="drive_file_display">Files</td>
<td> <td>
<div class="radio-box"> <div class="radio-box">
<input id="msd-mode-radio-image" checked type="radio" name="file-mode-radio" value="1"> <input id="msd-mode-radio-image" checked type="radio" name="file-mode-radio" value="1">
<label for="msd-mode-radio-image" i18n="kvm_text90">ImageFiles</label> <label for="msd-mode-radio-image" i18n="drive_image_files">ImageFiles</label>
<input id="msd-mode-radio-file" type="radio" name="file-mode-radio" value="0"> <input id="msd-mode-radio-file" type="radio" name="file-mode-radio" value="0">
<label for="msd-mode-radio-file" i18n="kvm_text91">NormalFiles</label> <label for="msd-mode-radio-file" i18n="drive_normal_files">NormalFiles</label>
</div> </div>
</td> </td>
</tr> </tr>
@ -682,9 +682,9 @@
<div id="msd-storages"></div> <div id="msd-storages"></div>
<hr> <hr>
<div class="buttons buttons-row"> <div class="buttons buttons-row">
<button class="row50" id="msd-select-new-button" disabled i18n="kvm_text64">Select image to upload</button> <button class="row50" id="msd-select-new-button" disabled i18n="drive_select_upload">Select image to upload</button>
<button class="row25" id="msd-upload-new-button" disabled i18n="kvm_text65">Upload</button> <button class="row25" id="msd-upload-new-button" disabled i18n="drive_upload">Upload</button>
<button class="row25" id="msd-abort-new-button" disabled i18n="kvm_text66">Abort</button> <button class="row25" id="msd-abort-new-button" disabled i18n="drive_abort">Abort</button>
</div> </div>
<div class="hidden" id="msd-message-another-user-uploads"> <div class="hidden" id="msd-message-another-user-uploads">
<div class="text"> <div class="text">
@ -700,19 +700,19 @@
<div class="hidden" id="msd-new-sub"> <div class="hidden" id="msd-new-sub">
<table class="kv"> <table class="kv">
<tr> <tr>
<td i18n="kvm_text68">Specify a local file:</td> <td i18n="drive_local_file">Specify a local file:</td>
<td> <td>
<input id="msd-new-file" type="file"> <input id="msd-new-file" type="file">
</td> </td>
</tr> </tr>
<tr> <tr>
<td i18n="kvm_text69"><b>Or</b> paste a URL:</td> <td i18n="drive_paste_url"><b>Or</b> paste a URL:</td>
<td> <td>
<input id="msd-new-url" type="text" style="width: 100%"> <input id="msd-new-url" type="text" style="width: 100%">
</td> </td>
</tr> </tr>
<tr class="hidden" id="msd-new-part"> <tr class="hidden" id="msd-new-part">
<td i18n="kvm_text70">Upload partition:</td> <td i18n="drive_upload_partition">Upload partition:</td>
<td width="100%"> <td width="100%">
<select id="msd-new-part-selector"></select> <select id="msd-new-part-selector"></select>
</td> </td>
@ -725,11 +725,11 @@
<div class="hidden" id="msd-uploading-sub"> <div class="hidden" id="msd-uploading-sub">
<table class="kv"> <table class="kv">
<tr> <tr>
<td i18n="kvm_text74">New image:</td> <td i18n="drive_new_image">New image:</td>
<td class="value" id="msd-uploading-name"></td> <td class="value" id="msd-uploading-name"></td>
</tr> </tr>
<tr> <tr>
<td i18n="kvm_text75">Upload size:</td> <td i18n="drive_upload_size">Upload size:</td>
<td class="value" id="msd-uploading-size"></td> <td class="value" id="msd-uploading-size"></td>
</tr> </tr>
</table> </table>
@ -741,51 +741,51 @@
<div class="hidden" id="msd-new-tips"> <div class="hidden" id="msd-new-tips">
<table class="kv"> <table class="kv">
<tr> <tr>
<td class="value" i18n="kvm_text71">Note:</td> <td class="value" i18n="drive_note">Note:</td>
<td i18n="kvm_text72">&bull; Don't close the browser page until the upload is complete.</td> <td i18n="drive_note_browser">&bull; Don't close the browser page until the upload is complete.</td>
</tr> </tr>
<tr> <tr>
<td></td> <td></td>
<td i18n="kvm_text73">&bull; To speed up the upload, close the stream window.</td> <td i18n="drive_note_stream">&bull; To speed up the upload, close the stream window.</td>
</tr> </tr>
</table> </table>
</div> </div>
<hr> <hr>
<div class="buttons buttons-row"> <div class="buttons buttons-row">
<button class="row50" id="msd-connect-button" disabled i18n="kvm_text76">Connect drive to Server</button> <button class="row50" id="msd-connect-button" disabled i18n="drive_connect">Connect drive to Server</button>
<button class="row25" id="msd-disconnect-button" disabled i18n="kvm_text77">Disconnect</button> <button class="row25" id="msd-disconnect-button" disabled i18n="drive_disconnect">Disconnect</button>
<button class="row25" id="msd-reset-button" disabled i18n="kvm_text78">Reset</button> <button class="row25" id="msd-reset-button" disabled i18n="drive_reset">Reset</button>
</div> </div>
<hr> <hr>
<div class="text"><b i18n="kvm_text85">Quick file transfer:</b><br><sub i18n="kvm_text86">&bull; Select NormalFiles tab to upload, package them and mount image</sub><br><sub i18n="kvm_text87">&bull; Disconnect MSD, unpackage it, select tab to download</sub><br></div> <div class="text"><b i18n="drive_quick_transfer">Quick file transfer:</b><br><sub i18n="drive_transfer_upload_note">&bull; Select NormalFiles tab to upload, package them and mount image</sub><br><sub i18n="drive_transfer_download_note">&bull; Disconnect MSD, unpackage it, select tab to download</sub><br></div>
<hr> <hr>
<div class="buttons buttons-row"> <div class="buttons buttons-row">
<button class="row50" id="msd-file-image-update-button" i18n="kvm_text88">Package files into image</button> <button class="row50" id="msd-file-image-update-button" i18n="drive_package_files">Package files into image</button>
<button class="row50" id="msd-file-image-unzip-button" i18n="kvm_text89">Unpackage files from image</button> <button class="row50" id="msd-file-image-unzip-button" i18n="drive_unpackage_files">Unpackage files from image</button>
</div> </div>
<hr> <hr>
</div> </div>
</li> </li>
<li class="right" id="macro-dropdown"><a class="menu-button" href="#"><img class="led-gray" id="hid-recorder-led" src="../share/svg/led-gear.svg"><span i18n="kvm_text32">Macro</span></a> <li class="right" id="macro-dropdown"><a class="menu-button" href="#"><img class="led-gray" id="hid-recorder-led" src="../share/svg/led-gear.svg"><span i18n="macro_menu">Macro</span></a>
<div class="menu"> <div class="menu">
<div class="text"><b i18n="kvm_text33">Record and play HID/ATX/GPIO actions<br></b><sub i18n="kvm_text34">For security reasons, the record will not be saved on the PiKVM</sub></div> <div class="text"><b i18n="macro_description">Record and play HID/ATX/GPIO actions<br></b><sub i18n="macro_security_note">For security reasons, the record will not be saved on the PiKVM</sub></div>
<hr> <hr>
<div class="buttons buttons-row"> <div class="buttons buttons-row">
<button class="row25" id="hid-recorder-record" disabled data-force-hide-menu i18n="kvm_text35">&bull; Rec</button> <button class="row25" id="hid-recorder-record" disabled data-force-hide-menu i18n="macro_record">&bull; Rec</button>
<button class="row25" id="hid-recorder-stop" disabled i18n="kvm_text36">Stop</button> <button class="row25" id="hid-recorder-stop" disabled i18n="macro_stop">Stop</button>
<button class="row25" id="hid-recorder-play" disabled i18n="kvm_text37">Play</button> <button class="row25" id="hid-recorder-play" disabled i18n="macro_play">Play</button>
<button class="row25" id="hid-recorder-clear" disabled i18n="kvm_text38">Clear</button> <button class="row25" id="hid-recorder-clear" disabled i18n="macro_clear">Clear</button>
</div> </div>
<hr> <hr>
<table class="kv"> <table class="kv">
<tr> <tr>
<td i18n="kvm_text39">Script time:</td> <td i18n="macro_script_time">Script time:</td>
<td class="value" id="hid-recorder-time" colspan="2">00:00:00.0</td> <td class="value" id="hid-recorder-time" colspan="2">00:00:00.0</td>
</tr> </tr>
<tr> <tr>
<td i18n="kvm_text40">Scripted events:</td> <td i18n="macro_script_events">Scripted events:</td>
<tdvalue id="hid-recorder-events-count">0</tdvalue> <tdvalue id="hid-recorder-events-count">0</tdvalue>
<td><sup><i i18n="kvm_text41">include delays</i></sup></td> <td><sup><i i18n="macro_include_delays">include delays</i></sup></td>
</tr> </tr>
</table> </table>
<hr> <hr>
@ -804,14 +804,14 @@
<hr> <hr>
<input id="hid-recorder-new-script-file" type="file" style="display: none"> <input id="hid-recorder-new-script-file" type="file" style="display: none">
<div class="buttons buttons-row"> <div class="buttons buttons-row">
<button class="row50" id="hid-recorder-upload" disabled i18n="kvm_text42">Upload script</button> <button class="row50" id="hid-recorder-upload" disabled i18n="macro_upload_script">Upload script</button>
<button class="row50" id="hid-recorder-download" disabled i18n="kvm_text43">Download script</button> <button class="row50" id="hid-recorder-download" disabled i18n="macro_download_script">Download script</button>
</div> </div>
</div> </div>
</li> </li>
<li class="right" id="text-dropdown"><a class="menu-button" href="#"><img class="feature-disabled" id="stream-ocr-led" src="../share/svg/led-gear.svg"><span i18n="kvm_text44">Text</span></a> <li class="right" id="text-dropdown"><a class="menu-button" href="#"><img class="feature-disabled" id="stream-ocr-led" src="../share/svg/led-gear.svg"><span i18n="text_menu">Text</span></a>
<div class="menu" id="text-menu" style="width: 360px"> <div class="menu" id="text-menu" style="width: 360px">
<div class="text"><b i18n="kvm_text45">Paste text as keypress sequence<br></b><sub i18n="kvm_text46">Please note that PiKVM cannot switch the keyboard layout</sub></div> <div class="text"><b i18n="text_paste_description">Paste text as keypress sequence<br></b><sub i18n="text_keyboard_layout_note">Please note that PiKVM cannot switch the keyboard layout</sub></div>
<hr> <hr>
<div class="text" style="margin-right: 20px"> <div class="text" style="margin-right: 20px">
<textarea id="hid-pak-text" data-focus placeholder="Enter your text here"></textarea> <textarea id="hid-pak-text" data-focus placeholder="Enter your text here"></textarea>
@ -819,9 +819,9 @@
<table class="kv"> <table class="kv">
<tr> <tr>
<td> <td>
<button id="hid-pak-button" disabled data-force-hide-menu title="Ctrl+Enter when the text is focused" i18n="kvm_text47">&bull; Paste</button> <button id="hid-pak-button" disabled data-force-hide-menu title="Ctrl+Enter when the text is focused" i18n="text_paste_button">&bull; Paste</button>
</td> </td>
<td i18n="kvm_text48">using host keymap</td> <td i18n="text_using_keymap">using host keymap</td>
<td> <td>
<select id="hid-pak-keymap-selector"></select> <select id="hid-pak-keymap-selector"></select>
</td> </td>
@ -837,7 +837,7 @@
<td class="value-number" id="hid-pak-delay-value"></td> <td class="value-number" id="hid-pak-delay-value"></td>
</tr> </tr>
<tr> <tr>
<td>Hide input text: <td i18n="hid-pak-secure-switch">Hide input text:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -847,7 +847,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Ask paste confirmation: <td i18n="hid-pak-ask-switch">Ask paste confirmation:
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -860,26 +860,26 @@
<div class="feature-disabled" id="stream-ocr"> <div class="feature-disabled" id="stream-ocr">
<hr><br> <hr><br>
<hr> <hr>
<div class="text"><b i18n="kvm_text49">Text recognition <sup><i>&beta;</i></sup><br></b><sub i18n="kvm_text50"><a target="_blank" href="https://docs.pikvm.org/ocr">OCR</a> works locally on PiKVM</sub></div> <div class="text"><b i18n="text_ocr_title">Text recognition <sup><i>&beta;</i></sup><br></b><sub i18n="text_ocr_local_note"><a target="_blank" href="https://docs.pikvm.org/ocr">OCR</a> works locally on PiKVM</sub></div>
<hr> <hr>
<table class="kv"> <table class="kv">
<tr> <tr>
<td> <td>
<button id="stream-ocr-button" data-force-hide-menu i18n="kvm_text51">&bull; Select area</button> <button id="stream-ocr-button" data-force-hide-menu i18n="text_ocr_select_area">&bull; Select area</button>
</td> </td>
<td i18n="kvm_text52">for</td> <td i18n="text_ocr_for">for</td>
<td> <td>
<select id="stream-ocr-lang-selector"></select> <select id="stream-ocr-lang-selector"></select>
</td> </td>
<td i18n="kvm_text53">text recognition</td> <td i18n="text_ocr_recognition">text recognition</td>
</tr> </tr>
</table> </table>
<table class="kv"> <table class="kv">
<tr> <tr>
<td colspan="4" i18n="kvm_text54">&bull; Next hit the <b>Enter</b> to recognize and copy text to clipboard...</td> <td colspan="4" i18n="text_ocr_enter_hint">&bull; Next hit the <b>Enter</b> to recognize and copy text to clipboard...</td>
</tr> </tr>
<tr> <tr>
<td colspan="4" i18n="kvm_text55">&bull; Or hit the <b>Escape</b> to cancel a selection</td> <td colspan="4" i18n="text_ocr_escape_hint">&bull; Or hit the <b>Escape</b> to cancel a selection</td>
</tr> </tr>
<tr> <tr>
<td></td> <td></td>
@ -888,9 +888,9 @@
</div> </div>
</div> </div>
</li> </li>
<li class="right" id="shortcuts-dropdown"><a class="menu-button" href="#" i18n="kvm_text56">Shortcuts</a> <li class="right" id="shortcuts-dropdown"><a class="menu-button" href="#" i18n="shortcuts_menu">Shortcuts</a>
<div class="menu" id="shortcuts-menu"> <div class="menu" id="shortcuts-menu">
<div class="text"><b i18n="kvm_text57">Quick keyboard shortcuts<br></b><sub i18n="kvm_text58">Also see <i>System &rarr; Show keyboard</i></sub></div> <div class="text"><b i18n="shortcuts_description">Quick keyboard shortcuts<br></b><sub i18n="shortcuts_also_see">Also see <i>System &rarr; Show keyboard</i></sub></div>
<hr> <hr>
<div class="buttons"> <div class="buttons">
<div class="buttons-row"> <div class="buttons-row">
@ -932,7 +932,7 @@
<hr> <hr>
<div class="text"> <div class="text">
&darr; &bull; Alt+SysRq+... <sup><i>linux magic &darr; &bull; Alt+SysRq+... <sup><i>linux magic
<a target="_blank" href="https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html" i18n="kvm_text59">help</a></i></sup> <a target="_blank" href="https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html" i18n="shortcuts_help">help</a></i></sup>
</div> </div>
<hr> <hr>
<div class="buttons"> <div class="buttons">
@ -955,7 +955,7 @@
<hr> <hr>
<table class="kv"> <table class="kv">
<tr> <tr>
<td> <td i18n>
</td> </td>
<td align="right"> <td align="right">
<div class="switch-box"> <div class="switch-box">
@ -1073,7 +1073,7 @@
</div> </div>
<div class="window" id="keyboard-window" data-show-centered> <div class="window" id="keyboard-window" data-show-centered>
<div class="window-header" id="keyboard-window-header"> <div class="window-header" id="keyboard-window-header">
<div class="window-grab" i18n="kvm_text15">Virtual Keyboard</div> <div class="window-grab" i18n="virtual_keyboard_title">Virtual Keyboard</div>
<div class="window-buttons"> <div class="window-buttons">
<button class="window-button-original">&bull;</button> <button class="window-button-original">&bull;</button>
<button class="window-button-close"><b>&times;</b></button> <button class="window-button-close"><b>&times;</b></button>
@ -2305,7 +2305,7 @@
</div> </div>
<div class="window" id="about-window" data-show-centered> <div class="window" id="about-window" data-show-centered>
<div class="window-header"> <div class="window-header">
<div class="window-grab" i18n="kvm_text1">About</div> <div class="window-grab" i18n="about_title">About</div>
<div class="window-buttons"> <div class="window-buttons">
<button class="window-button-original">&bull;</button> <button class="window-button-original">&bull;</button>
<button class="window-button-close"><b>&times;</b></button> <button class="window-button-close"><b>&times;</b></button>
@ -2356,7 +2356,7 @@
<input type="radio" name="about-tab-button" id="about-tab-thanks-button"> <input type="radio" name="about-tab-button" id="about-tab-thanks-button">
<label for="about-tab-thanks-button" i18n="thanks">Thanks</label> <label for="about-tab-thanks-button" i18n="thanks">Thanks</label>
<div class="tab"> <div class="tab">
<div class="code" id="about-thanks"><span class="code-comment" i18n="kvm_text2">// These kind people donated money to the PiKVM project<br> <div class="code" id="about-thanks"><span class="code-comment" i18n="about_sponsors">// These kind people donated money to the PiKVM project<br>
// and supported the work on it. We are very grateful<br> // and supported the work on it. We are very grateful<br>
// for their help, and memorializing their names<br> // for their help, and memorializing their names<br>
// is the least we can do in gratitude.<br> // is the least we can do in gratitude.<br>
@ -2366,12 +2366,12 @@
</div> </div>
</div> </div>
</div><br> </div><br>
<p class="text credits"><a target="_blank" href="https://github.com/mofeng-git/One-KVM" i18n="index_text_12">One-KVM Project</a>&nbsp; | &nbsp;<a target="_blank" href="https://one-kvm.mofeng.run" i18n="index_text_13">One-KVM Documentation</a>&nbsp; | &nbsp;<a target="_blank" href="https://pikvm.org" i18n="index_text_10">PiKVM Project</a>&nbsp; | &nbsp;<a target="_blank" href="https://docs.pikvm.org" i18n="index_text_11">Documentation</a></p> <p class="text credits"><a target="_blank" href="https://github.com/mofeng-git/One-KVM" i18n="onekvm_project_link">One-KVM Project</a>&nbsp; | &nbsp;<a target="_blank" href="https://one-kvm.mofeng.run" i18n="onekvm_documentation_link">One-KVM Documentation</a>&nbsp; | &nbsp;<a target="_blank" href="https://pikvm.org" i18n="pikvm_project_link">PiKVM Project</a>&nbsp; | &nbsp;<a target="_blank" href="https://docs.pikvm.org" i18n="pikvm_documentation_link">Documentation</a></p>
</div> </div>
</div> </div>
<div class="window window-resizable" id="webterm-window" data-show-centered style="display: flex; min-width: 720px; min-height: 480px"> <div class="window window-resizable" id="webterm-window" data-show-centered style="display: flex; min-width: 720px; min-height: 480px">
<div class="window-header"> <div class="window-header">
<div class="window-grab" i18n="kvm_text16">Terminal</div> <div class="window-grab" i18n="terminal_title">Terminal</div>
<div class="window-buttons"> <div class="window-buttons">
<button class="window-button-original">&bull;</button> <button class="window-button-original">&bull;</button>
<button class="window-button-maximize">&#9744;</button> <button class="window-button-maximize">&#9744;</button>
@ -2392,7 +2392,7 @@
</ul> </ul>
<ul class="footer"> <ul class="footer">
<li class="left"><span id="kvmd-meta-server-host" title="KVM/Server name (see System/About)"></span>&nbsp; | &nbsp;<span id="kvmd-info-platform" title="PiKVM Platform"></span>&nbsp; | &nbsp;<span id="kvmd-version-kvmd" title="KVMD version"></span>&nbsp; | &nbsp;<span id="kvmd-version-streamer" title="Streamer version"></span></li> <li class="left"><span id="kvmd-meta-server-host" title="KVM/Server name (see System/About)"></span>&nbsp; | &nbsp;<span id="kvmd-info-platform" title="PiKVM Platform"></span>&nbsp; | &nbsp;<span id="kvmd-version-kvmd" title="KVMD version"></span>&nbsp; | &nbsp;<span id="kvmd-version-streamer" title="Streamer version"></span></li>
<li class="right"><a target="_blank" href="https://github.com/mofeng-git/One-KVM" i18n="index_text_12">One-KVM Project</a>&nbsp; | &nbsp;<a target="_blank" href="https://one-kvm.mofeng.run" i18n="index_text_13">One-KVM Documentation</a></li> <li class="right"><a target="_blank" href="https://github.com/mofeng-git/One-KVM" i18n="onekvm_project_link">One-KVM Project</a>&nbsp; | &nbsp;<a target="_blank" href="https://one-kvm.mofeng.run" i18n="onekvm_documentation_link">One-KVM Documentation</a></li>
</ul> </ul>
</body> </body>
</html> </html>

View File

@ -34,6 +34,6 @@ block body
| &nbsp; | &nbsp; | &nbsp; | &nbsp;
span#kvmd-version-streamer(title="Streamer version") span#kvmd-version-streamer(title="Streamer version")
li.right li.right
a(target="_blank" href="https://github.com/mofeng-git/One-KVM" i18n="index_text_12") One-KVM Project a(target="_blank" href="https://github.com/mofeng-git/One-KVM" i18n="onekvm_project_link") One-KVM Project
| &nbsp; | &nbsp; | &nbsp; | &nbsp;
a(target="_blank" href="https://one-kvm.mofeng.run" i18n="index_text_13") One-KVM Documentation a(target="_blank" href="https://one-kvm.mofeng.run" i18n="onekvm_documentation_link") One-KVM Documentation

View File

@ -1,31 +1,31 @@
li.right#macro-dropdown li.right#macro-dropdown
a.menu-button(href="#") a.menu-button(href="#")
+navbar_led("hid-recorder-led", "led-gear") +navbar_led("hid-recorder-led", "led-gear")
span(i18n="kvm_text32") Macro span(i18n="macro_menu") Macro
.menu .menu
.text .text
b(i18n="kvm_text33") Record and play HID/ATX/GPIO actions#[br] b(i18n="macro_description") Record and play HID/ATX/GPIO actions#[br]
sub(i18n="kvm_text34") For security reasons, the record will not be saved on the PiKVM sub(i18n="macro_security_note") For security reasons, the record will not be saved on the PiKVM
hr hr
.buttons.buttons-row .buttons.buttons-row
button.row25#hid-recorder-record(disabled data-force-hide-menu i18n="kvm_text35") &bull; Rec button.row25#hid-recorder-record(disabled data-force-hide-menu i18n="macro_record") &bull; Rec
button.row25#hid-recorder-stop(disabled i18n="kvm_text36") Stop button.row25#hid-recorder-stop(disabled i18n="macro_stop") Stop
button.row25#hid-recorder-play(disabled i18n="kvm_text37") Play button.row25#hid-recorder-play(disabled i18n="macro_play") Play
button.row25#hid-recorder-clear(disabled i18n="kvm_text38") Clear button.row25#hid-recorder-clear(disabled i18n="macro_clear") Clear
hr hr
table.kv table.kv
tr tr
td(i18n="kvm_text39") Script time: td(i18n="macro_script_time") Script time:
td.value#hid-recorder-time(colspan="2") 00:00:00.0 td.value#hid-recorder-time(colspan="2") 00:00:00.0
tr tr
td(i18n="kvm_text40") Scripted events: td(i18n="macro_script_events") Scripted events:
tdvalue#hid-recorder-events-count 0 tdvalue#hid-recorder-events-count 0
td #[sup #[i(i18n="kvm_text41") include delays]] td #[sup #[i(i18n="macro_include_delays") include delays]]
hr hr
+menu_switch_table("hid-recorder-loop-switch", "Infinite loop playback", false, false, "hid-recorder-loop-switch") +menu_switch_table("hid-recorder-loop-switch", "Infinite loop playback", false, false, "hid-recorder-loop-switch")
hr hr
input#hid-recorder-new-script-file(type="file" style="display: none") input#hid-recorder-new-script-file(type="file" style="display: none")
.buttons.buttons-row .buttons.buttons-row
button.row50#hid-recorder-upload(disabled i18n="kvm_text42") Upload script button.row50#hid-recorder-upload(disabled i18n="macro_upload_script") Upload script
button.row50#hid-recorder-download(disabled i18n="kvm_text43") Download script button.row50#hid-recorder-download(disabled i18n="macro_download_script") Download script

View File

@ -1,10 +1,10 @@
li.right.feature-disabled#msd-dropdown li.right.feature-disabled#msd-dropdown
a.menu-button(href="#") a.menu-button(href="#")
+navbar_led("msd-led", "led-msd") +navbar_led("msd-led", "led-msd")
span(i18n="kvm_text60") Drive span(i18n="drive_menu") Drive
.menu#msd-menu .menu#msd-menu
.text .text
b(i18n="kvm_text61") Mass Storage Drive: b(i18n="drive_title") Mass Storage Drive:
span#msd-status span#msd-status
br br
hr hr
@ -36,7 +36,7 @@ li.right.feature-disabled#msd-dropdown
table.kv table.kv
tr tr
td(i18n="kvm_text62") Image: td(i18n="drive_image") Image:
td(width="100%") #[select#msd-image-selector(disabled)] td(width="100%") #[select#msd-image-selector(disabled)]
td #[button#msd-download-button(disabled title="Download image") #[b &nbsp;&nbsp;&#x21E9;&nbsp;&nbsp;]] td #[button#msd-download-button(disabled title="Download image") #[b &nbsp;&nbsp;&#x21E9;&nbsp;&nbsp;]]
td #[button#msd-remove-button(disabled title="Remove image") #[b &nbsp;&nbsp;&times;&nbsp;&nbsp;]] td #[button#msd-remove-button(disabled title="Remove image") #[b &nbsp;&nbsp;&times;&nbsp;&nbsp;]]
@ -49,21 +49,21 @@ li.right.feature-disabled#msd-dropdown
td &nbsp; td &nbsp;
+menu_switch_td2("msd-rw-switch", false, false) Writable: +menu_switch_td2("msd-rw-switch", false, false) Writable:
tr tr
td(i18n="kvm_text84") Files td(i18n="drive_file_display") Files
td td
div.radio-box() div.radio-box()
input#msd-mode-radio-image(checked type="radio" name="file-mode-radio" value="1") input#msd-mode-radio-image(checked type="radio" name="file-mode-radio" value="1")
label(for="msd-mode-radio-image" i18n="kvm_text90") ImageFiles label(for="msd-mode-radio-image" i18n="drive_image_files") ImageFiles
input#msd-mode-radio-file(type="radio" name="file-mode-radio" value="0") input#msd-mode-radio-file(type="radio" name="file-mode-radio" value="0")
label(for="msd-mode-radio-file" i18n="kvm_text91") NormalFiles label(for="msd-mode-radio-file" i18n="drive_normal_files") NormalFiles
hr hr
#msd-storages #msd-storages
hr hr
.buttons.buttons-row .buttons.buttons-row
button.row50#msd-select-new-button(disabled i18n="kvm_text64") Select image to upload button.row50#msd-select-new-button(disabled i18n="drive_select_upload") Select image to upload
button.row25#msd-upload-new-button(disabled i18n="kvm_text65") Upload button.row25#msd-upload-new-button(disabled i18n="drive_upload") Upload
button.row25#msd-abort-new-button(disabled i18n="kvm_text66") Abort button.row25#msd-abort-new-button(disabled i18n="drive_abort") Abort
.hidden#msd-message-another-user-uploads .hidden#msd-message-another-user-uploads
+menu_message("info", "Another user uploads an image", "msd-message-another-user-uploads") +menu_message("info", "Another user uploads an image", "msd-message-another-user-uploads")
hr hr
@ -71,13 +71,13 @@ li.right.feature-disabled#msd-dropdown
.hidden#msd-new-sub .hidden#msd-new-sub
table.kv table.kv
tr tr
td(i18n="kvm_text68") Specify a local file: td(i18n="drive_local_file") Specify a local file:
td #[input#msd-new-file(type="file")] td #[input#msd-new-file(type="file")]
tr tr
td(i18n="kvm_text69") #[b Or] paste a URL: td(i18n="drive_paste_url") #[b Or] paste a URL:
td #[input#msd-new-url(type="text" style="width: 100%")] td #[input#msd-new-url(type="text" style="width: 100%")]
tr.hidden#msd-new-part tr.hidden#msd-new-part
td(i18n="kvm_text70") Upload partition: td(i18n="drive_upload_partition") Upload partition:
td(width="100%") #[select#msd-new-part-selector] td(width="100%") #[select#msd-new-part-selector]
div(id="msd-uploading-sub" class="hidden") div(id="msd-uploading-sub" class="hidden")
hr hr
@ -85,10 +85,10 @@ li.right.feature-disabled#msd-dropdown
.hidden#msd-uploading-sub .hidden#msd-uploading-sub
table.kv table.kv
tr tr
td(i18n="kvm_text74") New image: td(i18n="drive_new_image") New image:
td.value#msd-uploading-name td.value#msd-uploading-name
tr tr
td(i18n="kvm_text75") Upload size: td(i18n="drive_upload_size") Upload size:
td.value#msd-uploading-size td.value#msd-uploading-size
.text .text
.progress#msd-uploading-progress .progress#msd-uploading-progress
@ -98,31 +98,31 @@ li.right.feature-disabled#msd-dropdown
.hidden#msd-new-tips .hidden#msd-new-tips
table.kv table.kv
tr tr
td.value(i18n="kvm_text71") Note: td.value(i18n="drive_note") Note:
td(i18n="kvm_text72") &bull; Don't close the browser page until the upload is complete. td(i18n="drive_note_browser") &bull; Don't close the browser page until the upload is complete.
tr tr
td td
td(i18n="kvm_text73") &bull; To speed up the upload, close the stream window. td(i18n="drive_note_stream") &bull; To speed up the upload, close the stream window.
hr hr
.buttons.buttons-row .buttons.buttons-row
button.row50#msd-connect-button(disabled i18n="kvm_text76") Connect drive to Server button.row50#msd-connect-button(disabled i18n="drive_connect") Connect drive to Server
button.row25#msd-disconnect-button(disabled i18n="kvm_text77") Disconnect button.row25#msd-disconnect-button(disabled i18n="drive_disconnect") Disconnect
button.row25#msd-reset-button(disabled i18n="kvm_text78") Reset button.row25#msd-reset-button(disabled i18n="drive_reset") Reset
hr hr
.text .text
b(i18n="kvm_text85") Quick file transfer: b(i18n="drive_quick_transfer") Quick file transfer:
br br
sub(i18n="kvm_text86") &bull; Select NormalFiles tab to upload, package them and mount image sub(i18n="drive_transfer_upload_note") &bull; Select NormalFiles tab to upload, package them and mount image
br br
sub(i18n="kvm_text87") &bull; Disconnect MSD, unpackage it, select tab to download sub(i18n="drive_transfer_download_note") &bull; Disconnect MSD, unpackage it, select tab to download
br br
hr hr
div(class="buttons buttons-row") div(class="buttons buttons-row")
button.row50#msd-file-image-update-button(i18n="kvm_text88") Package files into image button.row50#msd-file-image-update-button(i18n="drive_package_files") Package files into image
button.row50#msd-file-image-unzip-button(i18n="kvm_text89") Unpackage files from image button.row50#msd-file-image-unzip-button(i18n="drive_unpackage_files") Unpackage files from image
hr hr

View File

@ -1,10 +1,10 @@
li.right#shortcuts-dropdown li.right#shortcuts-dropdown
a.menu-button(href="#" i18n="kvm_text56") Shortcuts a.menu-button(href="#" i18n="shortcuts_menu") Shortcuts
.menu#shortcuts-menu .menu#shortcuts-menu
.text .text
b(i18n="kvm_text57") Quick keyboard shortcuts#[br] b(i18n="shortcuts_description") Quick keyboard shortcuts#[br]
sub(i18n="kvm_text58") Also see #[i System &rarr; Show keyboard] sub(i18n="shortcuts_also_see") Also see #[i System &rarr; Show keyboard]
hr hr
.buttons .buttons
@ -41,7 +41,7 @@ li.right#shortcuts-dropdown
.text .text
| &darr; &bull; Alt+SysRq+... <sup><i>linux magic | &darr; &bull; Alt+SysRq+... <sup><i>linux magic
| #[a(target="_blank" href="https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html" i18n="kvm_text59") help]</i></sup> | #[a(target="_blank" href="https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html" i18n="shortcuts_help") help]</i></sup>
hr hr
.buttons .buttons

View File

@ -4,26 +4,26 @@ li.right#system-dropdown
+navbar_led("stream-led", "led-video") +navbar_led("stream-led", "led-video")
+navbar_led("hid-keyboard-led", "led-hid-keyboard") +navbar_led("hid-keyboard-led", "led-hid-keyboard")
+navbar_led("hid-mouse-led", "led-hid-mouse") +navbar_led("hid-mouse-led", "led-hid-mouse")
span(i18n="kvm_text3") System span(i18n="system_menu") System
.menu#system-menu .menu#system-menu
table.kv table.kv
tr tr
td.value(i18n="kvm_text4") td.value(i18n="system_runtime_settings")
| Runtime settings &amp; tools | Runtime settings &amp; tools
td.feature-disabled#system-tool-webterm td.feature-disabled#system-tool-webterm
button.small(data-force-hide-menu data-show-window="webterm-window" i18n="kvm_text5") &bull; Term button.small(data-force-hide-menu data-show-window="webterm-window" i18n="system_terminal") &bull; Term
td#system-tool-about td#system-tool-about
button.small(data-force-hide-menu data-show-window="about-window" i18n="kvm_text6") &bull; About button.small(data-force-hide-menu data-show-window="about-window" i18n="system_about") &bull; About
td#system-tool-log td#system-tool-log
button.small#open-log-button(data-force-hide-menu i18n="kvm_text7") &bull; Log button.small#open-log-button(data-force-hide-menu i18n="system_log") &bull; Log
td.feature-disabled#system-tool-wol td.feature-disabled#system-tool-wol
button( button(
data-force-hide-menu data-force-hide-menu
class="__gpio-button-__wol__ __gpio-button small" class="__gpio-button-__wol__ __gpio-button small"
data-channel="__wol__" data-channel="__wol__"
data-confirm="Are you sure to send Wake-on-LAN packet to the server?" data-confirm="Are you sure to send Wake-on-LAN packet to the server?"
i18n="kvm_text8" i18n="system_wol"
) &bull; WoL ) &bull; WoL
hr hr
@ -39,70 +39,70 @@ li.right#system-dropdown
table.kv table.kv
tr.feature-disabled#stream-resolution tr.feature-disabled#stream-resolution
td(i18n="kvm_text9") Resolution: td(i18n="video_resolution") Resolution:
td #[select#stream-resolution-selector(disabled)] td #[select#stream-resolution-selector(disabled)]
tr.feature-disabled#stream-quality tr.feature-disabled#stream-quality
+menu_slider_td3("stream-quality-slider", "stream-quality-value", false, "kvm_text10") JPEG quality: +menu_slider_td3("stream-quality-slider", "stream-quality-value", false, "video_jpeg_quality") JPEG quality:
tr tr
+menu_slider_td3("stream-desired-fps-slider", "stream-desired-fps-value", false, "kvm_text11") JPEG max fps: +menu_slider_td3("stream-desired-fps-slider", "stream-desired-fps-value", false, "video_jpeg_fps") JPEG max fps:
tr.feature-disabled#stream-h264-bitrate tr.feature-disabled#stream-h264-bitrate
+menu_slider_td3("stream-h264-bitrate-slider", "stream-h264-bitrate-value", false, "kvm_text12") H.264 kbps: +menu_slider_td3("stream-h264-bitrate-slider", "stream-h264-bitrate-value", false, "video_h264_bitrate") H.264 kbps:
tr.feature-disabled#stream-h264-gop tr.feature-disabled#stream-h264-gop
+menu_slider_td3("stream-h264-gop-slider", "stream-h264-gop-value", false, "kvm_text13") H.264 gop: +menu_slider_td3("stream-h264-gop-slider", "stream-h264-gop-value", false, "video_h264_gop") H.264 gop:
tr.feature-disabled#stream-mode tr.feature-disabled#stream-mode
+menu_radio_td2("stream-mode-radio", [ +menu_radio_td2("stream-mode-radio", [
{title: "WebRTC<br>H.264", value: "janus"}, {title: "WebRTC<br>H.264", value: "janus"},
{title: "Direct<br>H.264", value: "media"}, {title: "Direct<br>H.264", value: "media"},
{title: "Legacy<br>MJPEG", value: "mjpeg", checked: true}, {title: "Legacy<br>MJPEG", value: "mjpeg", checked: true},
], "kvm_text14") #[a(target="_blank" href="https://docs.pikvm.org/webrtc") Video mode]: ], "video_mode") #[a(target="_blank" href="https://docs.pikvm.org/webrtc" i18n="video_mode") Video mode]:
tr.feature-disabled#stream-orient tr.feature-disabled#stream-orient
+menu_radio_td2("stream-orient-radio", [ +menu_radio_td2("stream-orient-radio", [
{title: "Default", value: "0", checked: true}, {title: "Default", value: "0", checked: true},
{title: "90&deg;", value: "90"}, {title: "90&deg;", value: "90"},
{title: "180&deg;", value: "180"}, {title: "180&deg;", value: "180"},
{title: "270&deg;", value: "270"}, {title: "270&deg;", value: "270"},
], "kvm_text17") Orientation: ], "video_orientation") Orientation:
tr.feature-disabled#stream-audio tr.feature-disabled#stream-audio
+menu_slider_td3("stream-audio-volume-slider", "stream-audio-volume-value", false, "kvm_text19") Audio volume: +menu_slider_td3("stream-audio-volume-slider", "stream-audio-volume-value", false, "audio_volume") Audio volume:
tr.feature-disabled#stream-mic tr.feature-disabled#stream-mic
+menu_switch_td2("stream-mic-switch", false, "stream-mic-switch") Microphone: +menu_switch_td2("stream-mic-switch", false, "stream-mic-switch") Microphone:
hr hr
.buttons.buttons-row .buttons.buttons-row
button.row33(data-force-hide-menu data-show-window="stream-window" i18n="kvm_text20") &bull; Show stream button.row33(data-force-hide-menu data-show-window="stream-window" i18n="stream_show") &bull; Show stream
button.row33#stream-screenshot-button(data-force-hide-menu i18n="kvm_text21") &bull; Screenshot button.row33#stream-screenshot-button(data-force-hide-menu i18n="stream_screenshot") &bull; Screenshot
button.row33#stream-reset-button( i18n="kvm_text22") Reset stream button.row33#stream-reset-button( i18n="stream_reset") Reset stream
hr hr
.text .text
b(i18n="kvm_text79") Video Record#[br] b(i18n="video_record_title") Video Record#[br]
sub(i18n="kvm_text80") Record video using the browser API, and will be downloaded automatically sub(i18n="video_record_description") Record video using the browser API, and will be downloaded automatically
.buttons.buttons-row .buttons.buttons-row
button.row50#stream-record-start-button(data-force-hide-menu i18n="kvm_text81") &bull; Start recording button.row50#stream-record-start-button(data-force-hide-menu i18n="video_record_start") &bull; Start recording
button.row50#stream-record-stop-button(data-force-hide-menu i18n="kvm_text82") &bull; End recording button.row50#stream-record-stop-button(data-force-hide-menu i18n="video_record_stop") &bull; End recording
hr hr
table.kv table.kv
tr.feature-disabled#hid-outputs-keyboard tr.feature-disabled#hid-outputs-keyboard
td(i18n="kvm_text23") Keyboard mode: td(i18n="hid_keyboard_mode") Keyboard mode:
td #[div.radio-box#hid-outputs-keyboard-box] td #[div.radio-box#hid-outputs-keyboard-box]
tr.feature-disabled#hid-outputs-mouse tr.feature-disabled#hid-outputs-mouse
td #[a(target="_blank" href="https://docs.pikvm.org/mouse" i18n="kvm_text24") Mouse mode]: td #[a(target="_blank" href="https://docs.pikvm.org/mouse" i18n="hid_mouse_mode") Mouse mode]:
td #[div.radio-box#hid-outputs-mouse-box] td #[div.radio-box#hid-outputs-mouse-box]
+menu_spoiler("Keyboard &amp; mouse (HID) settings", "kvm_text25") +menu_spoiler("Keyboard &amp; mouse (HID) settings", "hid_settings")
+menu_switch_table("hid-keyboard-swap-cc-switch", true, false, "hid-keyboard-swap-cc-switch") Swap Left Ctrl and Caps keys: +menu_switch_table("hid-keyboard-swap-cc-switch", true, false, "hid-keyboard-swap-cc-switch") Swap Left Ctrl and Caps keys:
hr hr
table(class="kv") table(class="kv")
tr tr
+menu_slider_td3("hid-mouse-rate-slider", "hid-mouse-rate-value", false, "kvm_text26") Mouse polling: +menu_slider_td3("hid-mouse-rate-slider", "hid-mouse-rate-value", false, "hid_mouse_polling") Mouse polling:
tr.feature-disabled#hid-mouse-sens tr.feature-disabled#hid-mouse-sens
+menu_slider_td3("hid-mouse-sens-slider", "hid-mouse-sens-value", false, "kvm_text27") Relative sensitivity: +menu_slider_td3("hid-mouse-sens-slider", "hid-mouse-sens-value", false, "hid_mouse_sensitivity") Relative sensitivity:
tr(id="hid-mouse-squash" class="feature-disabled") tr(id="hid-mouse-squash" class="feature-disabled")
+menu_switch_td2("hid-mouse-squash-switch", false, "hid-mouse-squash-switch") Squash relative moves: +menu_switch_td2("hid-mouse-squash-switch", false, false, "hid-mouse-squash-switch") Squash relative moves:
tr tr
td Reverse scrolling: td(i18n="hid_mouse_reverse_scroll") Reverse scrolling:
td td
table table
tr tr
@ -112,11 +112,11 @@ li.right#system-dropdown
tr tr
+menu_switch_td2("hid-mouse-cumulative-scrolling-switch", true, false, "hid-mouse-cumulative-scrolling-switch") Cumulative scrolling: +menu_switch_td2("hid-mouse-cumulative-scrolling-switch", true, false, "hid-mouse-cumulative-scrolling-switch") Cumulative scrolling:
tr tr
+menu_slider_td3("hid-mouse-scroll-slider", "hid-mouse-scroll-value", true, "kvm_text29") Scroll rate: +menu_slider_td3("hid-mouse-scroll-slider", "hid-mouse-scroll-value", true, "hid_mouse_scroll_rate") Scroll rate:
tr tr
+menu_switch_td2("hid-mouse-dot-switch", true, true, "hid-mouse-dot-switch") Show the blue dot: +menu_switch_td2("hid-mouse-dot-switch", true, true, "hid-mouse-dot-switch") Show the blue dot:
+menu_spoiler("Web UI settings") +menu_spoiler("Web UI settings", "web_ui_settings")
table.kv table.kv
tr tr
+menu_switch_td2("page-close-ask-switch", true, true, "page-close-ask-switch") Ask page close confirmation: +menu_switch_td2("page-close-ask-switch", true, true, "page-close-ask-switch") Ask page close confirmation:
@ -138,12 +138,15 @@ li.right#system-dropdown
tr.feature-disabled#v3-usb-breaker tr.feature-disabled#v3-usb-breaker
+menu_switch_td2_gpio( +menu_switch_td2_gpio(
"__v3_usb_breaker__", "__v3_usb_breaker__",
"Turning off this switch will disconnect the main USB from the server. Are you sure you want to continue?" "Turning off this switch will disconnect the main USB from the server. Are you sure you want to continue?",
) Connect main USB to Server: "usb_breaker_confirm"
)
span(i18n="usb_connect_main") Connect main USB to Server:
tr.feature-disabled#v4-locator tr.feature-disabled#v4-locator
+menu_switch_td2_gpio("__v4_locator__") Enable locator LED: +menu_switch_td2_gpio("__v4_locator__", "","locator_led_enable")
span(i18n="locator_led_enable") Enable locator LED:
hr hr
.buttons.buttons-row .buttons.buttons-row
button.row50(data-force-hide-menu data-show-window="keyboard-window" i18n="kvm_text30") &bull; Show keyboard button.row50(data-force-hide-menu data-show-window="keyboard-window" i18n="hid_show_keyboard") &bull; Show keyboard
button.row50#hid-reset-button(disabled i18n="kvm_text31") Reset HID button.row50#hid-reset-button(disabled i18n="hid_reset") Reset HID

View File

@ -1,19 +1,19 @@
li.right#text-dropdown li.right#text-dropdown
a.menu-button(href="#") a.menu-button(href="#")
+navbar_led("stream-ocr-led", "led-gear", "feature-disabled") +navbar_led("stream-ocr-led", "led-gear", "feature-disabled")
span(i18n="kvm_text44") Text span(i18n="text_menu") Text
.menu#text-menu(style="width: 360px") .menu#text-menu(style="width: 360px")
.text .text
b(i18n="kvm_text45") Paste text as keypress sequence#[br] b(i18n="text_paste_description") Paste text as keypress sequence#[br]
sub(i18n="kvm_text46") Please note that PiKVM cannot switch the keyboard layout sub(i18n="text_keyboard_layout_note") Please note that PiKVM cannot switch the keyboard layout
hr hr
.text(style="margin-right: 20px") .text(style="margin-right: 20px")
textarea#hid-pak-text(data-focus placeholder="Enter your text here") textarea#hid-pak-text(data-focus placeholder="Enter your text here")
table.kv table.kv
tr tr
td td
button#hid-pak-button(disabled data-force-hide-menu title="Ctrl+Enter when the text is focused" i18n="kvm_text47") &bull; Paste button#hid-pak-button(disabled data-force-hide-menu title="Ctrl+Enter when the text is focused" i18n="text_paste_button") &bull; Paste
td(i18n="kvm_text48") using host keymap td(i18n="text_using_keymap") using host keymap
td #[select#hid-pak-keymap-selector] td #[select#hid-pak-keymap-selector]
table.kv table.kv
tr tr
@ -28,19 +28,19 @@ li.right#text-dropdown
br br
hr hr
.text .text
b(i18n="kvm_text49") Text recognition <sup><i>&beta;</i></sup>#[br] b(i18n="text_ocr_title") Text recognition <sup><i>&beta;</i></sup>#[br]
sub(i18n="kvm_text50") #[a(target="_blank" href="https://docs.pikvm.org/ocr") OCR] works locally on PiKVM sub(i18n="text_ocr_local_note") #[a(target="_blank" href="https://docs.pikvm.org/ocr") OCR] works locally on PiKVM
hr hr
table.kv table.kv
tr tr
td #[button#stream-ocr-button(data-force-hide-menu i18n="kvm_text51") &bull; Select area] td #[button#stream-ocr-button(data-force-hide-menu i18n="text_ocr_select_area") &bull; Select area]
td(i18n="kvm_text52") for td(i18n="text_ocr_for") for
td #[select#stream-ocr-lang-selector] td #[select#stream-ocr-lang-selector]
td(i18n="kvm_text53") text recognition td(i18n="text_ocr_recognition") text recognition
table.kv table.kv
tr tr
td(colspan="4" i18n="kvm_text54") &bull; Next hit the #[b Enter] to recognize and copy text to clipboard... td(colspan="4" i18n="text_ocr_enter_hint") &bull; Next hit the #[b Enter] to recognize and copy text to clipboard...
tr tr
td(colspan="4" i18n="kvm_text55") &bull; Or hit the #[b Escape] to cancel a selection td(colspan="4" i18n="text_ocr_escape_hint") &bull; Or hit the #[b Escape] to cancel a selection
tr tr
td td

View File

@ -14,8 +14,8 @@ mixin menu_message(icon, short, classes="", i18nid)
block block
mixin menu_switch_td2_gpio(channel, confirm_off="") mixin menu_switch_td2_gpio(channel, confirm_off="", i18nid)
td td(i18n=i18nid)
block block
td(align="right") td(align="right")
.switch-box .switch-box
@ -33,7 +33,7 @@ mixin menu_switch_td2_gpio(channel, confirm_off="")
mixin menu_switch_td2(id, enabled, checked, i18nid) mixin menu_switch_td2(id, enabled, checked, i18nid)
td td(i18n=i18nid)
block block
td(align="right") td(align="right")
.switch-box .switch-box
@ -65,7 +65,7 @@ mixin menu_radio_td2(name, items, i18nid)
mixin menu_slider_td3(slider_id, value_id, enabled, i18nid) mixin menu_slider_td3(slider_id, value_id, enabled, i18nid)
- -
enabled = (enabled || true) enabled = (enabled || true)
td td(i18n=i18nid)
block block
td.value-slider td.value-slider
input(type="range" id=slider_id disabled=!enabled) input(type="range" id=slider_id disabled=!enabled)
@ -74,7 +74,7 @@ mixin menu_slider_td3(slider_id, value_id, enabled, i18nid)
mixin menu_spoiler(title, i18nid) mixin menu_spoiler(title, i18nid)
details details
summary !{title} summary(i18n=i18nid) !{title}
div(class="spoiler") div(class="spoiler")
block block

View File

@ -12,7 +12,7 @@ mixin about_tab(name, title, i18nid, checked=false)
.window#about-window(data-show-centered) .window#about-window(data-show-centered)
.window-header .window-header
.window-grab(i18n="kvm_text1") About .window-grab(i18n="about_title") About
.window-buttons .window-buttons
button.window-button-original &bull; button.window-button-original &bull;
button.window-button-close #[b &times;] button.window-button-close #[b &times;]
@ -47,7 +47,7 @@ mixin about_tab(name, title, i18nid, checked=false)
pre#kvmd-meta-json No data pre#kvmd-meta-json No data
+about_tab("thanks", "Thanks", "thanks") +about_tab("thanks", "Thanks", "thanks")
span.code-comment( i18n="kvm_text2") span.code-comment( i18n="about_sponsors")
| // These kind people donated money to the PiKVM project#[br] | // These kind people donated money to the PiKVM project#[br]
| // and supported the work on it. We are very grateful#[br] | // and supported the work on it. We are very grateful#[br]
| // for their help, and memorializing their names#[br] | // for their help, and memorializing their names#[br]
@ -57,10 +57,10 @@ mixin about_tab(name, title, i18nid, checked=false)
| or #[a(target="_blank" href="https://paypal.me/pikvm") Paypal]. | or #[a(target="_blank" href="https://paypal.me/pikvm") Paypal].
br br
p.text.credits p.text.credits
a(target="_blank" href="https://github.com/mofeng-git/One-KVM" i18n="index_text_12") One-KVM Project a(target="_blank" href="https://github.com/mofeng-git/One-KVM" i18n="onekvm_project_link") One-KVM Project
| &nbsp; | &nbsp; | &nbsp; | &nbsp;
a(target="_blank" href="https://one-kvm.mofeng.run" i18n="index_text_13") One-KVM Documentation a(target="_blank" href="https://one-kvm.mofeng.run" i18n="onekvm_documentation_link") One-KVM Documentation
| &nbsp; | &nbsp; | &nbsp; | &nbsp;
a(target="_blank" href="https://pikvm.org" i18n="index_text_10") PiKVM Project a(target="_blank" href="https://pikvm.org" i18n="pikvm_project_link") PiKVM Project
| &nbsp; | &nbsp; | &nbsp; | &nbsp;
a(target="_blank" href="https://docs.pikvm.org" i18n="index_text_11") Documentation a(target="_blank" href="https://docs.pikvm.org" i18n="pikvm_documentation_link") Documentation

View File

@ -32,7 +32,7 @@ mixin lamp(cls)
.window#keyboard-window(data-show-centered) .window#keyboard-window(data-show-centered)
.window-header#keyboard-window-header .window-header#keyboard-window-header
.window-grab(i18n="kvm_text15") Virtual Keyboard .window-grab(i18n="virtual_keyboard_title") Virtual Keyboard
.window-buttons .window-buttons
button.window-button-original &bull; button.window-button-original &bull;
button.window-button-close #[b &times;] button.window-button-close #[b &times;]

View File

@ -1,6 +1,6 @@
.window.window-resizable#webterm-window(data-show-centered style="display: flex; min-width: 720px; min-height: 480px") .window.window-resizable#webterm-window(data-show-centered style="display: flex; min-width: 720px; min-height: 480px")
.window-header .window-header
.window-grab(i18n="kvm_text16") Terminal .window-grab(i18n="terminal_title") Terminal
.window-buttons .window-buttons
button.window-button-original &bull; button.window-button-original &bull;
button.window-button-maximize &#9744; button.window-button-maximize &#9744;

View File

@ -88,7 +88,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td><a target="_blank" href="https://docs.pikvm.org/auth/#session-expiration">Remember me</a>:&nbsp;</td> <td i18n="remember_me"><a target="_blank" href="https://docs.pikvm.org/auth/#session-expiration">Remember me</a>:&nbsp;</td>
<td> <td>
<div class="radio-box"> <div class="radio-box">
<input type="radio" id="expire-radio-3600" name="expire-radio" value="3600"/> <input type="radio" id="expire-radio-3600" name="expire-radio" value="3600"/>
@ -100,11 +100,6 @@
</div> </div>
</td> </td>
</tr> </tr>
<tr>
<td colspan="2">
<hr>
</td>
</tr>
<tr> <tr>
<td i18n="select_language">Select language:&nbsp;</td> <td i18n="select_language">Select language:&nbsp;</td>
<td> <td>
@ -114,6 +109,11 @@
</select> </select>
</td> </td>
</tr> </tr>
<tr>
<td colspan="2">
<hr>
</td>
</tr>
<tr> <tr>
<td></td> <td></td>
<td> <td>

View File

@ -41,21 +41,21 @@ block body
tr tr
td(colspan=2) #[hr] td(colspan=2) #[hr]
tr tr
td #[a(target="_blank" href="https://docs.pikvm.org/auth/#session-expiration") Remember me]:&nbsp; td(i18n="remember_me") #[a(target="_blank" href="https://docs.pikvm.org/auth/#session-expiration") Remember me]:&nbsp;
td td
+radio("expire-radio", [ +radio("expire-radio", [
{"title": "1h", "value": "3600"}, {"title": "1h", "value": "3600"},
{"title": "12h", "value": "43200"}, {"title": "12h", "value": "43200"},
{"title": "Forever", "value": "0", "checked": true}, {"title": "Forever", "value": "0", "checked": true},
]) ])
tr
td(colspan=2) #[hr]
tr tr
td(i18n="select_language") Select language:&nbsp; td(i18n="select_language") Select language:&nbsp;
td td
select#selectLanguage(style="width:100%") select#selectLanguage(style="width:100%")
option#zh(selected="selected" i18n="chinese") Simplified Chinese option#zh(selected="selected" i18n="chinese") Simplified Chinese
option#en(i18n="english") English option#en(i18n="english") English
tr
td(colspan=2) #[hr]
tr tr
td td
td #[button.key#login-button(style="width:100%" i18n="login") Login] td #[button.key#login-button(style="width:100%" i18n="login") Login]

View File

@ -10,118 +10,118 @@
"footer-left": "This site is actively using JavaScript.<br>It doesn't contain ads, but is blocked by some ad filters.<br>Please turn it off to continue and reload the page.", "footer-left": "This site is actively using JavaScript.<br>It doesn't contain ads, but is blocked by some ad filters.<br>Please turn it off to continue and reload the page.",
"index": " One-KVM Index ", "index": " One-KVM Index ",
"copyright": "Copyright &copy; 2018-2024 Maxim Devaev | Modified by SilentWind", "copyright": "Copyright &copy; 2018-2025 Maxim Devaev | Modified by SilentWind",
"index_text_1": "Please note that when you are working with a KVM session or another application that captures the keyboard,you can't use some keyboard shortcuts such as Ctrl+Alt+Del (which will be caught by your OS) or Ctrl+W (caught by your browser).", "keyboard_limitation_note": "Please note that when you are working with a KVM session or another application that captures the keyboard,you can't use some keyboard shortcuts such as Ctrl+Alt+Del (which will be caught by your OS) or Ctrl+W (caught by your browser).",
"index_text_2": "To override this limitation you can use Google Chrome in application mode.", "browser_solution_note": "To override this limitation you can use Google Chrome in application mode.",
"serve_name": "Server:", "serve_name": "Server Name:",
"index_text_10":"PiKVM Project", "pikvm_project_link":"PiKVM Project",
"index_text_11":"PiKVM Documentation", "pikvm_documentation_link":"PiKVM Documentation",
"index_text_12":"One-KVM Project", "onekvm_project_link":"One-KVM Project",
"index_text_13":"One-KVM Documentation", "onekvm_documentation_link":"One-KVM Documentation",
"index_title":"The Open Source KVM over IP", "index_title":"The Open Source KVM over IP",
"vnc_text1": "This One-KVM device has running <b>kvmd-vnc</b> daemon and provides VNC access to the server.", "vnc_daemon_running": "This One-KVM device has running <b>kvmd-vnc</b> daemon and provides VNC access to the server.",
"vnc_text2": "<b>WARNING!</b> We strongly don't recommend you to use VNC in untrusted networks without enabled X.509 or TLS encryption. Otherwise your passwords are transmitted in a plain text over the network.", "vnc_security_warning": "<b>WARNING!</b> We strongly don't recommend you to use VNC in untrusted networks without enabled X.509 or TLS encryption. Otherwise your passwords are transmitted in a plain text over the network.",
"vnc_text3": "Your VNC client must support Tight JPEG compression and password authentication. <a href=\"https://tigervnc.org\">TigerVNC</a> is a good choice.On Linux, this client will most likely be available for installation from the repository. It can also be called vncviewer.", "vnc_client_requirements": "Your VNC client must support Tight JPEG compression and password authentication. <a href=\"https://tigervnc.org\">TigerVNC</a> is a good choice.On Linux, this client will most likely be available for installation from the repository. It can also be called vncviewer.",
"ipmi_text1":"This One-KVM device has running <b>kvmd-ipmi</b> daemon and provides IPMI 2.0 interface for some basic BMC operations like on/off/reset the server.", "ipmi_daemon_running":"This One-KVM device has running <b>kvmd-ipmi</b> daemon and provides IPMI 2.0 interface for some basic BMC operations like on/off/reset the server.",
"ipmi_text2":"<b>WARNING!</b> We strongly don't recommend you to use IPMI in untrusted networks because this protocol is completely unsafe by design. In short, the authentication process for IPMI mandates that the server send a salted SHA1 or MD5 hash of the requested user's password to the client, prior to the client authenticating.", "ipmi_security_warning":"<b>WARNING!</b> We strongly don't recommend you to use IPMI in untrusted networks because this protocol is completely unsafe by design. In short, the authentication process for IPMI mandates that the server send a salted SHA1 or MD5 hash of the requested user's password to the client, prior to the client authenticating.",
"ipmi_text3":"<b>NEVER</b> use the same passwords for KVMD and IPMI users. And even better not to use IPMI. Instead, you can directly use KVMD API via curl. Here some examples:", "ipmi_password_recommendation":"<b>NEVER</b> use the same passwords for KVMD and IPMI users. And even better not to use IPMI. Instead, you can directly use KVMD API via curl. Here some examples:",
"kvm_text1":"About", "about_title":"About",
"kvm_text2":"// These <a href=\"https://github.com/pikvm/pikvm?tab=readme-ov-file#special-thanks\">kind people</a> donated money to the PiKVM project and supported the work on it. <br>// If you also want to support this project, you can donate on <a target=\"_blank\" href=\"https://www.patreon.com/pikvm\"> Patreon</a> or <a target=\"_blank\" href=\"https://paypal.me/pikvm\"> Paypal</a>.<br><br>// These <a href=\"https://one-kvm.mofeng.run/thanks/#_2\">kind people</a> donated money to the One-KVM project and supported the work on it. <br>// If you also want to support this project, you can donate on <a target=\"_blank\" href=\"https://afdian.com/a/silentwind\"> afdian </a>.", "about_sponsors":"// These <a href=\"https://github.com/pikvm/pikvm?tab=readme-ov-file#special-thanks\">kind people</a> donated money to the PiKVM project and supported the work on it. <br>// If you also want to support this project, you can donate on <a target=\"_blank\" href=\"https://www.patreon.com/pikvm\"> Patreon</a> or <a target=\"_blank\" href=\"https://paypal.me/pikvm\"> Paypal</a>.<br><br>// These <a href=\"https://one-kvm.mofeng.run/thanks/#_2\">kind people</a> donated money to the One-KVM project and supported the work on it. <br>// If you also want to support this project, you can donate on <a target=\"_blank\" href=\"https://afdian.com/a/silentwind\"> afdian </a>.",
"kvm_text3":"System", "system_menu":"System",
"kvm_text4":"Runtime settings &amp; tools", "system_runtime_settings":"Runtime settings &amp; tools",
"kvm_text5":"Term", "system_terminal":"Term",
"kvm_text6":"About", "system_about":"About",
"kvm_text7":"Log", "system_log":"Log",
"kvm_text8":"WoL", "system_wol":"WoL",
"kvm_text9":"Resolution:", "video_resolution":"Resolution:",
"kvm_text10":"JPEG quality:", "video_jpeg_quality":"JPEG quality:",
"kvm_text11":"JPEG max fps:", "video_jpeg_fps":"JPEG max fps:",
"kvm_text12":"H.264 kbps:", "video_h264_bitrate":"H.264 kbps:",
"kvm_text13":"H.264 gop", "video_h264_gop":"H.264 gop",
"kvm_text14":"Video mode", "video_mode":"Video mode",
"kvm_text15":"Virtual Keyboard", "virtual_keyboard_title":"Virtual Keyboard",
"kvm_text16":"Terminal", "terminal_title":"Terminal",
"kvm_text17":"Orientation:", "video_orientation":"Orientation:",
"kvm_text18":"Default", "video_orientation_default":"Default",
"kvm_text19":"Audio volume:", "audio_volume":"Audio volume:",
"kvm_text20":"&bull; Show stream", "stream_show":"&bull; Show stream",
"kvm_text21":"&bull; Screenshot", "stream_screenshot":"&bull; Screenshot",
"kvm_text22":"Reset stream", "stream_reset":"Reset stream",
"kvm_text23":"Keyboard mode:", "hid_keyboard_mode":"Keyboard mode:",
"kvm_text24":"Mouse mode:", "hid_mouse_mode":"Mouse mode:",
"kvm_text25":"Keyboard &amp; Mouse (HID) settings", "hid_settings":"Keyboard &amp; Mouse (HID) settings",
"kvm_text26":"Mouse polling:", "hid_mouse_polling":"Mouse polling:",
"kvm_text27":"Relative sensitivity:", "hid_mouse_sensitivity":"Relative sensitivity:",
"kvm_text28":"Reverse scrolling:", "hid_mouse_reverse_scroll":"Reverse scrolling:",
"kvm_text29":"Scroll rate:", "hid_mouse_scroll_rate":"Scroll rate:",
"kvm_text30":"&bull; Show keyboard", "hid_show_keyboard":"&bull; Show keyboard",
"kvm_text31":"Reset HID", "hid_reset":"Reset HID",
"kvm_text32":"Macro", "macro_menu":"Macro",
"kvm_text33":"Record and play HID/ATX/GPIO actions<br>", "macro_description":"Record and play HID/ATX/GPIO actions<br>",
"kvm_text34":"For security reasons, the record will not be saved on the PiKVM", "macro_security_note":"For security reasons, the record will not be saved on the PiKVM",
"kvm_text35":"Rec", "macro_record":"Rec",
"kvm_text36":"Stop", "macro_stop":"Stop",
"kvm_text37":"Play", "macro_play":"Play",
"kvm_text38":"Clear", "macro_clear":"Clear",
"kvm_text39":"Script time:", "macro_script_time":"Script time:",
"kvm_text40":"Scripted events:", "macro_script_events":"Scripted events:",
"kvm_text41":"include delays", "macro_include_delays":"include delays",
"kvm_text42":"Upload script", "macro_upload_script":"Upload script",
"kvm_text43":"Download script", "macro_download_script":"Download script",
"kvm_text44":"Text", "text_menu":"Text",
"kvm_text45":"Paste text as keypress sequence<br>", "text_paste_description":"Paste text as keypress sequence<br>",
"kvm_text46":"Please note that One-KVM cannot switch the keyboard layout", "text_keyboard_layout_note":"Please note that One-KVM cannot switch the keyboard layout",
"kvm_text47":"&bull; Paste", "text_paste_button":"&bull; Paste",
"kvm_text48":"using host keymap", "text_using_keymap":"using host keymap",
"kvm_text49":"Text recognition <sup><i>&beta;</i></sup><br>", "text_ocr_title":"Text recognition <sup><i>&beta;</i></sup><br>",
"kvm_text50":"OCR works locally on One-KVM", "text_ocr_local_note":"OCR works locally on One-KVM",
"kvm_text51":"&bull; Select area", "text_ocr_select_area":"&bull; Select area",
"kvm_text52":"for", "text_ocr_for":"for",
"kvm_text53":"text recognition", "text_ocr_recognition":"text recognition",
"kvm_text54":"Press <b>Enter</b> to recognize and copy text to clipboard", "text_ocr_enter_hint":"Press <b>Enter</b> to recognize and copy text to clipboard",
"kvm_text55":"Press <b>Esc</b> to cancel selection", "text_ocr_escape_hint":"Press <b>Esc</b> to cancel selection",
"kvm_text56":"Shortcuts", "shortcuts_menu":"Shortcuts",
"kvm_text57":"Quick keyboard shortcuts<br>", "shortcuts_description":"Quick keyboard shortcuts<br>",
"kvm_text58":"Also see <i>System &rarr; Show keyboard<i>", "shortcuts_also_see":"Also see <i>System &rarr; Show keyboard</i>",
"kvm_text59":"help", "shortcuts_help":"help",
"kvm_text60":"Drive", "drive_menu":"Drive",
"kvm_text61":"Mass Storage Drive:", "drive_title":"Mass Storage Drive:",
"kvm_text62":"Image:", "drive_image":"Image:",
"kvm_text63":"Drive <a target=\"_blank\" href=\"https://docs.pikvm.org/msd\">mode</a>:", "drive_mode":"Drive <a target=\"_blank\" href=\"https://docs.pikvm.org/msd\">mode</a>:",
"kvm_text64":"Select image to upload", "drive_select_upload":"Select image to upload",
"kvm_text65":"Upload", "drive_upload":"Upload",
"kvm_text66":"Abort", "drive_abort":"Abort",
"kvm_text68":"Specify a local file:", "drive_local_file":"Specify a local file:",
"kvm_text69":"<b>Or</b> paste a URL:", "drive_paste_url":"<b>Or</b> paste a URL:",
"kvm_text70":"Upload partition:", "drive_upload_partition":"Upload partition:",
"kvm_text71":"Note:", "drive_note":"Note:",
"kvm_text72":"&bull; Don't close the browser page until the upload is complete.", "drive_note_browser":"&bull; Don't close the browser page until the upload is complete.",
"kvm_text73":"&bull; To speed up the upload, close the stream window.", "drive_note_stream":"&bull; To speed up the upload, close the stream window.",
"kvm_text74":"New image:", "drive_new_image":"New image:",
"kvm_text75":"Upload size:", "drive_upload_size":"Upload size:",
"kvm_text76":"Connect drive to Server", "drive_connect":"Connect drive to Server",
"kvm_text77":"Disconnect", "drive_disconnect":"Disconnect",
"kvm_text78":"Reset", "drive_reset":"Reset",
"kvm_text79":"Video Record<br>", "video_record_title":"Video Record<br>",
"kvm_text80":"Record video using the browser API, and will be downloaded automatically", "video_record_description":"Record video using the browser API, and will be downloaded automatically",
"kvm_text81":"Start recording", "video_record_start":"Start recording",
"kvm_text82":"End recording", "video_record_stop":"End recording",
"kvm_text83":"Web UI settings", "webui_settings":"Web UI settings",
"kvm_text84":"File display:", "drive_file_display":"File display:",
"kvm_text85":"Quick file transfer:", "drive_quick_transfer":"Quick file transfer:",
"kvm_text86":"&bull; Select NormalFiles tab to upload, package them and mount image", "drive_transfer_upload_note":"&bull; Select NormalFiles tab to upload, package them and mount image",
"kvm_text87":"&bull; Disconnect MSD, unpackage it, select tab to download", "drive_transfer_download_note":"&bull; Disconnect MSD, unpackage it, select tab to download",
"kvm_text88":"Package files into image", "drive_package_files":"Package files into image",
"kvm_text89":"Unpackage files from image", "drive_unpackage_files":"Unpackage files from image",
"kvm_text90":"ImageFiles", "drive_image_files":"Image Files",
"kvm_text91":"NormalFiles", "drive_normal_files":"Normal Files",
"atx-ask-switch":"Ask click confirmation", "atx-ask-switch":"Ask click confirmation",
"hid-recorder-loop-switch":"Infinite loop playback", "hid-recorder-loop-switch":"Infinite loop playback",
@ -151,5 +151,11 @@
"msd-message-downloads":"The image is being downloaded from One-KVM", "msd-message-downloads":"The image is being downloaded from One-KVM",
"msd-message-another-user-uploads":"Another user uploads an image", "msd-message-another-user-uploads":"Another user uploads an image",
"page-full-tab-stream-switch":"Expand for the entire tab by default", "page-full-tab-stream-switch":"Expand for the entire tab by default",
"hid-keyboard-bad-link-switch":"Bad link mode (release keys immediately)" "hid-keyboard-bad-link-switch":"Bad link mode (release keys immediately)",
"remember_me":"Remember me:&nbsp;",
"web_ui_settings":"Web UI settings",
"usb_breaker_confirm":"Turning off this switch will disconnect the main USB from the server. Are you sure you want to continue?",
"usb_connect_main":"Connect main USB to Server:",
"locator_led_enable":"Enable locator LED:",
"stream-suspend-switch":"Suspend stream when tab is not active:"
} }

View File

@ -10,118 +10,118 @@
"footer-left": "本网站需要使用 JavaScript 功能。<br>本网站不含广告,但仍有可能会被某些广告过滤器屏蔽。<br>如果网页响应异常请关闭它并重新加载页面以继续浏览。", "footer-left": "本网站需要使用 JavaScript 功能。<br>本网站不含广告,但仍有可能会被某些广告过滤器屏蔽。<br>如果网页响应异常请关闭它并重新加载页面以继续浏览。",
"index": " One-KVM 导航 ", "index": " One-KVM 导航 ",
"copyright": "版权所有 &copy; 2018-2024 Maxim Devaev | 由 SilentWind 二次开发", "copyright": "版权所有 &copy; 2018-2025 Maxim Devaev | 由 SilentWind 二次开发",
"index_text_1": "请注意,在使用 KVM 会话或其他可捕获键盘的应用程序时,您可能无法使用某些快捷键,如 Ctrl+Alt+Del这会被操作系统捕获或 Ctrl+W这会被浏览器捕获。", "keyboard_limitation_note": "请注意,在使用 KVM 会话或其他可捕获键盘的应用程序时,您可能无法使用某些快捷键,如 Ctrl+Alt+Del这会被操作系统捕获或 Ctrl+W这会被浏览器捕获。",
"index_text_2": "要突破这一限制,您可以使用 Google Chrome 浏览器。", "browser_solution_note": "要突破这一限制,您可以使用 Google Chrome 浏览器。",
"serve_name": "主机名", "serve_name": "服务器名称",
"index_text_10":"PiKVM 项目", "pikvm_project_link":"PiKVM 项目",
"index_text_11":"PiKVM 文档", "pikvm_documentation_link":"PiKVM 文档",
"index_text_12":"One-KVM 项目", "onekvm_project_link":"One-KVM 项目",
"index_text_13":"One-KVM 文档", "onekvm_documentation_link":"One-KVM 文档",
"index_title":"开源 KVM over IP", "index_title":"开源 KVM over IP",
"vnc_text1": "该 One-KVM 设备 <b>kvmd-vnc</b> 守护进程已运行,提供对服务器的 VNC 访问。", "vnc_daemon_running": "该 One-KVM 设备 <b>kvmd-vnc</b> 守护进程已运行,提供对服务器的 VNC 访问。",
"vnc_text2": "<b>不建议</b>在未启用 X.509 或 TLS 加密的网络中使用 VNC。否则您的密码将以纯文本形式在网络上传输。", "vnc_security_warning": "<b>不建议</b>在未启用 X.509 或 TLS 加密的网络中使用 VNC。否则您的密码将以纯文本形式在网络上传输。",
"vnc_text3": "VNC 客户端必须支持 Tight JPEG 压缩和密码验证。", "vnc_client_requirements": "VNC 客户端必须支持 Tight JPEG 压缩和密码验证。",
"ipmi_text1":"该 One-KVM 设备 <b>kvmd-ipmi</b> 守护进程已运行,并为一些基本的 BMC 操作(如打开/关闭/重置服务器)提供了 IPMI 2.0 接口。", "ipmi_daemon_running":"该 One-KVM 设备 <b>kvmd-ipmi</b> 守护进程已运行,并为一些基本的 BMC 操作(如打开/关闭/重置服务器)提供了 IPMI 2.0 接口。",
"ipmi_text2":"<b>不建议</b>在不受信任的网络中使用 IPMI因为该协议的设计完全不安全。<br>原因如下IPMI 的身份验证过程要求服务器在客户端进行身份验证之前,向客户端发送请求用户密码的加盐 SHA1 或 MD5 哈希值。", "ipmi_security_warning":"<b>不建议</b>在不受信任的网络中使用 IPMI因为该协议的设计完全不安全。<br>原因如下IPMI 的身份验证过程要求服务器在客户端进行身份验证之前,向客户端发送请求用户密码的加盐 SHA1 或 MD5 哈希值。",
"ipmi_text3":"<b>不建议</b>为 KVMD 和 IPMI 用户使用相同的密码,或者直接关闭 IPMI。如有需要可以通过 curl 直接使用 KVMD API。下面是一些示例", "ipmi_password_recommendation":"<b>不建议</b>为 KVMD 和 IPMI 用户使用相同的密码,或者直接关闭 IPMI。如有需要可以通过 curl 直接使用 KVMD API。下面是一些示例",
"kvm_text1":"关于", "about_title":"关于",
"kvm_text2":"//<a href=\"https://one-kvm.mofeng.run/thanks/#_2\">这些人</a>向 One-KVM 项目赞助并支持其工作,非常感谢他们的帮助。<br>//如果您也想支持 One-KVM ,可以在 <a target=\"_blank\" href=\"https://afdian.com/a/silentwind\"> 爱发电 </a>上捐款</a>。<br><br>//<a href=\"https://github.com/pikvm/pikvm?tab=readme-ov-file#special-thanks\">这些人</a>向 PiKVM 项目赞助并支持其工作,非常感谢他们的帮助。<br>//如果您也想支持 PiKVM ,可以在 <a target=\"_blank\" href=\"https://www.patreon.com/pikvm\"> Patreon</a> 或 <a target=\"_blank\" href=\"https://paypal.me/pikvm\"> PayPal 上捐款</a>。", "about_sponsors":"//<a href=\"https://one-kvm.mofeng.run/thanks/#_2\">这些人</a>向 One-KVM 项目赞助并支持其工作,非常感谢他们的帮助。<br>//如果您也想支持 One-KVM ,可以在 <a target=\"_blank\" href=\"https://afdian.com/a/silentwind\"> 爱发电 </a>上捐款</a>。<br><br>//<a href=\"https://github.com/pikvm/pikvm?tab=readme-ov-file#special-thanks\">这些人</a>向 PiKVM 项目赞助并支持其工作,非常感谢他们的帮助。<br>//如果您也想支持 PiKVM ,可以在 <a target=\"_blank\" href=\"https://www.patreon.com/pikvm\"> Patreon</a> 或 <a target=\"_blank\" href=\"https://paypal.me/pikvm\"> PayPal 上捐款</a>。",
"kvm_text3":"系统", "system_menu":"系统",
"kvm_text4":"运行设置 &amp; 工具", "system_runtime_settings":"运行设置 &amp; 工具",
"kvm_text5":"终端", "system_terminal":"终端",
"kvm_text6":"关于", "system_about":"关于",
"kvm_text7":"日志", "system_log":"日志",
"kvm_text8":"网络唤醒", "system_wol":"网络唤醒",
"kvm_text9":"分辨率:", "video_resolution":"分辨率:",
"kvm_text10":"JPEG 质量:", "video_jpeg_quality":"JPEG 质量:",
"kvm_text11":"JPEG 最大FPS", "video_jpeg_fps":"JPEG 最大帧率",
"kvm_text12":"H.264 比特率:", "video_h264_bitrate":"H.264 比特率:",
"kvm_text13":"H.264 帧间隔:", "video_h264_gop":"H.264 帧间隔:",
"kvm_text14":"视频模式", "video_mode":"视频模式",
"kvm_text15":"虚拟键盘", "virtual_keyboard_title":"虚拟键盘",
"kvm_text16":"终端", "terminal_title":"终端",
"kvm_text17":"方向:", "video_orientation":"方向:",
"kvm_text18":"默认", "video_orientation_default":"默认",
"kvm_text19":"音量:", "audio_volume":"音量:",
"kvm_text20":"&bull; 显示视频流", "stream_show":"&bull; 显示视频流",
"kvm_text21":"&bull; 截屏", "stream_screenshot":"&bull; 截屏",
"kvm_text22":"重置视频流", "stream_reset":"重置视频流",
"kvm_text23":"键盘模式:", "hid_keyboard_mode":"键盘模式:",
"kvm_text24":"鼠标模式:", "hid_mouse_mode":"鼠标模式:",
"kvm_text25":"键盘 &amp; 鼠标 (HID) 设置", "hid_settings":"键盘 &amp; 鼠标 (HID) 设置",
"kvm_text26":"鼠标轮询:", "hid_mouse_polling":"鼠标轮询:",
"kvm_text27":"相对灵敏度:", "hid_mouse_sensitivity":"相对灵敏度:",
"kvm_text28":"反向滚动:", "hid_mouse_reverse_scroll":"反向滚动:",
"kvm_text29":"滚动速率:", "hid_mouse_scroll_rate":"滚动速率:",
"kvm_text30":"显示虚拟键盘", "hid_show_keyboard":"显示虚拟键盘",
"kvm_text31":"重置 HID", "hid_reset":"重置 HID",
"kvm_text32":"宏", "macro_menu":"宏",
"kvm_text33":"录制或重放 HID/ATX/GPIO 操作<br>", "macro_description":"录制或重放 HID/ATX/GPIO 操作<br>",
"kvm_text34":"出于安全原因,录制的脚本默认不会保存到 One-KVM 主机上", "macro_security_note":"出于安全原因,录制的脚本默认不会保存到 One-KVM 主机上",
"kvm_text35":"录制", "macro_record":"录制",
"kvm_text36":"停止", "macro_stop":"停止",
"kvm_text37":"重放", "macro_play":"重放",
"kvm_text38":"清除", "macro_clear":"清除",
"kvm_text39":"脚本时间:", "macro_script_time":"脚本时间:",
"kvm_text40":"脚本事件:", "macro_script_events":"脚本事件:",
"kvm_text41":"包括延迟", "macro_include_delays":"包括延迟",
"kvm_text42":"上传脚本文件", "macro_upload_script":"上传脚本文件",
"kvm_text43":"下载脚本文件", "macro_download_script":"下载脚本文件",
"kvm_text44":"文本", "text_menu":"文本",
"kvm_text45":"以按键序列方式粘贴文本<br>", "text_paste_description":"以按键序列方式粘贴文本<br>",
"kvm_text46":"请注意 One-KVM 无法自动切换被控机键盘布局", "text_keyboard_layout_note":"请注意One-KVM 无法自动切换被控制主机的键盘布局",
"kvm_text47":"&bull; 粘贴", "text_paste_button":"&bull; 粘贴",
"kvm_text48":"使用的键盘布局", "text_using_keymap":"使用的键盘布局",
"kvm_text49":"文本识别<br>", "text_ocr_title":"文本识别<br>",
"kvm_text50":"文本识别仅在 One-KVM 主机上本地运行", "text_ocr_local_note":"文本识别仅在 One-KVM 主机上本地运行",
"kvm_text51":"&bull; 框选识别区域", "text_ocr_select_area":"&bull; 框选识别区域",
"kvm_text52":"进行", "text_ocr_for":"进行",
"kvm_text53":"文本识别", "text_ocr_recognition":"文本识别",
"kvm_text54":"按下 <b>Enter</b> 确认所选区域并将识别结果复制到粘贴板", "text_ocr_enter_hint":"按下 <b>Enter</b> 确认所选区域并将识别结果复制到粘贴板",
"kvm_text55":"按下 <b>Esc</b> 取消框选", "text_ocr_escape_hint":"按下 <b>Esc</b> 取消框选",
"kvm_text56":"快捷键", "shortcuts_menu":"快捷键",
"kvm_text57":"键盘快捷键<br>", "shortcuts_description":"键盘快捷键<br>",
"kvm_text58":"也可以查看 <i>系统 &rarr; 显示键盘<i>", "shortcuts_also_see":"也可以查看 <i>系统 &rarr; 显示键盘</i>",
"kvm_text59":"帮助", "shortcuts_help":"帮助",
"kvm_text60":"驱动器", "drive_menu":"驱动器",
"kvm_text61":"虚拟存储驱动器", "drive_title":"虚拟存储驱动器",
"kvm_text62":"文件:", "drive_image":"文件:",
"kvm_text63":"驱动<a target=\"_blank\" href=\"https://docs.pikvm.org/msd\">模式</a>:", "drive_mode":"驱动<a target=\"_blank\" href=\"https://docs.pikvm.org/msd\">模式</a>:",
"kvm_text64":"选择要上传的文件", "drive_select_upload":"选择要上传的文件",
"kvm_text65":"上传", "drive_upload":"上传",
"kvm_text66":"中止", "drive_abort":"中止",
"kvm_text68":"指定本地文件:", "drive_local_file":"指定本地文件:",
"kvm_text69":"<b>或者</b>粘贴 URL:", "drive_paste_url":"<b>或者</b>粘贴 URL:",
"kvm_text70":"上传分区:", "drive_upload_partition":"上传分区:",
"kvm_text71":"注意:", "drive_note":"注意:",
"kvm_text72":"&bull; 在上传完成之前,不要关闭浏览器页面。", "drive_note_browser":"&bull; 在上传完成之前,不要关闭浏览器页面。",
"kvm_text73":"&bull; 要加快上传速度,请关闭视频流窗口。", "drive_note_stream":"&bull; 要加快上传速度,请关闭视频流窗口。",
"kvm_text74":"新镜像:", "drive_new_image":"新镜像:",
"kvm_text75":"上传大小:", "drive_upload_size":"上传大小:",
"kvm_text76":"连接 MSD 到主机", "drive_connect":"连接 MSD 到主机",
"kvm_text77":"断开连接", "drive_disconnect":"断开连接",
"kvm_text78":"重置", "drive_reset":"重置",
"kvm_text79":"视频录制<br>", "video_record_title":"视频录制<br>",
"kvm_text80":"使用浏览器 API 录制视频,结束录制后视频文件会自动下载", "video_record_description":"使用浏览器 API 录制视频,结束录制后视频文件会自动下载",
"kvm_text81":"开始录制", "video_record_start":"开始录制",
"kvm_text82":"结束录制", "video_record_stop":"结束录制",
"kvm_text83":"网页界面设置", "webui_settings":"网页界面设置",
"kvm_text84":"文件显示:", "drive_file_display":"文件显示:",
"kvm_text85":"快速文件互传", "drive_quick_transfer":"快速文件传输",
"kvm_text86":"&bull; 切换互传文件上传文件,打包生成镜像文件,挂载 NormalFiles 镜像", "drive_transfer_upload_note":"&bull; 切换到普通文件模式上传文件,打包生成镜像文件并挂载",
"kvm_text87":"&bull; 断开 MSD 连接,选择从镜像文件解压,切换互传文件下载所需文件", "drive_transfer_download_note":"&bull; 断开 MSD 连接,从镜像文件解压,切换到普通文件模式下载所需文件",
"kvm_text88":"从互传文件打包镜像文件", "drive_package_files":"将文件打包为镜像文件",
"kvm_text89":"从镜像文件解压互传文件", "drive_unpackage_files":"从镜像文件解压文件",
"kvm_text90":"镜像文件", "drive_image_files":"镜像文件模式",
"kvm_text91":"互传文件", "drive_normal_files":"普通文件模式",
@ -153,5 +153,11 @@
"msd-message-downloads":"正在从 One-KVM 下载镜像", "msd-message-downloads":"正在从 One-KVM 下载镜像",
"msd-message-another-user-uploads":"另一个用户正在上传镜像", "msd-message-another-user-uploads":"另一个用户正在上传镜像",
"page-full-tab-stream-switch":"自动全屏视频窗口", "page-full-tab-stream-switch":"自动全屏视频窗口",
"hid-keyboard-bad-link-switch":"故障链接模式(立即释放按键)" "hid-keyboard-bad-link-switch":"故障链接模式(立即释放按键)",
"remember_me":"记住我:&nbsp;",
"web_ui_settings":"网页界面设置",
"usb_breaker_confirm":"关闭此开关将断开与服务器的主 USB 连接。您确定要继续吗?",
"usb_connect_main":"连接主 USB 到服务器:",
"locator_led_enable":"启用定位 LED",
"stream-suspend-switch":"标签页不活跃时暂停视频流:"
} }

View File

@ -51,12 +51,12 @@
<div class="start-box"> <div class="start-box">
<div class="start"><a style="display:inline-block; margin-top:4px; color:#5c90bc; text-decoration:none" href="../" i18n="index">&nbsp;&nbsp;&larr;&nbsp;&nbsp; [ One-KVM Index ]</a> <div class="start"><a style="display:inline-block; margin-top:4px; color:#5c90bc; text-decoration:none" href="../" i18n="index">&nbsp;&nbsp;&larr;&nbsp;&nbsp; [ One-KVM Index ]</a>
<hr> <hr>
<p class="text" i18n="vnc_text1">This PiKVM device has running <b>kvmd-vnc</b> daemon and provides VNC access to the server.</p> <p class="text" i18n="vnc_daemon_running">This PiKVM device has running <b>kvmd-vnc</b> daemon and provides VNC access to the server.</p>
<p class="text" i18n="vnc_text2"><b>WARNING!</b> We strongly don't recommend you to use VNC in untrusted networks without <p class="text" i18n="vnc_security_warning"><b>WARNING!</b> We strongly don't recommend you to use VNC in untrusted networks without
enabled X.509 or TLS encryption. Otherwise your passwords are transmitted in a plain text enabled X.509 or TLS encryption. Otherwise your passwords are transmitted in a plain text
over the network. over the network.
</p> </p>
<p class="text" i18n="vnc_text3"> <p class="text" i18n="vnc_client_requirements">
Your VNC client must support Tight JPEG compression and password authentication. Your VNC client must support Tight JPEG compression and password authentication.
<a href="https://tigervnc.org">TigerVNC</a> is a good choice. <a href="https://tigervnc.org">TigerVNC</a> is a good choice.
On Linux, this client will most likely be available for installation from the repository. On Linux, this client will most likely be available for installation from the repository.

View File

@ -9,13 +9,13 @@ append vars
index_link = true index_link = true
block start block start
p.text(i18n="vnc_text1") p.text(i18n="vnc_daemon_running")
| This PiKVM device has running #[b kvmd-vnc] daemon and provides VNC access to the server. | This PiKVM device has running #[b kvmd-vnc] daemon and provides VNC access to the server.
p.text(i18n="vnc_text2") p.text(i18n="vnc_security_warning")
| #[b WARNING!] We strongly don't recommend you to use VNC in untrusted networks without | #[b WARNING!] We strongly don't recommend you to use VNC in untrusted networks without
| enabled X.509 or TLS encryption. Otherwise your passwords are transmitted in a plain text | enabled X.509 or TLS encryption. Otherwise your passwords are transmitted in a plain text
| over the network. | over the network.
p.text(i18n="vnc_text3") p.text(i18n="vnc_client_requirements")
| Your VNC client must support Tight JPEG compression and password authentication. | Your VNC client must support Tight JPEG compression and password authentication.
| #[a(href="https://tigervnc.org") TigerVNC] is a good choice. | #[a(href="https://tigervnc.org") TigerVNC] is a good choice.
| On Linux, this client will most likely be available for installation from the repository. | On Linux, this client will most likely be available for installation from the repository.