embystream 0.0.36

Another Emby streaming application (frontend/backend separation) written in Rust.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
{
  "nav": {
    "home": "主頁",
    "login": "登入",
    "register": "註冊",
    "dashboard": "總覽",
    "wizard": "精靈",
    "drafts": "草稿",
    "configSets": "配置",
    "settings": "設定",
    "docs": "文件 Wiki",
    "logs": "日誌",
    "users": "使用者",
    "account": "個人中心"
  },
  "common": {
    "preview": "預覽",
    "openPreview": "放大預覽",
    "close": "關閉",
    "download": "下載",
    "copy": "複製",
    "copied": "已複製",
    "continue": "繼續",
    "duplicate": "複製",
    "rename": "重新命名",
    "delete": "刪除",
    "loading": "載入中",
    "newDraft": "新建草稿",
    "logout": "登出",
    "cancel": "取消",
    "confirmLogout": "確定要登出嗎?",
    "noDrafts": "還沒有草稿",
    "noLogs": "還沒有日誌",
    "previous": "上一步",
    "next": "下一步",
    "collapse": "收起",
    "expand": "展開",
    "forbidden": "無權限",
    "confirmDeleteConfigSet": "確認刪除這份設定嗎?",
    "promptRenameDraft": "請輸入新的草稿名稱",
    "promptRenameConfigSet": "請輸入新的設定名稱",
    "themeLight": "亮色",
    "themeDark": "暗色",
    "themeSystem": "跟隨系統",
    "themeCurrent": "目前主題:{mode}",
    "themeSwitchTo": "切換到{mode}",
    "help": "幫助",
    "notifications": "通知",
    "more": "更多",
    "workspace": "工作區",
    "system": "系統",
    "support": "支援",
    "accountActions": "帳戶",
    "disclaimer": "免責聲明",
    "openMenu": "打開選單",
    "closeMenu": "關閉選單",
    "collapseSidebar": "收起側欄",
    "expandSidebar": "展開側欄",
    "language": "語言",
    "private": "私人",
    "adminOnly": "僅管理員",
    "routeHint": "目前是骨架頁,後續會接入真實 API"
  },
  "auth": {
    "storyLabel": "EmbyStream",
    "wallTitle": "部署設定,按流程完成",
    "wallBody": "從草稿到產物,流程清楚,進度可續",
    "panelTitle": "面向真實部署",
    "panelBody": "保留恢復能力、明確反饋與可檢查的產物",
    "signals": ["分步精靈", "自動草稿", "五類產物", "管理員日誌"],
    "login": {
      "eyebrow": "EmbyStream",
      "title": "繼續設定工作區",
      "body": "登入後繼續編輯草稿、查看結果並生成設定",
      "loginLabel": "使用者名稱或信箱",
      "passwordLabel": "密碼",
      "helper": "使用既有帳號延續目前工作",
      "submit": "進入工作區",
      "switch": "沒有帳號?去註冊",
      "backgroundCount": "已載入 {count} 張背景"
    },
    "register": {
      "eyebrow": "First Run",
      "title": "建立本地帳號",
      "body": "新帳號只管理自己的草稿與產物,管理員帳號仍由系統初始化",
      "usernameLabel": "使用者名稱",
      "emailLabel": "信箱",
      "passwordLabel": "密碼",
      "helper": "建議使用長期信箱,便於識別與排查",
      "submit": "建立帳號",
      "switch": "已有帳號?去登入"
    },
    "registerClosedToast": "目前未開放註冊"
  },
  "wizard": {
    "eyebrow": "Guided Flow",
    "title": "按階段補齊真實部署設定,最後統一校驗再生成",
    "body": "流程不再只收集少量入口參數,前後端路由、節點、代理方式、限速與測試流程都會一起覆蓋",
    "stepRailTitle": "階段",
    "chooseMode": "先選運行方式",
    "backToConfigs": "返回配置",
    "saveDraft": "儲存草稿",
    "generateFiles": "生成檔案",
    "saving": "儲存中",
    "generating": "生成中",
    "autosaving": "自動儲存中",
    "deferDraftCreation": "目前是本地草稿,點擊最終生成時才會建立並保存到服務端",
    "nameLabel": "名稱",
    "nameHint": "只是給你自己在列表裡辨識用",
    "embyUrlLabel": "Emby 位址",
    "embyUrlHint": "填真實 Emby 的基礎位址,不要帶最後的斜線",
    "embyPortLabel": "Emby 埠",
    "embyPortHint": "通常是 8096,除非你的實例改過",
    "embyTokenLabel": "Emby Token",
    "embyTokenHint": "前端代理會用它安全存取 Emby API",
    "logRootLabel": "日誌目錄",
    "logRootHint": "出問題時先看這裡管理員日誌頁也會從這裡讀執行日誌",
    "logLevelLabel": "日誌等級",
    "logLevelHint": "調試時可以開到 debug,正式環境通常保持 info",
    "logPrefixLabel": "日誌前綴",
    "logPrefixHint": "多個實例共用同一個日誌目錄時,用前綴區分",
    "memoryModeLabel": "快取傾向",
    "memoryModeHint": "低內存更省,中等更均衡,高內存更偏效能",
    "encipherKeyLabel": "簽名密鑰",
    "encipherKeyHint": "不要直接帶著模板預設值上線,正式環境必須替換",
    "encipherIvLabel": "簽名 IV",
    "encipherIvHint": "要和簽名密鑰一起輪換",
    "frontendPortLabel": "前端埠",
    "frontendPortHint": "使用者先打到這裡,它負責代理 Emby 和改寫入口流量",
    "backendPortLabel": "後端埠",
    "backendPortHint": "真實媒體檔案從這裡出去雙端模式下不能和前端埠重複",
    "backendBaseUrlLabel": "後端對外位址",
    "backendBaseUrlHint": "填的是客戶端最終看到的後端公開位址,不是節點源站位址",
    "backendPublicPortLabel": "後端對外埠",
    "backendPublicPortHint": "若公開入口不是 80 或 443,請明確填寫",
    "backendPathLabel": "後端對外路徑",
    "backendPathHint": "播放服務最終掛在哪個路徑段;留空表示根路徑",
    "problematicClientsLabel": "特殊客戶端名單",
    "problematicClientsHint": "一行一個關鍵字,這些客戶端會跳過部分激進優化",
    "userAgentModeLabel": "UA 策略",
    "userAgentModeHint": "先決定白名單還是黑名單,再填匹配規則",
    "userAgentRulesLabel": "UA 規則",
    "userAgentRulesHint": "一行一個關鍵字",
    "fallbackPathLabel": "缺片回退影片",
    "fallbackPathHint": "可選請求的檔案缺失時,用這個影片兜底",
    "sslCertLabel": "SSL 憑證",
    "sslCertHint": "只對後端 HTTPS 有意義留空時沿用預設發現路徑",
    "sslKeyLabel": "SSL 私鑰",
    "sslKeyHint": "要和憑證成對出現",
    "deployNginxTitle": "Nginx 產物設定",
    "deployNginxBody": "這裡控制生成的 nginx.conf 網域、TLS 路徑與 DNS 解析器,不會改動程式本身的 HTTP2 設定",
    "nginxFrontendServerNameLabel": "前端 server_name",
    "nginxFrontendServerNameHint": "生成前端或雙端 nginx.conf 時寫入的對外網域",
    "nginxFrontendSslCertLabel": "前端憑證路徑",
    "nginxFrontendSslCertHint": "留空時只輸出註解提示,之後再按實際憑證路徑填寫",
    "nginxFrontendSslKeyLabel": "前端私鑰路徑",
    "nginxFrontendSslKeyHint": "留空時只輸出註解提示,並和憑證路徑成對填寫",
    "nginxBackendServerNameLabel": "後端 server_name",
    "nginxBackendServerNameHint": "生成後端 nginx.conf 時寫入的串流出口網域",
    "nginxBackendSslCertLabel": "後端憑證路徑",
    "nginxBackendSslCertHint": "留空時只輸出註解提示,之後再按實際憑證路徑填寫",
    "nginxBackendSslKeyLabel": "後端私鑰路徑",
    "nginxBackendSslKeyHint": "留空時只輸出註解提示,並和憑證路徑成對填寫",
    "nginxResolverProviderLabel": "DNS 解析商",
    "nginxResolverProviderHint": "只有後端 Nginx 反代上游 HTTPS 時才需要 resolver,預設不代填",
    "nginxCustomResolversLabel": "自訂 DNS",
    "nginxCustomResolversHint": "依 nginx resolver 語法填寫,多個位址以空白分隔",
    "resolverProvidernone": "不預填",
    "resolverProvidercloudflare": "Cloudflare",
    "resolverProviderdnspod": "DNSPod",
    "resolverProvidergoogle": "Google",
    "resolverProvideraliyun": "阿里雲",
    "resolverProvidertencent": "騰訊",
    "resolverProvidercustom": "自訂",
    "deployRuntimeTitle": "執行腳本路徑",
    "deployRuntimeBody": "這裡控制生成的 systemd.service 和 pm2.config.cjs 路徑,避免預設值帶出無關的專案名稱",
    "systemdBinaryPathLabel": "systemd 二進位路徑",
    "systemdBinaryPathHint": "預設是 /usr/bin/embystream,如果不同可先執行 which embystream 再回填",
    "systemdWorkingDirectoryLabel": "systemd 工作目錄",
    "systemdWorkingDirectoryHint": "預設 /opt/stream,可依部署目錄調整",
    "systemdConfigPathLabel": "systemd 設定檔路徑",
    "systemdConfigPathHint": "預設 /opt/stream/config.toml,要和實際掛載位置一致",
    "pm2BinaryPathLabel": "PM2 二進位路徑",
    "pm2BinaryPathHint": "預設是 /usr/bin/embystream,如果不同可先執行 which embystream 再回填",
    "pm2WorkingDirectoryLabel": "PM2 工作目錄",
    "pm2WorkingDirectoryHint": "預設會依模式寫成 /opt/stream、/opt/stream-frontend 或 /opt/stream-backend",
    "pm2ConfigPathLabel": "PM2 設定檔路徑",
    "pm2ConfigPathHint": "預設是工作目錄下的 config.toml,也可以改成其他路徑",
    "pm2OutFileLabel": "PM2 標準輸出日誌",
    "pm2OutFileHint": "預設寫到工作目錄下的 logs/pm2.out.log",
    "pm2ErrorFileLabel": "PM2 錯誤日誌",
    "pm2ErrorFileHint": "預設寫到工作目錄下的 logs/pm2.err.log",
    "frontendAntiReverseLabel": "前端反代校驗",
    "frontendAntiReverseHint": "前端入口暴露到公網時,建議開啟 Host 校驗",
    "frontendAntiHostLabel": "前端可信 Host",
    "frontendAntiHostHint": "只填網域或網域:埠,不要再帶協議",
    "enableProtection": "啟用保護",
    "frontendRewriteTitle": "前端路徑改寫",
    "frontendRewriteBody": "這裡控制公開入口路徑如何先在前端層被改寫,再轉發到 Emby 或後端",
    "addRewrite": "新增改寫",
    "rewriteEnabled": "啟用這條規則",
    "rewritePatternLabel": "匹配正則",
    "rewritePatternHint": "先拿真實路徑做樣例,再慢慢收斂到需要的正則",
    "rewriteReplacementLabel": "替換結果",
    "rewriteReplacementHint": "支援像 $1 這樣的捕獲組引用",
    "rewriteRegexInvalid": "正則錯誤",
    "rewriteRegexMatched": "已命中,結果 {output}",
    "rewriteRegexNoMatch": "目前樣例未命中",
    "noRewriteRules": "目前還沒有可用的改寫規則",
    "routeTestHint": "貼上一條真實媒體路徑,先在這裡看改寫結果",
    "routeTestInputLabel": "測試路徑",
    "routeTestResultLabel": "測試結果",
    "routeTestNoMatch": "沒有任何已啟用規則命中這個樣例",
    "routeChecklistTitle": "改寫測試流程",
    "routeChecklistItem1": "先在這裡用真實樣例驗證改寫結果,再儲存草稿",
    "routeChecklistItem2": "生成後直接檢查 config.toml 內的 Frontend.PathRewrite 與 BackendNode.PathRewrite",
    "routeChecklistItem3": "上線前用真實客戶端打一條媒體鏈接,確認入口路徑、節點命中與返回方式一致",
    "nodeFlowTitle": "後端節點編排",
    "nodeFlowBody": "每個後端節點都要有自己的匹配範圍、代理策略、限速與改寫規則,不能只剩一個監聽埠",
    "addNode": "新增節點",
    "nodeLabel": "節點",
    "nodeNameLabel": "節點名稱",
    "nodeNameHint": "主要用來提升設定可讀性與排障效率",
    "nodePatternLabel": "匹配路徑",
    "nodePatternHint": "通常直接匹配解密後的媒體路徑前綴或正則",
    "nodeBaseUrlLabel": "節點源位址",
    "nodeBaseUrlHint": "這裡才是節點真正的上游位址,例如 NAS、OpenList 或 WebDAV",
    "nodePortLabel": "節點埠",
    "nodePortHint": "如果上游不是預設埠,就在這裡補上",
    "nodePathLabel": "節點路徑前綴",
    "nodePathHint": "當上游服務不在根路徑時,用這個欄位補齊",
    "nodePriorityLabel": "節點優先級",
    "nodePriorityHint": "數字越小越先匹配;多節點重疊時必須明確順序",
    "nodeProxyModeLabel": "代理方式",
    "nodeProxyModeHint": "redirect、proxy、accel_redirect 會直接影響安全性與帶寬成本",
    "nodeSpeedLimitLabel": "限速 KB/s",
    "nodeSpeedLimitHint": "0 代表不限速,按設備維度生效",
    "nodeBurstLimitLabel": "突發 KB/s",
    "nodeBurstLimitHint": "給播放器留一點短時突發,避免一開播就抖動",
    "nodeAntiReverseLabel": "節點反代校驗",
    "nodeAntiReverseHint": "只有該節點需要單獨做 Host 校驗時再開啟",
    "nodeAntiHostLabel": "節點可信 Host",
    "nodeAntiHostHint": "除非節點有自己的公開域名,否則可以留空",
    "nodeRewriteTitle": "節點改寫與測試",
    "nodeRouteTestHint": "這裡測的是流量命中節點後的路徑改寫結果",
    "nodeSettingsTitle": "節點專屬設定",
    "backendNodeRequired": "至少新增一個後端節點後,才能繼續下一步",
    "diskDescriptionLabel": "磁碟備註",
    "diskDescriptionHint": "用來記錄掛載點或磁碟用途,方便後續維護",
    "openListBaseUrlLabel": "OpenList 位址",
    "openListBaseUrlHint": "填寫 OpenList/Alist 的真實訪問位址",
    "openListPortLabel": "OpenList 埠",
    "openListPortHint": "如果位址裡已經帶了埠,這裡可以留空",
    "openListTokenLabel": "OpenList Token",
    "openListTokenHint": "節點直接呼叫 OpenList API 時使用",
    "directLinkUserAgentLabel": "直鏈 UA",
    "directLinkUserAgentHint": "某些上游 CDN 只接受固定 User-Agent",
    "googleNodeUuidLabel": "Google 節點 UUID",
    "googleNodeUuidHint": "token 快取與刷新都依賴這個穩定 ID",
    "googleClientIdLabel": "Google Client ID",
    "googleClientIdHint": "你建立的 OAuth 用戶端對應的 Client ID",
    "googleClientSecretLabel": "Google Client Secret",
    "googleClientSecretHint": "必須和 Client ID 配套,否則無法刷新 token",
    "googleDriveIdLabel": "共享磁碟 ID",
    "googleDriveIdHint": "若有 drive_id 會優先於 drive_name",
    "googleDriveNameLabel": "共享磁碟名稱",
    "googleDriveNameHint": "沒有 drive_id 時,用它做回退匹配",
    "googleAccessTokenLabel": "訪問令牌",
    "googleAccessTokenHint": "若已提供 refresh_token,這裡可以先留空",
    "googleRefreshTokenLabel": "刷新令牌",
    "googleRefreshTokenHint": "這才是 GoogleDrive 節點真正需要的長期憑據",
    "webdavNodeUuidLabel": "WebDAV 節點 UUID",
    "webdavNodeUuidHint": "使用 accel_redirect 時必須穩定且唯一",
    "webdavUrlModeLabel": "WebDAV URL 模式",
    "webdavUrlModeHint": "決定最終檔案路徑怎麼拼到上游請求上",
    "webdavQueryParamLabel": "查詢參數名",
    "webdavQueryParamHint": "只有 url_mode = query_path 時使用",
    "webdavUrlTemplateLabel": "URL 模板",
    "webdavUrlTemplateHint": "只有 url_template 模式需要,記得包含 {file_path}",
    "webdavUsernameLabel": "WebDAV 使用者名稱",
    "webdavUsernameHint": "上游需要 Basic Auth 時填寫",
    "webdavPasswordLabel": "WebDAV 密碼",
    "webdavPasswordHint": "與使用者名稱成對使用",
    "webdavUserAgentLabel": "WebDAV UA",
    "webdavUserAgentHint": "某些 WebDAV 服務會限制可接受的 UA",
    "savedAt": "已儲存於 {timestamp}",
    "generatedCount": "已生成 {count} 個檔案",
    "restoreBanner": "已恢復草稿 {name}",
    "reviewTitle": "最終確認",
    "reviewBody": "這不是走過場,而是把埠、節點、改寫與測試動作再走一遍,確認後再輸出部署檔案",
    "reviewName": "草稿",
    "reviewMode": "模式",
    "reviewFrontendPort": "前端埠",
    "reviewBackendPort": "後端埠",
    "reviewNodes": "後端節點數",
    "reviewRewrites": "已啟用改寫數(前端 / 節點)",
    "reviewArtifacts": "檔案",
    "reviewChecklistTitle": "生成前檢查",
    "reviewChecklistItem1": "確認公開埠、公開位址與路徑段都符合最終部署環境",
    "reviewChecklistItem2": "確認每個後端節點都有自己的匹配規則、代理方式與必要憑據",
    "reviewChecklistItem3": "確認所有已啟用改寫都已用樣例路徑驗證,沒有錯誤替換",
    "reviewChecklistItem4": "確認限速、Host 校驗與回退策略符合線上要求,再執行生成",
    "purposeLabel": "這一步在做什麼",
    "effectLabel": "會帶來什麼效果",
    "questionLabel": "目前問題",
    "helperLabel": "這個答案會如何影響生成結果",
    "modeFrontendBody": "適合你只想在 Emby 前面放一個代理入口",
    "modeBackendBody": "適合你把流媒體出口單獨部署到另一台機器",
    "modeDualBody": "適合你想先完整跑通,一台服務同時承擔前後兩端",
    "memoryLow": "低內存",
    "memoryMiddle": "均衡",
    "memoryHigh": "高效能",
    "uaAllow": "只允許命中項",
    "uaDeny": "攔截命中項",
    "steps": [
      "選模式",
      "通用設定",
      "連線入口",
      "保護策略",
      "路徑改寫",
      "後端節點",
      "生成前確認"
    ],
    "stepCards": [
      {
        "title": "先決定運行方式",
        "purpose": "這一步決定你是只做代理、只做流媒體出口,還是兩端一起跑",
        "effect": "模式會直接決定後面需要哪些欄位與部署方式"
      },
      {
        "title": "先補齊共用執行設定",
        "purpose": "先把草稿名稱、日誌、快取傾向與簽名密鑰處理好,不要直接沿用模板預設",
        "effect": "它會影響排障、執行時行為,以及你是否把預設密鑰帶進正式環境"
      },
      {
        "title": "把真實入口與公開後端位址接好",
        "purpose": "這一頁同時處理 Emby 真地址、前端監聽埠、後端公開位址與特殊客戶端清單",
        "effect": "它會直接決定客戶端如何進來,以及生成產物對外暴露什麼入口"
      },
      {
        "title": "補上保護策略與兜底行為",
        "purpose": "這裡處理 UA 規則、Host 校驗、TLS 路徑與缺片回退",
        "effect": "它會影響被濫用風險、HTTPS 落地方式,以及播放失敗時使用者看到什麼"
      },
      {
        "title": "先把路徑改寫與測試流程跑通",
        "purpose": "不要只把改寫寫進設定卻不驗證,這一頁先用樣例路徑確認結果",
        "effect": "能提前發現正則寫錯、替換錯位,或公開入口路徑與真實檔案路徑不一致"
      },
      {
        "title": "逐個建立並補完整個後端節點",
        "purpose": "每個節點都要有自己的匹配規則、代理方式、限速、改寫與專屬憑據",
        "effect": "後端會變成真正可部署、可排障、可擴充的結構,而不是只剩一個監聽埠"
      },
      {
        "title": "最後確認再生成",
        "purpose": "把關鍵部署值、節點數與測試動作再過一遍,確認這次輸出就是要上線的版本",
        "effect": "確認後會一次生成部署檔案,並保留在你的列表中"
      }
    ],
    "noBackendNodesNeeded": "目前模式不會啟動後端服務,這一步可以直接跳過",
    "previewTitle": "生成結果",
    "previewBody": "每份檔案都可以展開查看、收起和單獨下載"
  },
  "drafts": {
    "eyebrow": "Workspace",
    "title": "草稿和進度都留在這裡",
    "body": "繼續編輯、重新命名或清理草稿,不必重來",
    "backToConfigs": "返回配置",
    "queueLabel": "目前隊列",
    "queueTitle": "先處理進行中的設定",
    "queueBody": "草稿繼續編輯,已生成結果進入設定管理",
    "statsDrafts": "草稿總數",
    "statsGenerated": "已生成",
    "statsConfigs": "設定集",
    "loadingTitle": "正在同步草稿列表",
    "loadingBody": "草稿與設定集準備好後再顯示結果",
    "errorTitle": "草稿列表暫時不可用",
    "emptyTitle": "還沒有進行中的設定",
    "emptyBody": "從新草稿開始,之後可隨時回來繼續",
    "updatedAt": "最近更新於 {time}",
    "statusDraft": "草稿",
    "statusGenerated": "已生成"
  },
  "account": {
    "eyebrow": "Profile",
    "title": "帳號與工作入口",
    "body": "查看目前帳號、角色與常用入口",
    "username": "使用者名稱",
    "email": "信箱",
    "role": "角色",
    "roleAdmin": "管理員",
    "roleUser": "普通使用者",
    "roleAdminBody": "可存取日誌與完整工作台,最終權限仍以後端校驗為準",
    "roleUserBody": "僅處理自己的草稿與已生成產物",
    "emailFallback": "尚未填寫信箱",
    "aboutOpen": "關於 EmbyStream",
    "aboutLabel": "About",
    "aboutTitle": "關於 EmbyStream",
    "aboutBody": "查看專案連結、版本號與更新日誌",
    "aboutVersion": "目前版本 {version}",
    "aboutGithub": "GitHub 專案",
    "aboutChangelog": "更新日誌",
    "fontsLabel": "字體設定",
    "fontsTitle": "依照自己的閱讀習慣調整中英文字體",
    "fontsBody": "中文與英文偏好會保存到本地,切換後立即套用到整個工作區",
    "fontZhLabel": "中文字體",
    "fontEnLabel": "英文字體",
    "fontCodeLabel": "程式碼字體",
    "fontPreviewZh": "在這裡預覽中文段落的氣質、密度與閱讀節奏",
    "fontPreviewEn": "Preview the Latin font pairing across labels, headings, and mixed-language content",
    "fontPreviewCode": "stream_mode = \"proxy\"\nfont_family = \"Fira Code\"\ntheme = \"catppuccin\"",
    "fontZhSourceHanSans": "思源黑體",
    "fontZhWenkai": "霞鶩文楷",
    "fontZhPingfang": "蘋方",
    "fontEnSourceSerif": "Source Serif 4",
    "fontEnSourceSans": "Source Sans 3",
    "fontEnInter": "Inter",
    "fontEnPlusJakartaSans": "Plus Jakarta Sans",
    "fontEnSourceCodePro": "Source Code Pro",
    "fontCodeMenlo": "Menlo",
    "fontCodeFiraCode": "Fira Code",
    "quickLinks": "快捷入口",
    "quickLinksTitle": "快速返回常用操作",
    "quickLinksBody": "把常用頁面放在這裡,減少來回切換",
    "securityTitle": "權限邊界仍在服務端",
    "securityBody": "前端負責引導與反饋,訪問邊界仍由 API 決定",
    "passwordCardTitle": "修改密碼",
    "passwordCardBody": "普通使用者在這裡只能修改自己的登入密碼,修改成功後會登出目前會話並要求重新登入",
    "passwordDialogBody": "請輸入舊密碼,並設定新的登入密碼,兩次新密碼必須完全一致",
    "passwordCurrentLabel": "舊密碼",
    "passwordCurrentPlaceholder": "輸入目前登入密碼",
    "passwordCurrentRequired": "請先輸入舊密碼",
    "passwordNewLabel": "新密碼",
    "passwordNewPlaceholder": "輸入新的登入密碼",
    "passwordNewRequired": "請輸入新密碼",
    "passwordRepeatLabel": "重複新密碼",
    "passwordRepeatPlaceholder": "再次輸入新密碼",
    "passwordRepeatMismatch": "兩次輸入的新密碼不一致"
  },
  "settings": {
    "eyebrow": "Preferences",
    "title": "工作區設定",
    "body": "統一管理介面語言與字體偏好",
    "themeLabel": "主題模式",
    "themeTitle": "亮暗主題",
    "themeBody": "支援固定亮色、固定暗色,或跟隨手機和電腦系統自動切換",
    "themeCurrent": "目前生效:{mode}",
    "languageLabel": "語言",
    "languageTitle": "介面語言",
    "languageBody": "切換後會立即更新介面文案與時間格式",
    "registrationLabel": "註冊開關",
    "registrationTitle": "公開註冊",
    "registrationBody": "控制訪客是否可以從登入頁建立本地帳號",
    "registrationStateOpen": "已開放",
    "registrationStateClosed": "未開放",
    "registrationCurrent": "目前狀態:{state}",
    "registrationSaved": "註冊狀態已更新為:{state}",
    "registrationLoadFailed": "載入註冊設定失敗",
    "registrationSaveFailed": "更新註冊設定失敗",
    "renderFontLabel": "網頁渲染字體",
    "renderWeightLabel": "網頁字重",
    "renderWeightNormal": "細體",
    "renderFontMenlo": "Menlo",
    "renderFontSans": "Source Sans 3",
    "renderFontSerif": "Source Serif 4",
    "renderWeightRegular": "常規",
    "renderWeightSemibold": "中粗",
    "renderWeightBold": "粗體",
    "zhWeightLabel": "中文字重",
    "enWeightLabel": "英文字重",
    "codeWeightLabel": "程式碼字重",
    "localeZhCn": "簡體中文",
    "localeZhTw": "繁體中文",
    "localeEn": "English"
  },
  "dashboard": {
    "eyebrow": "Overview",
    "title": "執行總覽",
    "body": "查看目前磁碟、CPU、記憶體與運行時間",
    "statusLabel": "狀態",
    "refreshTitle": "系統指標會自動刷新",
    "refreshBody": "最近更新於 {time}",
    "refreshHint": "以上數據基於 EmbyStream 主程式進程與相關檔案路徑統計,不代表整台機器的即時狀態",
    "refreshAction": "立即刷新",
    "loadingTitle": "正在讀取系統指標",
    "loadingBody": "系統指標準備好後會顯示在這裡",
    "errorTitle": "系統指標暫時不可用",
    "errorBody": "系統指標載入失敗",
    "cpu": "CPU 使用率",
    "memory": "記憶體使用率",
    "disk": "磁碟使用率",
    "uptime": "運行時間",
    "cpuMeta": "{count} 核心",
    "memoryMeta": "總記憶體 {total}",
    "diskMeta": "總磁碟 {total}"
  },
  "more": {
    "eyebrow": "More",
    "title": "更多",
    "body": "依功能分組查看更多入口,像系統頁一樣進入不同功能頁面"
  },
  "docs": {
    "eyebrow": "Wiki",
    "title": "文件 Wiki",
    "body": "集中查看主程式文件與 Web 管理頁部署說明",
    "readmeLabel": "README",
    "readmeTitle": "主程式使用說明",
    "readmeBody": "查看主程式使用說明與參數說明",
    "nginxLabel": "Nginx",
    "nginxTitle": "Web 管理頁反向代理示例",
    "nginxBody": "透過反向代理把網域請求轉發到 Web 管理頁,再用網域存取 EmbyStream 管理頁",
    "openLink": "打開文件",
    "issueLink": "提交 Issue 回饋文件問題"
  },
  "configSets": {
    "eyebrow": "Artifacts",
    "title": "配置",
    "body": "在這裡檢視、複製與下載已生成的設定",
    "libraryLabel": "產物總覽",
    "libraryTitle": "生成結果應隨時可查",
    "libraryBody": "先在列表中瀏覽配置,再按需進入詳情查看生成檔案",
    "createAction": "新增配置",
    "draftsAction": "草稿",
    "detailAction": "詳情",
    "detailEyebrow": "配置詳情",
    "detailTitle": "配置詳情",
    "detailBody": "查看這份配置生成的檔案列表,按需展開每個檔案內容",
    "backToList": "返回配置列表",
    "loadingTitle": "正在讀取設定集",
    "loadingBody": "載入完成後會顯示最新結果列表",
    "detailLoadingTitle": "正在讀取配置詳情",
    "detailLoadingBody": "配置檔案準備好後會顯示在這裡",
    "detailMissingTitle": "這份配置暫時不可用",
    "detailMissingBody": "請求的配置不存在,或暫時無法載入",
    "errorTitle": "設定庫暫時不可用",
    "emptyTitle": "還沒有可預覽的產物",
    "emptyBody": "先從精靈流程生成設定,之後可在這裡統一查看與下載",
    "updatedAt": "最近更新於 {time}",
    "countLabel": "{count} 份設定"
  },
  "logs": {
    "eyebrow": "Restricted",
    "title": "執行日誌僅對管理員開放",
    "body": "前端會提示權限狀態,最終訪問控制仍在服務端",
    "consoleLabel": "執行控制台",
    "consoleTitle": "集中查看最近日誌",
    "consoleBody": "依來源、等級與關鍵字過濾最近記錄,便於定位問題",
    "levelLabel": "日誌等級",
    "levelAll": "全部等級",
    "keywordLabel": "關鍵字",
    "keywordPlaceholder": "搜尋 message / source / level",
    "filteredLabel": "篩選結果",
    "filteredTitle": "沒有符合條件的日誌",
    "filteredBody": "放寬等級或關鍵字後再試",
    "securityNote": "前端守衛只是體驗層,真正的邊界在 API",
    "forbiddenTitle": "這個頁面已鎖定",
    "forbiddenBody": "後端仍然會拒絕你",
    "errorTitle": "日誌暫時不可用",
    "emptyTitle": "還沒有日誌記錄",
    "emptyBody": "服務開始寫入日誌後,這裡會依來源聚合顯示",
    "sourceLabel": "來源說明",
    "filterAll": "全部",
    "filterStream": "主程序日誌",
    "filterRuntime": "執行日誌",
    "filterAudit": "審計日誌",
    "filterAllHint": "聚合顯示主程式日誌、Web 管理端執行日誌與操作審計記錄,方便快速總覽最近問題。",
    "filterStreamHint": "記錄 EmbyStream 主程式自身的閘道、代理、轉發與串流處理相關執行資訊。",
    "filterRuntimeHint": "記錄 Web Studio 自身的啟動、監聽、初始化與介面執行狀態,不等同於主程式流量日誌。",
    "filterAuditHint": "記錄登入、使用者管理、設定變更等管理操作,方便追蹤誰在什麼時間做了什麼。",
    "statusConnecting": "連線中",
    "statusConnectingBody": "正在建立即時日誌連線。",
    "statusLive": "即時連線中",
    "statusLiveBody": "新的日誌會自動追加顯示。",
    "statusReconnecting": "重連中",
    "statusReconnectingBody": "正在嘗試恢復即時日誌連線。",
    "statusOffline": "已離線",
    "statusOfflineBody": "即時更新已暫停,等待頁面重新連線。",
    "followLive": "正在自動追蹤最新日誌",
    "followLiveBody": "控制台會始終停留在最新日誌位置。",
    "followPaused": "自動追蹤已暫停",
    "followPausedBody": "回到頂部或恢復追蹤後,新的日誌會繼續自動跟隨。",
    "followPausedCount": "上方有 {count} 條新日誌等待查看。",
    "pauseFollow": "暫停自動追蹤",
    "resumeFollow": "回到最新日誌",
    "reconnectNow": "立即重連"
  },
  "users": {
    "eyebrow": "Admin",
    "title": "使用者",
    "body": "管理已註冊使用者的權限、狀態與密碼",
    "filterLabel": "篩選",
    "filterTitle": "依使用者名稱或信箱查找使用者",
    "keywordLabel": "關鍵字",
    "keywordPlaceholder": "搜尋使用者名稱 / 信箱 / 角色",
    "statusLabel": "狀態",
    "loadingTitle": "正在載入使用者列表",
    "loadingBody": "使用者資料準備好後會顯示在這裡",
    "errorTitle": "使用者列表暫時不可用",
    "errorBody": "使用者列表載入失敗",
    "emptyLabel": "空結果",
    "emptyTitle": "沒有符合條件的使用者",
    "emptyBody": "調整關鍵字後再試",
    "disabled": "已停用",
    "promote": "提升權限",
    "demote": "降為普通使用者",
    "enable": "啟用",
    "disable": "停用",
    "changePassword": "修改密碼",
    "passwordPrompt": "輸入新密碼,至少 8 位",
    "passwordLabel": "新密碼",
    "passwordDialogTitle": "修改使用者密碼",
    "passwordDialogBody": "為 {username} 設定新密碼,儲存後該使用者需要重新登入",
    "deleteDialogTitle": "刪除使用者",
    "deleteConfirm": "確認刪除使用者 {username} 嗎?",
    "updatedAt": "最近更新於 {time}"
  },
  "disclaimer": {
    "title": "免責聲明",
    "body": "網頁樣式靈感來自 Claude Code,程式碼編寫來自 OpenAI Codex。如有侵權,請透過 GitHub Issue 回饋",
    "claude": "Claude Code",
    "codex": "OpenAI Codex",
    "github": "GitHub"
  },
  "errors": {
    "signInFailed": "登入失敗",
    "registerFailed": "註冊失敗",
    "draftsLoadFailed": "草稿載入失敗",
    "configsLoadFailed": "設定列表載入失敗",
    "logsLoadFailed": "日誌載入失敗",
    "templateLoadFailed": "設定模板載入失敗",
    "draftCreateFailed": "草稿建立失敗",
    "draftSaveFailed": "草稿儲存失敗",
    "generationFailed": "生成失敗"
  },
  "modes": {
    "frontend": "前端",
    "backend": "後端",
    "dual": "雙端"
  }
}