dsh-remote-plugin 0.5.7 → 0.5.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +2 -0
- package/README.md +2 -0
- package/apk/dsh-remote.apk +0 -0
- package/gateway.cjs +119 -0
- package/package.json +1 -1
- package/public/admin.html +91 -15
- package/public/admin.js +26 -0
- package/public/app.js +466 -44
- package/public/desktop/desktop.css +270 -0
- package/public/desktop/desktop.html +328 -0
- package/public/desktop/desktop.js +1027 -0
- package/public/desktop/i18n.js +53 -0
- package/public/index.html +146 -3
- package/public/styles.css +100 -351
- package/public/theme-vars.css +351 -0
- package/public/update.json +3 -3
- package/public/version.json +1 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/* DSH Remote 桌面端轻量 i18n · 零依赖(与 public/i18n.js 同构) */
|
|
2
|
+
'use strict'
|
|
3
|
+
;(function () {
|
|
4
|
+
const store = {
|
|
5
|
+
get(k) { try { return localStorage.getItem(k) } catch { return null } },
|
|
6
|
+
set(k, v) { try { localStorage.setItem(k, v) } catch {} }
|
|
7
|
+
}
|
|
8
|
+
function detect() {
|
|
9
|
+
const saved = store.get('dshLang')
|
|
10
|
+
if (saved === 'zh' || saved === 'en') return saved
|
|
11
|
+
return (navigator.language || 'zh').toLowerCase().startsWith('zh') ? 'zh' : 'en'
|
|
12
|
+
}
|
|
13
|
+
let dict = null
|
|
14
|
+
let lang = detect()
|
|
15
|
+
|
|
16
|
+
function t(key, vars) {
|
|
17
|
+
const table = (dict && (dict[lang] || dict.zh)) || {}
|
|
18
|
+
let s = table[key]
|
|
19
|
+
if (s == null) s = (dict && dict.zh && dict.zh[key]) != null ? dict.zh[key] : key
|
|
20
|
+
s = String(s)
|
|
21
|
+
if (vars) {
|
|
22
|
+
const keys = new Set(Object.keys(vars))
|
|
23
|
+
s = s.replace(/\{([A-Za-z0-9_]+)\}/g, (m, k) => keys.has(k) ? String(vars[k] ?? '') : '')
|
|
24
|
+
} else {
|
|
25
|
+
s = s.replace(/\{[A-Za-z0-9_]+\}/g, '')
|
|
26
|
+
}
|
|
27
|
+
return s
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function apply(root) {
|
|
31
|
+
root = root || document
|
|
32
|
+
root.querySelectorAll('[data-i18n]').forEach(el => { el.textContent = t(el.getAttribute('data-i18n')) })
|
|
33
|
+
root.querySelectorAll('[data-i18n-title]').forEach(el => { el.title = t(el.getAttribute('data-i18n-title')) })
|
|
34
|
+
root.querySelectorAll('[data-i18n-placeholder]').forEach(el => { el.placeholder = t(el.getAttribute('data-i18n-placeholder')) })
|
|
35
|
+
root.querySelectorAll('[data-i18n-aria]').forEach(el => { el.setAttribute('aria-label', t(el.getAttribute('data-i18n-aria'))) })
|
|
36
|
+
document.documentElement.lang = lang === 'zh' ? 'zh-CN' : 'en'
|
|
37
|
+
return lang
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function setLang(l) {
|
|
41
|
+
if (l !== 'zh' && l !== 'en') return lang
|
|
42
|
+
lang = l
|
|
43
|
+
store.set('dshLang', l)
|
|
44
|
+
apply(document)
|
|
45
|
+
return lang
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
window.I18N = {
|
|
49
|
+
init(strings) { dict = strings || dict; return apply(document) },
|
|
50
|
+
t, setLang, apply,
|
|
51
|
+
get lang() { return lang }
|
|
52
|
+
}
|
|
53
|
+
})()
|
package/public/index.html
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
<meta name="mobile-web-app-capable" content="yes">
|
|
8
8
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
|
9
9
|
<title>DSH Remote</title>
|
|
10
|
+
<script>/* 统一入口: 桌面浏览器(宽屏且 UA 非移动)访问根地址自动切换到桌面端, 手机/窄窗口继续 App 界面 */ (function(){try{var proto=location.protocol;var ua=navigator.userAgent||'';var mobile=/Android|iPhone|iPad|iPod|Mobile|Windows Phone/i.test(ua);if((proto==='http:'||proto==='https:')&&!mobile&&window.innerWidth>=1024){var p=location.pathname;if(p==='/'||/\/index\.html$/.test(p)){location.replace('desktop/desktop.html'+location.search)}}}catch(e){}})()</script>
|
|
10
11
|
<script>/* 首帧前应用皮肤, 避免闪白/闪黑 */ (function(){try{var t=localStorage.getItem('dshTheme');if(t!=='default'&&t!=='dark'&&t!=='light'&&t!=='neutral'){t=window.matchMedia('(prefers-color-scheme: light)').matches?'light':'default'}document.documentElement.setAttribute('data-theme',t)}catch(e){}})()</script>
|
|
11
12
|
<link rel="manifest" href="manifest.webmanifest">
|
|
12
13
|
<link rel="icon" href="icon.svg" type="image/svg+xml">
|
|
@@ -19,9 +20,9 @@
|
|
|
19
20
|
<span class="brand-name">DSH Remote</span>
|
|
20
21
|
</div>
|
|
21
22
|
<div class="topbar-right">
|
|
22
|
-
<button id="btn-
|
|
23
|
-
<button id="btn-refresh" class="icon-btn" data-i18n-title="a11y.refresh" data-i18n-aria="a11y.refresh">⟳</button>
|
|
24
|
-
<span id="conn-badge" class="conn-badge off" data-i18n="conn.off">未连接</span>
|
|
23
|
+
<button id="btn-feedback" class="topbar-btn icon-btn" data-i18n-title="feedback.title" data-i18n-aria="feedback.title" aria-haspopup="menu" aria-expanded="false">💬</button>
|
|
24
|
+
<button id="btn-refresh" class="topbar-btn icon-btn" data-i18n-title="a11y.refresh" data-i18n-aria="a11y.refresh">⟳</button>
|
|
25
|
+
<span id="conn-badge" class="topbar-btn conn-badge off" data-i18n="conn.off">未连接</span>
|
|
25
26
|
</div>
|
|
26
27
|
</header>
|
|
27
28
|
|
|
@@ -144,6 +145,16 @@
|
|
|
144
145
|
<div><div class="setting-name" data-i18n="settings.servers">服务器地址(可多个)</div><div class="setting-desc" id="server-desc" data-i18n="servers.defaultDesc">默认 = 当前页面地址</div></div>
|
|
145
146
|
<button id="btn-server-speed" class="mini-btn" data-i18n="settings.speedTest">测速</button>
|
|
146
147
|
</div>
|
|
148
|
+
<div class="group-bar">
|
|
149
|
+
<label class="group-bar-label" data-i18n="groups.current">当前组</label>
|
|
150
|
+
<div class="group-select" id="group-select">
|
|
151
|
+
<button id="group-select-btn" class="group-select-btn" type="button" aria-haspopup="listbox">
|
|
152
|
+
<span id="group-select-label">默认</span><span class="caret">▾</span>
|
|
153
|
+
</button>
|
|
154
|
+
<div id="group-select-menu" class="group-select-menu hidden"></div>
|
|
155
|
+
</div>
|
|
156
|
+
<button id="btn-group-add" class="mini-btn" data-i18n="groups.add">+ 组</button>
|
|
157
|
+
</div>
|
|
147
158
|
<div id="server-list" class="server-list"></div>
|
|
148
159
|
<div class="server-add">
|
|
149
160
|
<input id="server-input" type="url" placeholder="http://IP:8787">
|
|
@@ -157,6 +168,10 @@
|
|
|
157
168
|
<div><div class="setting-name" data-i18n="settings.notifyTitle">通知</div><div class="setting-desc" data-i18n="settings.notifyDesc">收到审批/提问时推送</div></div>
|
|
158
169
|
<label class="switch"><input type="checkbox" id="opt-notify"><span class="slider"></span></label>
|
|
159
170
|
</div>
|
|
171
|
+
<div class="setting-row">
|
|
172
|
+
<div><div class="setting-name" data-i18n="settings.peakRemindTitle">峰谷计费提醒</div><div class="setting-desc" data-i18n="settings.peakRemindDesc">每天 9:00 / 12:00 / 14:00 / 18:00 推送峰谷切换(App 内有效)</div></div>
|
|
173
|
+
<label class="switch"><input type="checkbox" id="opt-peak-remind"><span class="slider"></span></label>
|
|
174
|
+
</div>
|
|
160
175
|
<div class="setting-row">
|
|
161
176
|
<div><div class="setting-name" data-i18n="settings.toolsTitle">显示工具调用</div><div class="setting-desc" data-i18n="settings.toolsDesc">关闭后隐藏 🔧/📦 工具调用与结果</div></div>
|
|
162
177
|
<label class="switch"><input type="checkbox" id="opt-tools"><span class="slider"></span></label>
|
|
@@ -184,6 +199,25 @@
|
|
|
184
199
|
<button id="btn-check-update" class="mini-btn" data-i18n="settings.check">检查</button>
|
|
185
200
|
</div>
|
|
186
201
|
</div>
|
|
202
|
+
<div class="settings-group feedback-card">
|
|
203
|
+
<div class="setting-row">
|
|
204
|
+
<div><div class="setting-name" data-i18n="settings.feedbackTitle">反馈渠道</div><div class="setting-desc" data-i18n="settings.feedbackDesc">GitHub / Gitee / B站:反馈 bug、提建议、唠嗑</div></div>
|
|
205
|
+
</div>
|
|
206
|
+
<div class="feedback-links">
|
|
207
|
+
<a class="feedback-btn primary" href="https://github.com/Blank-not-black/dsh-Remote" target="_blank" rel="noopener">
|
|
208
|
+
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8a8.01 8.01 0 0 0 5.47 7.59c.4.08.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
|
|
209
|
+
<span>GitHub</span>
|
|
210
|
+
</a>
|
|
211
|
+
<a class="feedback-btn" href="https://gitee.com/Blankneverfails/dsh-Remote" target="_blank" rel="noopener">
|
|
212
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="9" r="6"/><path d="M7.5 13.5 7 19a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l-.5-5.5"/><circle cx="10" cy="8.6" r=".5" fill="currentColor" stroke="none"/><circle cx="14" cy="8.6" r=".5" fill="currentColor" stroke="none"/><path d="M11 10.8c.6.5 1.4.5 2 0"/></svg>
|
|
213
|
+
<span>Gitee</span>
|
|
214
|
+
</a>
|
|
215
|
+
<a class="feedback-btn" href="https://space.bilibili.com/419009275/dynamic" target="_blank" rel="noopener">
|
|
216
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3.5" y="6" width="17" height="11" rx="2"/><path d="M8.5 3.5v3M15.5 3.5v3"/><circle cx="9.2" cy="10.6" r=".5" fill="currentColor" stroke="none"/><circle cx="14.8" cy="10.6" r=".5" fill="currentColor" stroke="none"/><path d="M9.5 14c1.4 1 3.6 1 5 0"/></svg>
|
|
217
|
+
<span>B站</span>
|
|
218
|
+
</a>
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
187
221
|
<div class="settings-group">
|
|
188
222
|
<div class="setting-row">
|
|
189
223
|
<div><div class="setting-name" data-i18n="settings.resetTitle">清空本地数据</div><div class="setting-desc" data-i18n="settings.resetDesc">令牌与缓存</div></div>
|
|
@@ -194,6 +228,33 @@
|
|
|
194
228
|
</section>
|
|
195
229
|
</main>
|
|
196
230
|
|
|
231
|
+
<!-- 反馈底部菜单(非模态) -->
|
|
232
|
+
<div id="feedback-backdrop" class="sheet-backdrop hidden"></div>
|
|
233
|
+
<div id="feedback-sheet" class="sheet hidden" role="menu" data-i18n-aria="feedback.title">
|
|
234
|
+
<div class="sheet-handle" aria-hidden="true"></div>
|
|
235
|
+
<div class="sheet-title" data-i18n="feedback.title">反馈</div>
|
|
236
|
+
<button class="sheet-item" id="btn-write-feedback" role="menuitem">
|
|
237
|
+
<span class="sheet-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 20h9"/><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"/></svg></span>
|
|
238
|
+
<span class="sheet-item-body"><span class="sheet-item-name" data-i18n="feedback.write">写反馈</span><span class="sheet-item-desc" data-i18n="feedback.writeDesc">App 内直接提交</span></span>
|
|
239
|
+
</button>
|
|
240
|
+
<a class="sheet-item primary" href="https://github.com/Blank-not-black/dsh-Remote/issues" target="_blank" rel="noopener" role="menuitem">
|
|
241
|
+
<span class="sheet-ico"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8a8.01 8.01 0 0 0 5.47 7.59c.4.08.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg></span>
|
|
242
|
+
<span class="sheet-item-body"><span class="sheet-item-name">GitHub Issues</span><span class="sheet-item-desc" data-i18n="feedback.githubDesc">反馈 bug / 提建议</span></span>
|
|
243
|
+
</a>
|
|
244
|
+
<a class="sheet-item" href="https://gitee.com/Blankneverfails/dsh-Remote/issues" target="_blank" rel="noopener" role="menuitem">
|
|
245
|
+
<span class="sheet-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="9" r="6"/><path d="M7.5 13.5 7 19a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l-.5-5.5"/><circle cx="10" cy="8.6" r=".5" fill="currentColor" stroke="none"/><circle cx="14" cy="8.6" r=".5" fill="currentColor" stroke="none"/><path d="M11 10.8c.6.5 1.4.5 2 0"/></svg></span>
|
|
246
|
+
<span class="sheet-item-body"><span class="sheet-item-name">Gitee 反馈</span><span class="sheet-item-desc" data-i18n="feedback.giteeDesc">国内镜像,无需代理</span></span>
|
|
247
|
+
</a>
|
|
248
|
+
<a class="sheet-item" href="https://space.bilibili.com/419009275/dynamic" target="_blank" rel="noopener" role="menuitem">
|
|
249
|
+
<span class="sheet-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3.5" y="6" width="17" height="11" rx="2"/><path d="M8.5 3.5v3M15.5 3.5v3"/><circle cx="9.2" cy="10.6" r=".5" fill="currentColor" stroke="none"/><circle cx="14.8" cy="10.6" r=".5" fill="currentColor" stroke="none"/><path d="M9.5 14c1.4 1 3.6 1 5 0"/></svg></span>
|
|
250
|
+
<span class="sheet-item-body"><span class="sheet-item-name">B站交流</span><span class="sheet-item-desc" data-i18n="feedback.biliDesc">UP 动态页交流</span></span>
|
|
251
|
+
</a>
|
|
252
|
+
<button class="sheet-item" id="btn-copy-link" role="menuitem">
|
|
253
|
+
<span class="sheet-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="8" y="3" width="12" height="12" rx="2"/><path d="M16 8h3a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1v-3"/></svg></span>
|
|
254
|
+
<span class="sheet-item-body"><span class="sheet-item-name" data-i18n="feedback.copyLink">复制项目链接</span><span class="sheet-item-desc" data-i18n="feedback.copyDesc">手动分享给朋友</span></span>
|
|
255
|
+
</button>
|
|
256
|
+
</div>
|
|
257
|
+
|
|
197
258
|
<nav class="bottom-nav">
|
|
198
259
|
<button data-view="view-home" class="nav-btn active"><span class="nav-ico">▤</span><span data-i18n="nav.sessions">会话</span></button>
|
|
199
260
|
<button data-view="view-files" class="nav-btn"><span class="nav-ico">⇅</span><span data-i18n="nav.files">文件</span></button>
|
|
@@ -226,6 +287,26 @@
|
|
|
226
287
|
</div>
|
|
227
288
|
</div>
|
|
228
289
|
|
|
290
|
+
<!-- 写反馈模态 -->
|
|
291
|
+
<div id="modal-feedback" class="modal hidden">
|
|
292
|
+
<div class="modal-card">
|
|
293
|
+
<div class="modal-title" data-i18n="feedback.modalTitle">写反馈</div>
|
|
294
|
+
<div class="modal-body">
|
|
295
|
+
<div class="fb-chips" id="fb-chips">
|
|
296
|
+
<button class="fb-chip current" data-fb-type="bug" data-i18n="feedback.typeBug">Bug</button>
|
|
297
|
+
<button class="fb-chip" data-fb-type="suggestion" data-i18n="feedback.typeSuggestion">建议</button>
|
|
298
|
+
<button class="fb-chip" data-fb-type="other" data-i18n="feedback.typeOther">其他</button>
|
|
299
|
+
</div>
|
|
300
|
+
<textarea id="fb-msg" class="fb-textarea" rows="5" maxlength="2000" data-i18n-placeholder="feedback.messagePlaceholder" placeholder="请描述遇到的问题或建议(必填,≤2000 字)"></textarea>
|
|
301
|
+
<input id="fb-contact" class="fb-input" maxlength="200" data-i18n-placeholder="feedback.contactPlaceholder" placeholder="联系方式(可选):邮箱 / 微信 / B站 ID">
|
|
302
|
+
</div>
|
|
303
|
+
<div class="modal-actions">
|
|
304
|
+
<button id="fb-cancel" class="btn subtle" data-i18n="feedback.cancel">取消</button>
|
|
305
|
+
<button id="fb-submit" class="btn primary" data-i18n="feedback.submit">提交</button>
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
</div>
|
|
309
|
+
|
|
229
310
|
<!-- goal 模态 -->
|
|
230
311
|
<div id="modal-goal" class="modal hidden">
|
|
231
312
|
<div class="modal-card">
|
|
@@ -267,6 +348,7 @@
|
|
|
267
348
|
zh: {
|
|
268
349
|
'a11y.hostAdmin': '主机管理', 'a11y.refresh': '刷新', 'a11y.more': '更多操作', 'a11y.moreTitle': '指令/权限/模型',
|
|
269
350
|
'conn.on': '已连接', 'conn.off': '未连接', 'conn.reconnecting': '连接中断,正在重连…',
|
|
351
|
+
'conn.titleGroup': '{group} · {url}({ms})',
|
|
270
352
|
'common.refreshing': '刷新中…',
|
|
271
353
|
'nav.sessions': '会话', 'nav.files': '文件', 'nav.pending': '待办', 'nav.stats': '统计', 'nav.settings': '设置',
|
|
272
354
|
'statsPage.title': 'Token 统计',
|
|
@@ -293,6 +375,18 @@
|
|
|
293
375
|
'servers.currentDesc': '当前: {url}', 'servers.notSet': '未设置服务器', 'servers.defaultDesc': '默认 = 当前页面地址',
|
|
294
376
|
'servers.needAddress': '请输入服务器地址', 'servers.badProtocol': '地址需以 http:// 或 https:// 开头',
|
|
295
377
|
'servers.duplicate': '该地址已在列表中', 'servers.added': '已添加服务器', 'servers.removedActive': '已删除当前服务器,重新测速…',
|
|
378
|
+
'servers.currentDescGroup': '当前:{group} · {url}({ms})',
|
|
379
|
+
'servers.edit': '编辑', 'servers.manualSelected': '已切换至:{url}',
|
|
380
|
+
'servers.promptNote': '服务器备注(可留空):', 'servers.promptEditNote': '编辑备注({url}):',
|
|
381
|
+
'servers.promptEditUrl': '编辑服务器地址:', 'servers.promptEditGroup': '所属组:', 'servers.edited': '服务器已更新',
|
|
382
|
+
'speed.switchedOrigin': '已切换到当前页面(同源)', 'speed.manualUsing': '手动模式:{url}({ms})',
|
|
383
|
+
'groups.current': '当前组', 'groups.add': '+ 组', 'groups.noServer': '组内暂无服务器',
|
|
384
|
+
'groups.speedTest': '测速', 'groups.autoSelect': '自动选择最快', 'groups.delete': '删除组',
|
|
385
|
+
'groups.autoOn': '{group} 已切换为自动选择', 'groups.autoOff': '{group} 已切换为手动选择',
|
|
386
|
+
'groups.switched': '已切换到组:{group}', 'groups.switchHint': '点击切换当前组,双击重命名', 'groups.promptAdd': '新组名:', 'groups.duplicate': '组名已存在',
|
|
387
|
+
'groups.added': '已创建组:{group}', 'groups.promptRename': '重命名组「{group}」:',
|
|
388
|
+
'groups.renamed': '组已重命名', 'groups.cannotDeleteDefault': '默认组不可删除',
|
|
389
|
+
'groups.confirmDelete': '删除组「{group}」?组内服务器将归入默认组。', 'groups.deleted': '组已删除',
|
|
296
390
|
'stream.error': '事件流错误:{msg}',
|
|
297
391
|
'session.loading': '加载中…', 'session.unknown': '未知会话', 'session.running': '运行中', 'session.interrupted': '已中断',
|
|
298
392
|
'session.stop': '停止', 'session.history': '对话', 'session.errorMsg': '会话出错:{msg}',
|
|
@@ -368,6 +462,12 @@
|
|
|
368
462
|
'settings.servers': '服务器地址(可多个)', 'settings.speedTest': '测速', 'settings.add': '添加',
|
|
369
463
|
'settings.scanTitle': '扫码连接', 'settings.scanDesc': '拍照/相册本地解码(无谷歌服务依赖);也可系统相机扫码或手动粘贴', 'settings.scan': '扫码',
|
|
370
464
|
'settings.notifyTitle': '通知', 'settings.notifyDesc': '收到审批/提问时推送',
|
|
465
|
+
'settings.peakRemindTitle': '峰谷计费提醒', 'settings.peakRemindDesc': '每天 9:00 / 12:00 / 14:00 / 18:00 推送峰谷切换(App 内有效)',
|
|
466
|
+
'peakRemind.enterPeak': '已进入高峰计费时段', 'peakRemind.enterOff': '已进入空闲计费时段',
|
|
467
|
+
'peakRemind.peak0912': '高峰 9:00-12:00', 'peakRemind.off1214': '空闲 12:00-14:00',
|
|
468
|
+
'peakRemind.peak1418': '高峰 14:00-18:00', 'peakRemind.off1809': '空闲 18:00-次日 9:00',
|
|
469
|
+
'peakRemind.browserOnly': '峰谷提醒仅在 App 内有效',
|
|
470
|
+
'peakRemind.on': '峰谷提醒已开启', 'peakRemind.off': '峰谷提醒已关闭',
|
|
371
471
|
'settings.toolsTitle': '显示工具调用', 'settings.toolsDesc': '关闭后隐藏 🔧/📦 工具调用与结果',
|
|
372
472
|
'settings.langTitle': '语言 / Language', 'settings.langDesc': '界面语言,跟随系统或手动切换',
|
|
373
473
|
'settings.themeTitle': '皮肤', 'settings.themeDesc': '默认深空 / 落日 / 易北爱乐厅 / 草原孤塔',
|
|
@@ -377,6 +477,18 @@
|
|
|
377
477
|
'settings.hostTitle': 'DSH 状态', 'settings.hostProbing': '探测中…', 'settings.probe': '探测', 'settings.probeFailed': '探测失败',
|
|
378
478
|
'settings.hostDesc': 'DSH {version} · {cwd} · 附加会话 {n}',
|
|
379
479
|
'settings.updateTitle': '检查更新', 'settings.updateLoading': '加载中…', 'settings.downloadUpdate': '下载并安装更新', 'settings.check': '检查',
|
|
480
|
+
'settings.feedbackTitle': '反馈渠道', 'settings.feedbackDesc': 'GitHub / Gitee / B站:反馈 bug、提建议、唠嗑',
|
|
481
|
+
'feedback.title': '反馈', 'feedback.githubDesc': '反馈 bug / 提建议', 'feedback.giteeDesc': '国内镜像,无需代理',
|
|
482
|
+
'feedback.biliDesc': 'UP 动态页交流', 'feedback.copyLink': '复制项目链接', 'feedback.copyDesc': '手动分享给朋友',
|
|
483
|
+
'feedback.copied': '项目链接已复制', 'feedback.copyFailed': '复制失败,请手动复制',
|
|
484
|
+
'feedback.write': '写反馈', 'feedback.writeDesc': 'App 内直接提交', 'feedback.modalTitle': '写反馈',
|
|
485
|
+
'feedback.typeBug': 'Bug', 'feedback.typeSuggestion': '建议', 'feedback.typeOther': '其他',
|
|
486
|
+
'feedback.messagePlaceholder': '请描述遇到的问题或建议(必填,≤2000 字)',
|
|
487
|
+
'feedback.contactPlaceholder': '联系方式(可选):邮箱 / 微信 / B站 ID',
|
|
488
|
+
'feedback.cancel': '取消', 'feedback.submit': '提交',
|
|
489
|
+
'feedback.empty': '请填写描述内容', 'feedback.tooLong': '描述不能超过 2000 字',
|
|
490
|
+
'feedback.submitted': '已提交,感谢反馈',
|
|
491
|
+
'feedback.rateLimited': '提交太频繁,请稍后再试', 'feedback.rateLimitedAt': '提交太频繁,请 {n} 秒后再试', 'feedback.submitFailed': '提交失败:{msg}', 'feedback.networkError': '网络错误',
|
|
380
492
|
'settings.resetTitle': '清空本地数据', 'settings.resetDesc': '令牌与缓存', 'settings.reset': '重置',
|
|
381
493
|
'settings.confirmReset': '清除本地令牌、服务器与缓存?', 'settings.notifyDenied': '通知权限未开启',
|
|
382
494
|
'settings.toolsShown': '已显示工具调用', 'settings.toolsHidden': '已隐藏工具调用',
|
|
@@ -390,6 +502,7 @@
|
|
|
390
502
|
en: {
|
|
391
503
|
'a11y.hostAdmin': 'Host admin', 'a11y.refresh': 'Refresh', 'a11y.more': 'More actions', 'a11y.moreTitle': 'Commands / Permissions / Models',
|
|
392
504
|
'conn.on': 'Connected', 'conn.off': 'Offline', 'conn.reconnecting': 'Connection lost, reconnecting…',
|
|
505
|
+
'conn.titleGroup': '{group} · {url} ({ms})',
|
|
393
506
|
'common.refreshing': 'Refreshing…',
|
|
394
507
|
'nav.sessions': 'Sessions', 'nav.files': 'Files', 'nav.pending': 'Inbox', 'nav.stats': 'Stats', 'nav.settings': 'Settings',
|
|
395
508
|
'statsPage.title': 'Token stats',
|
|
@@ -416,6 +529,18 @@
|
|
|
416
529
|
'servers.currentDesc': 'Current: {url}', 'servers.notSet': 'No server set', 'servers.defaultDesc': 'Default = current page URL',
|
|
417
530
|
'servers.needAddress': 'Enter a server address', 'servers.badProtocol': 'Address must start with http:// or https://',
|
|
418
531
|
'servers.duplicate': 'This address is already in the list', 'servers.added': 'Server added', 'servers.removedActive': 'Removed active server, re-testing…',
|
|
532
|
+
'servers.currentDescGroup': 'Current: {group} · {url} ({ms})',
|
|
533
|
+
'servers.edit': 'Edit', 'servers.manualSelected': 'Switched to: {url}',
|
|
534
|
+
'servers.promptNote': 'Server note (optional):', 'servers.promptEditNote': 'Edit note ({url}):',
|
|
535
|
+
'servers.promptEditUrl': 'Edit server URL:', 'servers.promptEditGroup': 'Group:', 'servers.edited': 'Server updated',
|
|
536
|
+
'speed.switchedOrigin': 'Switched to current page (same origin)', 'speed.manualUsing': 'Manual mode: {url} ({ms})',
|
|
537
|
+
'groups.current': 'Current group', 'groups.add': '+ Group', 'groups.noServer': 'No servers in this group',
|
|
538
|
+
'groups.speedTest': 'Speed test', 'groups.autoSelect': 'Auto-select fastest', 'groups.delete': 'Delete group',
|
|
539
|
+
'groups.autoOn': '{group} is now auto-select', 'groups.autoOff': '{group} is now manual',
|
|
540
|
+
'groups.switched': 'Switched to group: {group}', 'groups.switchHint': 'Click to switch group, double-click to rename', 'groups.promptAdd': 'New group name:', 'groups.duplicate': 'Group already exists',
|
|
541
|
+
'groups.added': 'Created group: {group}', 'groups.promptRename': 'Rename group "{group}":',
|
|
542
|
+
'groups.renamed': 'Group renamed', 'groups.cannotDeleteDefault': 'The default group cannot be deleted',
|
|
543
|
+
'groups.confirmDelete': 'Delete group "{group}"? Its servers move to the default group.', 'groups.deleted': 'Group deleted',
|
|
419
544
|
'stream.error': 'Event stream error: {msg}',
|
|
420
545
|
'session.loading': 'Loading…', 'session.unknown': 'Unknown session', 'session.running': 'Running', 'session.interrupted': 'Interrupted',
|
|
421
546
|
'session.stop': 'Stop', 'session.history': 'Conversation', 'session.errorMsg': 'Session error: {msg}',
|
|
@@ -491,6 +616,12 @@
|
|
|
491
616
|
'settings.servers': 'Servers (one or more)', 'settings.speedTest': 'Test', 'settings.add': 'Add',
|
|
492
617
|
'settings.scanTitle': 'Scan to pair', 'settings.scanDesc': 'Photo/gallery QR decoding on device (no Google services); system camera or manual paste also work', 'settings.scan': 'Scan',
|
|
493
618
|
'settings.notifyTitle': 'Notifications', 'settings.notifyDesc': 'Push on approvals / questions',
|
|
619
|
+
'settings.peakRemindTitle': 'Peak/off-peak reminders', 'settings.peakRemindDesc': 'Push at 9:00 / 12:00 / 14:00 / 18:00 daily (in-app only)',
|
|
620
|
+
'peakRemind.enterPeak': 'Peak pricing period started', 'peakRemind.enterOff': 'Off-peak pricing period started',
|
|
621
|
+
'peakRemind.peak0912': 'Peak 9:00-12:00', 'peakRemind.off1214': 'Off-peak 12:00-14:00',
|
|
622
|
+
'peakRemind.peak1418': 'Peak 14:00-18:00', 'peakRemind.off1809': 'Off-peak 18:00-9:00 next day',
|
|
623
|
+
'peakRemind.browserOnly': 'Peak reminders only work in the app',
|
|
624
|
+
'peakRemind.on': 'Peak reminders enabled', 'peakRemind.off': 'Peak reminders disabled',
|
|
494
625
|
'settings.toolsTitle': 'Show tool calls', 'settings.toolsDesc': 'Hide 🔧/📦 tool calls and results when off',
|
|
495
626
|
'settings.langTitle': 'Language / 语言', 'settings.langDesc': 'UI language, follows system or switch manually',
|
|
496
627
|
'settings.themeTitle': 'Theme', 'settings.themeDesc': 'Default deep space / Sunset / Elbphilharmonie / Prairie Tower',
|
|
@@ -500,6 +631,18 @@
|
|
|
500
631
|
'settings.hostTitle': 'DSH status', 'settings.hostProbing': 'Probing…', 'settings.probe': 'Probe', 'settings.probeFailed': 'Probe failed',
|
|
501
632
|
'settings.hostDesc': 'DSH {version} · {cwd} · {n} attached sessions',
|
|
502
633
|
'settings.updateTitle': 'Check for updates', 'settings.updateLoading': 'Loading…', 'settings.downloadUpdate': 'Download & install update', 'settings.check': 'Check',
|
|
634
|
+
'settings.feedbackTitle': 'Feedback', 'settings.feedbackDesc': 'GitHub / Gitee / Bilibili: report bugs, suggest features, or just chat',
|
|
635
|
+
'feedback.title': 'Feedback', 'feedback.githubDesc': 'Report bugs · suggest features', 'feedback.giteeDesc': 'Mirror in China, no proxy needed',
|
|
636
|
+
'feedback.biliDesc': 'Chat on the UP\'s Bilibili page', 'feedback.copyLink': 'Copy project link', 'feedback.copyDesc': 'Share it manually',
|
|
637
|
+
'feedback.copied': 'Project link copied', 'feedback.copyFailed': 'Copy failed, copy manually',
|
|
638
|
+
'feedback.write': 'Write feedback', 'feedback.writeDesc': 'Submit from the app', 'feedback.modalTitle': 'Write feedback',
|
|
639
|
+
'feedback.typeBug': 'Bug', 'feedback.typeSuggestion': 'Suggestion', 'feedback.typeOther': 'Other',
|
|
640
|
+
'feedback.messagePlaceholder': 'Describe the bug or suggestion (required, ≤2000 chars)',
|
|
641
|
+
'feedback.contactPlaceholder': 'Contact (optional): email / WeChat / Bilibili ID',
|
|
642
|
+
'feedback.cancel': 'Cancel', 'feedback.submit': 'Submit',
|
|
643
|
+
'feedback.empty': 'Please fill in the description', 'feedback.tooLong': 'Description must be ≤2000 characters',
|
|
644
|
+
'feedback.submitted': 'Submitted — thanks!',
|
|
645
|
+
'feedback.rateLimited': 'Too frequent, try again later', 'feedback.rateLimitedAt': 'Too frequent, try again in {n}s', 'feedback.submitFailed': 'Submit failed: {msg}', 'feedback.networkError': 'Network error',
|
|
503
646
|
'settings.resetTitle': 'Clear local data', 'settings.resetDesc': 'Token and caches', 'settings.reset': 'Reset',
|
|
504
647
|
'settings.confirmReset': 'Clear local token, servers and caches?', 'settings.notifyDenied': 'Notification permission not granted',
|
|
505
648
|
'settings.toolsShown': 'Tool calls shown', 'settings.toolsHidden': 'Tool calls hidden',
|