diff --git a/.gitignore b/.gitignore index b218957..2752eb9 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -node_modules/\n.DS_Store +node_modules/ +.DS_Store diff --git a/README.md b/README.md index 62a6925..77da482 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,83 @@ # chinese2english -> Universal English translation patch for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) third-party plugins. +> Renders Chinese UI text in [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) third-party plugins as English. -Automatically intercepts and translates Chinese UI strings, buttons, dialogs, and labels in third-party community plugins (like `@michengai/dsh-skills-manager`, model routers, etc.) into clean English in real-time. +Most community plugins ship hardcoded Chinese inside their client bundles. Those +strings never reach DSH's locale dictionaries, so they stay Chinese even when the +interface language is English. This plugin translates them at the transport +layer, before any of that code runs. --- -## The Problem It Solves +## How it works -Most DeepSeek Harness community plugins are authored in Chinese with either missing English dictionaries or hardcoded Chinese strings inside their React components. Even when your DSH interface is set to English, those plugins remain in Chinese. +Plugin bundles are served by DSH's `clientModules` service over `/plugins/...`. +This plugin wraps `clientModules.bundleResource`, decodes each JavaScript +response, rewrites the Chinese string literals it can translate, and returns the +result. Because interception happens server-side, it covers every plugin at once, +including combination bundles that carry dozens of them, and it runs before any +plugin code is evaluated. -**`chinese2english`** fixes this globally across all your installed plugins using an intelligent real-time translation observer and comprehensive technical DSH dictionary. +Two deliberate choices: + +- **All-or-nothing literals.** Chinese has no word boundaries, so replacing known + words wherever they appear corrupts larger words (`当前工作区` would become + `Saat IniWorkspace`). A literal is translated only when every Chinese character + in it is covered by a dictionary entry; anything else is left in Chinese, since + half-translated text reads worse than untranslated text. +- **A compile gate.** Each rewritten bundle is parsed with `new Function` before + it is served. If a rewrite ever produced invalid JavaScript, the original bytes + are served instead, so a bad dictionary entry cannot break the UI. + +The client half does one thing: it selects the `en` locale through +`ctx.locale.setLocale`, which persists the preference. It never touches the DOM. --- -## Features +## What it does not cover -- **Real-Time DOM Translation:** Detects dynamically mounted modals, tabs, dialogs, and tooltips and translates Chinese text on the fly. -- **DSH Locale Integration:** Intercepts DSH's `ctx.locale` to provide English fallbacks for untranslated namespaces. -- **Preserves Code Blocks:** Intelligently ignores `
`, ``, inputs, and script tags so actual code and user inputs are never modified.
-- **Zero Configuration:** Works automatically out-of-the-box upon installation.
+Translation works on string literals inside served bundles. Text that arrives
+another way stays as it is:
+
+- Plugin **descriptors** in `package.json` and `README.md` files (marketplace
+ listings, plugin titles).
+- **Server-side API prose** that is fetched as JSON at runtime.
+- The long tail of one-off literals that the dictionary does not yet cover.
+
+The shipped dictionary holds roughly 1,200 entries and covers about 45% of the
+Chinese literals in a typical plugin set. Coverage is concentrated on strings
+that appear repeatedly; rare one-off sentences are usually left in Chinese.
---
## Installation
-Install directly with the official DSH CLI:
-
```bash
dsh plugin --profile web add chinese2english
```
-*(To remove later: `dsh plugin --profile web remove chinese2english`)*
+Remove it with `dsh plugin --profile web remove chinese2english`.
+
+Restart DSH after installing, so the plugin is loaded and its transport wrapper
+is installed before the first bundle request.
+
+---
+
+## Development
+
+```bash
+npm run dict # rebuild src/dictionary.json from its sources
+npm run build # bundle the server and client halves into lib/
+```
+
+Dictionary sources, merged in this order:
+
+1. `dshmarket_dict.json` — harvested pairs.
+2. `UI_TRANSLATIONS` in `patch-plugins.py` — harvested pairs.
+3. `src/dictionary.extra.json` — curated entries, merged last so they win.
+
+Add or fix translations in `src/dictionary.extra.json`, then run
+`npm run dict && npm run build`.
---
diff --git a/lib/client.js b/lib/client.js
index 592f0bc..ee9c6b2 100644
--- a/lib/client.js
+++ b/lib/client.js
@@ -22,368 +22,32 @@ var index_exports = {};
__export(index_exports, {
apply: () => apply,
inject: () => inject,
- name: () => name,
- translateElement: () => translateElement,
- translateText: () => translateText
+ name: () => name
});
module.exports = __toCommonJS(index_exports);
-
-// src/client/dictionary.ts
-var DICTIONARY = {
- // DSH Marketplace & Store
- "\u63D2\u4EF6\u5E02\u573A": "Plugin Marketplace",
- "\u901B\u4E00\u901B\uFF0C\u70B9\u4E00\u4E0B\uFF0C\u88C5\u597D\u3002": "Browse, click, and install.",
- "\u5168\u90E8\u63D2\u4EF6": "All Plugins",
- "\u5DF2\u5B89\u88C5\u63D2\u4EF6": "Installed Plugins",
- "\u63D2\u4EF6": "Plugins",
- "\u5E02\u573A": "Marketplace",
- "\u70ED\u95E8\u63D2\u4EF6": "Popular Plugins",
- "\u6700\u65B0\u4E0A\u67B6": "Recently Added",
- "\u63A8\u8350\u63D2\u4EF6": "Recommended Plugins",
- "\u4E0B\u8F7D\u91CF": "Downloads",
- "\u8BC4\u5206": "Rating",
- "\u4F5C\u8005": "Author",
- "\u5B89\u88C5\u91CF": "Installs",
- "\u5B89\u88C5\u63D2\u4EF6": "Install Plugin",
- "\u5378\u8F7D\u63D2\u4EF6": "Uninstall Plugin",
- "\u66F4\u65B0\u63D2\u4EF6": "Update Plugin",
- "\u7B2C\u4E09\u65B9\u63D2\u4EF6": "Third-Party Plugins",
- "\u5B98\u65B9\u63D2\u4EF6": "Official Plugins",
- "\u641C\u7D22\u63D2\u4EF6": "Search plugins...",
- "\u641C\u7D22\u63D2\u4EF6\u540D\u79F0\u6216\u4F5C\u8005": "Search by plugin name or author...",
- "\u4E00\u952E\u5B89\u88C5": "Install",
- "\u4E00\u952E\u66F4\u65B0": "Update",
- "\u6B63\u5728\u4E0B\u8F7D": "Downloading...",
- "\u6B63\u5728\u5B89\u88C5": "Installing...",
- "\u5B89\u88C5\u5B8C\u6210": "Installed",
- "\u5378\u8F7D\u5B8C\u6210": "Uninstalled",
- // Skills Manager Navigation & Tabs
- "\u6280\u80FD\u7BA1\u7406": "Skills Manager",
- "\u6280\u80FD\u7BA1\u7406\u5668": "Skills Manager",
- "\u7EDF\u4E00\u52A0\u8F7D\u548C\u7BA1\u7406\u672C\u673A Agent Skills\u3002": "Load and manage Agent Skills on this machine in one place.",
- "\u6280\u80FD\u5217\u8868": "Skills List",
- "\u5DF2\u5B89\u88C5\u6280\u80FD": "Installed Skills",
- "\u53EF\u7528\u6280\u80FD": "Available Skills",
- "\u53D1\u73B0\u6280\u80FD": "Discover Skills",
- "\u4ED3\u5E93\u8BA2\u9605": "Repositories",
- "\u4ED3\u5E93\u7BA1\u7406": "Repositories",
- "\u6280\u80FD\u6765\u6E90": "Skill Sources",
- "\u5168\u5C40\u6280\u80FD": "Global Skills",
- "\u9879\u76EE\u6280\u80FD": "Project Skills",
- "\u516C\u5171 Agent": "Shared Agent",
- "\u9879\u76EE Agent": "Project Agent",
- "\u9879\u76EE Skills": "Project Skills",
- "\u4F1A\u8BDD\u6280\u80FD": "Session Skills",
- "\u56DE\u6536\u7AD9": "Trash",
- "\u8BCA\u65AD\u5F02\u5E38": "Diagnostics",
- "\u5F02\u5E38\u8BCA\u65AD": "Diagnostics",
- "\u6E90\u6587\u4EF6\u53EA\u8BFB": "Read-only",
- "\u53EA\u8BFB": "Read-only",
- "\u521B\u5EFA\u4F4D\u7F6E": "Location",
- "\u5168\u5C40 DSH": "Global DSH",
- "\u9879\u76EE DSH": "Project DSH",
- "DSH \u6280\u80FD": "DSH Skills",
- // Actions & Buttons
- "\u521B\u5EFA\u6280\u80FD": "Create Skill",
- "\u521B\u5EFA\u65B0\u6280\u80FD": "Create Skill",
- "\u65B0\u5EFA\u6280\u80FD": "New Skill",
- "\u7ACB\u5373\u521B\u5EFA": "Create Now",
- "\u5BFC\u5165\u6280\u80FD": "Import Skill",
- "\u5BFC\u51FA\u6280\u80FD": "Export Skill",
- "\u5BFC\u5165": "Import",
- "\u5BFC\u51FA": "Export",
- "\u5237\u65B0": "Refresh",
- "\u68C0\u67E5\u66F4\u65B0": "Check Updates",
- "\u6B63\u5728\u68C0\u67E5\u66F4\u65B0\u2026": "Checking for updates...",
- "\u6B63\u5728\u68C0\u67E5\u66F4\u65B0...": "Checking for updates...",
- "\u68C0\u67E5\u5E76\u66F4\u65B0": "Check & Update",
- "\u66F4\u65B0": "Update",
- "\u7BA1\u7406\u66F4\u65B0": "Manage Updates",
- "\u7ACB\u5373\u66F4\u65B0": "Update Now",
- "\u786E\u8BA4\u66F4\u65B0": "Confirm Update",
- "\u56DE\u6EDA": "Rollback",
- "\u786E\u8BA4\u56DE\u6EDA": "Confirm Rollback",
- "\u6062\u590D": "Restore",
- "\u79FB\u5230\u56DE\u6536\u7AD9": "Move to Trash",
- "\u79FB\u5165\u56DE\u6536\u7AD9": "Move to Trash",
- "\u6C38\u4E45\u5220\u9664": "Delete Forever",
- "\u6E05\u7A7A\u56DE\u6536\u7AD9": "Empty Trash",
- "\u5220\u9664": "Delete",
- "\u542F\u7528": "Enable",
- "\u505C\u7528": "Disable",
- "\u5DF2\u542F\u7528": "Enabled",
- "\u5DF2\u505C\u7528": "Disabled",
- "\u5168\u90E8\u542F\u7528": "Enable All",
- "\u5168\u90E8\u505C\u7528": "Disable All",
- "\u542F\u505C\u6765\u6E90": "Toggle Source",
- "\u542F\u505C\u6280\u80FD": "Toggle Skill",
- "\u5B89\u88C5": "Install",
- "\u5DF2\u5B89\u88C5": "Installed",
- "\u5378\u8F7D": "Uninstall",
- "\u67E5\u770B\u8BE6\u60C5": "View Details",
- "\u67E5\u770B\u8BF4\u660E": "View Docs",
- "\u67E5\u770B": "View",
- "\u66F4\u591A": "More",
- "\u53D6\u6D88": "Cancel",
- "\u4FDD\u5B58": "Save",
- "\u5173\u95ED": "Close",
- "\u786E\u5B9A": "OK",
- "\u590D\u5236": "Copy",
- "\u5DF2\u590D\u5236": "Copied",
- "\u590D\u5236\u6210\u529F": "Copied",
- "\u641C\u7D22": "Search",
- "\u91CD\u8BD5": "Retry",
- "\u9009\u62E9\u6587\u4EF6": "Choose File",
- "\u9009\u62E9\u6587\u4EF6\u5939": "Choose Folder",
- "\u95EE\u9898\u53CD\u9988": "Issues",
- "\u8BBE\u7F6E": "Settings",
- // Status & Filters
- "\u5168\u90E8\u6765\u6E90": "All Sources",
- "\u5168\u90E8\u72B6\u6001": "All Statuses",
- "\u8C03\u7528\u72B6\u6001": "Invocation Status",
- "\u72B6\u6001": "Status",
- "\u6765\u6E90": "Source",
- "\u88AB\u8986\u76D6": "Shadowed",
- "\u540D\u79F0": "Name",
- "\u7248\u672C": "Version",
- "\u5927\u5C0F": "Size",
- "\u7C7B\u578B": "Type",
- "\u64CD\u4F5C": "Actions",
- "\u8BE6\u60C5": "Details",
- "\u63CF\u8FF0": "Description",
- "\u7B80\u4ECB": "Description",
- "\u6B63\u6587": "Body",
- "\u6E90\u6587\u4EF6": "Source File",
- "\u66F4\u65B0\u65F6\u95F4": "Updated",
- "\u521B\u5EFA\u65F6\u95F4": "Created",
- "\u5220\u9664\u4E8E": "Deleted at",
- "\u6765\u6E90\uFF1A": "Source: ",
- // Empty & Loading States
- "\u6B63\u5728\u52A0\u8F7D\u6280\u80FD\u2026": "Loading skills...",
- "\u6B63\u5728\u52A0\u8F7D\u6280\u80FD...": "Loading skills...",
- "\u6B63\u5728\u52A0\u8F7D\u2026": "Loading...",
- "\u6B63\u5728\u52A0\u8F7D...": "Loading...",
- "\u52A0\u8F7D\u4E2D\u2026": "Loading...",
- "\u52A0\u8F7D\u4E2D...": "Loading...",
- "\u6B63\u5728\u8BFB\u53D6\u8BF4\u660E\u2026": "Loading documentation...",
- "\u6B63\u5728\u8BFB\u53D6\u8BF4\u660E...": "Loading documentation...",
- "\u6CA1\u6709\u5339\u914D\u7684\u6280\u80FD\u3002": "No matching skills.",
- "\u6CA1\u6709\u5339\u914D\u7684\u6280\u80FD": "No matching skills",
- "\u8BE5\u6765\u6E90\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u6682\u65F6\u6CA1\u6709\u6280\u80FD\u3002": "This source directory does not exist or has no skills.",
- "\u56DE\u6536\u7AD9\u4E3A\u7A7A\u3002": "Trash is empty.",
- "\u56DE\u6536\u7AD9\u4E3A\u7A7A": "Trash is empty",
- "\u6682\u65E0\u6280\u80FD": "No skills available",
- "\u6682\u65E0\u6570\u636E": "No data available",
- "\u672A\u63D0\u4F9B\u7B80\u4ECB": "No description provided",
- "\u672A\u53D1\u73B0\u8BCA\u65AD\u95EE\u9898\u3002": "No diagnostic issues found.",
- // Upload & Import Modal
- "\u62D6\u62FD\u6280\u80FD\u5230\u6B64\u5904": "Drop skill here",
- "\u652F\u6301 .zip\u3001\u6280\u80FD\u6587\u4EF6\u5939\u6216\u5355\u4E2A SKILL.md": "Supports .zip, a skill folder, or single SKILL.md",
- "\u6587\u4EF6\u8981\u6C42": "Requirements",
- "\u538B\u7F29\u5305\u6216\u6587\u4EF6\u5939\u9700\u5305\u542B SKILL.md": "Archives or folders must contain SKILL.md",
- "SKILL.md \u9700\u5305\u542B YAML \u683C\u5F0F\u7684\u6280\u80FD\u540D\u79F0\u548C\u63CF\u8FF0": "SKILL.md must include YAML name and description",
- "\u5BFC\u5165\u65F6\u590D\u5236\u5B8C\u6574\u5185\u5BB9\uFF0C\u4E0D\u4FEE\u6539\u539F\u59CB\u6765\u6E90": "Import copies full content without modifying source",
- "\u5BFC\u5165\u5230\u5168\u5C40 DSH": "Import to global DSH",
- "\u79FB\u9664\u6240\u9009\u5185\u5BB9": "Remove selection",
- "\u8BF7\u9009\u62E9 .zip \u6216\u5355\u4E2A SKILL.md\u3002": "Please choose a .zip or single SKILL.md.",
- "\u6240\u9009\u6587\u4EF6\u5939\u4E2D\u6CA1\u6709\u627E\u5230 SKILL.md\u3002": "No SKILL.md found in the selected folder.",
- // Creation Form
- "\u4F8B\u5982 code-review-helper": "e.g. code-review-helper",
- "\u4E00\u53E5\u8BDD\u8BF4\u660E\u4EC0\u4E48\u65F6\u5019\u4F7F\u7528": "One sentence describing when to use it",
- "\u6B63\u6587\uFF08Markdown\uFF09": "Body (Markdown)",
- "\u5199\u4E0B\u6280\u80FD\u8981\u9075\u5FAA\u7684\u6307\u4EE4\u3001\u6B65\u9AA4\u548C\u8FB9\u754C\u2026": "Write the instructions, steps, and boundaries...",
- "\u521B\u5EFA\u548C\u5BFC\u5165\u5747\u4FDD\u5B58\u5230\u5168\u5C40 DSH\uFF0C\u8DE8\u9879\u76EE\u53EF\u7528\u3002": "Created and imported skills are saved to global DSH and available across projects.",
- // General Settings & UI
- "\u901A\u7528\u8BBE\u7F6E": "General Settings",
- "\u6A21\u578B\u8BBE\u7F6E": "Model Settings",
- "\u5916\u89C2\u8BBE\u7F6E": "Appearance",
- "\u8BED\u8A00\u8BBE\u7F6E": "Language",
- "\u5FEB\u6377\u952E": "Shortcuts",
- "\u5173\u4E8E": "About",
- "\u7248\u672C\u53F7": "Version",
- "\u68C0\u67E5\u65B0\u7248\u672C": "Check for updates",
- "\u8BED\u8A00": "Language",
- "\u7B80\u4F53\u4E2D\u6587": "Simplified Chinese",
- "\u82F1\u6587": "English",
- "\u6DF1\u8272\u6A21\u5F0F": "Dark Mode",
- "\u6D45\u8272\u6A21\u5F0F": "Light Mode",
- "\u8DDF\u968F\u7CFB\u7EDF": "Follow System",
- "\u9000\u51FA": "Exit",
- "\u91CD\u542F": "Restart",
- // Model & Chat Concepts
- "\u6A21\u578B": "Models",
- "\u4F1A\u8BDD": "Sessions",
- "\u65B0\u4F1A\u8BDD": "New Session",
- "\u5386\u53F2\u4F1A\u8BDD": "History",
- "\u5DE5\u4F5C\u533A": "Workspace",
- "\u6682\u65E0\u4F1A\u8BDD": "No sessions",
- "\u53D1\u9001": "Send",
- "\u505C\u6B62\u751F\u6210": "Stop generating",
- "\u91CD\u65B0\u751F\u6210": "Regenerate",
- "\u8017\u65F6": "Duration",
- "\u6B65\u9AA4": "Steps",
- "\u8F6E\u6B21": "Turns"
-};
-var SORTED_PAIRS = Object.entries(DICTIONARY).sort(
- (a, b) => b[0].length - a[0].length
-);
-var DYNAMIC_PATTERNS = [
- [/(\d+)\s*个技能/g, "$1 skills"],
- [/(\d+)\s*个已启用/g, "$1 enabled"],
- [/(\d+)\s*个已停用/g, "$1 disabled"],
- [/(\d+)\s*个被覆盖/g, "$1 shadowed"],
- [/(\d+)\s*个诊断异常/g, "$1 issues"],
- [/(\d+)\s*个文件/g, "$1 files"],
- [/(\d+)\s*个待处理技能/g, "$1 pending skills"],
- [/来源:/g, "Source: "],
- [/创建于\s*([0-9:\-\/ ]+)/g, "Created at $1"],
- [/更新于\s*([0-9:\-\/ ]+)/g, "Updated at $1"],
- [/删除于\s*([0-9:\-\/ ]+)/g, "Deleted at $1"],
- [/被\s*(.+?)\s*覆盖/g, "Shadowed by $1"]
-];
-
-// src/client/index.ts
-var name = "chinese2english-client";
+var name = "chinese2english";
var inject = ["locale"];
-var CHINESE_REGEX = /[\u4e00-\u9fa5]/;
-function translateText(text) {
- if (!text || !CHINESE_REGEX.test(text)) return text;
- const trimmed = text.trim();
- if (DICTIONARY[trimmed]) {
- return text.replace(trimmed, DICTIONARY[trimmed]);
- }
- for (const [pattern, replacement] of DYNAMIC_PATTERNS) {
- if (pattern.test(trimmed)) {
- return text.replace(trimmed, trimmed.replace(pattern, replacement));
- }
- }
- let result = text;
- let changed = false;
- for (const [cn, en] of SORTED_PAIRS) {
- if (cn.length >= 2 && result.includes(cn)) {
- result = result.replaceAll(cn, en);
- changed = true;
- if (!CHINESE_REGEX.test(result)) break;
- }
- }
- return changed ? result : text;
-}
-function translateElement(root) {
- if (!root) return;
- if (root.nodeType === Node.TEXT_NODE) {
- const val = root.nodeValue;
- if (val && CHINESE_REGEX.test(val)) {
- const t = translateText(val);
- if (t !== val) root.nodeValue = t;
- }
+function apply(ctx) {
+ const locale = ctx.locale;
+ if (!locale || typeof locale.setLocale !== "function") {
+ console.warn("[chinese2english] locale service unavailable; UI language left unchanged");
return;
}
- if (root.nodeType !== Node.ELEMENT_NODE) return;
- const el = root;
- const tag = el.tagName;
- if (tag === "SCRIPT" || tag === "STYLE" || tag === "PRE" || tag === "CODE") return;
- for (const attr of ["placeholder", "title", "aria-label", "alt"]) {
- const val = el.getAttribute(attr);
- if (val && CHINESE_REGEX.test(val)) {
- el.setAttribute(attr, translateText(val));
- }
- }
- const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null);
- let textNode = walker.nextNode();
- while (textNode) {
- const val = textNode.nodeValue;
- if (val && CHINESE_REGEX.test(val)) {
- const parent = textNode.parentElement;
- if (parent) {
- const pTag = parent.tagName;
- if (pTag !== "SCRIPT" && pTag !== "STYLE" && pTag !== "PRE" && pTag !== "CODE") {
- const t = translateText(val);
- if (t !== val) textNode.nodeValue = t;
- }
- }
- }
- textNode = walker.nextNode();
- }
-}
-function enforceEnglishStorage() {
- if (typeof window === "undefined" || !window.localStorage) return;
- try {
- for (let i = 0; i < localStorage.length; i++) {
- const key = localStorage.key(i);
- if (key && (key.includes("lang") || key.includes("locale") || key.includes("all-usage") || key.includes("dsh"))) {
- const val = localStorage.getItem(key);
- if (val === "zh" || val === "zh-CN") {
- localStorage.setItem(key, "en");
- }
- }
- }
- } catch {
- }
-}
-function apply(ctx) {
- console.log("[chinese2english] Activating English locale & translation engine...");
- enforceEnglishStorage();
- if (ctx.locale) {
+ const pin = (reason) => {
try {
- if (typeof ctx.locale.setLocale === "function") {
- ctx.locale.setLocale("en");
- }
- if (typeof ctx.locale.resolveActive === "function") {
- ctx.locale.resolveActive = () => "en";
- }
- if (typeof ctx.locale.getSnapshot === "function") {
- const origSnap = ctx.locale.getSnapshot.bind(ctx.locale);
- ctx.locale.getSnapshot = () => {
- const s = origSnap();
- return s ? { ...s, active: "en" } : s;
- };
- }
- if (typeof ctx.locale.publish === "function") {
- ctx.locale.publish("en", true);
- }
- if (typeof ctx.locale.translate === "function") {
- const origTranslate = ctx.locale.translate.bind(ctx.locale);
- ctx.locale.translate = function(ns, key, params) {
- const val = origTranslate(ns, key, params);
- if (typeof val === "string" && CHINESE_REGEX.test(val)) {
- return translateText(val);
- }
- return val;
- };
- }
- if (ctx.locale.dicts && typeof ctx.locale.dicts.entries === "function") {
- for (const [ns, localesMap] of ctx.locale.dicts.entries()) {
- const zh = localesMap?.get("zh");
- let en = localesMap?.get("en");
- if (!en) {
- en = {};
- localesMap?.set("en", en);
- }
- if (zh) {
- for (const [k, v] of Object.entries(zh)) {
- if ((!en[k] || en[k] === k || CHINESE_REGEX.test(en[k])) && typeof v === "string") {
- en[k] = translateText(v) || v;
- }
- }
- }
- }
- }
- } catch (err) {
- console.error("[dsh-plugin-english] Locale patch error:", err);
+ if (locale.getLocale?.().active === "en") return;
+ locale.setLocale("en");
+ } catch (error) {
+ console.error(`[chinese2english] could not select English (${reason}):`, error);
}
- }
- if (typeof document !== "undefined") {
- document.documentElement.lang = "en";
- const observer = new MutationObserver(() => {
- if (document.documentElement.lang !== "en") {
- document.documentElement.lang = "en";
- }
- });
- observer.observe(document.documentElement, { attributes: true, attributeFilter: ["lang"] });
- }
-}
-if (typeof window !== "undefined") {
- enforceEnglishStorage();
+ };
+ pin("initial");
+ ctx.effect(
+ () => ctx.on("locale/change", (snapshot) => {
+ if (snapshot?.active !== "en") pin("locale change");
+ }),
+ "chinese2english: keep the UI locale on English"
+ );
}
return module.exports; } });
//# sourceMappingURL=client.js.map
diff --git a/lib/client.js.map b/lib/client.js.map
index a6b6e11..74d569d 100644
--- a/lib/client.js.map
+++ b/lib/client.js.map
@@ -1,7 +1,7 @@
{
"version": 3,
- "sources": ["../src/client/index.ts", "../src/client/dictionary.ts"],
- "sourcesContent": ["import { DICTIONARY, SORTED_PAIRS, DYNAMIC_PATTERNS } from \"./dictionary.js\";\n\nexport const name = \"chinese2english-client\";\nexport const inject = [\"locale\"];\n\nconst CHINESE_REGEX = /[\\u4e00-\\u9fa5]/;\n\n/**\n * Translates a text string safely without corrupting sentences:\n * 1. Checks exact match on the entire string first.\n * 2. Matches full dynamic count/date patterns.\n * 3. Matches multi-word phrases from longest to shortest (never single characters).\n */\nexport function translateText(text: string): string {\n if (!text || !CHINESE_REGEX.test(text)) return text;\n\n const trimmed = text.trim();\n // 1. Direct exact dictionary match (highest fidelity)\n if (DICTIONARY[trimmed]) {\n return text.replace(trimmed, DICTIONARY[trimmed]);\n }\n\n // 2. Dynamic patterns (e.g. \"3 \u4E2A\u5DF2\u542F\u7528\" -> \"3 enabled\")\n for (const [pattern, replacement] of DYNAMIC_PATTERNS) {\n if (pattern.test(trimmed)) {\n return text.replace(trimmed, trimmed.replace(pattern, replacement));\n }\n }\n\n // 3. Multi-word phrase matches (2+ characters only, longest first)\n let result = text;\n let changed = false;\n for (const [cn, en] of SORTED_PAIRS) {\n if (cn.length >= 2 && result.includes(cn)) {\n result = result.replaceAll(cn, en);\n changed = true;\n if (!CHINESE_REGEX.test(result)) break;\n }\n }\n\n return changed ? result : text;\n}\n\nlet isTranslating = false;\n\n/**\n * Traverses elements using TreeWalker and translates whole text nodes.\n */\nexport function translateElement(root: Node) {\n if (!root) return;\n\n if (root.nodeType === Node.TEXT_NODE) {\n const val = root.nodeValue;\n if (val && CHINESE_REGEX.test(val)) {\n const t = translateText(val);\n if (t !== val) root.nodeValue = t;\n }\n return;\n }\n\n if (root.nodeType !== Node.ELEMENT_NODE) return;\n const el = root as HTMLElement;\n\n const tag = el.tagName;\n // Ignore code, pre, scripts, styles\n if (tag === \"SCRIPT\" || tag === \"STYLE\" || tag === \"PRE\" || tag === \"CODE\") return;\n\n // Attributes (placeholder, title, aria-label)\n for (const attr of [\"placeholder\", \"title\", \"aria-label\", \"alt\"]) {\n const val = el.getAttribute(attr);\n if (val && CHINESE_REGEX.test(val)) {\n el.setAttribute(attr, translateText(val));\n }\n }\n\n // Fast native TreeWalker\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null);\n let textNode = walker.nextNode();\n while (textNode) {\n const val = textNode.nodeValue;\n if (val && CHINESE_REGEX.test(val)) {\n const parent = textNode.parentElement;\n if (parent) {\n const pTag = parent.tagName;\n if (pTag !== \"SCRIPT\" && pTag !== \"STYLE\" && pTag !== \"PRE\" && pTag !== \"CODE\") {\n const t = translateText(val);\n if (t !== val) textNode.nodeValue = t;\n }\n }\n }\n textNode = walker.nextNode();\n }\n}\n\nfunction startDOMTranslator() {\n if (typeof document === \"undefined\") return;\n\n // Force document language to English immediately\n document.documentElement.lang = \"en\";\n\n const queue = new Set();\n let frameRequested = false;\n\n const flush = () => {\n frameRequested = false;\n isTranslating = true;\n try {\n const nodes = Array.from(queue);\n queue.clear();\n for (const n of nodes) {\n if (n.isConnected) translateElement(n);\n }\n } finally {\n isTranslating = false;\n }\n };\n\n const observer = new MutationObserver((mutations) => {\n if (isTranslating) return;\n\n for (const m of mutations) {\n if (m.type === \"childList\") {\n for (let i = 0; i < m.addedNodes.length; i++) {\n queue.add(m.addedNodes[i]);\n }\n } else if (m.type === \"characterData\") {\n if (m.target.nodeValue && CHINESE_REGEX.test(m.target.nodeValue)) {\n queue.add(m.target);\n }\n } else if (m.type === \"attributes\") {\n queue.add(m.target);\n }\n }\n if (!frameRequested && queue.size > 0) {\n frameRequested = true;\n requestAnimationFrame(flush);\n }\n });\n\n const root = document.documentElement || document.body;\n if (root) {\n translateElement(root);\n observer.observe(root, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true,\n attributeFilter: [\"placeholder\", \"title\", \"aria-label\", \"alt\"],\n });\n }\n\n // Periodic safety check every 1s to sweep any lazily mounted modal content\n setInterval(() => {\n if (document.body && !isTranslating) {\n isTranslating = true;\n try {\n translateElement(document.body);\n } finally {\n isTranslating = false;\n }\n }\n }, 1000);\n}\n\n// Force English locale in localStorage across known plugin keys\nfunction enforceEnglishStorage() {\n if (typeof window === \"undefined\" || !window.localStorage) return;\n try {\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && (key.includes(\"lang\") || key.includes(\"locale\") || key.includes(\"all-usage\") || key.includes(\"dsh\"))) {\n const val = localStorage.getItem(key);\n if (val === \"zh\" || val === \"zh-CN\") {\n localStorage.setItem(key, \"en\");\n }\n }\n }\n } catch {}\n}\n\nexport function apply(ctx: any) {\n console.log(\"[chinese2english] Activating English locale & translation engine...\");\n\n enforceEnglishStorage();\n\n // 1. Force DSH core locale service to English\n if (ctx.locale) {\n try {\n // Force active locale to \"en\"\n if (typeof ctx.locale.setLocale === \"function\") {\n ctx.locale.setLocale(\"en\");\n }\n if (typeof ctx.locale.resolveActive === \"function\") {\n ctx.locale.resolveActive = () => \"en\";\n }\n\n // Intercept snapshot\n if (typeof ctx.locale.getSnapshot === \"function\") {\n const origSnap = ctx.locale.getSnapshot.bind(ctx.locale);\n ctx.locale.getSnapshot = () => {\n const s = origSnap();\n return s ? { ...s, active: \"en\" } : s;\n };\n }\n\n // Publish active: \"en\" to trigger all native bilingual plugin updates\n if (typeof ctx.locale.publish === \"function\") {\n ctx.locale.publish(\"en\", true);\n }\n\n // Intercept translate function\n if (typeof ctx.locale.translate === \"function\") {\n const origTranslate = ctx.locale.translate.bind(ctx.locale);\n ctx.locale.translate = function (ns: string, key: string, params: any) {\n const val = origTranslate(ns, key, params);\n if (typeof val === \"string\" && CHINESE_REGEX.test(val)) {\n return translateText(val);\n }\n return val;\n };\n }\n\n // Auto-patch all plugin registered dictionaries with English translations\n if (ctx.locale.dicts && typeof ctx.locale.dicts.entries === \"function\") {\n for (const [ns, localesMap] of ctx.locale.dicts.entries()) {\n const zh = localesMap?.get(\"zh\");\n let en = localesMap?.get(\"en\");\n if (!en) {\n en = {};\n localesMap?.set(\"en\", en);\n }\n if (zh) {\n for (const [k, v] of Object.entries(zh)) {\n if ((!en[k] || en[k] === k || CHINESE_REGEX.test(en[k])) && typeof v === \"string\") {\n en[k] = translateText(v) || v;\n }\n }\n }\n }\n }\n } catch (err) {\n console.error(\"[dsh-plugin-english] Locale patch error:\", err);\n }\n }\n\n // 2. Keep document.documentElement.lang set to \"en\"\n if (typeof document !== \"undefined\") {\n document.documentElement.lang = \"en\";\n const observer = new MutationObserver(() => {\n if (document.documentElement.lang !== \"en\") {\n document.documentElement.lang = \"en\";\n }\n });\n observer.observe(document.documentElement, { attributes: true, attributeFilter: [\"lang\"] });\n }\n\n // 3. DOM translation engine (disabled: direct React DOM mutation causes Market UI crash)\n // startDOMTranslator();\n}\n\n// Start immediately on script load as well\nif (typeof window !== \"undefined\") {\n enforceEnglishStorage();\n}\n", "/**\n * Comprehensive Chinese-to-English translation dictionary for DeepSeek Harness plugins\n */\nexport const DICTIONARY: Record = {\n // DSH Marketplace & Store\n \"\u63D2\u4EF6\u5E02\u573A\": \"Plugin Marketplace\",\n \"\u901B\u4E00\u901B\uFF0C\u70B9\u4E00\u4E0B\uFF0C\u88C5\u597D\u3002\": \"Browse, click, and install.\",\n \"\u5168\u90E8\u63D2\u4EF6\": \"All Plugins\",\n \"\u5DF2\u5B89\u88C5\u63D2\u4EF6\": \"Installed Plugins\",\n \"\u63D2\u4EF6\": \"Plugins\",\n \"\u5E02\u573A\": \"Marketplace\",\n \"\u70ED\u95E8\u63D2\u4EF6\": \"Popular Plugins\",\n \"\u6700\u65B0\u4E0A\u67B6\": \"Recently Added\",\n \"\u63A8\u8350\u63D2\u4EF6\": \"Recommended Plugins\",\n \"\u4E0B\u8F7D\u91CF\": \"Downloads\",\n \"\u8BC4\u5206\": \"Rating\",\n \"\u4F5C\u8005\": \"Author\",\n \"\u5B89\u88C5\u91CF\": \"Installs\",\n \"\u5B89\u88C5\u63D2\u4EF6\": \"Install Plugin\",\n \"\u5378\u8F7D\u63D2\u4EF6\": \"Uninstall Plugin\",\n \"\u66F4\u65B0\u63D2\u4EF6\": \"Update Plugin\",\n \"\u7B2C\u4E09\u65B9\u63D2\u4EF6\": \"Third-Party Plugins\",\n \"\u5B98\u65B9\u63D2\u4EF6\": \"Official Plugins\",\n \"\u641C\u7D22\u63D2\u4EF6\": \"Search plugins...\",\n \"\u641C\u7D22\u63D2\u4EF6\u540D\u79F0\u6216\u4F5C\u8005\": \"Search by plugin name or author...\",\n \"\u4E00\u952E\u5B89\u88C5\": \"Install\",\n \"\u4E00\u952E\u66F4\u65B0\": \"Update\",\n \"\u6B63\u5728\u4E0B\u8F7D\": \"Downloading...\",\n \"\u6B63\u5728\u5B89\u88C5\": \"Installing...\",\n \"\u5B89\u88C5\u5B8C\u6210\": \"Installed\",\n \"\u5378\u8F7D\u5B8C\u6210\": \"Uninstalled\",\n\n // Skills Manager Navigation & Tabs\n \"\u6280\u80FD\u7BA1\u7406\": \"Skills Manager\",\n \"\u6280\u80FD\u7BA1\u7406\u5668\": \"Skills Manager\",\n \"\u7EDF\u4E00\u52A0\u8F7D\u548C\u7BA1\u7406\u672C\u673A Agent Skills\u3002\": \"Load and manage Agent Skills on this machine in one place.\",\n \"\u6280\u80FD\u5217\u8868\": \"Skills List\",\n \"\u5DF2\u5B89\u88C5\u6280\u80FD\": \"Installed Skills\",\n \"\u53EF\u7528\u6280\u80FD\": \"Available Skills\",\n \"\u53D1\u73B0\u6280\u80FD\": \"Discover Skills\",\n \"\u4ED3\u5E93\u8BA2\u9605\": \"Repositories\",\n \"\u4ED3\u5E93\u7BA1\u7406\": \"Repositories\",\n \"\u6280\u80FD\u6765\u6E90\": \"Skill Sources\",\n \"\u5168\u5C40\u6280\u80FD\": \"Global Skills\",\n \"\u9879\u76EE\u6280\u80FD\": \"Project Skills\",\n \"\u516C\u5171 Agent\": \"Shared Agent\",\n \"\u9879\u76EE Agent\": \"Project Agent\",\n \"\u9879\u76EE Skills\": \"Project Skills\",\n \"\u4F1A\u8BDD\u6280\u80FD\": \"Session Skills\",\n \"\u56DE\u6536\u7AD9\": \"Trash\",\n \"\u8BCA\u65AD\u5F02\u5E38\": \"Diagnostics\",\n \"\u5F02\u5E38\u8BCA\u65AD\": \"Diagnostics\",\n \"\u6E90\u6587\u4EF6\u53EA\u8BFB\": \"Read-only\",\n \"\u53EA\u8BFB\": \"Read-only\",\n \"\u521B\u5EFA\u4F4D\u7F6E\": \"Location\",\n \"\u5168\u5C40 DSH\": \"Global DSH\",\n \"\u9879\u76EE DSH\": \"Project DSH\",\n \"DSH \u6280\u80FD\": \"DSH Skills\",\n\n // Actions & Buttons\n \"\u521B\u5EFA\u6280\u80FD\": \"Create Skill\",\n \"\u521B\u5EFA\u65B0\u6280\u80FD\": \"Create Skill\",\n \"\u65B0\u5EFA\u6280\u80FD\": \"New Skill\",\n \"\u7ACB\u5373\u521B\u5EFA\": \"Create Now\",\n \"\u5BFC\u5165\u6280\u80FD\": \"Import Skill\",\n \"\u5BFC\u51FA\u6280\u80FD\": \"Export Skill\",\n \"\u5BFC\u5165\": \"Import\",\n \"\u5BFC\u51FA\": \"Export\",\n \"\u5237\u65B0\": \"Refresh\",\n \"\u68C0\u67E5\u66F4\u65B0\": \"Check Updates\",\n \"\u6B63\u5728\u68C0\u67E5\u66F4\u65B0\u2026\": \"Checking for updates...\",\n \"\u6B63\u5728\u68C0\u67E5\u66F4\u65B0...\": \"Checking for updates...\",\n \"\u68C0\u67E5\u5E76\u66F4\u65B0\": \"Check & Update\",\n \"\u66F4\u65B0\": \"Update\",\n \"\u7BA1\u7406\u66F4\u65B0\": \"Manage Updates\",\n \"\u7ACB\u5373\u66F4\u65B0\": \"Update Now\",\n \"\u786E\u8BA4\u66F4\u65B0\": \"Confirm Update\",\n \"\u56DE\u6EDA\": \"Rollback\",\n \"\u786E\u8BA4\u56DE\u6EDA\": \"Confirm Rollback\",\n \"\u6062\u590D\": \"Restore\",\n \"\u79FB\u5230\u56DE\u6536\u7AD9\": \"Move to Trash\",\n \"\u79FB\u5165\u56DE\u6536\u7AD9\": \"Move to Trash\",\n \"\u6C38\u4E45\u5220\u9664\": \"Delete Forever\",\n \"\u6E05\u7A7A\u56DE\u6536\u7AD9\": \"Empty Trash\",\n \"\u5220\u9664\": \"Delete\",\n \"\u542F\u7528\": \"Enable\",\n \"\u505C\u7528\": \"Disable\",\n \"\u5DF2\u542F\u7528\": \"Enabled\",\n \"\u5DF2\u505C\u7528\": \"Disabled\",\n \"\u5168\u90E8\u542F\u7528\": \"Enable All\",\n \"\u5168\u90E8\u505C\u7528\": \"Disable All\",\n \"\u542F\u505C\u6765\u6E90\": \"Toggle Source\",\n \"\u542F\u505C\u6280\u80FD\": \"Toggle Skill\",\n \"\u5B89\u88C5\": \"Install\",\n \"\u5DF2\u5B89\u88C5\": \"Installed\",\n \"\u5378\u8F7D\": \"Uninstall\",\n \"\u67E5\u770B\u8BE6\u60C5\": \"View Details\",\n \"\u67E5\u770B\u8BF4\u660E\": \"View Docs\",\n \"\u67E5\u770B\": \"View\",\n \"\u66F4\u591A\": \"More\",\n \"\u53D6\u6D88\": \"Cancel\",\n \"\u4FDD\u5B58\": \"Save\",\n \"\u5173\u95ED\": \"Close\",\n \"\u786E\u5B9A\": \"OK\",\n \"\u590D\u5236\": \"Copy\",\n \"\u5DF2\u590D\u5236\": \"Copied\",\n \"\u590D\u5236\u6210\u529F\": \"Copied\",\n \"\u641C\u7D22\": \"Search\",\n \"\u91CD\u8BD5\": \"Retry\",\n \"\u9009\u62E9\u6587\u4EF6\": \"Choose File\",\n \"\u9009\u62E9\u6587\u4EF6\u5939\": \"Choose Folder\",\n \"\u95EE\u9898\u53CD\u9988\": \"Issues\",\n \"\u8BBE\u7F6E\": \"Settings\",\n\n // Status & Filters\n \"\u5168\u90E8\u6765\u6E90\": \"All Sources\",\n \"\u5168\u90E8\u72B6\u6001\": \"All Statuses\",\n \"\u8C03\u7528\u72B6\u6001\": \"Invocation Status\",\n \"\u72B6\u6001\": \"Status\",\n \"\u6765\u6E90\": \"Source\",\n \"\u88AB\u8986\u76D6\": \"Shadowed\",\n \"\u540D\u79F0\": \"Name\",\n \"\u7248\u672C\": \"Version\",\n \"\u5927\u5C0F\": \"Size\",\n \"\u7C7B\u578B\": \"Type\",\n \"\u64CD\u4F5C\": \"Actions\",\n \"\u8BE6\u60C5\": \"Details\",\n \"\u63CF\u8FF0\": \"Description\",\n \"\u7B80\u4ECB\": \"Description\",\n \"\u6B63\u6587\": \"Body\",\n \"\u6E90\u6587\u4EF6\": \"Source File\",\n \"\u66F4\u65B0\u65F6\u95F4\": \"Updated\",\n \"\u521B\u5EFA\u65F6\u95F4\": \"Created\",\n \"\u5220\u9664\u4E8E\": \"Deleted at\",\n \"\u6765\u6E90\uFF1A\": \"Source: \",\n\n // Empty & Loading States\n \"\u6B63\u5728\u52A0\u8F7D\u6280\u80FD\u2026\": \"Loading skills...\",\n \"\u6B63\u5728\u52A0\u8F7D\u6280\u80FD...\": \"Loading skills...\",\n \"\u6B63\u5728\u52A0\u8F7D\u2026\": \"Loading...\",\n \"\u6B63\u5728\u52A0\u8F7D...\": \"Loading...\",\n \"\u52A0\u8F7D\u4E2D\u2026\": \"Loading...\",\n \"\u52A0\u8F7D\u4E2D...\": \"Loading...\",\n \"\u6B63\u5728\u8BFB\u53D6\u8BF4\u660E\u2026\": \"Loading documentation...\",\n \"\u6B63\u5728\u8BFB\u53D6\u8BF4\u660E...\": \"Loading documentation...\",\n \"\u6CA1\u6709\u5339\u914D\u7684\u6280\u80FD\u3002\": \"No matching skills.\",\n \"\u6CA1\u6709\u5339\u914D\u7684\u6280\u80FD\": \"No matching skills\",\n \"\u8BE5\u6765\u6E90\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u6682\u65F6\u6CA1\u6709\u6280\u80FD\u3002\": \"This source directory does not exist or has no skills.\",\n \"\u56DE\u6536\u7AD9\u4E3A\u7A7A\u3002\": \"Trash is empty.\",\n \"\u56DE\u6536\u7AD9\u4E3A\u7A7A\": \"Trash is empty\",\n \"\u6682\u65E0\u6280\u80FD\": \"No skills available\",\n \"\u6682\u65E0\u6570\u636E\": \"No data available\",\n \"\u672A\u63D0\u4F9B\u7B80\u4ECB\": \"No description provided\",\n \"\u672A\u53D1\u73B0\u8BCA\u65AD\u95EE\u9898\u3002\": \"No diagnostic issues found.\",\n\n // Upload & Import Modal\n \"\u62D6\u62FD\u6280\u80FD\u5230\u6B64\u5904\": \"Drop skill here\",\n \"\u652F\u6301 .zip\u3001\u6280\u80FD\u6587\u4EF6\u5939\u6216\u5355\u4E2A SKILL.md\": \"Supports .zip, a skill folder, or single SKILL.md\",\n \"\u6587\u4EF6\u8981\u6C42\": \"Requirements\",\n \"\u538B\u7F29\u5305\u6216\u6587\u4EF6\u5939\u9700\u5305\u542B SKILL.md\": \"Archives or folders must contain SKILL.md\",\n \"SKILL.md \u9700\u5305\u542B YAML \u683C\u5F0F\u7684\u6280\u80FD\u540D\u79F0\u548C\u63CF\u8FF0\": \"SKILL.md must include YAML name and description\",\n \"\u5BFC\u5165\u65F6\u590D\u5236\u5B8C\u6574\u5185\u5BB9\uFF0C\u4E0D\u4FEE\u6539\u539F\u59CB\u6765\u6E90\": \"Import copies full content without modifying source\",\n \"\u5BFC\u5165\u5230\u5168\u5C40 DSH\": \"Import to global DSH\",\n \"\u79FB\u9664\u6240\u9009\u5185\u5BB9\": \"Remove selection\",\n \"\u8BF7\u9009\u62E9 .zip \u6216\u5355\u4E2A SKILL.md\u3002\": \"Please choose a .zip or single SKILL.md.\",\n \"\u6240\u9009\u6587\u4EF6\u5939\u4E2D\u6CA1\u6709\u627E\u5230 SKILL.md\u3002\": \"No SKILL.md found in the selected folder.\",\n\n // Creation Form\n \"\u4F8B\u5982 code-review-helper\": \"e.g. code-review-helper\",\n \"\u4E00\u53E5\u8BDD\u8BF4\u660E\u4EC0\u4E48\u65F6\u5019\u4F7F\u7528\": \"One sentence describing when to use it\",\n \"\u6B63\u6587\uFF08Markdown\uFF09\": \"Body (Markdown)\",\n \"\u5199\u4E0B\u6280\u80FD\u8981\u9075\u5FAA\u7684\u6307\u4EE4\u3001\u6B65\u9AA4\u548C\u8FB9\u754C\u2026\": \"Write the instructions, steps, and boundaries...\",\n \"\u521B\u5EFA\u548C\u5BFC\u5165\u5747\u4FDD\u5B58\u5230\u5168\u5C40 DSH\uFF0C\u8DE8\u9879\u76EE\u53EF\u7528\u3002\": \"Created and imported skills are saved to global DSH and available across projects.\",\n\n // General Settings & UI\n \"\u901A\u7528\u8BBE\u7F6E\": \"General Settings\",\n \"\u6A21\u578B\u8BBE\u7F6E\": \"Model Settings\",\n \"\u5916\u89C2\u8BBE\u7F6E\": \"Appearance\",\n \"\u8BED\u8A00\u8BBE\u7F6E\": \"Language\",\n \"\u5FEB\u6377\u952E\": \"Shortcuts\",\n \"\u5173\u4E8E\": \"About\",\n \"\u7248\u672C\u53F7\": \"Version\",\n \"\u68C0\u67E5\u65B0\u7248\u672C\": \"Check for updates\",\n \"\u8BED\u8A00\": \"Language\",\n \"\u7B80\u4F53\u4E2D\u6587\": \"Simplified Chinese\",\n \"\u82F1\u6587\": \"English\",\n \"\u6DF1\u8272\u6A21\u5F0F\": \"Dark Mode\",\n \"\u6D45\u8272\u6A21\u5F0F\": \"Light Mode\",\n \"\u8DDF\u968F\u7CFB\u7EDF\": \"Follow System\",\n \"\u9000\u51FA\": \"Exit\",\n \"\u91CD\u542F\": \"Restart\",\n\n // Model & Chat Concepts\n \"\u6A21\u578B\": \"Models\",\n \"\u4F1A\u8BDD\": \"Sessions\",\n \"\u65B0\u4F1A\u8BDD\": \"New Session\",\n \"\u5386\u53F2\u4F1A\u8BDD\": \"History\",\n \"\u5DE5\u4F5C\u533A\": \"Workspace\",\n \"\u6682\u65E0\u4F1A\u8BDD\": \"No sessions\",\n \"\u53D1\u9001\": \"Send\",\n \"\u505C\u6B62\u751F\u6210\": \"Stop generating\",\n \"\u91CD\u65B0\u751F\u6210\": \"Regenerate\",\n \"\u8017\u65F6\": \"Duration\",\n \"\u6B65\u9AA4\": \"Steps\",\n \"\u8F6E\u6B21\": \"Turns\",\n};\n\n// Sorted array of [chinese, english] pairs, longest Chinese phrases first\n// (ensures compound phrases are matched before single words)\nexport const SORTED_PAIRS: Array<[string, string]> = Object.entries(DICTIONARY).sort(\n (a, b) => b[0].length - a[0].length\n);\n\n// Dynamic pattern replacements\nexport const DYNAMIC_PATTERNS: Array<[RegExp, string]> = [\n [/(\\d+)\\s*\u4E2A\u6280\u80FD/g, \"$1 skills\"],\n [/(\\d+)\\s*\u4E2A\u5DF2\u542F\u7528/g, \"$1 enabled\"],\n [/(\\d+)\\s*\u4E2A\u5DF2\u505C\u7528/g, \"$1 disabled\"],\n [/(\\d+)\\s*\u4E2A\u88AB\u8986\u76D6/g, \"$1 shadowed\"],\n [/(\\d+)\\s*\u4E2A\u8BCA\u65AD\u5F02\u5E38/g, \"$1 issues\"],\n [/(\\d+)\\s*\u4E2A\u6587\u4EF6/g, \"$1 files\"],\n [/(\\d+)\\s*\u4E2A\u5F85\u5904\u7406\u6280\u80FD/g, \"$1 pending skills\"],\n [/\u6765\u6E90\uFF1A/g, \"Source: \"],\n [/\u521B\u5EFA\u4E8E\\s*([0-9:\\-\\/ ]+)/g, \"Created at $1\"],\n [/\u66F4\u65B0\u4E8E\\s*([0-9:\\-\\/ ]+)/g, \"Updated at $1\"],\n [/\u5220\u9664\u4E8E\\s*([0-9:\\-\\/ ]+)/g, \"Deleted at $1\"],\n [/\u88AB\\s*(.+?)\\s*\u8986\u76D6/g, \"Shadowed by $1\"],\n];\n"],
- "mappings": "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",
+ "sources": ["../src/client/index.ts"],
+ "sourcesContent": ["export const name = \"chinese2english\";\nexport const inject = [\"locale\"];\n\n/**\n * Pins the UI language to English.\n *\n * Hardcoded Chinese inside plugin bundles is handled on the server by the\n * bundle-transport rewrite in `src/index.ts`. Text that flows through the\n * locale service is only English when the active locale is `en`, so this half\n * makes that selection explicit and durable. Walking the DOM is deliberately\n * avoided: it corrupts React trees and cannot reach text that arrives as data.\n */\nexport function apply(ctx: any) {\n const locale = ctx.locale;\n if (!locale || typeof locale.setLocale !== \"function\") {\n console.warn(\"[chinese2english] locale service unavailable; UI language left unchanged\");\n return;\n }\n\n const pin = (reason: string) => {\n try {\n if (locale.getLocale?.().active === \"en\") return;\n locale.setLocale(\"en\");\n } catch (error) {\n console.error(`[chinese2english] could not select English (${reason}):`, error);\n }\n };\n\n pin(\"initial\");\n\n // A late language pack or an external preference can republish the snapshot\n // with another active locale; re-assert English when that happens.\n ctx.effect(\n () =>\n ctx.on(\"locale/change\", (snapshot: any) => {\n if (snapshot?.active !== \"en\") pin(\"locale change\");\n }),\n \"chinese2english: keep the UI locale on English\",\n );\n}\n"],
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAM,OAAO;AACb,IAAM,SAAS,CAAC,QAAQ;AAWxB,SAAS,MAAM,KAAU;AAC9B,QAAM,SAAS,IAAI;AACnB,MAAI,CAAC,UAAU,OAAO,OAAO,cAAc,YAAY;AACrD,YAAQ,KAAK,0EAA0E;AACvF;AAAA,EACF;AAEA,QAAM,MAAM,CAAC,WAAmB;AAC9B,QAAI;AACF,UAAI,OAAO,YAAY,EAAE,WAAW,KAAM;AAC1C,aAAO,UAAU,IAAI;AAAA,IACvB,SAAS,OAAO;AACd,cAAQ,MAAM,+CAA+C,MAAM,MAAM,KAAK;AAAA,IAChF;AAAA,EACF;AAEA,MAAI,SAAS;AAIb,MAAI;AAAA,IACF,MACE,IAAI,GAAG,iBAAiB,CAAC,aAAkB;AACzC,UAAI,UAAU,WAAW,KAAM,KAAI,eAAe;AAAA,IACpD,CAAC;AAAA,IACH;AAAA,EACF;AACF;",
"names": []
}
diff --git a/lib/index.js b/lib/index.js
index 862fed5..01b875d 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -1,6 +1,1515 @@
-const name = "chinese2english";
-const inject = [];
+// src/dictionary.json
+var dictionary_default = {
+ "DSH \u6B63\u5728\u8FD0\u884C\u65F6\u65E0\u6CD5\u66F4\u65B0\uFF0C\u800C\u66F4\u65B0\u524D\u7684\u7248\u672C\u4E5F\u5DF2\u7ECF\u635F\u574F\u3002\u4E3A\u907F\u514D\u4E0B\u6B21\u542F\u52A8\u5361\u4F4F\uFF0C\u5E02\u573A\u628A\u5B83\u4ECE profile \u91CC\u79FB\u9664\u3002\u63D2\u4EF6\u76EE\u5F55\u8FD8\u5728\u539F\u5904\uFF0C\u9000\u51FA DSH \u540E\u91CD\u65B0\u5B89\u88C5\u5373\u53EF\u3002": "DSH cannot be updated while it is running, and the pre-update version is corrupted. To avoid getting stuck on the next launch, the market removes it from the profile. The plugin directory is still in place, just exit DSH and reinstall.",
+ "\u53D6\u6D88\u65F6\uFF0C\u65E7\u7248\u672C\u5DF2\u88AB\u6E05\u6389\u4E00\u90E8\u5206\u3002\u4E3A\u907F\u514D\u4E0B\u6B21\u542F\u52A8\u5361\u4F4F\uFF0C\u5E02\u573A\u628A\u5B83\u4ECE profile \u91CC\u79FB\u9664\u3002\u63D2\u4EF6\u76EE\u5F55\u8FD8\u5728\u539F\u5904\uFF0C\u91CD\u65B0\u5B89\u88C5\u5373\u53EF\uFF1B\u82E5\u518D\u6B21\u5931\u8D25\uFF0C\u5148\u9000\u51FA DSH \u518D\u88C5\u3002": "When cancelled, the old version was partially cleared. To avoid getting stuck on the next launch, the market removes it from the profile. The plugin directory is still in place, just reinstall it; if it fails again, exit DSH and install it again.",
+ "GitHub token\uFF08\u4EC5\u672C\u6B21\u4F1A\u8BDD\u5185\u5B58\uFF0C\u5237\u65B0\u540E\u9700\u91CD\u65B0\u8F93\u5165\uFF1B\u7559\u7A7A\u5219\u4F7F\u7528\u670D\u52A1\u7AEF DSH_GITHUB_TOKEN \u6216\u5DF2\u767B\u5F55\u7684 gh CLI\uFF09": "GitHub token (only the memory of this session needs to be re-entered after refreshing; leave blank to use the server DSH_GITHUB_token or the logged-in gh CLI)",
+ "\u5C06\u5220\u9664\uFF1A\u5E02\u573A\u7684\u505C\u7528\u6E05\u5355\u4E0E\u81EA\u5B9A\u4E49\u5206\u7EC4\uFF0C\u4EE5\u53CA\u5B83\u5199\u8FDB\u914D\u7F6E\u6587\u4EF6\u7684\u505C\u7528\u8BB0\u5F55\u2014\u2014\u88AB\u505C\u7528\u7684\u63D2\u4EF6\u5C06\u6062\u590D\u8FD0\u884C\u3002\u4E0D\u6D89\u53CA\u5BC6\u7801\u6216\u5BC6\u94A5\uFF0C\u5E02\u573A\u4ECE\u4E0D\u628A\u5B83\u4EEC\u5B58\u5728\u78C1\u76D8\u4E0A\u3002": "Will delete: the deactivation list of the market with the custom grouping, and the deactivation record it writes to the profile - the deactivated plugin will resume operation. There are no passwords or keys involved, and the market never stores them on disk.",
+ "\u8BC4\u8BBA\u6765\u81EA GitHub Discussions\u3002\u6253\u5F00\u540E\u4F1A\u8FDE\u63A5 giscus.app \u4E0E GitHub\uFF1B\u53D1\u8868\u8BC4\u8BBA\u9700\u8981 GitHub \u8D26\u53F7\u3002": "Comment from GitHub Discussions. Opening it will connect giscus.app to GitHub; a GitHub account is required to leave a comment.",
+ "\u6709 Agent \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5B83\u5B8C\u6210\u6216\u5148\u53D6\u6D88\uFF0C\u518D\u66F4\u65B0\u2014\u2014\u66F4\u65B0\u4F1A\u76F4\u63A5\u66FF\u6362\u63D2\u4EF6\u6587\u4EF6\uFF0C\u8FD0\u884C\u4E2D\u7684 Agent \u53EF\u80FD\u4E2D\u9014\u62A5\u9519\u6216\u65B0\u65E7\u7248\u672C\u6DF7\u7528\u3002": "There is an agent running, please wait for it to complete or cancel before updating - the update will directly replace the plugin file. The running agent may report errors or mix old and new versions.",
+ "\u5F53\u524D\u4F1A\u8BDD\u5DF2\u88AB\u5360\u7528\uFF0C\u53EF\u80FD\u662F\u5176\u4ED6\u6B63\u5728\u8FD0\u884C\u7684 DSH \u5BFC\u81F4\u7684\uFF08\u5982\u5176\u4ED6 dsh web\u3001\u684C\u9762\u7AEF\uFF09\uFF0C\u8BF7\u9000\u51FA\u5176\u4ED6\u6B63\u5728\u8FD0\u884C\u7684 DSH \u540E\u91CD\u8BD5\u3002": "This session is already in use, possibly by another running DSH instance (such as another dsh web or the desktop app). Quit the other DSH instances and try again.",
+ "\u5DF2\u5B89\u88C5\uFF0C\u4F46\u4E0D\u662F\u6700\u65B0\u7248\uFF1A\u8FD9\u4E2A profile \u7684 minimumReleaseAge \u6321\u4F4F\u4E86 {0}\uFF0C\u5B89\u88C5\u7684\u662F {1}\u3002": "Installed, but not the latest version: This profile's minimumReleaseAge blocks {0}, installing {1}.",
+ "npm \u8FD130\u5929\u6EDA\u52A8\u4E0B\u8F7D\u91CF\uFF1A{0}\u3002\u8FD9\u4E0D\u662F\u7D2F\u8BA1\u4E0B\u8F7D\u91CF\uFF0C\u4E5F\u4E0D\u4EE3\u8868\u72EC\u7ACB\u7528\u6237\u6570\u3002\u7EDF\u8BA1\u53EF\u80FD\u5EF6\u8FDF\uFF0C\u6765\u6E90\u6838\u9A8C\u65F6\u95F4\u4E0D\u4FDD\u8BC1\u6570\u636E\u5B8C\u6574\u3002": "npm rolling downloads in the last 30 days: {0}. This is not a cumulative download and does not represent the number of unique users. Statistics may be delayed, and the source verification time does not guarantee the completeness of the data.",
+ "\u5F53\u524D dsh \u8FDB\u7A0B\u6B63\u88AB\u8C03\u8BD5\u5668\u8FDE\u63A5\u3002\u8BF7\u4ECE IDE \u6216\u7EC8\u7AEF\u505C\u6B62\u8BE5\u8FDB\u7A0B\u540E\u91CD\u65B0\u542F\u52A8\uFF0C\u5E02\u573A\u4E0D\u80FD\u4ECE\u754C\u9762\u91CC\u7ED3\u675F\u6B63\u5728\u8C03\u8BD5\u7684 dsh\u3002": "The current dsh process is being connected by the debugger. Please restart the process after stopping it from the IDE or terminal, the market cannot end the dsh being debugged from the interface.",
+ "\u5728\u8FD9\u91CC\u767B\u5F55\u4F1A\u79BB\u5F00\u672C\u9875\uFF0C\u8FD4\u56DE\u65F6\u9700\u91CD\u65B0\u6253\u5F00 dsh web\u2014\u2014\u8FD9\u4E0D\u662F\u6545\u969C\u3002\u53D1\u8868\u8BC4\u8BBA\u8BF7\u5230 GitHub\uFF0C\u672C\u9875\u53EA\u7528\u4E8E\u9605\u8BFB\u3002": "Logging in here will leave this page, and you will need to reopen the dsh web when you return - this is not a glitch. Leave a comment on GitHub, this page is for reading only.",
+ "\u6709 Agent \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5B83\u5B8C\u6210\u6216\u5148\u53D6\u6D88\uFF0C\u518D\u5B89\u88C5\u2014\u2014\u5B89\u88C5\u4F1A\u6539\u52A8\u63D2\u4EF6\u6587\u4EF6\uFF0C\u8FD0\u884C\u4E2D\u7684 Agent \u53EF\u80FD\u4E2D\u9014\u62A5\u9519\u3002": "There is an Agent running, please wait for it to complete or cancel before installing--Installation will change the plugin file, and the running Agent may report errors halfway.",
+ "\u8FD9\u4E9B\u76EE\u5F55\u4E0D\u88AB\u4EFB\u4F55\u63D2\u4EF6\u4F7F\u7528\uFF0C\u4E5F\u4E0D\u5F71\u54CD\u542F\u52A8\uFF0C\u662F\u66F4\u65B0\u4E2D\u65AD\u540E\u7559\u4E0B\u7684\u3002\u9000\u51FA DSH \u540E\u53EF\u4EE5\u5220\u9664\uFF0C\u6216\u91CD\u65B0\u5B89\u88C5\u5BF9\u5E94\u7684\u63D2\u4EF6\u3002": "These directories are not used by any plugins and do not affect startup, they are left after the update is interrupted. After exiting DSH, you can remove or reinstall the corresponding plugin.",
+ "\u53E6\u4E00\u4E2A\u5B89\u88C5\u3001\u66F4\u65B0\u6216\u5378\u8F7D\u8FD8\u5728\u8FDB\u884C\uFF0C\u73B0\u5728\u8FD8\u4E0D\u80FD\u5F00\u59CB\uFF1A\u8FD9\u4E00\u6761\u7559\u5728\u961F\u5217\u91CC\uFF0C\u7B49\u5B83\u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u5F00\u59CB\uFF0C\u4E0D\u9700\u8981\u518D\u70B9\u4E00\u6B21\u3002": "Another installation, update or uninstallation is still in progress and cannot be started yet: this one stays in the queue and will start automatically once it is completed, no need to click again.",
+ "\u672C\u6B21\u91CD\u542F\u6CA1\u6709\u6210\u529F\uFF0Cdsh \u5DF2\u7ECF\u9000\u51FA\u3002\u52FE\u9009\u4F60\u5E0C\u671B\u4E0B\u6B21\u542F\u52A8\u65F6\u542F\u7528\u7684\u63D2\u4EF6\uFF1B\u672C\u6B21\u542F\u52A8\u62A5\u9519\u7684\u63D2\u4EF6\u5DF2\u6807\u7EA2\u5E76\u53D6\u6D88\u52FE\u9009\u3002": "This reboot was unsuccessful and dsh has exited. Check the plugin that you want to enable the next time you start; the plugin that reported an error on this startup has been red and unchecked.",
+ "\u8FD9\u4E00\u6761\u8981\u88C5\u7684\u63D2\u4EF6\u5728\u5F53\u524D\u76EE\u5F55\u91CC\u627E\u4E0D\u5230\u4E86\uFF08\u76EE\u5F55\u5237\u65B0\u8FC7\u6216\u6362\u4E86\u9875\uFF09\uFF0C\u5DF2\u4ECE\u961F\u5217\u79FB\u9664\u3002\u8BF7\u5728\u76EE\u5F55\u91CC\u91CD\u65B0\u627E\u5230\u5B83\u518D\u88C5\u4E00\u6B21\u3002": "This plugin to be installed cannot be found in the current directory (the directory has been refreshed or changed pages), it has been removed from the queue. Please find it again in the catalog and install it again.",
+ "cordis \u4E0D\u63A5\u53D7\u91CD\u590D\u7684\u6761\u76EE id\uFF0C\u4FDD\u7559\u5B83\u4F1A\u8BA9 DeepSeek Harness \u4E0B\u6B21\u542F\u52A8\u5931\u8D25\u3002": "cordis does not accept duplicate entry ids, keeping it will cause DeepSeek Harness to fail the next time it starts.",
+ "\u63D2\u4EF6\u628A DSH \u81EA\u5E26\u7684\u516C\u5171\u5305\u5217\u8FDB\u4E86\u4F9D\u8D56\uFF0C\u53EF\u80FD\u548C DSH \u81EA\u5DF1\u7684\u7248\u672C\u4E92\u76F8\u5E72\u6270\uFF08\u4EC5\u4F9D\u636E\u58F0\u660E\uFF0C\u672A\u786E\u8BA4\uFF09\uFF1A": "The plugin lists the public packages that come with DSH as dependencies, which may interfere with DSH's own version (by declaration only, unconfirmed):",
+ "\u7B49\u5F85 DeepSeek Harness \u542F\u52A8\u8D85\u65F6\u3002\u53EF\u70B9\u300C\u8C03\u6574\u63D2\u4EF6\u300D\uFF0C\u68C0\u67E5\u662F\u5426\u67D0\u4E2A\u63D2\u4EF6\u5BFC\u81F4\u65E0\u6CD5\u542F\u52A8\u3002": 'Timeout waiting for DeepSeek Harness to start. Click "Adjust Plugin" to check if a plugin cannot be started.',
+ "\u8BF7\u5E2E\u6211\u4FEE\u590D DeepSeek Harness \u7684\u63D2\u4EF6\u95EE\u9898\uFF08profile\uFF1A{0}\uFF09\u3002\u8BCA\u65AD\u53D1\u73B0\u5982\u4E0B\uFF1A": "Please help me fix a plugin issue for DeepSeek Harness (profile: {0}). The diagnostic findings are as follows:",
+ "\u5DF2\u4E0B\u8F7D\u5B8C\u6210\u3002\u91CD\u542F DeepSeek Harness \u540E\u65B0\u7248\u672C\u624D\u4F1A\u751F\u6548\u2014\u2014\u9875\u9762\u4F1A\u5148\u663E\u793A\u65B0\u7248\u672C\u53F7\u3002": "Download complete. Restart DeepSeek Harness to activate the update.",
+ "\u7CBE\u9009\u76EE\u5F55\u91CC\u6709\u540C\u540D\u63D2\u4EF6\uFF0C\u4F46\u4E0E\u4F60\u672C\u5730\u4ED3\u5E93\u4E0D\u4E00\u81F4\uFF0C\u65E0\u6CD5\u5B89\u5168\u6062\u590D\u3002\u53EF\u4EE5\u5378\u8F7D\u672C\u5730\u7248\uFF0C\u6216\u7EE7\u7EED\u7528\u672C\u5730\u5F00\u53D1\u3002": "There is a plugin with the same name in the featured directory, but it does not match your local repository and cannot be safely recovered. You can uninstall the local version or continue with local development.",
+ "\u8BE5\u63D2\u4EF6\u9700\u8981\u8FD0\u884C\u6784\u5EFA\u811A\u672C\u624D\u80FD\u5DE5\u4F5C\uFF0C\u51FA\u4E8E\u5B89\u5168\u8003\u8651\u5DF2\u9ED8\u8BA4\u963B\u6B62\u3002\u786E\u8BA4\u6765\u6E90\u53EF\u4FE1\u540E\uFF0C\u53EF\u653E\u884C\u5E76\u91CD\u65B0\u5B89\u88C5\uFF1A": "The plugin requires a build script to run in order to work and has been blocked by default for security reasons. Once the source is verified, it can be released and reinstalled:",
+ "\u628A\u5F53\u524D\u7684\u63D2\u4EF6\u987A\u5E8F\u548C\u5DF2\u505C\u7528\u7684\u63D2\u4EF6\u4FDD\u5B58\u4E3A\u7EC4\u5408\uFF0C\u968F\u65F6\u5207\u6362\uFF1B\u5E94\u7528\u524D\u4F1A\u5148\u8BD5\u542F\u52A8\u4E00\u6B21\u5E76\u81EA\u52A8\u521B\u5EFA\u5FEB\u7167\u3002": "Save the current plugin order and deactivated plugins as a combination and switch at any time; try to launch it once and automatically create a snapshot before applying.",
+ "WebDAV \u5730\u5740\u4E0E\u7528\u6237\u540D\u4EC5\u4FDD\u5B58\u5728\u5F53\u524D\u6D4F\u89C8\u5668\uFF1B\u5BC6\u7801\u53EA\u5B58\u4E8E\u670D\u52A1\u7AEF\uFF0C\u6BCF\u6B21\u4F1A\u8BDD\u9700\u91CD\u65B0\u8F93\u5165\u3002": "The WebDAV address and username are only saved in the current browser; the password is only stored on the server side and needs to be re-entered each session.",
+ "\u8FD8\u6CA1\u6709\u6536\u85CF\u3002\u5728\u300C\u53D1\u73B0\u300D\u6216\u300C\u4E3B\u9898\u300D\u91CC\u70B9\u4E66\u7B7E\u56FE\u6807\uFF0C\u6216\u5728\u300C\u5DF2\u5B89\u88C5\u300D\u7684\u300C\xB7\xB7\xB7\u300D\u91CC\u52A0\u5165\u6536\u85CF\u3002": "No favorites yet. Tap the bookmark icon in Discover or Themes, or add a collection to Installed.",
+ "\u4FDD\u7559\u5E02\u573A\u6570\u636E\u3002\u6CE8\u610F\uFF1A\u88AB\u5E02\u573A\u505C\u7528\u7684\u63D2\u4EF6\u4F1A\u4FDD\u6301\u505C\u7528\uFF0C\u4E14\u79FB\u9664\u540E\u5C06\u6CA1\u6709\u754C\u9762\u53EF\u5C06\u5176\u91CD\u65B0\u542F\u7528\u3002": "Keep market data. Note: Plugins that are deactivated by the market will remain deactivated and there will be no interface to re-enable them once removed.",
+ "\u5C06\u8BCA\u65AD\u95EE\u9898\u4EA4\u7531\u65B0\u5BF9\u8BDD\u4E2D\u7684 Agent \u4FEE\u590D\uFF08\u5185\u5BB9\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F\uFF0C\u7531\u4F60\u51B3\u5B9A\u662F\u5426\u53D1\u9001\uFF09": "Refer the diagnostic issue to the Agent in the new conversation for repair (the content has been copied to the clipboard and you decide whether to send it or not)",
+ "\u76EE\u5F55\u8BB0\u5F55\u7684 npm \u7248\u672C\uFF1B\u76EE\u5F55\u6BCF\u65E5\u5237\u65B0\uFF0C\u53EF\u80FD\u6EDE\u540E\u4E8E npm \u4E0A\u7684\u5B9E\u9645 latest": "The npm version of the directory record; the directory is refreshed daily and may lag behind the actual latest on npm",
+ "\u5168\u9009 = \u5B8C\u6574\u5907\u4EFD\uFF08\u542B\u914D\u7F6E\u6587\u4EF6\uFF09\uFF1B\u5426\u5219\u53EA\u5BFC\u51FA\u52FE\u9009\u7684\u63D2\u4EF6\uFF0C\u53EF\u53E6\u52FE\u300C\u5305\u542B\u914D\u7F6E\u6587\u4EF6\u300D\u3002": 'Select All = Full backup (including configuration files); otherwise, only checked plug-ins can be exported, and "Include configuration files" can be checked separately.',
+ "\u5B89\u88C5\u6765\u6E90\u662F\u53E6\u4E00\u53F0\u7535\u8111\u4E0A\u7684\u672C\u5730\u8DEF\u5F84\uFF0C\u672C\u673A\u627E\u4E0D\u5230\u3002\u8BF7\u91CD\u65B0\u5B89\u88C5\u8BE5\u63D2\u4EF6\uFF0C\u6216\u6539\u4E3A\u672C\u673A\u8DEF\u5F84": "The installation source is a local path on another computer, which the machine cannot find. Please reinstall the plugin or change to the native path",
+ "\u5DF2\u5378\u8F7D\uFF0C\u4F46 pnpm \u5728\u6536\u5C3E\u9636\u6BB5\u62A5\u9519\uFF08\u901A\u5E38\u662F\u6587\u4EF6\u88AB\u5360\u7528\uFF09\uFF1B\u914D\u7F6E\u5DF2\u540C\u6B65\uFF0C\u65E0\u9700\u91CD\u8BD5": "Uninstalled, but pnpm reported an error at the closing stage (usually the file is occupied); the configuration is synchronized, no need to retry",
+ "\u7CBE\u9009\u76EE\u5F55\u91CC\u6CA1\u6709\u8FD9\u4E2A\u63D2\u4EF6\uFF0C\u65E0\u6CD5\u6062\u590D\u5230\u7EBF\u4E0A\u7248\u672C\u3002\u53EF\u4EE5\u5378\u8F7D\u672C\u5730\u7248\uFF0C\u6216\u7EE7\u7EED\u7528\u672C\u5730\u5F00\u53D1\u3002": "This plugin is not available in the featured directory and cannot be restored to the online version. You can uninstall the local version or continue with local development.",
+ "\u4EC5\u5305\u542B\u63D2\u4EF6\u6E05\u5355\u548C profile \u914D\u7F6E\uFF0C\u4E0D\u542B\u63D2\u4EF6\u6587\u4EF6\uFF1B\u6062\u590D\u65F6\u6309\u6E05\u5355\u91CD\u65B0\u5B89\u88C5\u3002": "Only the plugin manifest and profile configuration are included, no plugin files are included; reinstall according to the manifest when restoring.",
+ "\u65E5\u5FD7\u5DF2\u5BFC\u51FA\uFF1Adsh-market-log.txt\uFF0C\u8BF7\u5C06\u5176\u9644\u5728 issue \u4E2D": "Log exported: dsh-market-log.txt, please attach it to issue",
+ "\u76EE\u5F55\uFF08{0} \u5237\u65B0\uFF09\u8BB0\u5F55\u7684 npm \u7248\u672C\uFF1B\u4E4B\u540E\u53D1\u5E03\u7684\u7248\u672C\u8981\u7B49\u4E0B\u6B21\u5237\u65B0\u624D\u4F1A\u51FA\u73B0": "The npm version of the directory ({0} refresh) record; subsequent releases will not appear until the next refresh",
+ "\u793E\u533A bundle \u52A0\u8F7D\u987A\u5E8F\u4E0E\u63D2\u4EF6\u58F0\u660E\u7684 before/after \u89C4\u5219\u51B2\u7A81": "The community bundle loading order conflicts with the before/after rules declared by the plugin",
+ "GitHub \u8BA4\u8BC1\u5931\u8D25\uFF1AToken \u65E0\u6548\u3001\u5DF2\u8FC7\u671F\uFF0C\u6216 gh CLI \u672A\u767B\u5F55": "GitHub authentication failed: Token is invalid, expired, or gh CLI is not logged in",
+ "\u8BE5\u987A\u5E8F\u4F1A\u6539\u53D8\u7EC4\u5408\uFF1A{0} \u5904\u8986\u76D6\u3001{1} \u4E2A\u65E0\u6548\u6761\u76EE\u3001{2} \u4E2A\u91CD\u590D\u6761\u76EE": "This order changes the combination: {0} overrides, {1} invalid entries, {2} duplicate entries",
+ "Agent \u6B63\u5FD9\uFF0C\u5DF2\u6392\u961F\uFF0C\u7A7A\u95F2\u540E\u81EA\u52A8\u5378\u8F7D\uFF08\u53EF\u5728\u53F3\u4E0A\u89D2\u300C\u4EFB\u52A1\u300D\u91CC\u53D6\u6D88\uFF09\u3002": "Agent is busy, queued, and uninstalled automatically when idle (can be canceled in Tasks in the top right corner).",
+ "Agent \u6B63\u5FD9\uFF0C\u5DF2\u6392\u961F\uFF0C\u7A7A\u95F2\u540E\u81EA\u52A8\u5B89\u88C5\uFF08\u53EF\u5728\u53F3\u4E0A\u89D2\u300C\u4EFB\u52A1\u300D\u91CC\u53D6\u6D88\uFF09\u3002": 'The agent is busy, queued, and automatically installed when it is free (can be canceled in the "Tasks" in the top right corner).',
+ "Agent \u6B63\u5FD9\uFF0C\u5DF2\u6392\u961F\uFF0C\u7A7A\u95F2\u540E\u81EA\u52A8\u66F4\u65B0\uFF08\u53EF\u5728\u53F3\u4E0A\u89D2\u300C\u4EFB\u52A1\u300D\u91CC\u53D6\u6D88\uFF09\u3002": 'The agent is busy, queued, and will automatically update when it is free (can be canceled in the "Tasks" in the top right corner).',
+ "\u56DE\u6EDA\u4F1A\u7528\u5FEB\u7167\u8986\u76D6\u5F53\u524D\u7684\u63D2\u4EF6\u4E0E\u914D\u7F6E\uFF0C\u4E14\u4E0D\u53EF\u64A4\u9500\uFF08\u53EF\u5148\u521B\u5EFA\u65B0\u5FEB\u7167\u518D\u56DE\u6EDA\uFF09\u3002": "Rollbacks overwrite the current plugin and configuration with a snapshot and are irreversible (you can create a new snapshot before rolling back).",
+ "\u6B63\u5728\u91CD\u542F\uFF1Adsh \u542F\u52A8\u540E\u672C\u9875\u4F1A\u5237\u65B0\uFF1B\u82E5\u53C8\u5931\u8D25\uFF0C\u4F1A\u5E26\u7740\u65B0\u7684\u62A5\u9519\u56DE\u5230\u8FD9\u91CC\u3002": "Restarting: This page will refresh after dsh starts; if it fails again, it will return here with a new error report.",
+ "\u7531\u73AF\u5883\u53D8\u91CF DSHM_GITHUB_PROXY \u7BA1\u7406\uFF0C\u754C\u9762\u4E2D\u4E0D\u53EF\u4FEE\u6539\u3002": "Managed by DSHM_GITHUB_PROXY environment variable.",
+ "\u4E0B\u9762\u6807\u7EA2\u7684\u63D2\u4EF6\u5728\u672C\u6B21\u542F\u52A8\u65F6\u62A5\u4E86\u9519\uFF0C\u53D6\u6D88\u52FE\u9009\u540E\u4E0B\u6B21\u542F\u52A8\u4E0D\u518D\u542F\u7528\u5B83\u4EEC\u3002": "The plugins marked red below reported an error on this startup, and they will not be enabled on the next startup after unchecking them.",
+ "\u91CD\u542F\u65B9\u5F0F\uFF1A\u5173\u95ED\u5F53\u524D dsh \u8FDB\u7A0B\u540E\u91CD\u65B0\u8FD0\u884C\uFF08\u4F8B\u5982 dsh web\uFF09": "Restart method: Run again after closing the current dsh process (e.g. dsh web)",
+ "\u5C06\u5378\u8F7D\u672C\u5730\u7248\u672C\u5E76\u5B89\u88C5\u7EBF\u4E0A\u7248\u672C\uFF0C\u4E4B\u540E\u7167\u5E38\u68C0\u67E5\u66F4\u65B0\u3002\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002": "The local version will be uninstalled and the online version will be installed, after which the update will be checked as usual. This action cannot be undone.",
+ "\u5DF2\u6309 DSH {0} \u7B5B\u9009\uFF1B\u672A\u58F0\u660E\u6216\u65E0\u6CD5\u786E\u8BA4\u517C\u5BB9\u6027\u7684\u63D2\u4EF6\u4ECD\u4F1A\u663E\u793A": "Filtered by DSH {0}; undeclared or incompatible plugins will still show",
+ "\u6062\u590D\u5C06\u8986\u76D6\u5F53\u524D profile \u914D\u7F6E\u5E76\u91CD\u65B0\u5B89\u88C5\u63D2\u4EF6\uFF0C\u786E\u5B9A\u7EE7\u7EED\u5417\uFF1F": "Restoring will overwrite the current profile configuration and reinstall the plugin, are you sure you want to continue?",
+ "\u6B63\u5728\u68C0\u67E5\u5BBF\u4E3B\u8981\u6C42 {0}/{1}\uFF1B\u672A\u58F0\u660E\u6216\u65E0\u6CD5\u786E\u8BA4\u7684\u63D2\u4EF6\u4ECD\u4F1A\u663E\u793A": "Checking host requirements {0}/{1}; undeclared or unconfirmed plugins will still be displayed",
+ "\u8BE5 npm \u5305\u53EF\u80FD\u7531\u5176\u4ED6\u4EBA\u53D1\u5E03\uFF0C\u5E76\u975E\u540C\u4E00\u63D2\u4EF6\uFF1B\u786E\u8BA4\u53EF\u4FE1\u540E\u518D\u7EE7\u7EED\u3002": "The npm package may be published by someone else and is not the same plugin; confirm it is trusted before proceeding.",
+ "\u4E00\u7EC4\u53EA\u6709\u4E00\u4E2A\u4E3B\u9898\u3002\u9009\u62E9\u4E0D\u4F1A\u542F\u7528\u5B83\uFF0C\u66F4\u6362\u4F1A\u628A\u539F\u6765\u7684\u4E3B\u9898\u79FB\u51FA\u8BE5\u7EC4\u3002": "A group has only one subject. Choosing not to enable it and replacing it will move the original topic out of the group.",
+ "\u5E94\u7528\u53D8\u66F4\u524D\u4F1A\u81EA\u52A8\u521B\u5EFA\u5FEB\u7167\uFF1B\u4E5F\u53EF\u624B\u52A8\u521B\u5EFA\uFF0C\u968F\u65F6\u56DE\u6EDA\u5230\u4EFB\u610F\u72B6\u6001\u3002": "Snapshots are automatically created before changes are applied, or they can be created manually and rolled back to any state at any time.",
+ "\u6392\u961F\u65F6\u5B83\u8FD8\u5728\u5DF2\u5B89\u88C5\u5217\u8868\u91CC\uFF0C\u73B0\u5728\u5DF2\u4E0D\u5728\uFF0C\u56E0\u6B64\u8DF3\u8FC7\uFF08\u6CA1\u6709\u5378\u8F7D\uFF09\u3002": "It was still in the installed list at the time of queuing and is no longer there, so it was skipped (not uninstalled).",
+ "\u4ECE\u8FD9\u4E2A profile \u5378\u8F7D\u5E02\u573A\u3002\u5DF2\u88C5\u7684\u5176\u5B83\u63D2\u4EF6\u4E0D\u53D7\u5F71\u54CD\u3002": "Uninstall the market from this profile. Other installed plugins are not affected.",
+ "\u672C\u9875\u68C0\u67E5\u63D2\u4EF6\u51B2\u7A81\u3001\u4F9D\u8D56\u7248\u672C\u4E0D\u5339\u914D\u4E0E\u52A0\u8F7D\u987A\u5E8F\u95EE\u9898\u3002\u5E38\u7528\u672F\u8BED\uFF1A": "This page checks for plugin conflicts, dependency version mismatches, and loading order issues. Common terms:",
+ "\u68C0\u6D4B\u5230\u517C\u5BB9\u6027\u98CE\u9669\uFF0C\u5EFA\u8BAE\u91CD\u542F\u524D\u5230\u8BCA\u65AD\u9875\u5904\u7406\uFF0C\u6216\u56DE\u6EDA\u672C\u6B21\u64CD\u4F5C\u3002": "Compatibility risk detected, it is recommended to go to the diagnostics page before restarting, or roll back this operation.",
+ "\u9759\u6001\u626B\u63CF\u53EA\u80FD\u8BC1\u660E\u300C\u6709\u300D\uFF0C\u4E0D\u80FD\u8BC1\u660E\u300C\u6CA1\u6709\u300D\u3002\u8FD9\u4E0D\u4EE3\u8868\u5B83\u5B89\u5168\u3002": "A static scan can only prove yes, not no. This does not mean it is safe.",
+ "SKILL.md \u9700\u5305\u542B YAML \u683C\u5F0F\u7684\u6280\u80FD\u540D\u79F0\u548C\u63CF\u8FF0": "SKILL.md must include YAML name and description",
+ "\u4E0B\u5217\u63D2\u4EF6\u7684\u754C\u9762\u6587\u4EF6\u5DF2\u635F\u574F\uFF0C\u5237\u65B0\u540E\u9875\u9762\u53EF\u80FD\u7A7A\u767D\uFF0C\u5EFA\u8BAE\u56DE\u6EDA\uFF1A": "The interface files of the following plugins are corrupted. After refreshing, the page may be blank. It is recommended to roll back:",
+ "\u52A0\u8F7D\u987A\u5E8F = \u63D2\u4EF6\u88AB\u6FC0\u6D3B\u7684\u5148\u540E\uFF0C\u540E\u52A0\u8F7D\u8005\u53EF\u80FD\u8986\u76D6\u5148\u52A0\u8F7D\u8005": "Loading order = the order in which the plugin is activated, the last loader may override the first loader",
+ "\u53D1\u73B0\u793E\u533A\u4E3A DeepSeek Harness \u5F00\u53D1\u7684\u63D2\u4EF6": "Discover plugins developed by the community for DeepSeek Harness",
+ "\u53EF\u4EE5\u66F4\u65B0\u5230 {version}\uFF1A\u5B83\u58F0\u660E\u517C\u5BB9\u5F53\u524D DSH\u3002": "Can update to {version}: it declares compatibility with the current DSH.",
+ "\u5DF2\u4ECE\u53D1\u73B0\u9875\u79FB\u51FA\u3002\u5728\u300C\u5DF2\u5B89\u88C5\u300D\u540E\u9762\u7684\u300C\u5DF2\u5C4F\u853D\u300D\u91CC\u53EF\u4EE5\u53D6\u6D88\u3002": "Moved out of the discovery page. You can cancel in Blocked after Installed.",
+ "\u5EFA\u8BAE\u987A\u5E8F\uFF08\u6309 before/after \u89C4\u5219\u81EA\u52A8\u6392\u5E8F\uFF09\uFF1A": "Suggested order (automatically sorted by before/after rule):",
+ "\u6B64\u64CD\u4F5C\u540E\uFF0C\u540C\u4E00\u4E2A\u63D2\u4EF6\u540D\u51FA\u73B0\u5728\u4E24\u5904\uFF0C\u91CD\u542F\u540E\u53EA\u6709\u4E00\u4E2A\u4F1A\u751F\u6548\uFF1A": "After this operation, the same plugin name appears in two places, and only one will take effect after restart:",
+ "\u9996\u6B21\u5B89\u88C5\u9700\u4E0B\u8F7D\u63D2\u4EF6\u7684\u4F9D\u8D56\u5305\uFF0C\u5927\u578B\u63D2\u4EF6\u53EF\u80FD\u9700 1-3 \u5206\u949F": "The first installation requires the download of the plugin dependency package, large plugins may take 1-3 minutes",
+ "Gist ID \u6216\u94FE\u63A5\uFF08\u5BFC\u51FA\u7559\u7A7A\u5219\u65B0\u5EFA\u79C1\u6709 Gist\uFF09": "Gist ID or link (leave the export blank to create a new private Gist)",
+ "\u65B0\u589E {added} \u4E2A\uFF0C\u79FB\u9664 {removed} \u4E2A": "Added {added}, removed {removed}",
+ "\u65E5\u5FD7\u6CA1\u6709\u6307\u51FA\u5177\u4F53\u63D2\u4EF6\uFF0C\u4E0B\u9762\u6309\u542F\u7528\u72B6\u6001\u5217\u51FA\u53EF\u8C03\u6574\u7684\u63D2\u4EF6\u3002": "The log does not indicate a specific plug-in, the list of adjustable plug-ins is shown below by activation status.",
+ "\u66F4\u65B0\u6A21\u5F0F\u9700\u8981 Gist ID\uFF1A\u8BF7\u586B\u5199\uFF0C\u6216\u5207\u6362\u4E3A\u300C\u65B0\u5EFA\u300D": 'Update mode requires Gist ID: please fill in, or switch to "New"',
+ "\u9879\u53D8\u66F4\u9700\u91CD\u542F DeepSeek Harness \u540E\u751F\u6548": "Item changes will take effect after DeepSeek Harness is restarted",
+ "\u4E5F\u53EF\u80FD\u8BA9 DeepSeek Harness \u8D77\u4E0D\u6765\u3002": "It may also make DeepSeek Harness unable to get up.",
+ "\u53EF\u4EE5\u88C5 {version}\uFF1A\u5B83\u58F0\u660E\u517C\u5BB9\u5F53\u524D DSH\u3002": "Can be loaded with {version}: it declares compatibility with the current DSH.",
+ "\u63D0\u524D\u83B7\u53D6\u5F85\u9A8C\u8BC1\u7248\u672C\uFF0C\u53EF\u80FD\u4E0D\u7A33\u5B9A\u3002\u4EC5\u5F71\u54CD\u63D2\u4EF6\u5E02\u573A\u81EA\u8EAB\u3002": "Getting the pending version in advance may be unstable. Affects only the plugin market itself.",
+ "\u6536\u85CF\u529F\u80FD\u6682\u4E0D\u53EF\u7528\u3002\u8BF7\u5237\u65B0\u9875\u9762\u6216\u91CD\u542F dsh web\u3002": "Favorites is temporarily unavailable. Please refresh the page or restart dsh web.",
+ "\u91CD\u542F DeepSeek Harness \u540E\u5B8C\u5168\u6E05\u7406\u3002": "Clean up completely after restarting DeepSeek Harness.",
+ "\u6062\u590D\u5B8C\u6210\uFF0C\u8BF7\u91CD\u542F DeepSeek Harness": "Recovery complete, please restart DeepSeek Harness",
+ "\u652F\u6301 .zip\u3001\u6280\u80FD\u6587\u4EF6\u5939\u6216\u5355\u4E2A SKILL.md": "Supports .zip, a skill folder, or single SKILL.md",
+ "\u786E\u5B9A\u8981\u5378\u8F7D\u63D2\u4EF6\u5E02\u573A\u5417\uFF1F\u5378\u8F7D\u540E\u9700\u4F7F\u7528\u547D\u4EE4\u884C\u91CD\u65B0\u5B89\u88C5\u3002": "Are you sure you want to uninstall the plugin marketplace? It needs to be reinstalled using the command line after uninstallation.",
+ "\u4E2D\u56FD\u5927\u9646\u8BBF\u95EE\u66F4\u5FEB\u3002\u4EC5\u6539\u53D8\u4E0B\u8F7D\u7EBF\u8DEF\uFF0C\u63D2\u4EF6\u6765\u6E90\u4E0D\u53D8\u3002": "Faster in China. Only changes CDN routing; source is identical.",
+ "\u53E6\u4E00\u4E2A\u5B89\u88C5\u3001\u66F4\u65B0\u6216\u5378\u8F7D\u8FD8\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5B83\u5B8C\u6210\u540E\u518D\u8BD5": "Another installation, update or uninstallation is still in progress, please wait for it to complete and try again",
+ "\u66FF\u6362\u672A\u5B8C\u6210\u3002\u4E0B\u5217\u63D2\u4EF6\u5DF2\u5378\u8F7D\u4E14\u672A\u6062\u590D\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\uFF1A": "Replacement incomplete. The following plugins have been uninstalled and not restored, please reinstall:",
+ "\u7B49\u5F85 DeepSeek Harness \u542F\u52A8\u8D85\u65F6": "Timeout waiting for DeepSeek Harness to start",
+ "\u81EA\u52A8\u914D\u7F6E\u5931\u8D25\u3002\u8BF7\u5BFC\u51FA\u65E5\u5FD7\u5E76\u9644\u5728 issue \u4E2D\u3002": "Autoconfiguration failed. Please export the log and attach it to the issue.",
+ "/{command} \u4E0D\u63A5\u53D7\u9644\u4EF6\uFF0C\u8BF7\u5148\u79FB\u9664\u9644\u4EF6": "/{command} does not accept attachments; remove them first",
+ "bundle = \u4E00\u4E2A\u63D2\u4EF6\u5305\uFF0C\u4F1A\u6309\u987A\u5E8F\u53E0\u52A0\u52A0\u8F7D": "bundle = A plugin package that is stacked sequentially",
+ "\u6700\u8FD1\u63D0\u4EA4\uFF08\u65E0\u6CD5\u5BF9\u5E94\u4F60\u5F53\u524D\u5B89\u88C5\u7684\u7248\u672C\uFF0C\u4EC5\u4F9B\u53C2\u8003\uFF09": "Recently Submitted (does not correspond to the version you currently have installed, for reference only)",
+ "\u5B89\u88C5\u65F6\u4F1A\u7ACB\u523B\u8FD0\u884C\u5B83\u81EA\u5E26\u7684\u811A\u672C\uFF0C\u4E0D\u9700\u8981\u4F60\u6253\u5F00\u63D2\u4EF6": "It runs its own script immediately upon installation and does not require you to open the plugin",
+ "\u62D6\u52A8 \u283F \u8C03\u6574\u987A\u5E8F\uFF0C\u9009\u62E9\u300C\u5E94\u7528\u987A\u5E8F\u300D\u540E\u624D\u4F1A\u4FDD\u5B58": 'Drag to adjust order, select "Apply order" to save',
+ "\u672C\u5E02\u573A\u7531\u684C\u9762\u7AEF\u5B89\u88C5\u548C\u66F4\u65B0\uFF0C\u65B0\u7248\u672C\u8BF7\u5728\u684C\u9762\u7AEF\u66F4\u65B0": "This market is installed and updated on the desktop, please update the new version on the desktop",
+ "\u6B8B\u7F3A\u7684\u5305\u76EE\u5F55\uFF08\u7F3A\u5C11 package.json\uFF09": "Missing package directory (missing package.json)",
+ "WebDAV \u5730\u5740\u548C\u7528\u6237\u540D\u53EA\u4FDD\u5B58\u5728\u6B64\u6D4F\u89C8\u5668\u3002": "WebDAV addresses and usernames are only saved in this browser.",
+ "\u521B\u5EFA\u548C\u5BFC\u5165\u5747\u4FDD\u5B58\u5230\u5168\u5C40 DSH\uFF0C\u8DE8\u9879\u76EE\u53EF\u7528\u3002": "Created and imported skills are saved to global DSH and available across projects.",
+ "\u5BF9\u7B49\u4F9D\u8D56 = \u63D2\u4EF6\u8981\u6C42\u5BBF\u4E3B\u73AF\u5883\u63D0\u4F9B\u7684\u53E6\u4E00\u4E2A\u5305": "Peer dependency = Another package that the plugin requires from the hosting environment",
+ "\u5F00\u53D1\u5206\u652F\u6784\u5EFA\uFF0C\u672A\u7ECF\u9A8C\u8BC1\uFF0C\u4E0D\u5EFA\u8BAE\u666E\u901A\u7528\u6237\u4F7F\u7528\u3002": "Development branch build, unverified, not recommended for regular users.",
+ "\u65E0\u6CD5\u8FDE\u63A5 GitHub\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u4EE3\u7406\u8BBE\u7F6E": "Unable to connect to GitHub, please check your network or proxy settings",
+ "\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u63CF\u8FF0\u8FD9\u4E2A\u63D2\u4EF6\uFF0C\u5C06\u4EE3\u66FF\u4F5C\u8005\u7B80\u4ECB\u663E\u793A": "Describe the plugin in your own words and it will be displayed instead of the author's profile",
+ "\u8BE5\u63D2\u4EF6\u5DF2\u88AB\u76EE\u5F55\u6807\u8BB0\u4E3A\u5E9F\u5F03\uFF0C\u4E0D\u5EFA\u8BAE\u65B0\u7528\u6237\u5B89\u88C5\u3002": "The plugin has been marked as deprecated by the directory and is not recommended for new users to install.",
+ "\u8BF7\u9009\u62E9 .zip \u6216\u5355\u4E2A SKILL.md\u3002": "Please choose a .zip archive or single SKILL.md.",
+ "\u8FD9\u4EFD\u5E02\u573A\u7531\u684C\u9762\u7AEF\u5B89\u88C5\uFF0C\u65B0\u7248\u672C\u8BF7\u5728\u684C\u9762\u7AEF\u66F4\u65B0\u3002": "Installed via desktop app; please update from the desktop client.",
+ "\u8FD9\u4F1A\u66F4\u6539\u63D2\u4EF6\u7684\u5B89\u88C5\u6765\u6E90\uFF0C\u800C\u4E0D\u662F\u666E\u901A\u7248\u672C\u66F4\u65B0\u3002": "This changes the installation source of the plugin instead of the normal version update.",
+ "\uFF08\u672A\u80FD\u5199\u5165\u914D\u7F6E\uFF0C\u91CD\u542F\u540E\u4F1A\u56DE\u5230\u4E0A\u6B21\u4FDD\u5B58\u7684\u503C\uFF09": "(Could not write to config; it will revert to the last saved value after restart)",
+ "{n} \u4E2A\u8FD0\u884C\u4E2D\u7684\u5B50\u667A\u80FD\u4F53\uFF1A{names}": "{n} running subagents: {names}",
+ "GitHub \u9650\u6D41\u6216 Token \u6743\u9650\u4E0D\u8DB3": "GitHub throttling or insufficient token permissions",
+ "\u4ECE npm \u548C GitHub \u5B98\u65B9\u6E90\u4E0B\u8F7D\u3002": "Download from official npm and GitHub sources.",
+ "\u4F8B\u5982 code-review-helper": "e.g. code-review-helper",
+ "\u52A0\u8F7D\u6761\u76EE = \u63D2\u4EF6\u5728\u8FD0\u884C\u7EC4\u5408\u91CC\u6CE8\u518C\u7684\u6BCF\u4E00\u9879": "Load entries = each item that the plugin registers in the running portfolio",
+ "\u5907\u4EFD\u5DF2\u5BFC\u5165\uFF0C\u8BF7\u5728\u300C\u5DF2\u5B89\u88C5\u300D\u4E2D\u786E\u8BA4\u540E\u5F00\u59CB\u6062\u590D": 'Backup has been imported, please confirm in "Installed" to start recovery',
+ "\u5B89\u88C5\u65F6\u4F1A\u7ACB\u523B\u8FD0\u884C {0}\uFF0C\u4E0D\u9700\u8981\u4F60\u6253\u5F00\u63D2\u4EF6": "{0} will run immediately upon installation and does not require you to open the plugin",
+ "\u5F53\u524D\u987A\u5E8F\u5DF2\u6EE1\u8DB3\u5168\u90E8\u89C4\u5219\u4E0E\u63D2\u4EF6\u4F9D\u8D56\uFF0C\u65E0\u9700\u8C03\u6574": "The current order has satisfied all rules and plugin dependencies, no need to adjust",
+ "\u5F53\u524D\u987A\u5E8F\u7684 before/after \u51B2\u7A81": "Conflict before/after of current order",
+ "\u65E0\u6CD5\u786E\u8BA4\u66F4\u65B0\u524D\u7684\u51C6\u786E\u6765\u6E90\uFF0C\u81EA\u52A8\u56DE\u6EDA\u4E0D\u53EF\u7528\u3002": "The exact source before the update could not be confirmed and the automatic rollback is not available.",
+ "\u68C0\u6D4B\u5230\u517C\u5BB9\u6027\u98CE\u9669\uFF0C\u5EFA\u8BAE\u91CD\u542F\u524D\u5230\u8BCA\u65AD\u9875\u5904\u7406\u3002": "A compatibility risk has been detected and it is recommended to go to the diagnostics page before restarting.",
+ "\u73AF\u5883\u53D8\u91CF DSH_GITHUB_TOKEN": "Environment variable DSH_Github_token",
+ "\u8FD9\u4E9B\u63D2\u4EF6\u4E0D\u5728\u53D1\u73B0\u9875\u663E\u793A\uFF0C\u5168\u90E8\u66F4\u65B0\u4E5F\u4F1A\u8DF3\u8FC7\u3002": "These plugins are not shown on the discovery page and all updates are skipped.",
+ "\u906E\u853D = \u63D2\u4EF6\u81EA\u5E26\u7684\u65E7\u7248\u5305\u76D6\u4F4F\u4E86\u5BBF\u4E3B\u7684\u65B0\u7248": "Masking = The old version of the package that comes with the plugin covers the new version of the host",
+ "{count} \u4E2A\u6587\u4EF6 \xB7 {size}": "{count} files \xB7 {size}",
+ "{minutes}\u5206{seconds}\u79D2": "{minutes}m {seconds}s",
+ "GitHub \u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5": "GitHub request timed out, please check your network and try again",
+ "\u4F18\u5148\u4F7F\u7528\u81EA\u5B9A\u4E49\u7EBF\u8DEF\uFF0C\u5931\u8D25\u540E\u4ECD\u4F1A\u5C1D\u8BD5\u76F4\u8FDE\u3002": "Uses custom mirror first, falls back to direct connection.",
+ "\u53EA\u6539\u5206\u7EC4\u540D\u79F0\uFF0C\u7EC4\u5185\u63D2\u4EF6\u4E0E\u542F\u7528\u72B6\u6001\u4E0D\u53D7\u5F71\u54CD": "Only the group name will be changed, and the in-group plug-in and activation status will not be affected",
+ "\u5C06\u4ECE\u5F53\u524D profile \u4E2D\u79FB\u9664\u8BE5\u63D2\u4EF6\u3002": "The plugin will be removed from the current profile.",
+ "\u6240\u9009\u6587\u4EF6\u5939\u4E2D\u6CA1\u6709\u627E\u5230 SKILL.md\u3002": "No SKILL.md found in the selected folder.",
+ "\u6392\u961F\u65F6\u5B83\u6709\u53EF\u7528\u66F4\u65B0\uFF0C\u73B0\u5728\u6CA1\u6709\u4E86\uFF0C\u5DF2\u8DF3\u8FC7\u3002": "It has an update available while queuing, it is no longer available, it has been skipped.",
+ "\u65E0\u6CD5\u8BBF\u95EE\u526A\u8D34\u677F\uFF0C\u8BF7\u624B\u52A8\u590D\u5236\u4E0B\u9762\u7684\u8BCA\u65AD\u5185\u5BB9": "Unable to access the clipboard, please manually copy the diagnostic content below",
+ "\u672A\u627E\u5230\u8BE5 Gist\uFF0C\u8BF7\u68C0\u67E5 ID \u6216\u94FE\u63A5": "Gist not found, please check ID or link",
+ "\u70B9\u4E86\u67D0\u4E2A\u5206\u7C7B\uFF0C\u6807\u7B7E\u5C31\u8DD1\u5230\u524D\u9762\u6765\u4E86\uFF0C\u597D\u5947\u602A": "I clicked on a certain category, and the tag came to the front, which is strange.",
+ "\u4E0A\u6B21\u7684\u9009\u62E9\u6CA1\u6709\u5168\u90E8\u4FDD\u5B58\uFF0C\u56E0\u6B64\u6CA1\u6709\u91CD\u542F\uFF1A": "The last selection was not all saved, so it was not restarted:",
+ "\u538B\u7F29\u5305\u6216\u6587\u4EF6\u5939\u9700\u5305\u542B SKILL.md": "Archives and folders must contain SKILL.md",
+ "\u5C1A\u672A\u5B89\u88C5\u793E\u533A\u63D2\u4EF6\uFF0C\u53EF\u524D\u5F80\u300C\u53D1\u73B0\u300D\u9875\u6D4F\u89C8": "No community plugins installed, browse to the Discover page",
+ "\u5F53\u524D profile \u6CA1\u6709\u53EF\u5BFC\u51FA\u7684\u63D2\u4EF6": "Current profile has no plugins to export",
+ "\u63D2\u4EF6\u64CD\u4F5C\u672A\u7ED3\u675F\uFF0C\u6536\u85CF\u672A\u4FDD\u5B58\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5": "The plugin operation is not over, the collection is not saved, please try again later",
+ "\u65E0\u6548\u6761\u76EE = \u914D\u7F6E\u91CC\u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u4E1C\u897F": "Invalid entry = the configuration refers to something that does not exist",
+ "\u672C\u90E8\u7F72\u6CA1\u6709\u63A5\u53D7\u8FD9\u4E9B\u503C\uFF0C\u5DF2\u4FDD\u7559\u4F9B\u4F60\u4FEE\u6539\u3002": "This deployment did not accept these values; they were preserved for you to edit.",
+ "\u6CA1\u6709\u627E\u5230\u58F0\u660E\u517C\u5BB9\u5F53\u524D DSH \u7684\u7248\u672C\u3002": "Declaration of compatibility with current DSH version not found.",
+ "\u2026 \u5DF2\u622A\u65AD\uFF0C\u5171 {total} \u5B57\u7B26": "\u2026 truncated, {total} characters total",
+ "{count} \u4E2A subagent": "{count} subagents",
+ "{count} \u4E2A\u5B50\u667A\u80FD\u4F53\uFF0C\u6B63\u5728\u8FD0\u884C": "{count} subagents, running",
+ "Gist \u5185\u5BB9\u65E0\u6548\u6216\u5907\u4EFD\u683C\u5F0F\u4E0D\u53D7\u652F\u6301": "Invalid Gist content or unsupported backup format",
+ "\u4F1A\u6539\u52A8 DSH \u81EA\u5E26\u7684\u7EC4\u4EF6\uFF08{0}\uFF09": "Modifies DSH included components ({0})",
+ "\u4F1A\u76F4\u63A5\u8FDE\u63A5\u56FA\u5B9A IP \u5730\u5740\uFF08{0}\uFF09": "Directly connects to a fixed IP address ({0})",
+ "\u4F1A\u7981\u7528 DSH \u81EA\u5E26\u7684\u7EC4\u4EF6\uFF08{0}\uFF09": "Disables DSH included components ({0})",
+ "\u4F1A\u8986\u76D6 DSH \u81EA\u5E26\u7684\u7EC4\u4EF6\uFF08{0}\uFF09": "Will overwrite DSH's own components ({0})",
+ "\u5206\u7EC4\u4EC5\u7528\u4E8E\u6574\u7406\uFF0C\u4E0D\u4F1A\u6539\u53D8\u63D2\u4EF6\u542F\u7528\u72B6\u6001": "Grouping is for collation only and does not change the plugin activation status",
+ "\u5B89\u88C5\u63D2\u4EF6\u524D\u9700\u8981\u5148\u914D\u7F6E pnpm \u73AF\u5883": "The pnpm environment needs to be configured before installing the plugin",
+ "\u5DF2\u590D\u5236\u4FEE\u590D\u8BF4\u660E\uFF0C\u8BF7\u7C98\u8D34\u5230\u65B0\u5BF9\u8BDD\u4E2D\u53D1\u9001": "Repair instructions copied, please paste into new conversation to send",
+ "\u5DF2\u6839\u636E\u7F51\u7EDC\u72B6\u51B5\u81EA\u52A8\u9009\u62E9\uFF0C\u53EF\u968F\u65F6\u5207\u6362\u3002": "It's automatically selected based on your network and can be switched at any time.",
+ "\u6BCF\u5C0F\u65F6\u7684\u7B2C {minutes} \u5206\u949F": "At minute {minutes} of every hour",
+ "\u793E\u533A\u7B2C\u4E09\u65B9\u63D2\u4EF6\uFF0C\u6784\u5EFA\u811A\u672C\u9ED8\u8BA4\u4E0D\u8FD0\u884C\u3002": "Community third-party plugins, build scripts do not run by default.",
+ "\u88AB\u5378\u8F7D\u7684\u63D2\u4EF6\u914D\u7F6E\u4F1A\u4FDD\u7559\uFF0C\u53EF\u4EE5\u518D\u88C5\u56DE\u6765": "The uninstalled plugin configuration will be preserved and can be loaded back",
+ "\u8BC4\u8BBA\u52A0\u8F7D\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u540E\u91CD\u8BD5\u3002": "Comment loading failed. Please check your network connection and try again.",
+ "\u9A8C\u8BC1\u901A\u8FC7\uFF08Token \u6765\u6E90\uFF1A{0}\uFF09": "Validation passed (Token source: {0})",
+ "{n} \u4E2A\u540E\u53F0\u4EFB\u52A1\uFF1A{names}": "{n} background tasks: {names}",
+ "{n} \u6761\u5B9A\u65F6\u63D0\u9192\uFF1A{names}": "{n} scheduled reminders: {names}",
+ "{n} \u9879\u5176\u4ED6\u5DE5\u4F5C\uFF08{kind}\uFF09": "{n} other jobs ({kind})",
+ "DSH \u6307\u51FA\u4F46\u672C\u9875\u65E0\u6CD5\u5F00\u5173\u7684\u63D2\u4EF6\uFF1A": "The DSH points to plugins that cannot be switched on on this page:",
+ "\u5199\u4E0B\u6280\u80FD\u8981\u9075\u5FAA\u7684\u6307\u4EE4\u3001\u6B65\u9AA4\u548C\u8FB9\u754C\u2026": "Write the instructions, steps, and boundaries...",
+ "\u56DE\u8F66\u4FDD\u5B58\u5355\u4E2A\uFF1B\u6E05\u7A7A\u522B\u540D\u8FD8\u539F\u6587\u4EF6\u5939\u540D": "Press Enter to save; clear alias to restore folder name",
+ "\u5B89\u88C5\u3001\u66F4\u65B0\u4E0E\u5378\u8F7D\u7684\u8FDB\u5EA6\u5C06\u663E\u793A\u5728\u8FD9\u91CC": "The progress of installing, updating and uninstalling will be shown here",
+ "\u5BFC\u5165\u65F6\u590D\u5236\u5B8C\u6574\u5185\u5BB9\uFF0C\u4E0D\u4FEE\u6539\u539F\u59CB\u6765\u6E90": "Import copies full content and never modifies original source",
+ "\u641C\u7D22\u63D2\u4EF6\uFF0C\u4F8B\u5982\uFF1A\u901A\u77E5\u3001\u7EC8\u7AEF\u3001\u8BB0\u5FC6\u2026": "Search plugins such as: notifications, terminals, memories...",
+ "\u8FD9\u662F\u7EC8\u7AEF\u63D2\u4EF6\uFF0C\u7F51\u9875\u7248\u91CC\u53EF\u80FD\u7528\u4E0D\u4E86\u3002": "This is a terminal plugin, it may not be available in the web version.",
+ "{count} \u4E2A\u540E\u53F0\u4EFB\u52A1\u8FD0\u884C\u4E2D": "{count} background tasks running",
+ "\u548C\u5DF2\u5B89\u88C5\u7684\u63D2\u4EF6\u51B2\u7A81\uFF0C\u53EA\u80FD\u7559\u4E00\u4E2A\uFF1A": "Conflicts with installed plugins, only one can be left:",
+ "\u5728 GitHub \u767B\u5F55\u5E76\u53C2\u4E0E\u8BA8\u8BBA": "Log in and join the discussion on GitHub",
+ "\u5907\u4EFD\u4E2D\u6709 {0} \u4E2A\u63D2\u4EF6\u5C1A\u672A\u5B89\u88C5": "{0} plugin (s) not installed in backup",
+ \u5B9E\u5FC3\u7684\u9879\u5728\u5DF2\u626B\u63CF\u7684\u63D2\u4EF6\u91CC\u8F83\u5C11\u51FA\u73B0: "Solid items rarely appear in scanned plugins",
+ "\u6062\u590D\u5DF2\u5B8C\u6210\uFF0C\u4F46\u4E0B\u5217\u63D2\u4EF6\u5B89\u88C5\u5931\u8D25\uFF1A": "Restore completed, but the following plugins failed to install:",
+ "\u66F4\u65B0\u63D0\u9192\u5DF2\u5173\u95ED\u3002\u65B0\u7248\u672C\u4ECD\u4F1A\u5217\u51FA\u3002": "Update alerts are turned off. The new version will still be listed.",
+ "\u81EA\u52A8\u9009\u62E9\u53EF\u7528\u7EBF\u8DEF\uFF0C\u5931\u8D25\u65F6\u624D\u5207\u6362\u3002": "Automatically selects available mirror, falls back on failure.",
+ "\u8BE5\u63D2\u4EF6\u5F53\u524D\u672A\u52A0\u8F7D\uFF0C\u6682\u65F6\u65E0\u6CD5\u914D\u7F6E\u3002": "This plugin is not loaded, so it cannot be configured yet.",
+ "\u8BE5\u6765\u6E90\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u6682\u65F6\u6CA1\u6709\u6280\u80FD\u3002": "This source directory does not exist or has no skills.",
+ "dsh \u7684\u539F\u59CB\u8F93\u51FA\uFF08\u7ED3\u5C3E\u90E8\u5206\uFF09": "raw output of dsh (end)",
+ "npm \u4E0B\u8F7D\u91CF\uFF08\u8FD1 30 \u5929\uFF09": "npm downloads (last 30 days)",
+ "\u52A0\u8F7D\u6761\u76EE\uFF08loader id\uFF09": "Loader entry (loader id)",
+ "\u5339\u914D\u7684\u63D2\u4EF6\u5728\u300C\u5DF2\u5C4F\u853D\u300D\u6807\u7B7E\u91CC\u3002": "The matching plugin is in the Blocked tab.",
+ "\u540C\u540D\u63D2\u4EF6\uFF08\u4EC5\u4F9B\u53C2\u8003\uFF0C\u4E0D\u7B97\u51B2\u7A81\uFF09": "Plugins with the same name (for reference only, not conflict)",
+ "\u5DF2\u5B89\u88C5\uFF0C\u4E0E\u5F53\u524D dsh \u4E0D\u517C\u5BB9": "Installed, incompatible with current dsh",
+ "\u5F53\u524D\u8FDB\u7A0B\u4EE4\u724C\u4E0D\u53EF\u7528\uFF0C\u8BF7\u5237\u65B0\u770B\u677F": "The current process token is unavailable; refresh the dashboard",
+ "\u65B0\u7248\u672C\u4ECD\u4F1A\u5217\u51FA\uFF0C\u53EA\u662F\u4E0D\u518D\u63D0\u9192\u3002": "The new version will still be listed, just no more reminders.",
+ "\u6682\u65F6\u8BFB\u4E0D\u5230\u66F4\u65B0\u8BF4\u660E\uFF0C\u7A0D\u540E\u518D\u8BD5\u3002": "The update instructions could not be read at the moment, please try again later.",
+ "\u66F4\u65B0\u4F1A\u4E0B\u8F7D\u65B0\u7248\u672C\uFF0C\u91CD\u542F\u540E\u751F\u6548\u3002": "Update will download the new version; takes effect upon restart.",
+ "\u672A\u53D1\u73B0\u51B2\u7A81\u3001\u4F9D\u8D56\u6216\u52A0\u8F7D\u987A\u5E8F\u95EE\u9898": "No conflicts, dependencies, or loading order issues found",
+ "\u7EDF\u8BA1\u533A\u95F4\uFF1A{0} \u81F3 {1}\u3002": "Statistical range: {0} to {1}.",
+ "\u8BF7\u586B\u6570\u5B57\uFF1B\u7559\u7A7A\u8868\u793A\u4F7F\u7528\u9ED8\u8BA4\u503C\u3002": "Enter a number; leave blank to use the default.",
+ "\u2026 \u5176\u4F59 {count} \u884C": "\u2026 {count} more lines",
+ "\uFF08\u5DF2\u5199\u5165\u914D\u7F6E\uFF0C\u91CD\u542F\u540E\u4ECD\u751F\u6548\uFF09": "(Written to config; persists after restart)",
+ "\u4FDD\u5B58\u5931\u8D25\uFF1A{message}": "Save failed: {message}",
+ "\u5168\u90E8 {count} \u4E2A\u6587\u4EF6": "All {count} files",
+ "\u5305\u5143\u4FE1\u606F\u9519\u8BEF\uFF1A{error}": "Package metadata error: {error}",
+ "\u53EF\u79BB\u5F00\u672C\u9875\u9762\uFF0C\u5B8C\u6210\u540E\u5C06\u901A\u77E5\u4F60": "You can leave this page and we'll let you know when it's done",
+ "\u5728 GitHub \u4E0A\u67E5\u770B\u4ED3\u5E93": "View repository on GitHub",
+ "\u575A\u679C\u4E91 / Nutstore": "Nut Cloud/Nutstore",
+ "\u63D2\u4EF6\u52A0\u8F7D\u987A\u5E8F\uFF08bundle\uFF09": "Plugin loading order (bundle)",
+ "\u63D2\u4EF6\u76EE\u5F55\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5": "Plugin directory failed to load, please try again later",
+ "\u65E0\u6CD5\u5B89\u88C5\uFF1A\u4E0E\u5DF2\u5B89\u88C5\u7684\u63D2\u4EF6\u51B2\u7A81": "Unable to install: conflicts with installed plugins",
+ "\u680F\u5BBD\u4E0D\u8DB3\uFF0C\u62D6\u5BBD\u4FA7\u8FB9\u680F\u540E\u518D\u5206\u680F": "Not enough width; widen the sidebar before splitting",
+ "\u8BFB\u53D6\u5931\u8D25\uFF1A{message}": "Read failed: {message}",
+ "\u8FD9\u4E2A\u65B0\u7248\u672C\u8981\u6C42\u66F4\u65B0\u7684 DSH": "This new version requires an updated DSH",
+ "{count} \u4E2A\u540E\u53F0\u4EFB\u52A1": "{count} background tasks",
+ "{count} \u4E2A\u5B50\u667A\u80FD\u4F53": "{count} subagents",
+ "{count} \u4E2A\u5DE5\u5177\u8C03\u7528": "{count} tool calls",
+ "{count} \u4E2A\u8BCA\u65AD\u5F02\u5E38": "{count} diagnostics issues",
+ "{count} \u6B21\u5DE5\u5177\u8C03\u7528": "{count} tool calls",
+ "Agent \u7A7A\u95F2\u540E\u81EA\u52A8\u5F00\u59CB": "Start automatically when the agent is free",
+ "npm \u5F53\u524D latest": "npm Current latest",
+ \u4F1A\u5728\u8FD0\u884C\u65F6\u6267\u884C\u62FC\u51FA\u6765\u7684\u4EE3\u7801: "will execute the spelled-out code at runtime",
+ "\u4F1A\u6539\u52A8 DSH \u81EA\u5E26\u7684\u7EC4\u4EF6": "Will change the DSH's own components",
+ "\u5220\u9664 {provider}": "Remove {provider}",
+ "\u5305\u542B\u914D\u7F6E\u6587\u4EF6\uFF08\u53EF\u80FD\u542B\u5BC6\u94A5\uFF09": "Include profile (may include key)",
+ "\u53E6\u6709 {0} \u6761\u5F85\u786E\u8BA4\u4FE1\u606F": "{0} more to confirm",
+ "\u5728\u4FA7\u8FB9\u680F\u6253\u5F00 {name}": "Open {name} in the sidebar",
+ "\u5DF2\u81EA\u52A8\u64A4\u9500\uFF0C\u672A\u6539\u52A8\u4EFB\u4F55\u63D2\u4EF6": "Automatically revoked, no plugins changed",
+ "\u5DF2\u9009\u62E9\u4FDD\u7559\u73B0\u6709\u63D2\u4EF6\uFF0C\u672A\u5B89\u88C5": "Selected to keep existing plugins, not installed",
+ \u5F53\u524D\u5DE5\u4F5C\u533A\u6216\u672C\u5730\u5E94\u7528\u4E0D\u53EF\u7528: "The current workspace or local application is unavailable",
+ "\u65E0\u6CD5\u66F4\u65B0\u5C4F\u853D\u5217\u8868\uFF0C\u8BF7\u91CD\u8BD5\u3002": "Unable to update the block list, please try again.",
+ "\u66F4\u65B0\u5230 {version}": "Update to {version}",
+ "\u66F4\u65B0\u5230\u8F93\u5165\u6846\u4E2D\u7684 Gist": "Update to Gist in Input",
+ "\u68C0\u67E5\u66F4\u65B0\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002": "Update check failed; try again later.",
+ "\u6BCF\u5929\u81EA\u52A8\u5907\u4EFD\uFF08\u6253\u5F00\u5E02\u573A\u65F6\uFF09": "Automatic daily backups (when market is open)",
+ "\u6CA1\u6709\u626B\u63CF\u5230\u3002\u8FD9\u4E0D\u7B49\u4E8E\u5B89\u5168\u3002": "Not scanned. This does not equal security.",
+ "\u7528\u5230 DSH \u5BBF\u4E3B\u5185\u90E8\u7684\u5305": "Uses packages inside the DSH host",
+ "\u786E\u8BC1\u4E0E\u5F53\u524D DSH \u4E0D\u517C\u5BB9": "Confirm incompatibility with current DSH",
+ "\u7B2C {0} / {1} \u9875": "Page {0} of {1}",
+ "\u8BE5\u7248\u672C\u4F4E\u4E8E\u5F53\u524D\u5DF2\u5B89\u88C5\u7248\u672C\u3002": "This version is lower than the currently installed version.",
+ "\u8BF7\u8F93\u5165\u81F3\u5C11 1 \u5206\u949F\u7684\u95F4\u9694": "Enter an interval of at least 1 minute",
+ "\u91CD\u6392 {0} \u4E2A\u63D2\u4EF6\u7684\u4F4D\u7F6E": "Relocate {0} plugins",
+ "{count} \u4E2A\u5DF2\u505C\u7528": "{count} disabled",
+ "{count} \u4E2A\u5DF2\u542F\u7528": "{count} enabled",
+ "{count} \u4E2A\u88AB\u8986\u76D6": "{count} overridden",
+ "{n} \u4E2A\u5B50\u667A\u80FD\u4F53\u8FD0\u884C\u4E2D": "{n} subagents running",
+ "{y}\u5E74{m}\u6708{d}\u65E5": "{y}-{m}-{d}",
+ "\u505C\u6B62 Cordis \u63D2\u4EF6": "Stop Cordis plugin",
+ "\u517C\u5BB9\u5F53\u524D DSH {0}": "Compatible with current DSH {0}",
+ "\u5220\u9664\u540E\u8BE5\u5FEB\u7167\u5C06\u65E0\u6CD5\u6062\u590D\u3002": "Once deleted, the snapshot cannot be recovered.",
+ \u52A0\u5165\u5206\u7EC4\u4E0D\u4F1A\u81EA\u52A8\u542F\u7528\u63D2\u4EF6: "Joining a group does not automatically enable the plugin",
+ "\u5B89\u88C5 {version}": "Install {version}",
+ "\u5C55\u5F00\u5176\u4F59 {n} \u884C\u8F93\u51FA": "Show {n} more output lines",
+ "\u5DF2\u6DFB\u52A0\u5DE5\u5177\uFF1A{name}": "Tool added: {name}",
+ "\u5DF2\u79FB\u9664\u5DE5\u5177\uFF1A{name}": "Tool removed: {name}",
+ "\u6211\u5DF2\u4E86\u89E3\u98CE\u9669\uFF0C\u5E76\u613F\u610F\u7EE7\u7EED": "I understand the risk and want to continue",
+ "\u6536\u85CF\u7684\u6761\u76EE\u5DF2\u4E0D\u5728\u76EE\u5F55\u4E2D\u3002": "Favorite entry is no longer in the directory.",
+ "\u65B0\u589E {count} \u4E2A": "Added {count}",
+ "\u65E0\u6CD5\u663E\u793A\u6587\u4EF6\u4F4D\u7F6E\uFF0C\u8BF7\u91CD\u8BD5": "Could not show the file location; try again",
+ "\u6709\u8FDE\u63A5\u6CA1\u6709\u52A0\u5BC6\uFF08{0}\uFF09": "Connection with no encryption ({0})",
+ "\u67E5\u770B\u63D2\u4EF6\u5E02\u573A\u7248\u672C\u4E0E\u8BBE\u7F6E\u3002": "View marketplace version and settings.",
+ "\u6B63\u6587\uFF08Markdown\uFF09": "Body (Markdown)",
+ "\u6BCF {count} \u5C0F\u65F6": "Every {count} hours",
+ "\u79FB\u9664 {count} \u4E2A": "Removed {count}",
+ "\u79FB\u9664 Cordis \u63D2\u4EF6": "Remove Cordis plugin",
+ "\u7B26\u5408\u5BBF\u4E3B\u8981\u6C42\uFF08\u4F9D\u636E\u58F0\u660E\uFF09": "Meets host requirements (per claim)",
+ "\u7B49\u5F85 {0} \u4E2A\u4F1A\u8BDD\u7A7A\u95F2": "Waiting for {0} sessions to be free",
+ "\u8FD0\u884C Cordis \u63D2\u4EF6": "Run Cordis plugin",
+ "{count} \u4E2A\u6210\u5458": "{count} members",
+ "{count} \u4E2A\u6280\u80FD": "{count} skills",
+ "{count} \u4E2A\u63D0\u9192": "{count} reminders",
+ "{count} \u4E2A\u6B65\u9AA4": "{count} steps",
+ "{count} \u6761\u6D88\u606F": "{count} messages",
+ "DeepSeek \u8D26\u53F7": "DeepSeek account",
+ \u4E00\u53E5\u8BDD\u8BF4\u660E\u4EC0\u4E48\u65F6\u5019\u4F7F\u7528: "One sentence describing when to use it",
+ "\u4ECE WebDAV \u6062\u590D": "Restore from WebDAV",
+ "\u4F1A\u8054\u7F51\uFF0C\u5E76\u7528\u5230\u4F60\u7684\u5BC6\u94A5": "will be connected to the network and will use your key",
+ "\u4FE1\u53F7 {signal}": "Signal {signal}",
+ "\u53E6\u6709 {0} \u9879\u5DF2\u7701\u7565": "{0} more items omitted",
+ \u540C\u65F6\u6E05\u9664\u5E02\u573A\u81EA\u5DF1\u7684\u6570\u636E: "while clearing the market's own data",
+ "\u5DF2\u53D6\u6D88\uFF0C\u90E8\u5206\u66F4\u6539\u5DF2\u5E94\u7528": "Cancelled, some changes applied",
+ "\u65B0\u5EFA\u4E00\u4E2A\u79C1\u6709 Gist": "Create a new private Gist",
+ \u65E5\u5FD7\u91CC\u6CA1\u6709\u8BF4\u660E\u5177\u4F53\u539F\u56E0: "No specific reason was given in the log",
+ "\u6765\u6E90\u6838\u9A8C\u65F6\u95F4\uFF1A{0}\u3002": "Source verification time: {0}.",
+ "\u6765\u6E90\u6838\u9A8C\u65F6\u95F4\uFF1A\u672A\u63D0\u4F9B\u3002": "Source verification time: Not provided.",
+ "\u6BCF {step} \u5206\u949F": "Every {step} minutes",
+ \u6CA1\u6709\u672A\u5206\u7EC4\u7684\u63D2\u4EF6\u53EF\u52A0\u5165: "No ungrouped plugins to join",
+ "\u8BE5\u63D2\u4EF6\u672A\u63D0\u4F9B\u66F4\u65B0\u8BF4\u660E\u3002": "No update instructions were provided for this plugin.",
+ \u8BE5\u683C\u5F0F\u6587\u4EF6\u6682\u65F6\u65E0\u6CD5\u9884\u89C8: "This file format cannot be previewed yet",
+ "\u901B\u4E00\u901B\uFF0C\u70B9\u4E00\u4E0B\uFF0C\u88C5\u597D\u3002": "Browse, click, and install.",
+ "\u987A\u5E8F\u68C0\u67E5\u672A\u901A\u8FC7\uFF1A{0}": "Sequence check failed: {0}",
+ "\u2026 \u5176\u4F59 {n} \u884C": "\u2026 {n} more lines",
+ "\uFF08\u672A\u83B7\u53D6\u5230\u8D26\u53F7\u4FE1\u606F\uFF09": "(no account information available)",
+ "{seconds}\u79D2": "{seconds}s",
+ "HTTPS \u52A0\u901F\u524D\u7F00": "HTTPS Mirror Prefix",
+ "\u4E3A\u300C{0}\u300D\u9009\u62E9\u4E3B\u9898": "Select a topic for '{0}'",
+ "\u4EC5\u63A5\u6536\u6B63\u5F0F\u53D1\u5E03\u7248\u672C\u3002": "Only official releases are accepted.",
+ "\u505C\u7528 {0} \u4E2A\u63D2\u4EF6": "Deactivate {0} plugins",
+ "\u542F\u52A8\u5931\u8D25\u2014\u2014\u8C03\u6574\u63D2\u4EF6": "Launch Failure - Adjust Plugin",
+ "\u542F\u7528 {0} \u4E2A\u63D2\u4EF6": "Activate {0} plugins",
+ \u5B8C\u6574\u8D39\u7387\u8BBE\u7F6E\u52A0\u8F7D\u5931\u8D25: "Failed to load the full rate settings",
+ "\u5DF2\u505C\u7528\uFF0C\u529F\u80FD\u7ACB\u5373\u5931\u6548": "Disabled, features expire immediately",
+ "\u5DF2\u5904\u7406 {0} \u4E2A\u5305": "{0} packages processed",
+ "\u5DF2\u7EE7\u7EED\u5DE5\u4F5C\uFF0C\u4ECD\u53EF\u56DE\u7B54": "Work resumed; still answerable",
+ "\u6362\u7528 npm \u7248\u672C\uFF1F": "Switch to npm version?",
+ "\u6536\u85CF\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5": "Collection failed, please try again later",
+ "\u65B0\u589E\uFF1A{names}": "Added: {names}",
+ "\u6682\u65F6\u67E5\u4E0D\u5230\u517C\u5BB9\u7248\u672C\u3002": "A compatible version is temporarily unavailable.",
+ "\u672C\u90E8\u7F72\u7684\u8BBE\u7F6E\u4E3A\u53EA\u8BFB\u3002": "This deployment's settings are read-only.",
+ "\u6B63\u5728\u52A0\u8F7D\u66F4\u65E9\u7684\u5386\u53F2\u2026": "Loading earlier history\u2026",
+ \u6CA1\u6709\u5DF2\u6EE1\u8DB3\u7684\u4F9D\u8D56\u6761\u76EE: "No Dependent Entries Satisfied",
+ "\u7528 {app} \u6253\u5F00": "Open with {app}",
+ "\u79FB\u9664\uFF1A{names}": "Removed: {names}",
+ "\u7B2C {turn} \u8F6E": "Turn {turn}",
+ "\u8FD8\u6CA1\u6709\u5C4F\u853D\u4EFB\u4F55\u63D2\u4EF6\u3002": "No plugins have been blocked yet.",
+ "\u9000\u51FA\u7801 {code}": "Exit code {code}",
+ "{app}\uFF08\u9ED8\u8BA4\uFF09": "{app} (default)",
+ "### \u4EC0\u4E48\u65F6\u5019\u9009": "### When to choose",
+ "Cordis \u63D2\u4EF6": "Cordis plugin",
+ "GitHub \u52A0\u901F": "GitHub Mirror",
+ "pnpm \u4E34\u65F6\u76EE\u5F55": "pnpm temporary directory",
+ \u4E2D\u56FD\u7248\u7AEF\u70B9\u4E0E\u6A21\u578B\u6C60: "China Endpoints & Model Pool",
+ "\u4ECE Gist \u5BFC\u5165": "Import from Gist",
+ "\u4F1A\u8C03\u7528 AI \u6A21\u578B": "will invoke the AI model",
+ \u5141\u8BB8\u6784\u5EFA\u811A\u672C\u5E76\u91CD\u8BD5: "Allow build scripts and retry",
+ "\u5171 {0} \u4E2A\u6536\u85CF": "Total {0} Collections",
+ \u53EF\u80FD\u4E0D\u9002\u7528\u4E8E\u7F51\u9875\u7248: "May not be available on the web",
+ \u5B89\u88C5\u65F6\u5C31\u4F1A\u8FD0\u884C\u4EE3\u7801: "The code will run at installation time",
+ "\u5BFC\u5165\u5230\u5168\u5C40 DSH": "Import to global DSH",
+ "\u5C1A\u65E0\u5206\u7EC4\uFF0C\u8BF7\u5148\u65B0\u5EFA": "There are no groups yet, please create a new one first",
+ "\u5DF2\u56DE\u6EDA\uFF0C\u91CD\u542F\u540E\u751F\u6548": "Rolled back, effective after restart",
+ "\u5DF2\u5B89\u88C5\uFF0C\u6821\u9A8C\u672A\u901A\u8FC7": "Installed, checksum failed",
+ "\u5DF2\u5B89\u88C5\uFF0C\u91CD\u542F\u540E\u751F\u6548": "Installed, effective after reboot",
+ "\u5DF2\u5BFC\u51FA\u5230 Gist": "Exported to Gist",
+ "\u5DF2\u5E94\u7528\uFF0C\u91CD\u542F\u540E\u751F\u6548": "Applied, effective after restart",
+ "\u5DF2\u6355\u83B7\u5E76\u4FDD\u5B58\u51ED\u8BC1\u3002": "Credentials captured and saved.",
+ "\u5DF2\u9009\u62E9 {0} \u9879": "{0} items selected",
+ "\u5FEB\u7167\u5217\u8868\u52A0\u8F7D\u5931\u8D25\uFF1A": "Failed to load snapshot list:",
+ "\u603B\u5904\u7406 Token": "Total processed tokens",
+ "\u6062\u590D\u540E\u4ECD\u65E0\u6CD5\u542F\u52A8\uFF1A": "Unable to start after recovery:",
+ "\u6362\u7528 npm \u7248\u672C": "Switch to npm version",
+ \u641C\u7D22\u63D2\u4EF6\u540D\u79F0\u6216\u4F5C\u8005: "Search by plugin name or author...",
+ "\u65B0\u7684 npm \u6765\u6E90": "New npm source",
+ "\u65E0\u6CD5\u4FDD\u5B58\uFF0C\u8BF7\u91CD\u8BD5\u3002": "Unable to save, please try again.",
+ "\u67E5\u770B {name}": "View {name}",
+ "\u6B63\u5728\u52A0\u8F7D\u63D2\u4EF6\u76EE\u5F55\u2026": "Loading plugin directory...",
+ "\u6B63\u5728\u68C0\u67E5\u66F4\u65B0...": "Checking for updates...",
+ "\u6B63\u5728\u8BC6\u522B\u5BBF\u4E3B\u7248\u672C\u2026": "Identifying host version...",
+ "\u6B63\u5728\u8BFB\u53D6\u5931\u8D25\u8BE6\u60C5\u2026": "Reading failure details...",
+ "\u6B63\u5728\u8BFB\u53D6\u5BBF\u4E3B\u8981\u6C42\u2026": "Reading host requirements...",
+ \u6CA1\u6709\u4F9D\u8D56\u7248\u672C\u4E0D\u5339\u914D: "No dependent version mismatch",
+ "\u6CA1\u6709\u53D1\u73B0\u6B8B\u7559\u76EE\u5F55\u3002": "No residual directories found.",
+ \u6CA1\u6709\u91CD\u590D\u7684\u63D2\u4EF6\u6761\u76EE: "No duplicate plugin entries",
+ "\u786E\u8BA4\u542F\u7528\u5B8C\u5168\u6743\u9650\uFF1F": "Enable full access?",
+ "\u7EC4\u5408\u5217\u8868\u52A0\u8F7D\u5931\u8D25\uFF1A": "Failed to load portfolio list:",
+ "\u7EDF\u8BA1\u533A\u95F4\uFF1A\u672A\u63D0\u4F9B\u3002": "Statistical interval: not provided.",
+ \u9000\u51FA\u5E76\u767B\u5F55\u5176\u5B83\u8D26\u53F7: "Sign out and sign in to another account",
+ "\u9879\u53D8\u66F4\uFF0C\u5237\u65B0\u540E\u751F\u6548": "Item changes, effective after refresh",
+ "\u9879\u76EE Skills": "Project Skills",
+ "API \u5BC6\u94A5\u65E0\u6548": "Invalid API key",
+ "patch \u6587\u4EF6": "patch file",
+ \u4E0A\u4E0B\u6587\u7F13\u5B58\u547D\u4E2D\u7387: "Context Cache Hit Rate",
+ \u4F1A\u81EA\u5DF1\u5F00\u4EFB\u52A1\u5E72\u6D3B: "Will work on his own tasks",
+ \u4F1A\u8BFB\u4F60\u7684\u73AF\u5883\u53D8\u91CF: "will read your environment variables",
+ \u4F7F\u7528\u63D0\u4F9B\u5546\u9ED8\u8BA4\u503C: "Use provider default",
+ "\u4F9B\u5E94\u5546 / \u6A21\u578B": "Provider / Model",
+ \u5141\u8BB8\u5E76\u884C\u8C03\u7528\u5DE5\u5177: "Allow parallel tool calls",
+ "\u516C\u5171 Agent": "Shared Agent",
+ "\u5907\u4EFD\u6587\u4EF6 URL": "Backup file URL",
+ "\u5DF2\u6062\u590D\u66F4\u65B0\u63D0\u9192\u3002": "The update reminder has been restored.",
+ \u5E02\u573A\u81EA\u8EAB\u4E0D\u80FD\u505C\u7528: "Market itself cannot be deactivated",
+ "\u6253\u5F00\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5": "Open failed; try again",
+ "\u63A8\u7406 Token": "Reasoning tokens",
+ \u63D2\u4EF6\u5E02\u573A\u65E0\u6CD5\u663E\u793A: "Plugin Marketplace cannot be displayed",
+ "\u6587\u6863\u6E32\u67D3\u4E2D...": "Rendering document...",
+ \u65E0\u6CD5\u83B7\u53D6\u5E94\u7528\u5217\u8868: "Could not retrieve the application list",
+ \u6682\u65E0\u8FDB\u884C\u4E2D\u7684\u64CD\u4F5C: "No actions in progress",
+ "\u6709\u65B0\u7248\u672C {0}": "Update Available",
+ "\u672A\u53D1\u73B0\u8BCA\u65AD\u95EE\u9898\u3002": "No diagnostic issues found.",
+ \u672A\u914D\u7F6E\u4EFB\u4F55\u63D2\u4EF6\u5305: "No plugin packages configured",
+ "\u6B63\u5728\u4FDD\u5B58\u5E76\u91CD\u542F\u2026": "Saving and restarting...",
+ "\u6CA1\u6709\u5339\u914D\u7684\u6280\u80FD\u3002": "No matching skills.",
+ "\u6CA1\u6709\u5339\u914D\u7684\u6A21\u578B\u3002": "No matching models.",
+ \u6CA1\u6709\u591A\u7248\u672C\u6838\u5FC3\u5305: "No multi-version core packages",
+ \u6CA1\u6709\u65E0\u6548\u914D\u7F6E\u6761\u76EE: "There are no invalid configuration entries",
+ \u6CA1\u6709\u672A\u5206\u7EC4\u7684\u4E3B\u9898: "No ungrouped topics",
+ "\u6DFB\u52A0 {0} \u9879": "Add {0} items",
+ "\u6DFB\u52A0\u5230\u300C{0}\u300D": "Add To",
+ "\u7F13\u5B58\u5199 / 1M": "Cache write / 1M",
+ "\u7F13\u5B58\u8BFB / 1M": "Cache read / 1M",
+ "\u81EA\u52A8\uFF08\u5F15\u64CE\u9ED8\u8BA4\uFF09": "Auto (engine default)",
+ "\u8F93\u5165 Token": "Input tokens",
+ "\u8F93\u51FA Token": "Output tokens",
+ \u8FD8\u6CA1\u6709\u4FDD\u5B58\u8FC7\u7EC4\u5408: "No groups saved yet",
+ \u9009\u62E9\u8981\u5BFC\u51FA\u7684\u63D2\u4EF6: "Select plugins to export",
+ \u91CD\u542F\u524D\u90FD\u4E0D\u518D\u63D0\u9192: "Don't remind me again before restarting",
+ \u91CD\u5F00\u94FE\u65F6\u6362\u65B0\u4F1A\u8BDD: "Start a new session when reopening the chain",
+ "\u9879\u76EE Agent": "Project Agent",
+ "{n} \u4E2A\u4F1A\u8BDD": "{n} sessions",
+ "AI \u56FE\u50CF\u5DE5\u574A": "AI Image Studio",
+ \u4E00\u76F4\u4E0D\u63D0\u9192\u66F4\u65B0: "Never remind me to update",
+ "\u4E3A\u4EC0\u4E48\u672A\u751F\u6548\uFF1F": "Why didn't it go into effect?",
+ "\u4E3B\u9898\uFF08{0}\uFF09": "WordPress.org themes",
+ "\u4ECD\u5B89\u88C5 {0}": "Install {0} anyway",
+ \u4ECE\u516C\u5F00\u65E5\u5386\u8F7D\u5165: "Load from Public Calendar",
+ \u4F1A\u5199\u5165\u672C\u673A\u6587\u4EF6: "will write to the native file",
+ \u4F1A\u8BFB\u53D6\u672C\u673A\u6587\u4EF6: "Reads native files",
+ \u4F9D\u8D56\u7248\u672C\u4E0D\u5339\u914D: "Dependency version mismatch",
+ \u4FDD\u6301\u73B0\u5728\u7684\u7248\u672C: "Keep Current Version",
+ "\u6700\u8FD1 30 \u5929": "Latest 30 days",
+ "\u6700\u8FD1 90 \u5929": "Last 90 days",
+ "\u521B\u5EFA\u5FEB\u7167\u5931\u8D25\uFF1A": "Failed to create snapshot:",
+ "\u5220\u9664\u5FEB\u7167\u5931\u8D25\uFF1A": "Failed to delete snapshot:",
+ \u5230\u671F\u524D\u81EA\u52A8\u91CD\u767B: "Auto re-login before expiry",
+ "\u53C2\u6570 JSON": "Parameters JSON",
+ "\u590D\u5236 HTML": "Copy HTML",
+ "\u5DF2\u5B89\u88C5\uFF0C\u672A\u751F\u6548": "Installed, Not Active",
+ \u5DF2\u5B89\u88C5\u5E76\u5DF2\u751F\u6548: "Installed and Active",
+ "\u5E94\u7528\u6B64\u7EC4\u5408\u5C06\uFF1A": "Applying this combination will:",
+ \u6253\u5F00\u72EC\u7ACB\u6062\u590D\u9875: "Open Independent Recovery Page",
+ "\u626B\u63CF\u4E8E {0}": "Scanned on {0}",
+ \u62D6\u62FD\u6280\u80FD\u5230\u6B64\u5904: "Drop skill here",
+ "\u63D2\u4EF6\uFF08{0}\uFF09": "Plugin",
+ "\u641C\u7D22\u63D2\u4EF6...": "Search plugins...",
+ \u65E0\u6548\u7684\u914D\u7F6E\u6761\u76EE: "Invalid configuration entry",
+ \u6709\u672A\u4FDD\u5B58\u7684\u4FEE\u6539: "Unsaved changes",
+ \u672A\u58F0\u660E\u5BBF\u4E3B\u8981\u6C42: "Host requirement not declared",
+ \u672A\u627E\u5230\u76F8\u5173\u63D2\u4EF6: "No matching plugins",
+ "\u6B63\u5728\u52A0\u8F7D\u6280\u80FD\u2026": "Loading skills...",
+ "\u6B63\u5728\u52A0\u8F7D\u6A21\u578B\u2026": "Loading models\u2026",
+ "\u6B63\u5728\u52A0\u8F7D\u8BC4\u8BBA\u2026": "Loading comments...",
+ \u6B63\u5728\u6253\u5F00\u5DE5\u4F5C\u533A: "Opening workspace",
+ "\u6B63\u5728\u68C0\u67E5\u66F4\u65B0\u2026": "Checking for updates...",
+ "\u6B63\u5728\u751F\u6210\u56FE\u7247\u2026": "Generating image\u2026",
+ "\u6B63\u5728\u8BFB\u53D6\u63D2\u4EF6\u2026": "Reading plugins\u2026",
+ \u6CA1\u6709\u5339\u914D\u7684\u6280\u80FD: "No matching skills",
+ \u6CA1\u6709\u5339\u914D\u7684\u63D2\u4EF6: "No matching plugins",
+ \u6D4F\u89C8\u5668\u7A97\u53E3\u767B\u5F55: "Browser window login",
+ "\u7528\u6237\u540D\uFF08\u53EF\u9009\uFF09": "Notification E-Mail auth username (optional)",
+ \u7531\u4F60\u7684\u914D\u7F6E\u52A0\u8F7D: "Loaded by your configuration",
+ \u76EE\u5F55\u4E2D\u6682\u65E0\u4E3B\u9898: "There are currently no topics in the directory",
+ "\u7701 Token": "Save tokens",
+ "\u7EC4\u5408\u64CD\u4F5C\u5931\u8D25\uFF1A": "Combination operation failed:",
+ "\u7ED3\u679C JSON": "Result JSON",
+ \u81EA\u5B9A\u4E49\u65F6\u95F4\u8303\u56F4: "Custom time range",
+ "\u8BCA\u65AD\u52A0\u8F7D\u5931\u8D25\uFF1A": "Diagnostics failed to load:",
+ \u8BF7\u8F93\u5165\u7EC4\u5408\u540D\u79F0: "Please enter a portfolio name",
+ "\u8F93\u5165 / 1M": "Input / 1M",
+ "\u8F93\u51FA / 1M": "Output / 1M",
+ \u8FD8\u6CA1\u6709\u626B\u63CF\u7ED3\u679C: "No scans yet",
+ \u91CD\u542F\u524D\u4E0D\u518D\u63D0\u9192: "Don't remind me again before restarting",
+ \u91CD\u590D\u7684\u63D2\u4EF6\u6761\u76EE: "Duplicate plugin entry",
+ "DSH \u5185\u90E8": "DSH Internal",
+ "DSH \u6280\u80FD": "DSH Skills",
+ "EAC \u6A21\u578B": "EAC models",
+ "Star \u6570": "Number of Stars",
+ \u4E0A\u4E0B\u6587\u5DF2\u538B\u7F29: "Context compacted",
+ \u4E0D\u518D\u663E\u793A\u8FD9\u6761: "Don't show this again",
+ \u4E86\u89E3\u9879\u76EE\u7ED3\u6784: "Inspect Project Structure",
+ \u4F1A\u7528\u4F60\u7684\u5BC6\u94A5: "will use your key",
+ \u4F4E\u4E8E\u58F0\u660E\u4E0B\u9650: "Below Claim Lower Limit",
+ \u4FDD\u5B58\u5F53\u524D\u72B6\u6001: "Save Current State",
+ \u4FDD\u5B58\u73AF\u5883\u53D8\u91CF: "Save Environment Variables",
+ \u4FDD\u7559\u73B0\u6709\u63D2\u4EF6: "Keep existing plugins",
+ "\u5168\u5C40 DSH": "Global DSH",
+ \u5173\u95ED\u6210\u672C\u8BBE\u7F6E: "Close cost settings",
+ \u5173\u95ED\u7528\u91CF\u7EDF\u8BA1: "Close usage statistics",
+ \u5173\u95ED\u81EA\u52A8\u5237\u65B0: "Disable auto refresh",
+ "\u6700\u8FD1 1 \u5929": "Last 1 day",
+ "\u6700\u8FD1 1 \u5E74": "Last year",
+ "\u6700\u8FD1 7 \u5929": "In the last 7 days",
+ \u5220\u9664\u8D39\u7387\u6863\u4F4D: "Delete rate tier",
+ \u5237\u65B0\u7EDF\u8BA1\u6570\u636E: "Refresh statistics",
+ \u5378\u8F7D\u63D2\u4EF6\u5E02\u573A: "Uninstall Plugin Marketplace",
+ \u53D1\u5E03\u65F6\u95F4\u8303\u56F4: "Publish Time Range",
+ \u542F\u7528\u5B8C\u5168\u6743\u9650: "Enable full access",
+ "\u56DE\u6536\u7AD9\u4E3A\u7A7A\u3002": "Trash is empty.",
+ \u590D\u5236\u5B89\u88C5\u547D\u4EE4: "Copy Install Command",
+ \u5B89\u88C5\u524D\u8BF7\u6CE8\u610F: "Please note before installation",
+ \u5B89\u88C5\u540E\u5B83\u53EF\u4EE5: "After installation it can be",
+ \u5BBF\u4E3B\u7248\u672C\u672A\u77E5: "Host version unknown",
+ \u5BBF\u4E3B\u8981\u6C42\u672A\u77E5: "Unknown host request",
+ "\u5BC6\u7801\uFF08\u53EF\u9009\uFF09": "Password (optional)",
+ "\u5C55\u5F00 {0}": "Expand",
+ \u5DE5\u4F5C\u533A\u5185\u4FEE\u6539: "Modify within workspace",
+ \u5DF2\u662F\u6700\u65B0\u7248\u672C: "Up to date",
+ \u5DF2\u6EE1\u8DB3\u7684\u4F9D\u8D56: "Satisfied Dependencies",
+ \u5DF2\u8FBE\u4E24\u683C\u4E0A\u9650: "Two-pane limit reached",
+ \u5E02\u573A\u663E\u793A\u7A7A\u767D: "Market Show Blank",
+ \u5F00\u542F\u81EA\u52A8\u5237\u65B0: "Enable auto refresh",
+ \u6062\u590D\u66F4\u65B0\u63D0\u9192: "Resume update alerts",
+ \u6210\u672C\u7EDF\u8BA1\u8BBE\u7F6E: "Cost statistics settings",
+ \u6362\u7528\u6765\u6E90\u5931\u8D25: "Failed to swap source",
+ \u6362\u7528\u7EBF\u4E0A\u7248\u672C: "Switch to online version",
+ \u63D2\u4EF6\u5E02\u573A\u8BBE\u7F6E: "Marketplace Settings",
+ "\u6536\u8D77 {0}": "Collapse",
+ \u6539\u4E3A\u5B89\u88C5\u8FD9\u4E2A: "Install this instead",
+ \u65E5\u5FD7\u5BFC\u51FA\u5931\u8D25: "Log export failed",
+ \u663E\u793A\u6587\u4EF6\u4F4D\u7F6E: "Show file location",
+ \u66F4\u591A\u6253\u5F00\u65B9\u5F0F: "More ways to open",
+ \u66F4\u65B0\u63D2\u4EF6\u5E02\u573A: "Update Plugin Marketplace",
+ \u672C\u9875\u65E0\u6CD5\u5F00\u5173: "This page cannot be switched on or off",
+ \u6784\u5EFA\u73AF\u5883\u53D8\u91CF: "Build Environment Variables",
+ \u67E5\u627E\u8FD9\u4E2A\u63D2\u4EF6: "Find this plugin",
+ \u67E5\u770B\u4F5C\u8005\u7B80\u4ECB: "View author bio",
+ \u6838\u5FC3\u5305\u591A\u7248\u672C: "Core Package Multiple Versions",
+ \u6CA1\u6709\u4F9D\u8D56\u4FE1\u606F: "No dependency information",
+ \u6CA1\u6709\u4F9D\u8D56\u8B66\u544A: "No Dependency Warning",
+ \u6CA1\u6709\u4F9D\u8D56\u98CE\u9669: "No reliance on risk",
+ \u6CA1\u6709\u8986\u76D6\u5173\u7CFB: "No override relationships",
+ \u6E05\u9664\u5931\u6548\u6536\u85CF: "Clear Expired Favorites",
+ \u7248\u672C\u53D1\u5E03\u65F6\u95F4: "Version release time",
+ \u767D\u5AD6\u6A21\u578B\u63A5\u5165: "Free model access",
+ \u76EE\u5F55\u5EFA\u8BAE\u6539\u7528: "Catalog recommended to use instead",
+ \u76EE\u6807\u4E0D\u662F\u5206\u7EC4: "Target is not a group",
+ \u79FB\u9664\u6240\u9009\u5185\u5BB9: "Remove selection",
+ \u7F51\u5173\u6682\u4E0D\u53EF\u8FBE: "Gateway unreachable",
+ \u8BE5\u7EC4\u6682\u65E0\u6210\u5458: "There are no members in this group",
+ \u8BF7\u5148\u9009\u62E9\u4F1A\u8BDD: "Select a session first",
+ \u8D85\u51FA\u58F0\u660E\u4E0A\u9650: "Claim limit exceeded",
+ \u8FD0\u884C\u6784\u5EFA\u811A\u672C: "Run the build script",
+ "\u8FD1 30 \u5929": "Last 30 days",
+ "\u8FD1 90 \u5929": "Last 90 days",
+ \u8FD4\u56DE\u6211\u7684\u5907\u6CE8: "Back to my notes",
+ \u9000\u51FA\u5F53\u524D\u8D26\u53F7: "Sign out of this account",
+ \u91C7\u7528\u5EFA\u8BAE\u987A\u5E8F: "Adopt Suggested Order",
+ "\u9879\u76EE DSH": "Project DSH",
+ \u9AD8\u4E8E\u663E\u5F0F\u4E0A\u9650: "Above Explicit Upper Limit",
+ "\uFF08\u5DF2\u5220\u9664\uFF09": "(deleted)",
+ "{n}\u4E2A\u6708": "{n} months",
+ "{n}\u5206\u949F": "{n} minutes",
+ "{n}\u5C0F\u65F6": "{n} hours",
+ "\u26AA \u672A\u767B\u5F55": "\u26AA Not signed in",
+ "\u2713 \u5DF2\u5B89\u88C5": "installed",
+ "AI \u4FEE\u590D": "AI Repair",
+ \u4E0A\u4E0B\u6587\u7A97\u53E3: "Context window",
+ "\u4EFB\u52A1 ID": "Task ID",
+ \u4F9B\u5E94\u5546\u7528\u91CF: "Provider Usage",
+ \u4F9B\u5E94\u5546\u7B5B\u9009: "Provider filter",
+ "\u4FDD\u5B58\u5931\u8D25\uFF1A": "SAVE FAILED:",
+ \u4FDD\u5B58\u5E76\u91CD\u542F: "Save & Restart",
+ \u5168\u90E8\u4F9B\u5E94\u5546: "All providers",
+ \u5168\u90E8\u5DE5\u4F5C\u533A: "All workspaces",
+ \u5173\u95ED\u6B64\u63D0\u793A: "Dismiss this notice",
+ "\u5207\u6362\u4E2D\u2026\u2026": "Switching\u2026",
+ \u521B\u5EFA\u65B0\u6280\u80FD: "Create Skill",
+ "\u5220\u9664\u5206\u7EC4\uFF1F": "Remove group",
+ \u53D1\u73B0\u65B0\u7248\u672C: "New version available",
+ \u540D\u79F0\u4E0D\u5339\u914D: "Name mismatch",
+ "\u542F\u52A8\u5931\u8D25\uFF1A": "Activation failed:",
+ \u56DE\u6536\u7AD9\u4E3A\u7A7A: "Trash is empty",
+ "\u56DE\u6EDA\u5931\u8D25\uFF1A": "Rollback failed:",
+ \u5728\u672C\u5730\u6253\u5F00: "Open locally",
+ \u5907\u4EFD\u4E0E\u6062\u590D: "Backup and Recovery",
+ \u5907\u4EFD\u5DF2\u4E0A\u4F20: "Backup uploaded",
+ \u590D\u5236\u63D0\u793A\u8BCD: "Copy prompt",
+ \u5B83\u4F1A\u505A\u4EC0\u4E48: "What it will do",
+ \u5B89\u88C5\u66FF\u4EE3\u54C1: "Install Substitute",
+ "\u5B8C\u6574\u65E5\u5FD7\uFF1A": "Full Log",
+ \u5BFC\u5165\u5E76\u9884\u89C8: "Import and preview",
+ "\u5CF0\u8C37\u8BA1\u5212 ": "Peak/off-peak plan",
+ \u5DE5\u4F5C\u533A\u522B\u540D: "Workspace Aliases",
+ \u5DE5\u4F5C\u533A\u7528\u91CF: "Workspace Usage",
+ \u5DE5\u4F5C\u533A\u7B5B\u9009: "Workspace filter",
+ \u5DE5\u5177\u5DF2\u66F4\u65B0: "Tools updated",
+ \u5DF2\u5B89\u88C5\u6280\u80FD: "Installed Skills",
+ \u5DF2\u5B89\u88C5\u63D2\u4EF6: "Installed Plugins",
+ \u5F53\u524D\u4E0D\u53EF\u7528: "Currently unavailable",
+ \u5FEB\u7167\u4E0E\u56DE\u6EDA: "Snapshots & Rollbacks",
+ \u5FEB\u7167\u5DF2\u521B\u5EFA: "Snapshot created",
+ \u5FEB\u7167\u5DF2\u5220\u9664: "Snapshots have been deleted.",
+ \u624B\u673A\u53F7\u767B\u5F55: "Phone number login",
+ \u6253\u5F00\u4FA7\u8FB9\u680F: "Open sidebar",
+ \u6280\u80FD\u7BA1\u7406\u5668: "Skills Manager",
+ \u63D0\u9192\u5DF2\u5173\u95ED: "Reminders are off",
+ "\u641C\u7D22\u63D2\u4EF6\u2026": "Search plugins by",
+ "\u641C\u7D22\u6536\u85CF\u2026": "Search Collection",
+ \u6536\u8D77\u4FA7\u8FB9\u680F: "Collapse sidebar",
+ \u6587\u4EF6\u4E0E\u73AF\u5883: "Documents & Environment",
+ \u6682\u65E0\u5DE5\u4F5C\u533A: "No workspaces yet",
+ \u670D\u52A1\u5546\u9884\u8BBE: "Provider Presets",
+ \u672A\u63D0\u4F9B\u7B80\u4ECB: "No description provided",
+ \u672A\u6B63\u5E38\u9000\u51FA: "Exited abnormally",
+ \u672A\u77E5\u4F9B\u5E94\u5546: "Unknown provider",
+ \u672A\u77E5\u5DE5\u4F5C\u533A: "Unknown workspace",
+ \u67E5\u770B\u66FF\u4EE3\u54C1: "View substitutions",
+ \u6821\u9A8C\u672A\u901A\u8FC7: "Verification failed",
+ \u68C0\u67E5\u5E76\u66F4\u65B0: "Check & Update",
+ "\u6B63\u5728\u5220\u9664\u2026": "Deleting\u2026",
+ "\u6B63\u5728\u52A0\u8F7D\u2026": "Loading...",
+ "\u6B63\u5728\u5378\u8F7D\u2026": "Uninstalling",
+ "\u6B63\u5728\u53D6\u6D88\u2026": "Cancelling...",
+ "\u6B63\u5728\u66F4\u65B0\u2026": "Updating\u2026",
+ "\u6B63\u5728\u66FF\u6362\u2026": "Replacing...",
+ "\u6B63\u5728\u68C0\u67E5\u2026": "Checking\u2026",
+ "\u6B63\u5728\u8BFB\u53D6\u2026": "Reading\u2026",
+ "\u6B63\u5728\u914D\u7F6E\u2026": "Configuring",
+ "\u6B63\u5728\u91CD\u542F\u2026": "restarting",
+ \u6E05\u7A7A\u56DE\u6536\u7AD9: "Empty Trash",
+ \u6E05\u7A7A\u5DF2\u5B8C\u6210: "Emptying completed",
+ \u6E90\u6587\u4EF6\u53EA\u8BFB: "Read-only",
+ \u767B\u5F55\u6001\u63A2\u6D3B: "Login health check",
+ \u76EE\u6807\u4E0D\u5B58\u5728: "The target does not exist",
+ "\u786E\u8BA4\u5378\u8F7D\uFF1F": "Uninstall Confirmation",
+ \u79FB\u5165\u56DE\u6536\u7AD9: "Move to Trash",
+ \u79FB\u5230\u56DE\u6536\u7AD9: "Move to Trash",
+ \u7CFB\u7EDF\u63D0\u793A\u8BCD: "System Prompt",
+ \u7EC4\u5408\u5DF2\u4FDD\u5B58: "Portfolio saved.",
+ \u7EC4\u5408\u5DF2\u5220\u9664: "Group deleted",
+ \u7F13\u5B58\u547D\u4E2D\u7387: "Cache hit rate",
+ \u80FD\u8FD0\u884C\u547D\u4EE4: "Ability to run commands",
+ \u81EA\u52A8\u5316\u4EFB\u52A1: "Automated tasks",
+ \u81EA\u5B9A\u4E49\u89C4\u5219: "Custom rules",
+ \u8BF7\u9009\u62E9\u6A21\u578B: "Select a model",
+ "\u8FD1 7 \u5929": "Last 7 days",
+ \u8FD8\u6CA1\u6709\u5FEB\u7167: "No snapshots yet",
+ \u8FDE\u901A\u6027\u6D4B\u8BD5: "Connectivity test",
+ \u9009\u62E9\u6587\u4EF6\u5939: "Choose Folder",
+ \u91CD\u542F\u540E\u751F\u6548: "Reboot after changes are installed",
+ \u91CD\u547D\u540D\u5206\u7EC4: "Rename Group",
+ "\u9884\u89C8\u5931\u8D25\uFF1A": "Preview failed",
+ "\uFF08\u672A\u77E5\uFF09": "(unknown)",
+ "{n}\u5929": "{n} days",
+ "{n}\u5E74": "{n} years",
+ \u4E00\u952E\u5B89\u88C5: "Install",
+ \u4E00\u952E\u66F4\u65B0: "Update",
+ \u4E00\u952E\u9886\u53D6: "Claim with 1-Click",
+ \u4E0A\u4F20\u5907\u4EFD: "Upload Backup",
+ \u4E0A\u6B21\u68C0\u67E5: "Last Checked",
+ \u4E0A\u6E38\u8BF7\u6C42: "Upstream Requests",
+ \u4E0B\u6B21\u8FD0\u884C: "Next run",
+ \u4E0B\u8F7D\u533A\u57DF: "Download Region",
+ \u4E0B\u8F7D\u56FE\u50CF: "Download image",
+ \u4E0D\u53EF\u9A71\u52A8: "Cannot Drive",
+ \u4E13\u5BB6\u7BA1\u7406: "Expert Manager",
+ \u4E2D\u56FD\u5927\u9646: "China Mainland",
+ \u4E2D\u7EE7\u5BC6\u94A5: "Relay API Key",
+ \u4EC5\u53EF\u67E5\u770B: "View only",
+ \u4ECD\u7136\u5B89\u88C5: "Install Anyway",
+ \u4ECD\u7136\u66F4\u65B0: "Update Anyway",
+ \u4ED3\u5E93\u7BA1\u7406: "Repositories",
+ \u4ED3\u5E93\u8BA2\u9605: "Repositories",
+ \u4EE3\u7801\u5BA1\u67E5: "Code Review",
+ \u4EFB\u52A1\u603B\u89C8: "Tasks Overview",
+ \u4EFB\u52A1\u8BBE\u7F6E: "Task Settings",
+ \u4F1A\u8BDD\u6280\u80FD: "Session Skills",
+ \u4F30\u7B97\u6210\u672C: "Estimated Cost",
+ \u4F7F\u7528\u8BF4\u660E: "Instructions",
+ \u4F9D\u8D56\u4FE1\u606F: "Dependency Info",
+ \u4F9D\u8D56\u8B66\u544A: "Dependency Warnings",
+ \u4F9D\u8D56\u98CE\u9669: "Dependency Risks",
+ "\u4FDD\u5B58\u4E2D\u2026": "Saving...",
+ \u4FDD\u5B58\u4FEE\u6539: "Save changes",
+ \u4FDD\u5B58\u5931\u8D25: "Save failed",
+ \u505C\u6B62\u751F\u6210: "Stop generating",
+ \u505C\u7528\u5176\u4ED6: "Deactivate Other",
+ \u5141\u8BB8\u5E76\u53D1: "Allow concurrency",
+ \u514D\u8D39\u6A21\u578B: "Free models",
+ \u514D\u8D39\u989D\u5EA6: "Free quota",
+ \u5168\u5C40\u6280\u80FD: "Global Skills",
+ \u5168\u5C4F\u6D4F\u89C8: "Fullscreen",
+ \u5168\u90E8\u4FDD\u5B58: "Save All",
+ \u5168\u90E8\u505C\u7528: "Disable All",
+ \u5168\u90E8\u542F\u7528: "Enable All",
+ \u5168\u90E8\u63D2\u4EF6: "All Plugins",
+ \u5168\u90E8\u65F6\u95F4: "Full Time",
+ \u5168\u90E8\u66F4\u65B0: "Update All",
+ \u5168\u90E8\u6765\u6E90: "All Sources",
+ \u5168\u90E8\u6A21\u578B: "All models",
+ \u5168\u90E8\u72B6\u6001: "All Statuses",
+ \u5173\u95ED\u63D0\u793A: "Closure Prompt",
+ \u5173\u95ED\u8BE6\u60C5: "Close details",
+ \u5173\u95ED\u9884\u89C8: "Close Preview",
+ \u5185\u7F6E\u63D2\u4EF6: "Built-in plugins",
+ \u6700\u65B0\u7248\u672C: "Latest Version",
+ \u51C6\u5907\u4F9D\u8D56: "Prepare Dependencies",
+ \u51ED\u8BC1\u6765\u6E90: "Credential source",
+ \u5206\u7EC4\u540D\u79F0: "Group name",
+ \u5207\u6362\u5931\u8D25: "Switch failed",
+ "\u521B\u5EFA\u4E2D\u2026": "Creating...",
+ \u521B\u5EFA\u4F4D\u7F6E: "Location",
+ \u521B\u5EFA\u5FEB\u7167: "Create Snapshot",
+ \u521B\u5EFA\u6280\u80FD: "Create Skill",
+ \u521B\u5EFA\u65F6\u95F4: "Created",
+ "\u5220\u9664\u4E2D\u2026": "deleting...",
+ \u5220\u9664\u5206\u7EC4: "Remove group",
+ \u5220\u9664\u65F6\u6BB5: "Delete period",
+ \u5220\u9664\u89C4\u5219: "Delete rule",
+ \u5237\u65B0\u9875\u9762: "Refresh page ",
+ \u524D\u9762\u8FD8\u6709: "There's more up ahead.",
+ \u52A0\u5165\u6536\u85CF: "Add Favorites",
+ "\u52A0\u8F7D\u4E2D\u2026": "Loading...",
+ \u52A0\u8F7D\u5931\u8D25: "Load failed",
+ \u52A0\u8F7D\u66F4\u591A: "Load more",
+ \u5305\u542B\u6587\u4EF6: "File Inlcuded",
+ "\u5378\u8F7D\u4E2D\u2026": "Uninstalling",
+ \u5386\u53F2\u4F1A\u8BDD: "History",
+ \u53D1\u5E03\u65F6\u95F4: "Release time",
+ \u53D1\u73B0\u6280\u80FD: "Discover Skills",
+ \u53D1\u73B0\u95EE\u9898: "Recognise there is a problem",
+ \u53D1\u9001\u6D88\u606F: "Send message",
+ \u53D6\u6D88\u5B89\u88C5: "Cancel the installation",
+ \u53D6\u6D88\u5C4F\u853D: "Unmask",
+ \u53D6\u6D88\u5F52\u6863: "Unarchive",
+ \u53D6\u6D88\u6536\u85CF: "Uncollect",
+ \u53D6\u6D88\u6807\u8BB0: "Unmark",
+ \u53D6\u6D88\u7F16\u8F91: "Cancel edit",
+ \u53D6\u6D88\u7F6E\u9876: "Unpin",
+ \u53EF\u7528\u6280\u80FD: "Available Skills",
+ \u53EF\u9009\u4F9D\u8D56: "Optional Dependencies",
+ "\u540C\u6B65\u4E2D\u2026": "Syncing\u2026",
+ \u542F\u505C\u6280\u80FD: "Toggle Skill",
+ \u542F\u505C\u6765\u6E90: "Toggle Source",
+ \u542F\u52A8\u5931\u8D25: "Start failed",
+ \u56DE\u5230\u9876\u90E8: "Back to the top",
+ "\u56DE\u6EDA\u4E2D\u2026": "Rolling back...",
+ \u56FE\u7247\u9884\u89C8: "Image preview",
+ "\u5904\u7406\u4E2D\u2026": "Processing\u2026",
+ \u590D\u5236\u5931\u8D25: "Copy failed",
+ \u590D\u5236\u6210\u529F: "Copied",
+ \u590D\u5236\u6307\u4EE4: "Copy instructions",
+ \u590D\u5236\u8DEF\u5F84: "Copy path",
+ \u5916\u89C2\u8BBE\u7F6E: "Appearance",
+ \u5B50\u667A\u80FD\u4F53: "Subagent",
+ "\u5B89\u88C5\u4E2D\u2026": "Installing...",
+ \u5B89\u88C5\u547D\u4EE4: "Installation Commands",
+ \u5B89\u88C5\u5931\u8D25: "Installation was unsuccessful",
+ \u5B8C\u5168\u6743\u9650: "Full access",
+ \u5B9E\u9645\u7248\u672C: "Actual Version",
+ \u5BBF\u4E3B\u7248\u672C: "Host Version",
+ \u5BFC\u5165\u6280\u80FD: "Import Skill",
+ "\u5BFC\u51FA\u4E2D\u2026": "Exporting",
+ \u5BFC\u51FA\u5907\u4EFD: "Exported Backups",
+ \u5BFC\u51FA\u6280\u80FD: "Export Skill",
+ \u5BFC\u51FA\u65E5\u5FD7: "Export As JSON",
+ \u5C55\u5F00\u5168\u90E8: "Expand All",
+ \u5DE5\u5177\u8C03\u7528: "Tool call",
+ "\u5DF2\u5BFC\u51FA\uFF1A": "Exported",
+ \u5DF2\u662F\u6700\u65B0: "Up To Date",
+ \u5DF2\u6709\u4E3B\u9898: "Existing topic",
+ \u5E94\u7528\u987A\u5E8F: "Order of Application",
+ \u5F00\u59CB\u6062\u590D: "Begin Rollback",
+ \u5F00\u59CB\u65F6\u95F4: "Start time",
+ \u5F02\u5E38\u8BCA\u65AD: "Diagnostics",
+ \u5F52\u6863\u4F1A\u8BDD: "Archive session",
+ \u5F53\u524D\u51FA\u53E3: "Current egress",
+ \u5F53\u524D\u6765\u6E90: "Current Source:",
+ \u5F53\u524D\u7248\u672C: "Current Version",
+ \u5FEB\u6377\u9884\u8BBE: "Quick presets",
+ \u6062\u590D\u5931\u8D25: "Backup succeeded with an warning.",
+ \u6062\u590D\u63D0\u9192: "Resume Reminder",
+ \u6062\u590D\u81EA\u52A8: "Restore Auto",
+ \u6062\u590D\u9ED8\u8BA4: "Restore Defaults",
+ \u6211\u7684\u5907\u6CE8: "My notes",
+ \u624B\u52A8\u8F93\u5165: "Manual input.",
+ "\u6267\u884C\u4E2D\u2026": "Running\u2026",
+ \u6280\u80FD\u5217\u8868: "Skills List",
+ \u6280\u80FD\u6765\u6E90: "Skill Sources",
+ \u6280\u80FD\u7BA1\u7406: "Skills Manager",
+ \u62D6\u62FD\u6392\u5E8F: "Drag to Reorder",
+ \u6307\u7EB9\u6E05\u7406: "Fingerprint cleanup",
+ \u6392\u5E8F\u65B9\u5411: "SORT DIRECTION",
+ \u6392\u961F\u53D1\u9001: "Queued to send",
+ \u63D0\u4EA4\u8BB0\u5F55: "Submit Record",
+ \u63D2\u4EF6\u5217\u8868: "Plugin list",
+ \u63D2\u4EF6\u5347\u7EA7: "Plugin upgrade",
+ \u63D2\u4EF6\u5E02\u573A: "Plugin Marketplace",
+ \u63D2\u4EF6\u7EC4\u5408: "Plugin Portfolio",
+ \u63D2\u8BDD\u53D1\u9001: "Send interjection",
+ \u641C\u7D22\u4F1A\u8BDD: "Search sessions",
+ \u641C\u7D22\u63D2\u4EF6: "Search plugins...",
+ \u64CD\u4F5C\u5931\u8D25: "Operation Failed",
+ \u6536\u5F55\u65F6\u95F4: "Listed on",
+ \u6536\u8D77\u8F93\u51FA: "Collapse output",
+ \u653E\u5F03\u4FEE\u6539: "Discard changes",
+ \u6570\u636E\u770B\u677F: "Dashboard",
+ \u6587\u4EF6\u8981\u6C42: "File Requirements",
+ \u65B0\u5EFA\u5206\u7EC4: "Group Adding",
+ \u65B0\u5EFA\u6280\u80FD: "New Skill",
+ \u65E0\u6CD5\u6062\u590D: "Can't Redo",
+ \u65F6\u95F4\u8303\u56F4: "Time range",
+ \u663E\u793A\u5168\u90E8: "Show All",
+ \u663E\u793A\u540D\u79F0: "Display name",
+ \u6682\u4E0D\u53EF\u7528: "Temporarily unavailable",
+ \u6682\u65E0\u4F1A\u8BDD: "No sessions",
+ \u6682\u65E0\u6280\u80FD: "No skills available",
+ \u6682\u65E0\u6570\u636E: "No data available",
+ \u6682\u65E0\u9884\u89C8: "No preview yet",
+ \u66F4\u591A\u5206\u7C7B: "More category",
+ \u66F4\u6362\u4E3B\u9898: "switch_themes",
+ "\u66F4\u65B0\u4E2D\u2026": "Updating...",
+ \u66F4\u65B0\u5185\u5BB9: "Update of Content",
+ \u66F4\u65B0\u5931\u8D25: "Gagal Update",
+ \u66F4\u65B0\u65F6\u95F4: "Updated",
+ \u66F4\u65B0\u901A\u9053: "Update channel",
+ \u6709\u65B0\u7248\u672C: "Update Available",
+ \u672A\u77E5\u539F\u56E0: "Unknown reason",
+ \u672A\u77E5\u6A21\u578B: "Unknown model",
+ \u672A\u77E5\u7248\u672C: "unknown",
+ \u672C\u5730\u5F00\u53D1: "Native Development",
+ \u672C\u5730\u6587\u4EF6: "Local File",
+ \u672F\u8BED\u8BF4\u660E: "A few words about terms",
+ \u67E5\u770B\u4ED3\u5E93: "View Repository",
+ \u67E5\u770B\u8BCA\u65AD: "View Diagnostics",
+ \u67E5\u770B\u8BE6\u60C5: "View Details",
+ \u67E5\u770B\u8BF4\u660E: "View Documentation",
+ "\u67E5\u8BE2\u4E2D\u2026": "Querying\u2026",
+ \u683C\u5F0F\u9519\u8BEF: "Format salah.",
+ "\u68C0\u67E5\u4E2D\u2026": "Checking\u2026",
+ \u68C0\u67E5\u66F4\u65B0: "Check Updates",
+ \u6A21\u578B\u6E05\u5355: "Model catalog",
+ \u6A21\u578B\u7528\u91CF: "Model Usage",
+ \u6A21\u578B\u7B5B\u9009: "Model filter",
+ \u6A21\u578B\u8BBE\u7F6E: "Model Settings",
+ \u6B63\u5728\u4E0B\u8F7D: "Downloading...",
+ \u6B63\u5728\u5904\u7406: "(In work)",
+ \u6B63\u5728\u5B89\u88C5: "Installing...",
+ \u6B8B\u7559\u76EE\u5F55: "Residual Catalog",
+ \u6C38\u4E45\u5220\u9664: "Delete Forever",
+ \u6CA1\u6709\u8B66\u544A: "No warnings",
+ \u6CA1\u6709\u9519\u8BEF: "No Errors",
+ \u6D45\u8272\u6A21\u5F0F: "Light Mode",
+ "\u6D4B\u8BD5\u4E2D\u2026": "Testing\u2026",
+ "\u6D4B\u91CF\u4E2D\u2026": "Measuring\u2026",
+ \u6DF1\u8272\u6A21\u5F0F: "Dark Mode",
+ \u6DF7\u5408\u67E5\u770B: "Combined view",
+ \u6DFB\u52A0\u5907\u6CE8: "Add note for seller",
+ \u6DFB\u52A0\u6210\u5458: "Add Member",
+ \u6DFB\u52A0\u63D2\u4EF6: "Add plugin",
+ \u6DFB\u52A0\u8D26\u53F7: "Add account",
+ \u6E05\u7A7A\u641C\u7D22: "Clear search",
+ "\u6E05\u9664\u4E2D\u2026": "Cleaning...",
+ \u6E05\u9664\u641C\u7D22: "Clear search",
+ \u6E05\u9664\u7B5B\u9009: "Clear filters",
+ \u7248\u672C\u8BF4\u660E: "Imprint",
+ \u7528\u91CF\u7EDF\u8BA1: "Usage Statistics",
+ \u754C\u9762\u8BED\u8A00: "Interface language",
+ \u767B\u5F55\u72B6\u6001: "Login status",
+ \u76D1\u542C\u5730\u5740: "Listen address",
+ \u786E\u8BA4\u5220\u9664: "Confirm Deletion",
+ \u786E\u8BA4\u5378\u8F7D: "Uninstall Confirmation",
+ \u786E\u8BA4\u56DE\u6EDA: "Confirm Rollback",
+ \u786E\u8BA4\u5B89\u88C5: "Install Confirmation",
+ \u786E\u8BA4\u6062\u590D: "Confirm to resume",
+ \u786E\u8BA4\u6362\u7528: "Confirm Replacement",
+ \u786E\u8BA4\u66F4\u65B0: "Confirm Update",
+ \u786E\u8BA4\u79FB\u9664: "Confirm removal",
+ \u79FB\u51FA\u4E3B\u9898: "Move out of topic",
+ \u79FB\u51FA\u961F\u5217: "Move out of queue",
+ \u7ACB\u5373\u521B\u5EFA: "Create Now",
+ \u7ACB\u5373\u6267\u884C: "Execute Now",
+ \u7ACB\u5373\u66F4\u65B0: "Update Now",
+ \u7ACB\u5373\u91CD\u542F: "Restart immediately",
+ \u7B49\u5F85\u4F9D\u8D56: "Waiting for dependencies",
+ \u7B49\u5F85\u56DE\u7B54: "Awaiting answer",
+ \u7B49\u5F85\u5BA1\u6279: "Awaiting approval",
+ \u7B80\u4F53\u4E2D\u6587: "Simplified Chinese",
+ \u7BA1\u7406\u66F4\u65B0: "Manage Updates",
+ \u7EC4\u5408\u540D\u79F0: "Combo Name",
+ \u7EE7\u7EED\u66F4\u65B0: "Continue updating",
+ \u7F13\u5B58\u5199\u5165: "Cache Write",
+ \u7F13\u5B58\u547D\u4E2D: "Cache Hit",
+ \u7F13\u5B58\u8BFB\u53D6: "Cache read",
+ \u7F16\u8F91\u5907\u6CE8: "Edit note",
+ \u7F3A\u5C11\u6807\u8BC6: "id is missing",
+ \u7F51\u5173\u8BBE\u7F6E: "Gateway settings",
+ \u7F51\u9875\u641C\u7D22: "Web search",
+ \u7F6E\u9876\u4F1A\u8BDD: "Pin session",
+ \u805A\u5408\u6E20\u9053: "Aggregated channels",
+ \u81EA\u52A8\u5237\u65B0: "Auto refresh",
+ \u81EA\u52A8\u6362\u884C: "Word Wrap",
+ \u81EA\u52A8\u6392\u5E8F: "AutoSort",
+ \u81EA\u52A8\u914D\u7F6E: "Automatic Configuration",
+ \u8981\u6C42\u7248\u672C: "Requires Version",
+ \u8986\u76D6\u5173\u7CFB: "Override Relationship",
+ \u8BA1\u5212\u5F85\u5BA1: "Plan awaiting review",
+ \u8BCA\u65AD\u5F02\u5E38: "Diagnostics",
+ \u8BED\u8A00\u8BBE\u7F6E: "Language",
+ \u8BF7\u6C42\u65E5\u5FD7: "Request log",
+ "\u8BFB\u53D6\u4E2D\u2026": "Reading\u2026",
+ \u8C03\u6574\u63D2\u4EF6: "Tweak plugin",
+ \u8C03\u7528\u53F0\u8D26: "Call ledger",
+ \u8C03\u7528\u6B21\u6570: "Call count",
+ \u8C03\u7528\u72B6\u6001: "Invocation Status",
+ \u8DDF\u968F\u7CFB\u7EDF: "Follow System",
+ \u8F93\u5165\u53E3\u5F84: "Input basis",
+ \u8FD0\u884C\u547D\u4EE4: "Run command",
+ \u8FD0\u884C\u65E5\u5FD7: "Runtime log",
+ \u8FD0\u884C\u7248\u672C: "Running version",
+ \u8FD130\u5929: "Last 30 Days",
+ \u8FDB\u5165\u76EE\u5F55: "Enter directory",
+ \u9000\u51FA\u5168\u5C4F: "Exit fullscreen",
+ \u9000\u51FA\u767B\u5F55: "Sign out",
+ \u9009\u62E9\u4E3B\u9898: "Theme selection",
+ \u9009\u62E9\u6587\u4EF6: "Choose File",
+ \u901A\u7528\u8BBE\u7F6E: "General Settings",
+ \u90E8\u5206\u542F\u7528: "Partially enabled",
+ \u91CD\u542F\u5931\u8D25: "Restart failed",
+ \u91CD\u65B0\u52A0\u8F7D: "Reload",
+ \u91CD\u65B0\u68C0\u67E5: "Recheck",
+ \u91CD\u65B0\u751F\u6210: "Regenerate",
+ \u91CD\u7F6E\u8349\u7A3F: "Reset to Draft",
+ \u94FE\u63A5\u4F9D\u8D56: "Link Dependency",
+ \u9519\u8BEF\u8BE6\u60C5: "Hide Error Details",
+ \u95EE\u9898\u53CD\u9988: "Issues",
+ \u95F4\u9694\u4E0A\u9650: "Maximum interval",
+ \u95F4\u9694\u4E0B\u9650: "Minimum interval",
+ \u9879\u76EE\u522B\u540D: "Project Alias",
+ \u9879\u76EE\u6280\u80FD: "Project Skills",
+ \u9879\u9700\u5904\u7406: "Items need to be processed",
+ \u9A8C\u8BC1\u8FDE\u63A5: "Verify Connection",
+ " \u81F3 ": " to ",
+ \u4E0A\u4E00\u5F20: "Previous",
+ \u4E0A\u4E00\u6B65: "Back",
+ \u4E0A\u4E00\u9875: "Previous Page",
+ \u4E0A\u4E0B\u6587: "Context",
+ \u4E0B\u4E00\u5F20: "Next",
+ \u4E0B\u4E00\u6B65: "Next",
+ \u4E0B\u4E00\u9875: "Next Page",
+ \u4E0B\u4E00\u9898: "Next question",
+ \u4E0B\u8F7D\u4E2D: "Downloading...",
+ \u4E0B\u8F7D\u91CF: "Downloads",
+ \u4E0D\u53EF\u7528: "Unavailable",
+ \u4E0D\u5B89\u88C5: "Not Installed",
+ \u4E0D\u652F\u6301: "Not Supported",
+ \u4E0D\u6EE1\u8DB3: "Not satisfied",
+ \u4E3B\u83DC\u5355: "Main Menu",
+ \u4EC5\u4E00\u6B21: "Once only",
+ \u4F1A\u8054\u7F51: "Will be networked",
+ \u4F7F\u7528\u4E2D: "In Use",
+ \u5168\u4E0D\u9009: "Deselect All",
+ \u5206\u914D\u5230: "Assigned To",
+ \u5207\u6362\u81F3: "switch to ",
+ \u5220\u9664\u4E8E: "Deleted at",
+ \u52A0\u8F7D\u4E2D: "Loading",
+ \u5378\u8F7D\u4E2D: "Uninstalling...",
+ \u53BB\u5145\u503C: "Add credit",
+ \u53D1\u5E03\u4E8E: "In",
+ \u542F\u7528\u4E2D: "Activating",
+ \u547D\u4E2D\u7387: "Hit rate",
+ \u56DE\u6536\u7AD9: "Trash",
+ \u5B89\u88C5\u4E2D: "Installing...",
+ \u5DE5\u4F5C\u533A: "Workspace",
+ \u5DF2\u4E2D\u65AD: "Interrupted",
+ \u5DF2\u4FDD\u5B58: "Saved",
+ \u5DF2\u505C\u6B62: "Stopped",
+ \u5DF2\u505C\u7528: "Disabled",
+ \u5DF2\u5173\u95ED: "Closed",
+ \u5DF2\u5220\u9664: "Deleted",
+ \u5DF2\u5378\u8F7D: "Uninstalled",
+ \u5DF2\u538B\u7F29: "Compacted",
+ \u5DF2\u53D6\u6D88: "Canceled",
+ \u5DF2\u542F\u7528: "Enabled",
+ \u5DF2\u590D\u5236: "Copied",
+ \u5DF2\u5931\u8D25: "Failed",
+ \u5DF2\u5B89\u88C5: "Installed",
+ \u5DF2\u5B8C\u6210: "Complete",
+ \u5DF2\u5C4F\u853D: "blocked",
+ \u5DF2\u5E9F\u5F03: "Obsolete",
+ \u5DF2\u622A\u65AD: "Truncated",
+ \u5DF2\u751F\u6548: "Berlaku",
+ \u5DF2\u79FB\u9664: "Removed",
+ \u5DF2\u7ED3\u675F: "Ended",
+ \u5DF2\u8986\u76D6: "Overridden",
+ \u5DF2\u89E3\u9664: "Cleared",
+ \u5F00\u53D1\u7248: "The7 Dev",
+ \u5F85\u5904\u7406: "Pending",
+ \u5F85\u5BA1\u6279: "Pending approval",
+ \u5FEB\u6377\u952E: "Shortcuts",
+ \u603B\u5904\u7406: "Total processed",
+ \u6309\u6A21\u578B: "By model",
+ \u6309\u8D26\u53F7: "By account",
+ \u6392\u961F\u4E2D: "In queue:",
+ \u63D0\u4F9B\u5546: "Provider",
+ \u63D0\u4F9B\u65B9: "Provider",
+ \u65B0\u4F1A\u8BDD: "New Session",
+ \u65E0\u5185\u5BB9: "No content",
+ \u65E0\u53D8\u66F4: "No change",
+ \u65E0\u8F93\u51FA: "No output",
+ \u66F4\u65B0\u4E2D: "Updating...",
+ \u672A\u5206\u7EC4: "Not Grouped",
+ \u672A\u542F\u7528: "Disabled",
+ \u672A\u5B89\u88C5: "Not Installed",
+ \u672A\u751F\u6548: "Unactivated",
+ \u672A\u786E\u8BA4: "Unconfirmed",
+ \u672A\u8BA1\u4EF7: "Not priced",
+ \u672A\u8FD0\u884C: "Not running",
+ \u672A\u914D\u7F6E: "Not configured",
+ "\u6765\u6E90\uFF1A": "Source: ",
+ \u6BCF\u5206\u949F: "Every minute",
+ \u6BCF\u5C0F\u65F6: "Every hour",
+ \u6E90\u6587\u4EF6: "Source File",
+ \u77E5\u9053\u4E86: "Got it",
+ \u7A33\u5B9A\u7248: "Stable",
+ \u7EAF\u6587\u672C: "Plain text",
+ \u81EA\u5B9A\u4E49: "Custom",
+ \u88AB\u8986\u76D6: "Shadowed",
+ \u8986\u76D6\u4E86: "Overwritten",
+ \u8BF7\u6C42\u6570: "Requests",
+ \u8D26\u53F7\u5E93: "Account pool",
+ \u8FD0\u884C\u4E2D: "Running",
+ \u8FDB\u884C\u4E2D: "In progress",
+ \u91CD\u547D\u540D: "Rename",
+ \u963F\u91CC\u7CFB: "Alibaba family",
+ " \u5929": " days",
+ \u4E0A\u79FB: "Move Up",
+ \u4E0B\u79FB: "Move Down",
+ \u4E13\u5BB6: "Experts",
+ \u4E2A\u4EBA: "Personal",
+ \u4E2D\u6587: "Chinese",
+ \u4E3B\u9898: "Themes",
+ \u4ECA\u65E5: "Today",
+ \u4EE3\u7801: "Code",
+ \u4EFB\u52A1: "Tasks",
+ \u4F1A\u8BDD: "Sessions",
+ \u4F4D\u7F6E: "Location",
+ \u4F5C\u8005: "Author",
+ \u4F7F\u7528: "Use",
+ \u4F9D\u8D56: "Dependencies",
+ \u4FDD\u5B58: "Save",
+ \u4FDD\u7559: "Preserve",
+ \u4FE1\u606F: "information",
+ \u505C\u7528: "Disable",
+ \u5168\u5C4F: "Full screen",
+ \u5168\u7403: "Global",
+ \u5168\u9009: "Select All",
+ \u5168\u90E8: "All",
+ \u5173\u4E8E: "About",
+ \u5173\u95ED: "Close",
+ \u5176\u4ED6: "Other",
+ \u5185\u5BB9: "Content",
+ \u6700\u65B0: "Recent",
+ \u6700\u65E7: "Oldest",
+ \u51B2\u7A81: "Tension",
+ \u5206\u7EC4: "Group",
+ \u5206\u949F: "minute",
+ \u5217\u8868: "Vertical",
+ \u521A\u521A: "Just now",
+ \u521B\u5EFA: "Buat",
+ \u5220\u9664: "Delete",
+ \u5237\u65B0: "Refresh",
+ \u52A0\u5165: "Add",
+ \u52A9\u624B: "Assistant",
+ \u5347\u5E8F: "ascending",
+ \u5355\u6B21: "Once",
+ \u5378\u8F7D: "Uninstall",
+ \u538B\u7F29: "Compact",
+ \u539F\u6587: "Original Text",
+ \u53C2\u6570: "Parameters",
+ \u53CD\u9988: "Feedback",
+ \u53D1\u73B0: "Discover",
+ \u53D1\u9001: "Send",
+ \u53D6\u6D88: "Cancel",
+ \u53EA\u8BFB: "Read-only",
+ \u53EF\u7528: "Available",
+ \u540D\u79F0: "Name",
+ \u542F\u7528: "Enable",
+ \u5468\u4E00: "Monday",
+ \u5468\u4E09: "Wednesday",
+ \u5468\u4E8C: "Tuesday",
+ \u5468\u4E94: "Friday",
+ \u5468\u516D: "Saturday",
+ \u5468\u56DB: "Thursday",
+ \u5468\u65E5: "Sunday",
+ \u56DE\u5408: "Turn",
+ \u56DE\u6EDA: "Rollback",
+ \u56FE\u7247: "Image",
+ \u5907\u4EFD: "Backup",
+ \u590D\u5236: "Copy",
+ \u5927\u5C0F: "Size",
+ \u5931\u8D25: "Failed",
+ \u5B89\u88C5: "Install",
+ \u5B8C\u6210: "Done",
+ \u5B98\u65B9: "Offical",
+ \u5BC6\u94A5: "Key",
+ \u5BF9\u8BDD: "Conversation",
+ \u5BFC\u5165: "Import",
+ \u5BFC\u51FA: "Export",
+ \u5C0F\u65F6: "hour",
+ \u5C42\u7EA7: "Level",
+ \u5C4F\u853D: "Block",
+ \u5C55\u5F00: "Expand",
+ \u5DE5\u5177: "Tool",
+ \u5E94\u7528: "Applications",
+ \u5F02\u5E38: "Error",
+ \u5F53\u524D: "Current",
+ \u601D\u8003: "Thinking",
+ \u603B\u8BA1: "Total",
+ \u6062\u590D: "Restore",
+ \u6210\u672C: "Cost",
+ \u6253\u5F00: "Open",
+ \u6267\u884C: "Go",
+ \u6280\u80FD: "Skills",
+ \u6298\u53E0: "Collapse",
+ \u62D2\u7EDD: "Deny",
+ \u6307\u4EE4: "Instructions",
+ \u6392\u5E8F: "Sort",
+ \u63A8\u7406: "Reasoning",
+ \u63A8\u8350: "Featured",
+ \u63CF\u8FF0: "Description",
+ \u63D0\u4EA4: "Submit",
+ \u63D2\u4EF6: "Plugin",
+ \u641C\u7D22: "Search",
+ \u64A4\u9500: "Undo",
+ \u64CD\u4F5C: "Actions",
+ \u6536\u85CF: "Favorites",
+ \u6536\u8D77: "Collapse",
+ \u6587\u4EF6: "File",
+ \u65B0\u589E: "Added",
+ \u65E5\u671F: "Date",
+ \u65F6\u533A: "Time zone",
+ \u65F6\u957F: "Duration",
+ \u65F6\u95F4: "Time",
+ \u663E\u793A: "Show",
+ \u66F4\u591A: "More",
+ \u66F4\u65B0: "Update",
+ \u672A\u77E5: "Unknown",
+ \u672C\u5730: "Local",
+ \u672C\u673A: "This machine",
+ \u6743\u9650: "Permissions",
+ \u6765\u6E90: "Source",
+ \u67E5\u770B: "View",
+ \u6807\u51C6: "Standard",
+ \u6A21\u578B: "Models",
+ \u6B63\u6587: "Body",
+ \u6B65\u9AA4: "Steps",
+ \u6BCF\u5468: "Weekly",
+ \u6BCF\u5929: "Daily",
+ \u6BCF\u9875: "Per page",
+ \u6D4B\u8BD5: "Test",
+ \u6D88\u606F: "Message",
+ \u6DFB\u52A0: "Add",
+ \u6E05\u9664: "Clear",
+ \u6E90\u7801: "Source code",
+ \u6EE1\u8DB3: "Confirmed",
+ \u70ED\u95E8: "Popular",
+ \u7248\u672C: "Version",
+ \u72B6\u6001: "Status",
+ \u7528\u6237: "User",
+ \u7528\u91CF: "Usage",
+ \u767B\u5F55: "Sign in",
+ \u76EE\u5F55: "Table of Contents",
+ \u76EE\u6807: "Goal",
+ \u786E\u5B9A: "OK",
+ \u786E\u8BA4: "Confirmation",
+ \u793E\u533A: "COMMUNITY",
+ \u79FB\u51FA: "Emigration",
+ \u79FB\u9664: "Remove",
+ \u7A7A\u95F2: "Idle",
+ \u7AEF\u53E3: "Port",
+ \u7B5B\u9009: "Filter Bar",
+ \u7B80\u4ECB: "Description",
+ \u7B80\u6D01: "Concise",
+ \u7C7B\u578B: "Type",
+ \u7EC8\u7AEF: "Terminal",
+ \u7ED3\u679C: "Result",
+ \u7EE7\u7EED: "Continue",
+ \u7F16\u8F91: "Edit",
+ \u7F51\u7EDC: "networks",
+ \u8017\u65F6: "Duration",
+ \u811A\u6CE8: "Footnote",
+ \u82F1\u6587: "English",
+ \u8303\u56F4: "Range",
+ \u8BA1\u5212: "Plan",
+ \u8BBE\u7F6E: "Settings",
+ \u8BBF\u8FBE: "Finder",
+ \u8BC4\u5206: "Rating",
+ \u8BC4\u8BBA: "Comments",
+ \u8BCA\u65AD: 'Diagnosis: ',
+ \u8BE6\u60C5: "Details",
+ \u8BE6\u7EC6: "Detailed",
+ \u8BED\u8A00: "Language",
+ \u8C03\u7528: "Call",
+ \u8B66\u544A: "WARNING",
+ \u8D26\u53F7: "Account",
+ \u8DEF\u7531: "Routing",
+ \u8DF3\u8FC7: "Skip",
+ \u8F6E\u6B21: "Turns",
+ \u8F93\u5165: "Input",
+ \u8F93\u51FA: "Output",
+ \u9000\u51FA: "Exit",
+ \u901F\u5EA6: "Speed",
+ \u91CD\u542F: "Restart",
+ \u91CD\u590D: "Repeat",
+ \u91CD\u8BD5: "Retry",
+ \u9519\u8BEF: "Error:",
+ \u964D\u5E8F: "descending",
+ \u9690\u85CF: "Hide",
+ \u9876\u5C42: "top floor",
+ \u987A\u5E8F: "Sequence",
+ \u9884\u89C8: "Prev",
+ \u98CE\u9669: "Hazard",
+ \u9996\u5B57: "First token",
+ \u9AD8\u7EA7: "III",
+ \u4E00: "1",
+ \u4E09: "3",
+ \u4E8C: "2",
+ \u4E94: "5",
+ \u516D: "6",
+ \u5206: "min",
+ \u56DB: "4",
+ \u591A: "More",
+ \u5929: "Day",
+ \u5C11: "Less",
+ \u65E0: "None",
+ \u65E5: "Day",
+ \u6708: "Month",
+ \u79D2: "sec"
+};
+
+// src/strings.ts
+var REGEX_PREFIX = /* @__PURE__ */ new Set([
+ "",
+ "(",
+ ",",
+ "=",
+ ":",
+ "[",
+ "!",
+ "&",
+ "|",
+ "?",
+ "{",
+ "}",
+ ";",
+ "+",
+ "-",
+ "*",
+ "%",
+ "~",
+ "^",
+ "<",
+ ">",
+ "\n"
+]);
+function scanLiterals(src) {
+ const out = [];
+ const n = src.length;
+ let i = 0;
+ let lastSig = "";
+ while (i < n) {
+ const c = src[i];
+ if (c === "/" && src[i + 1] === "/") {
+ const e = src.indexOf("\n", i);
+ i = e < 0 ? n : e + 1;
+ continue;
+ }
+ if (c === "/" && src[i + 1] === "*") {
+ const e = src.indexOf("*/", i + 2);
+ i = e < 0 ? n : e + 2;
+ continue;
+ }
+ if (c === "/" && REGEX_PREFIX.has(lastSig)) {
+ let j = i + 1;
+ let inClass = false;
+ let ok = false;
+ while (j < n) {
+ const d = src[j];
+ if (d === "\\") {
+ j += 2;
+ continue;
+ }
+ if (d === "\n") break;
+ if (d === "[") inClass = true;
+ else if (d === "]") inClass = false;
+ else if (d === "/" && !inClass) {
+ ok = true;
+ break;
+ }
+ j++;
+ }
+ if (ok) {
+ i = j + 1;
+ lastSig = "/";
+ continue;
+ }
+ }
+ if (c === '"' || c === "'" || c === "`") {
+ let j = i + 1;
+ while (j < n) {
+ const d = src[j];
+ if (d === "\\") {
+ j += 2;
+ continue;
+ }
+ if (d === c) break;
+ j++;
+ }
+ if (j < n) {
+ out.push({ start: i, end: j + 1, quote: c, raw: src.slice(i + 1, j) });
+ i = j + 1;
+ lastSig = c;
+ continue;
+ }
+ i = n;
+ continue;
+ }
+ if (!/\s/.test(c)) lastSig = c;
+ i++;
+ }
+ return out;
+}
+function decodeRaw(raw) {
+ if (!raw.includes("\\")) return raw;
+ let out = "";
+ for (let i = 0; i < raw.length; i++) {
+ const c = raw[i];
+ if (c !== "\\") {
+ out += c;
+ continue;
+ }
+ const d = raw[++i];
+ switch (d) {
+ case "n":
+ out += "\n";
+ break;
+ case "r":
+ out += "\r";
+ break;
+ case "t":
+ out += " ";
+ break;
+ case "b":
+ out += "\b";
+ break;
+ case "f":
+ out += "\f";
+ break;
+ case "v":
+ out += "\v";
+ break;
+ case "0":
+ out += "\0";
+ break;
+ case "x":
+ out += String.fromCharCode(parseInt(raw.slice(i + 1, i + 3), 16));
+ i += 2;
+ break;
+ case "u":
+ if (raw[i + 1] === "{") {
+ const close = raw.indexOf("}", i + 2);
+ if (close < 0) {
+ out += "u";
+ break;
+ }
+ out += String.fromCodePoint(parseInt(raw.slice(i + 2, close), 16));
+ i = close;
+ } else {
+ out += String.fromCharCode(parseInt(raw.slice(i + 1, i + 5), 16));
+ i += 4;
+ }
+ break;
+ case "\n":
+ break;
+ case "\r":
+ if (raw[i + 1] === "\n") i++;
+ break;
+ default:
+ out += d;
+ }
+ }
+ return out;
+}
+function encodeValue(value, quote) {
+ let out = "";
+ for (const ch of value) {
+ if (ch === "\\") out += "\\\\";
+ else if (ch === quote) out += "\\" + quote;
+ else if (ch === "\n") out += "\\n";
+ else if (ch === "\r") out += "\\r";
+ else if (ch === "\u2028") out += "\\u2028";
+ else if (ch === "\u2029") out += "\\u2029";
+ else out += ch;
+ }
+ if (quote === "`") out = out.replace(/\$\{/g, "\\${");
+ return out;
+}
+function precedingSignificant(src, index) {
+ let i = index - 1;
+ while (i >= 0 && /\s/.test(src[i])) i--;
+ return i < 0 ? "" : src[i];
+}
+function isObjectKeyPosition(src, span) {
+ const prev = precedingSignificant(src, span.start);
+ if (prev !== "{" && prev !== ",") return false;
+ let j = span.end;
+ while (j < src.length && /\s/.test(src[j])) j++;
+ return src[j] === ":";
+}
+
+// src/rewrite.ts
+var CHINESE = /[\u4e00-\u9fa5]/;
+var KEYS = Object.keys(dictionary_default).sort((a, b) => b.length - a.length);
+var BY_FIRST = /* @__PURE__ */ new Map();
+for (const key of KEYS) {
+ const first = key[0];
+ const bucket = BY_FIRST.get(first);
+ if (bucket) bucket.push(key);
+ else BY_FIRST.set(first, [key]);
+}
+function substitute(value) {
+ if (!CHINESE.test(value)) return value;
+ if (dictionary_default[value] !== void 0) return dictionary_default[value];
+ const pieces = [];
+ let i = 0;
+ while (i < value.length) {
+ const char = value[i];
+ if (!CHINESE.test(char)) {
+ let j = i;
+ while (j < value.length && !CHINESE.test(value[j])) j++;
+ pieces.push(value.slice(i, j));
+ i = j;
+ continue;
+ }
+ const candidates = BY_FIRST.get(char);
+ let match;
+ if (candidates) {
+ for (const key of candidates) {
+ if (value.startsWith(key, i)) {
+ match = key;
+ break;
+ }
+ }
+ }
+ if (match === void 0) return value;
+ pieces.push(dictionary_default[match]);
+ i += match.length;
+ }
+ return pieces.join("");
+}
+function hasChinese(text) {
+ return CHINESE.test(text);
+}
+function rewriteScript(source) {
+ if (!hasChinese(source)) return source;
+ const spans = scanLiterals(source);
+ let out = "";
+ let cursor = 0;
+ let changed = false;
+ for (const span of spans) {
+ if (span.quote === "`") continue;
+ if (span.raw.includes("${")) continue;
+ if (isObjectKeyPosition(source, span)) continue;
+ const value = decodeRaw(span.raw);
+ if (!hasChinese(value)) continue;
+ const next = substitute(value);
+ if (next === value) continue;
+ out += source.slice(cursor, span.start) + span.quote + encodeValue(next, span.quote) + span.quote;
+ cursor = span.end;
+ changed = true;
+ }
+ return changed ? out + source.slice(cursor) : source;
+}
+function compiles(source) {
+ try {
+ new Function(source);
+ return true;
+ } catch {
+ return false;
+ }
+}
+function translateScript(source) {
+ const next = rewriteScript(source);
+ if (next === source) return source;
+ return compiles(next) ? next : source;
+}
+
+// src/index.ts
+var name = "chinese2english";
+var inject = ["clientModules"];
+var JS_TYPE = /^text\/javascript\b/i;
+var JS_URL = /\.js(?:[,&?]|$)/;
+var MAX_BODY = 16 * 1024 * 1024;
+var MAX_CACHE = 64;
+function isScriptUrl(url) {
+ return JS_URL.test(url);
+}
function apply(ctx) {
+ const registry = ctx.clientModules;
+ if (!registry || typeof registry.bundleResource !== "function") {
+ console.error("[chinese2english] clientModules.bundleResource unavailable; translation disabled");
+ return;
+ }
+ const original = registry.bundleResource;
+ const cache = /* @__PURE__ */ new Map();
+ registry.bundleResource = async function(method, url, ...rest) {
+ const response = await original.call(this, method, url, ...rest);
+ if (response?.status !== 200) return response;
+ if (!isScriptUrl(url)) return response;
+ const raw = response.body;
+ const isBuffer = Buffer.isBuffer(raw);
+ if (!isBuffer && typeof raw !== "string") return response;
+ const contentType = response.headers?.["content-type"];
+ if (typeof contentType !== "string" || !JS_TYPE.test(contentType)) return response;
+ if (raw.length > MAX_BODY) return response;
+ try {
+ let body = cache.get(url);
+ if (body === void 0) {
+ const source = isBuffer ? raw.toString("utf8") : raw;
+ const rewritten = translateScript(source);
+ body = isBuffer ? Buffer.from(rewritten, "utf8") : rewritten;
+ if (cache.size >= MAX_CACHE) {
+ const oldest = cache.keys().next();
+ if (!oldest.done) cache.delete(oldest.value);
+ }
+ cache.set(url, body);
+ }
+ if (method === "HEAD") return response;
+ if (typeof body === "string") {
+ if (body === raw) return response;
+ } else if (body.length === raw.length && (!isBuffer || body.equals(raw))) {
+ return response;
+ }
+ return {
+ ...response,
+ headers: { ...response.headers, "cache-control": "no-cache" },
+ body
+ };
+ } catch (error) {
+ console.error(`[chinese2english] could not translate ${url}:`, error);
+ return response;
+ }
+ };
}
export {
apply,
diff --git a/lib/index.js.map b/lib/index.js.map
index 3bed36c..0a68222 100644
--- a/lib/index.js.map
+++ b/lib/index.js.map
@@ -1,7 +1,7 @@
{
"version": 3,
- "sources": ["../src/index.ts"],
- "sourcesContent": ["export const name = \"chinese2english\";\nexport const inject = [];\n\nexport function apply(ctx: any) {\n // Service initialized\n}\n"],
- "mappings": "AAAO,MAAM,OAAO;AACb,MAAM,SAAS,CAAC;AAEhB,SAAS,MAAM,KAAU;AAEhC;",
+ "sources": ["../src/dictionary.json", "../src/strings.ts", "../src/rewrite.ts", "../src/index.ts"],
+ "sourcesContent": ["{\n \"DSH \u6B63\u5728\u8FD0\u884C\u65F6\u65E0\u6CD5\u66F4\u65B0\uFF0C\u800C\u66F4\u65B0\u524D\u7684\u7248\u672C\u4E5F\u5DF2\u7ECF\u635F\u574F\u3002\u4E3A\u907F\u514D\u4E0B\u6B21\u542F\u52A8\u5361\u4F4F\uFF0C\u5E02\u573A\u628A\u5B83\u4ECE profile \u91CC\u79FB\u9664\u3002\u63D2\u4EF6\u76EE\u5F55\u8FD8\u5728\u539F\u5904\uFF0C\u9000\u51FA DSH \u540E\u91CD\u65B0\u5B89\u88C5\u5373\u53EF\u3002\": \"DSH cannot be updated while it is running, and the pre-update version is corrupted. To avoid getting stuck on the next launch, the market removes it from the profile. The plugin directory is still in place, just exit DSH and reinstall.\",\n \"\u53D6\u6D88\u65F6\uFF0C\u65E7\u7248\u672C\u5DF2\u88AB\u6E05\u6389\u4E00\u90E8\u5206\u3002\u4E3A\u907F\u514D\u4E0B\u6B21\u542F\u52A8\u5361\u4F4F\uFF0C\u5E02\u573A\u628A\u5B83\u4ECE profile \u91CC\u79FB\u9664\u3002\u63D2\u4EF6\u76EE\u5F55\u8FD8\u5728\u539F\u5904\uFF0C\u91CD\u65B0\u5B89\u88C5\u5373\u53EF\uFF1B\u82E5\u518D\u6B21\u5931\u8D25\uFF0C\u5148\u9000\u51FA DSH \u518D\u88C5\u3002\": \"When cancelled, the old version was partially cleared. To avoid getting stuck on the next launch, the market removes it from the profile. The plugin directory is still in place, just reinstall it; if it fails again, exit DSH and install it again.\",\n \"GitHub token\uFF08\u4EC5\u672C\u6B21\u4F1A\u8BDD\u5185\u5B58\uFF0C\u5237\u65B0\u540E\u9700\u91CD\u65B0\u8F93\u5165\uFF1B\u7559\u7A7A\u5219\u4F7F\u7528\u670D\u52A1\u7AEF DSH_GITHUB_TOKEN \u6216\u5DF2\u767B\u5F55\u7684 gh CLI\uFF09\": \"GitHub token (only the memory of this session needs to be re-entered after refreshing; leave blank to use the server DSH_GITHUB_token or the logged-in gh CLI)\",\n \"\u5C06\u5220\u9664\uFF1A\u5E02\u573A\u7684\u505C\u7528\u6E05\u5355\u4E0E\u81EA\u5B9A\u4E49\u5206\u7EC4\uFF0C\u4EE5\u53CA\u5B83\u5199\u8FDB\u914D\u7F6E\u6587\u4EF6\u7684\u505C\u7528\u8BB0\u5F55\u2014\u2014\u88AB\u505C\u7528\u7684\u63D2\u4EF6\u5C06\u6062\u590D\u8FD0\u884C\u3002\u4E0D\u6D89\u53CA\u5BC6\u7801\u6216\u5BC6\u94A5\uFF0C\u5E02\u573A\u4ECE\u4E0D\u628A\u5B83\u4EEC\u5B58\u5728\u78C1\u76D8\u4E0A\u3002\": \"Will delete: the deactivation list of the market with the custom grouping, and the deactivation record it writes to the profile - the deactivated plugin will resume operation. There are no passwords or keys involved, and the market never stores them on disk.\",\n \"\u8BC4\u8BBA\u6765\u81EA GitHub Discussions\u3002\u6253\u5F00\u540E\u4F1A\u8FDE\u63A5 giscus.app \u4E0E GitHub\uFF1B\u53D1\u8868\u8BC4\u8BBA\u9700\u8981 GitHub \u8D26\u53F7\u3002\": \"Comment from GitHub Discussions. Opening it will connect giscus.app to GitHub; a GitHub account is required to leave a comment.\",\n \"\u6709 Agent \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5B83\u5B8C\u6210\u6216\u5148\u53D6\u6D88\uFF0C\u518D\u66F4\u65B0\u2014\u2014\u66F4\u65B0\u4F1A\u76F4\u63A5\u66FF\u6362\u63D2\u4EF6\u6587\u4EF6\uFF0C\u8FD0\u884C\u4E2D\u7684 Agent \u53EF\u80FD\u4E2D\u9014\u62A5\u9519\u6216\u65B0\u65E7\u7248\u672C\u6DF7\u7528\u3002\": \"There is an agent running, please wait for it to complete or cancel before updating - the update will directly replace the plugin file. The running agent may report errors or mix old and new versions.\",\n \"\u5F53\u524D\u4F1A\u8BDD\u5DF2\u88AB\u5360\u7528\uFF0C\u53EF\u80FD\u662F\u5176\u4ED6\u6B63\u5728\u8FD0\u884C\u7684 DSH \u5BFC\u81F4\u7684\uFF08\u5982\u5176\u4ED6 dsh web\u3001\u684C\u9762\u7AEF\uFF09\uFF0C\u8BF7\u9000\u51FA\u5176\u4ED6\u6B63\u5728\u8FD0\u884C\u7684 DSH \u540E\u91CD\u8BD5\u3002\": \"This session is already in use, possibly by another running DSH instance (such as another dsh web or the desktop app). Quit the other DSH instances and try again.\",\n \"\u5DF2\u5B89\u88C5\uFF0C\u4F46\u4E0D\u662F\u6700\u65B0\u7248\uFF1A\u8FD9\u4E2A profile \u7684 minimumReleaseAge \u6321\u4F4F\u4E86 {0}\uFF0C\u5B89\u88C5\u7684\u662F {1}\u3002\": \"Installed, but not the latest version: This profile's minimumReleaseAge blocks {0}, installing {1}.\",\n \"npm \u8FD130\u5929\u6EDA\u52A8\u4E0B\u8F7D\u91CF\uFF1A{0}\u3002\u8FD9\u4E0D\u662F\u7D2F\u8BA1\u4E0B\u8F7D\u91CF\uFF0C\u4E5F\u4E0D\u4EE3\u8868\u72EC\u7ACB\u7528\u6237\u6570\u3002\u7EDF\u8BA1\u53EF\u80FD\u5EF6\u8FDF\uFF0C\u6765\u6E90\u6838\u9A8C\u65F6\u95F4\u4E0D\u4FDD\u8BC1\u6570\u636E\u5B8C\u6574\u3002\": \"npm rolling downloads in the last 30 days: {0}. This is not a cumulative download and does not represent the number of unique users. Statistics may be delayed, and the source verification time does not guarantee the completeness of the data.\",\n \"\u5F53\u524D dsh \u8FDB\u7A0B\u6B63\u88AB\u8C03\u8BD5\u5668\u8FDE\u63A5\u3002\u8BF7\u4ECE IDE \u6216\u7EC8\u7AEF\u505C\u6B62\u8BE5\u8FDB\u7A0B\u540E\u91CD\u65B0\u542F\u52A8\uFF0C\u5E02\u573A\u4E0D\u80FD\u4ECE\u754C\u9762\u91CC\u7ED3\u675F\u6B63\u5728\u8C03\u8BD5\u7684 dsh\u3002\": \"The current dsh process is being connected by the debugger. Please restart the process after stopping it from the IDE or terminal, the market cannot end the dsh being debugged from the interface.\",\n \"\u5728\u8FD9\u91CC\u767B\u5F55\u4F1A\u79BB\u5F00\u672C\u9875\uFF0C\u8FD4\u56DE\u65F6\u9700\u91CD\u65B0\u6253\u5F00 dsh web\u2014\u2014\u8FD9\u4E0D\u662F\u6545\u969C\u3002\u53D1\u8868\u8BC4\u8BBA\u8BF7\u5230 GitHub\uFF0C\u672C\u9875\u53EA\u7528\u4E8E\u9605\u8BFB\u3002\": \"Logging in here will leave this page, and you will need to reopen the dsh web when you return - this is not a glitch. Leave a comment on GitHub, this page is for reading only.\",\n \"\u6709 Agent \u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5B83\u5B8C\u6210\u6216\u5148\u53D6\u6D88\uFF0C\u518D\u5B89\u88C5\u2014\u2014\u5B89\u88C5\u4F1A\u6539\u52A8\u63D2\u4EF6\u6587\u4EF6\uFF0C\u8FD0\u884C\u4E2D\u7684 Agent \u53EF\u80FD\u4E2D\u9014\u62A5\u9519\u3002\": \"There is an Agent running, please wait for it to complete or cancel before installing--Installation will change the plugin file, and the running Agent may report errors halfway.\",\n \"\u8FD9\u4E9B\u76EE\u5F55\u4E0D\u88AB\u4EFB\u4F55\u63D2\u4EF6\u4F7F\u7528\uFF0C\u4E5F\u4E0D\u5F71\u54CD\u542F\u52A8\uFF0C\u662F\u66F4\u65B0\u4E2D\u65AD\u540E\u7559\u4E0B\u7684\u3002\u9000\u51FA DSH \u540E\u53EF\u4EE5\u5220\u9664\uFF0C\u6216\u91CD\u65B0\u5B89\u88C5\u5BF9\u5E94\u7684\u63D2\u4EF6\u3002\": \"These directories are not used by any plugins and do not affect startup, they are left after the update is interrupted. After exiting DSH, you can remove or reinstall the corresponding plugin.\",\n \"\u53E6\u4E00\u4E2A\u5B89\u88C5\u3001\u66F4\u65B0\u6216\u5378\u8F7D\u8FD8\u5728\u8FDB\u884C\uFF0C\u73B0\u5728\u8FD8\u4E0D\u80FD\u5F00\u59CB\uFF1A\u8FD9\u4E00\u6761\u7559\u5728\u961F\u5217\u91CC\uFF0C\u7B49\u5B83\u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u5F00\u59CB\uFF0C\u4E0D\u9700\u8981\u518D\u70B9\u4E00\u6B21\u3002\": \"Another installation, update or uninstallation is still in progress and cannot be started yet: this one stays in the queue and will start automatically once it is completed, no need to click again.\",\n \"\u672C\u6B21\u91CD\u542F\u6CA1\u6709\u6210\u529F\uFF0Cdsh \u5DF2\u7ECF\u9000\u51FA\u3002\u52FE\u9009\u4F60\u5E0C\u671B\u4E0B\u6B21\u542F\u52A8\u65F6\u542F\u7528\u7684\u63D2\u4EF6\uFF1B\u672C\u6B21\u542F\u52A8\u62A5\u9519\u7684\u63D2\u4EF6\u5DF2\u6807\u7EA2\u5E76\u53D6\u6D88\u52FE\u9009\u3002\": \"This reboot was unsuccessful and dsh has exited. Check the plugin that you want to enable the next time you start; the plugin that reported an error on this startup has been red and unchecked.\",\n \"\u8FD9\u4E00\u6761\u8981\u88C5\u7684\u63D2\u4EF6\u5728\u5F53\u524D\u76EE\u5F55\u91CC\u627E\u4E0D\u5230\u4E86\uFF08\u76EE\u5F55\u5237\u65B0\u8FC7\u6216\u6362\u4E86\u9875\uFF09\uFF0C\u5DF2\u4ECE\u961F\u5217\u79FB\u9664\u3002\u8BF7\u5728\u76EE\u5F55\u91CC\u91CD\u65B0\u627E\u5230\u5B83\u518D\u88C5\u4E00\u6B21\u3002\": \"This plugin to be installed cannot be found in the current directory (the directory has been refreshed or changed pages), it has been removed from the queue. Please find it again in the catalog and install it again.\",\n \"cordis \u4E0D\u63A5\u53D7\u91CD\u590D\u7684\u6761\u76EE id\uFF0C\u4FDD\u7559\u5B83\u4F1A\u8BA9 DeepSeek Harness \u4E0B\u6B21\u542F\u52A8\u5931\u8D25\u3002\": \"cordis does not accept duplicate entry ids, keeping it will cause DeepSeek Harness to fail the next time it starts.\",\n \"\u63D2\u4EF6\u628A DSH \u81EA\u5E26\u7684\u516C\u5171\u5305\u5217\u8FDB\u4E86\u4F9D\u8D56\uFF0C\u53EF\u80FD\u548C DSH \u81EA\u5DF1\u7684\u7248\u672C\u4E92\u76F8\u5E72\u6270\uFF08\u4EC5\u4F9D\u636E\u58F0\u660E\uFF0C\u672A\u786E\u8BA4\uFF09\uFF1A\": \"The plugin lists the public packages that come with DSH as dependencies, which may interfere with DSH's own version (by declaration only, unconfirmed):\",\n \"\u7B49\u5F85 DeepSeek Harness \u542F\u52A8\u8D85\u65F6\u3002\u53EF\u70B9\u300C\u8C03\u6574\u63D2\u4EF6\u300D\uFF0C\u68C0\u67E5\u662F\u5426\u67D0\u4E2A\u63D2\u4EF6\u5BFC\u81F4\u65E0\u6CD5\u542F\u52A8\u3002\": \"Timeout waiting for DeepSeek Harness to start. Click \\\"Adjust Plugin\\\" to check if a plugin cannot be started.\",\n \"\u8BF7\u5E2E\u6211\u4FEE\u590D DeepSeek Harness \u7684\u63D2\u4EF6\u95EE\u9898\uFF08profile\uFF1A{0}\uFF09\u3002\u8BCA\u65AD\u53D1\u73B0\u5982\u4E0B\uFF1A\": \"Please help me fix a plugin issue for DeepSeek Harness (profile: {0}). The diagnostic findings are as follows:\",\n \"\u5DF2\u4E0B\u8F7D\u5B8C\u6210\u3002\u91CD\u542F DeepSeek Harness \u540E\u65B0\u7248\u672C\u624D\u4F1A\u751F\u6548\u2014\u2014\u9875\u9762\u4F1A\u5148\u663E\u793A\u65B0\u7248\u672C\u53F7\u3002\": \"Download complete. Restart DeepSeek Harness to activate the update.\",\n \"\u7CBE\u9009\u76EE\u5F55\u91CC\u6709\u540C\u540D\u63D2\u4EF6\uFF0C\u4F46\u4E0E\u4F60\u672C\u5730\u4ED3\u5E93\u4E0D\u4E00\u81F4\uFF0C\u65E0\u6CD5\u5B89\u5168\u6062\u590D\u3002\u53EF\u4EE5\u5378\u8F7D\u672C\u5730\u7248\uFF0C\u6216\u7EE7\u7EED\u7528\u672C\u5730\u5F00\u53D1\u3002\": \"There is a plugin with the same name in the featured directory, but it does not match your local repository and cannot be safely recovered. You can uninstall the local version or continue with local development.\",\n \"\u8BE5\u63D2\u4EF6\u9700\u8981\u8FD0\u884C\u6784\u5EFA\u811A\u672C\u624D\u80FD\u5DE5\u4F5C\uFF0C\u51FA\u4E8E\u5B89\u5168\u8003\u8651\u5DF2\u9ED8\u8BA4\u963B\u6B62\u3002\u786E\u8BA4\u6765\u6E90\u53EF\u4FE1\u540E\uFF0C\u53EF\u653E\u884C\u5E76\u91CD\u65B0\u5B89\u88C5\uFF1A\": \"The plugin requires a build script to run in order to work and has been blocked by default for security reasons. Once the source is verified, it can be released and reinstalled:\",\n \"\u628A\u5F53\u524D\u7684\u63D2\u4EF6\u987A\u5E8F\u548C\u5DF2\u505C\u7528\u7684\u63D2\u4EF6\u4FDD\u5B58\u4E3A\u7EC4\u5408\uFF0C\u968F\u65F6\u5207\u6362\uFF1B\u5E94\u7528\u524D\u4F1A\u5148\u8BD5\u542F\u52A8\u4E00\u6B21\u5E76\u81EA\u52A8\u521B\u5EFA\u5FEB\u7167\u3002\": \"Save the current plugin order and deactivated plugins as a combination and switch at any time; try to launch it once and automatically create a snapshot before applying.\",\n \"WebDAV \u5730\u5740\u4E0E\u7528\u6237\u540D\u4EC5\u4FDD\u5B58\u5728\u5F53\u524D\u6D4F\u89C8\u5668\uFF1B\u5BC6\u7801\u53EA\u5B58\u4E8E\u670D\u52A1\u7AEF\uFF0C\u6BCF\u6B21\u4F1A\u8BDD\u9700\u91CD\u65B0\u8F93\u5165\u3002\": \"The WebDAV address and username are only saved in the current browser; the password is only stored on the server side and needs to be re-entered each session.\",\n \"\u8FD8\u6CA1\u6709\u6536\u85CF\u3002\u5728\u300C\u53D1\u73B0\u300D\u6216\u300C\u4E3B\u9898\u300D\u91CC\u70B9\u4E66\u7B7E\u56FE\u6807\uFF0C\u6216\u5728\u300C\u5DF2\u5B89\u88C5\u300D\u7684\u300C\u00B7\u00B7\u00B7\u300D\u91CC\u52A0\u5165\u6536\u85CF\u3002\": \"No favorites yet. Tap the bookmark icon in Discover or Themes, or add a collection to Installed.\",\n \"\u4FDD\u7559\u5E02\u573A\u6570\u636E\u3002\u6CE8\u610F\uFF1A\u88AB\u5E02\u573A\u505C\u7528\u7684\u63D2\u4EF6\u4F1A\u4FDD\u6301\u505C\u7528\uFF0C\u4E14\u79FB\u9664\u540E\u5C06\u6CA1\u6709\u754C\u9762\u53EF\u5C06\u5176\u91CD\u65B0\u542F\u7528\u3002\": \"Keep market data. Note: Plugins that are deactivated by the market will remain deactivated and there will be no interface to re-enable them once removed.\",\n \"\u5C06\u8BCA\u65AD\u95EE\u9898\u4EA4\u7531\u65B0\u5BF9\u8BDD\u4E2D\u7684 Agent \u4FEE\u590D\uFF08\u5185\u5BB9\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F\uFF0C\u7531\u4F60\u51B3\u5B9A\u662F\u5426\u53D1\u9001\uFF09\": \"Refer the diagnostic issue to the Agent in the new conversation for repair (the content has been copied to the clipboard and you decide whether to send it or not)\",\n \"\u76EE\u5F55\u8BB0\u5F55\u7684 npm \u7248\u672C\uFF1B\u76EE\u5F55\u6BCF\u65E5\u5237\u65B0\uFF0C\u53EF\u80FD\u6EDE\u540E\u4E8E npm \u4E0A\u7684\u5B9E\u9645 latest\": \"The npm version of the directory record; the directory is refreshed daily and may lag behind the actual latest on npm\",\n \"\u5168\u9009 = \u5B8C\u6574\u5907\u4EFD\uFF08\u542B\u914D\u7F6E\u6587\u4EF6\uFF09\uFF1B\u5426\u5219\u53EA\u5BFC\u51FA\u52FE\u9009\u7684\u63D2\u4EF6\uFF0C\u53EF\u53E6\u52FE\u300C\u5305\u542B\u914D\u7F6E\u6587\u4EF6\u300D\u3002\": \"Select All = Full backup (including configuration files); otherwise, only checked plug-ins can be exported, and \\\"Include configuration files\\\" can be checked separately.\",\n \"\u5B89\u88C5\u6765\u6E90\u662F\u53E6\u4E00\u53F0\u7535\u8111\u4E0A\u7684\u672C\u5730\u8DEF\u5F84\uFF0C\u672C\u673A\u627E\u4E0D\u5230\u3002\u8BF7\u91CD\u65B0\u5B89\u88C5\u8BE5\u63D2\u4EF6\uFF0C\u6216\u6539\u4E3A\u672C\u673A\u8DEF\u5F84\": \"The installation source is a local path on another computer, which the machine cannot find. Please reinstall the plugin or change to the native path\",\n \"\u5DF2\u5378\u8F7D\uFF0C\u4F46 pnpm \u5728\u6536\u5C3E\u9636\u6BB5\u62A5\u9519\uFF08\u901A\u5E38\u662F\u6587\u4EF6\u88AB\u5360\u7528\uFF09\uFF1B\u914D\u7F6E\u5DF2\u540C\u6B65\uFF0C\u65E0\u9700\u91CD\u8BD5\": \"Uninstalled, but pnpm reported an error at the closing stage (usually the file is occupied); the configuration is synchronized, no need to retry\",\n \"\u7CBE\u9009\u76EE\u5F55\u91CC\u6CA1\u6709\u8FD9\u4E2A\u63D2\u4EF6\uFF0C\u65E0\u6CD5\u6062\u590D\u5230\u7EBF\u4E0A\u7248\u672C\u3002\u53EF\u4EE5\u5378\u8F7D\u672C\u5730\u7248\uFF0C\u6216\u7EE7\u7EED\u7528\u672C\u5730\u5F00\u53D1\u3002\": \"This plugin is not available in the featured directory and cannot be restored to the online version. You can uninstall the local version or continue with local development.\",\n \"\u4EC5\u5305\u542B\u63D2\u4EF6\u6E05\u5355\u548C profile \u914D\u7F6E\uFF0C\u4E0D\u542B\u63D2\u4EF6\u6587\u4EF6\uFF1B\u6062\u590D\u65F6\u6309\u6E05\u5355\u91CD\u65B0\u5B89\u88C5\u3002\": \"Only the plugin manifest and profile configuration are included, no plugin files are included; reinstall according to the manifest when restoring.\",\n \"\u65E5\u5FD7\u5DF2\u5BFC\u51FA\uFF1Adsh-market-log.txt\uFF0C\u8BF7\u5C06\u5176\u9644\u5728 issue \u4E2D\": \"Log exported: dsh-market-log.txt, please attach it to issue\",\n \"\u76EE\u5F55\uFF08{0} \u5237\u65B0\uFF09\u8BB0\u5F55\u7684 npm \u7248\u672C\uFF1B\u4E4B\u540E\u53D1\u5E03\u7684\u7248\u672C\u8981\u7B49\u4E0B\u6B21\u5237\u65B0\u624D\u4F1A\u51FA\u73B0\": \"The npm version of the directory ({0} refresh) record; subsequent releases will not appear until the next refresh\",\n \"\u793E\u533A bundle \u52A0\u8F7D\u987A\u5E8F\u4E0E\u63D2\u4EF6\u58F0\u660E\u7684 before/after \u89C4\u5219\u51B2\u7A81\": \"The community bundle loading order conflicts with the before/after rules declared by the plugin\",\n \"GitHub \u8BA4\u8BC1\u5931\u8D25\uFF1AToken \u65E0\u6548\u3001\u5DF2\u8FC7\u671F\uFF0C\u6216 gh CLI \u672A\u767B\u5F55\": \"GitHub authentication failed: Token is invalid, expired, or gh CLI is not logged in\",\n \"\u8BE5\u987A\u5E8F\u4F1A\u6539\u53D8\u7EC4\u5408\uFF1A{0} \u5904\u8986\u76D6\u3001{1} \u4E2A\u65E0\u6548\u6761\u76EE\u3001{2} \u4E2A\u91CD\u590D\u6761\u76EE\": \"This order changes the combination: {0} overrides, {1} invalid entries, {2} duplicate entries\",\n \"Agent \u6B63\u5FD9\uFF0C\u5DF2\u6392\u961F\uFF0C\u7A7A\u95F2\u540E\u81EA\u52A8\u5378\u8F7D\uFF08\u53EF\u5728\u53F3\u4E0A\u89D2\u300C\u4EFB\u52A1\u300D\u91CC\u53D6\u6D88\uFF09\u3002\": \"Agent is busy, queued, and uninstalled automatically when idle (can be canceled in Tasks in the top right corner).\",\n \"Agent \u6B63\u5FD9\uFF0C\u5DF2\u6392\u961F\uFF0C\u7A7A\u95F2\u540E\u81EA\u52A8\u5B89\u88C5\uFF08\u53EF\u5728\u53F3\u4E0A\u89D2\u300C\u4EFB\u52A1\u300D\u91CC\u53D6\u6D88\uFF09\u3002\": \"The agent is busy, queued, and automatically installed when it is free (can be canceled in the \\\"Tasks\\\" in the top right corner).\",\n \"Agent \u6B63\u5FD9\uFF0C\u5DF2\u6392\u961F\uFF0C\u7A7A\u95F2\u540E\u81EA\u52A8\u66F4\u65B0\uFF08\u53EF\u5728\u53F3\u4E0A\u89D2\u300C\u4EFB\u52A1\u300D\u91CC\u53D6\u6D88\uFF09\u3002\": \"The agent is busy, queued, and will automatically update when it is free (can be canceled in the \\\"Tasks\\\" in the top right corner).\",\n \"\u56DE\u6EDA\u4F1A\u7528\u5FEB\u7167\u8986\u76D6\u5F53\u524D\u7684\u63D2\u4EF6\u4E0E\u914D\u7F6E\uFF0C\u4E14\u4E0D\u53EF\u64A4\u9500\uFF08\u53EF\u5148\u521B\u5EFA\u65B0\u5FEB\u7167\u518D\u56DE\u6EDA\uFF09\u3002\": \"Rollbacks overwrite the current plugin and configuration with a snapshot and are irreversible (you can create a new snapshot before rolling back).\",\n \"\u6B63\u5728\u91CD\u542F\uFF1Adsh \u542F\u52A8\u540E\u672C\u9875\u4F1A\u5237\u65B0\uFF1B\u82E5\u53C8\u5931\u8D25\uFF0C\u4F1A\u5E26\u7740\u65B0\u7684\u62A5\u9519\u56DE\u5230\u8FD9\u91CC\u3002\": \"Restarting: This page will refresh after dsh starts; if it fails again, it will return here with a new error report.\",\n \"\u7531\u73AF\u5883\u53D8\u91CF DSHM_GITHUB_PROXY \u7BA1\u7406\uFF0C\u754C\u9762\u4E2D\u4E0D\u53EF\u4FEE\u6539\u3002\": \"Managed by DSHM_GITHUB_PROXY environment variable.\",\n \"\u4E0B\u9762\u6807\u7EA2\u7684\u63D2\u4EF6\u5728\u672C\u6B21\u542F\u52A8\u65F6\u62A5\u4E86\u9519\uFF0C\u53D6\u6D88\u52FE\u9009\u540E\u4E0B\u6B21\u542F\u52A8\u4E0D\u518D\u542F\u7528\u5B83\u4EEC\u3002\": \"The plugins marked red below reported an error on this startup, and they will not be enabled on the next startup after unchecking them.\",\n \"\u91CD\u542F\u65B9\u5F0F\uFF1A\u5173\u95ED\u5F53\u524D dsh \u8FDB\u7A0B\u540E\u91CD\u65B0\u8FD0\u884C\uFF08\u4F8B\u5982 dsh web\uFF09\": \"Restart method: Run again after closing the current dsh process (e.g. dsh web)\",\n \"\u5C06\u5378\u8F7D\u672C\u5730\u7248\u672C\u5E76\u5B89\u88C5\u7EBF\u4E0A\u7248\u672C\uFF0C\u4E4B\u540E\u7167\u5E38\u68C0\u67E5\u66F4\u65B0\u3002\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002\": \"The local version will be uninstalled and the online version will be installed, after which the update will be checked as usual. This action cannot be undone.\",\n \"\u5DF2\u6309 DSH {0} \u7B5B\u9009\uFF1B\u672A\u58F0\u660E\u6216\u65E0\u6CD5\u786E\u8BA4\u517C\u5BB9\u6027\u7684\u63D2\u4EF6\u4ECD\u4F1A\u663E\u793A\": \"Filtered by DSH {0}; undeclared or incompatible plugins will still show\",\n \"\u6062\u590D\u5C06\u8986\u76D6\u5F53\u524D profile \u914D\u7F6E\u5E76\u91CD\u65B0\u5B89\u88C5\u63D2\u4EF6\uFF0C\u786E\u5B9A\u7EE7\u7EED\u5417\uFF1F\": \"Restoring will overwrite the current profile configuration and reinstall the plugin, are you sure you want to continue?\",\n \"\u6B63\u5728\u68C0\u67E5\u5BBF\u4E3B\u8981\u6C42 {0}/{1}\uFF1B\u672A\u58F0\u660E\u6216\u65E0\u6CD5\u786E\u8BA4\u7684\u63D2\u4EF6\u4ECD\u4F1A\u663E\u793A\": \"Checking host requirements {0}/{1}; undeclared or unconfirmed plugins will still be displayed\",\n \"\u8BE5 npm \u5305\u53EF\u80FD\u7531\u5176\u4ED6\u4EBA\u53D1\u5E03\uFF0C\u5E76\u975E\u540C\u4E00\u63D2\u4EF6\uFF1B\u786E\u8BA4\u53EF\u4FE1\u540E\u518D\u7EE7\u7EED\u3002\": \"The npm package may be published by someone else and is not the same plugin; confirm it is trusted before proceeding.\",\n \"\u4E00\u7EC4\u53EA\u6709\u4E00\u4E2A\u4E3B\u9898\u3002\u9009\u62E9\u4E0D\u4F1A\u542F\u7528\u5B83\uFF0C\u66F4\u6362\u4F1A\u628A\u539F\u6765\u7684\u4E3B\u9898\u79FB\u51FA\u8BE5\u7EC4\u3002\": \"A group has only one subject. Choosing not to enable it and replacing it will move the original topic out of the group.\",\n \"\u5E94\u7528\u53D8\u66F4\u524D\u4F1A\u81EA\u52A8\u521B\u5EFA\u5FEB\u7167\uFF1B\u4E5F\u53EF\u624B\u52A8\u521B\u5EFA\uFF0C\u968F\u65F6\u56DE\u6EDA\u5230\u4EFB\u610F\u72B6\u6001\u3002\": \"Snapshots are automatically created before changes are applied, or they can be created manually and rolled back to any state at any time.\",\n \"\u6392\u961F\u65F6\u5B83\u8FD8\u5728\u5DF2\u5B89\u88C5\u5217\u8868\u91CC\uFF0C\u73B0\u5728\u5DF2\u4E0D\u5728\uFF0C\u56E0\u6B64\u8DF3\u8FC7\uFF08\u6CA1\u6709\u5378\u8F7D\uFF09\u3002\": \"It was still in the installed list at the time of queuing and is no longer there, so it was skipped (not uninstalled).\",\n \"\u4ECE\u8FD9\u4E2A profile \u5378\u8F7D\u5E02\u573A\u3002\u5DF2\u88C5\u7684\u5176\u5B83\u63D2\u4EF6\u4E0D\u53D7\u5F71\u54CD\u3002\": \"Uninstall the market from this profile. Other installed plugins are not affected.\",\n \"\u672C\u9875\u68C0\u67E5\u63D2\u4EF6\u51B2\u7A81\u3001\u4F9D\u8D56\u7248\u672C\u4E0D\u5339\u914D\u4E0E\u52A0\u8F7D\u987A\u5E8F\u95EE\u9898\u3002\u5E38\u7528\u672F\u8BED\uFF1A\": \"This page checks for plugin conflicts, dependency version mismatches, and loading order issues. Common terms:\",\n \"\u68C0\u6D4B\u5230\u517C\u5BB9\u6027\u98CE\u9669\uFF0C\u5EFA\u8BAE\u91CD\u542F\u524D\u5230\u8BCA\u65AD\u9875\u5904\u7406\uFF0C\u6216\u56DE\u6EDA\u672C\u6B21\u64CD\u4F5C\u3002\": \"Compatibility risk detected, it is recommended to go to the diagnostics page before restarting, or roll back this operation.\",\n \"\u9759\u6001\u626B\u63CF\u53EA\u80FD\u8BC1\u660E\u300C\u6709\u300D\uFF0C\u4E0D\u80FD\u8BC1\u660E\u300C\u6CA1\u6709\u300D\u3002\u8FD9\u4E0D\u4EE3\u8868\u5B83\u5B89\u5168\u3002\": \"A static scan can only prove yes, not no. This does not mean it is safe.\",\n \"SKILL.md \u9700\u5305\u542B YAML \u683C\u5F0F\u7684\u6280\u80FD\u540D\u79F0\u548C\u63CF\u8FF0\": \"SKILL.md must include YAML name and description\",\n \"\u4E0B\u5217\u63D2\u4EF6\u7684\u754C\u9762\u6587\u4EF6\u5DF2\u635F\u574F\uFF0C\u5237\u65B0\u540E\u9875\u9762\u53EF\u80FD\u7A7A\u767D\uFF0C\u5EFA\u8BAE\u56DE\u6EDA\uFF1A\": \"The interface files of the following plugins are corrupted. After refreshing, the page may be blank. It is recommended to roll back:\",\n \"\u52A0\u8F7D\u987A\u5E8F = \u63D2\u4EF6\u88AB\u6FC0\u6D3B\u7684\u5148\u540E\uFF0C\u540E\u52A0\u8F7D\u8005\u53EF\u80FD\u8986\u76D6\u5148\u52A0\u8F7D\u8005\": \"Loading order = the order in which the plugin is activated, the last loader may override the first loader\",\n \"\u53D1\u73B0\u793E\u533A\u4E3A DeepSeek Harness \u5F00\u53D1\u7684\u63D2\u4EF6\": \"Discover plugins developed by the community for DeepSeek Harness\",\n \"\u53EF\u4EE5\u66F4\u65B0\u5230 {version}\uFF1A\u5B83\u58F0\u660E\u517C\u5BB9\u5F53\u524D DSH\u3002\": \"Can update to {version}: it declares compatibility with the current DSH.\",\n \"\u5DF2\u4ECE\u53D1\u73B0\u9875\u79FB\u51FA\u3002\u5728\u300C\u5DF2\u5B89\u88C5\u300D\u540E\u9762\u7684\u300C\u5DF2\u5C4F\u853D\u300D\u91CC\u53EF\u4EE5\u53D6\u6D88\u3002\": \"Moved out of the discovery page. You can cancel in Blocked after Installed.\",\n \"\u5EFA\u8BAE\u987A\u5E8F\uFF08\u6309 before/after \u89C4\u5219\u81EA\u52A8\u6392\u5E8F\uFF09\uFF1A\": \"Suggested order (automatically sorted by before/after rule):\",\n \"\u6B64\u64CD\u4F5C\u540E\uFF0C\u540C\u4E00\u4E2A\u63D2\u4EF6\u540D\u51FA\u73B0\u5728\u4E24\u5904\uFF0C\u91CD\u542F\u540E\u53EA\u6709\u4E00\u4E2A\u4F1A\u751F\u6548\uFF1A\": \"After this operation, the same plugin name appears in two places, and only one will take effect after restart:\",\n \"\u9996\u6B21\u5B89\u88C5\u9700\u4E0B\u8F7D\u63D2\u4EF6\u7684\u4F9D\u8D56\u5305\uFF0C\u5927\u578B\u63D2\u4EF6\u53EF\u80FD\u9700 1-3 \u5206\u949F\": \"The first installation requires the download of the plugin dependency package, large plugins may take 1-3 minutes\",\n \"Gist ID \u6216\u94FE\u63A5\uFF08\u5BFC\u51FA\u7559\u7A7A\u5219\u65B0\u5EFA\u79C1\u6709 Gist\uFF09\": \"Gist ID or link (leave the export blank to create a new private Gist)\",\n \"\u65B0\u589E {added} \u4E2A\uFF0C\u79FB\u9664 {removed} \u4E2A\": \"Added {added}, removed {removed}\",\n \"\u65E5\u5FD7\u6CA1\u6709\u6307\u51FA\u5177\u4F53\u63D2\u4EF6\uFF0C\u4E0B\u9762\u6309\u542F\u7528\u72B6\u6001\u5217\u51FA\u53EF\u8C03\u6574\u7684\u63D2\u4EF6\u3002\": \"The log does not indicate a specific plug-in, the list of adjustable plug-ins is shown below by activation status.\",\n \"\u66F4\u65B0\u6A21\u5F0F\u9700\u8981 Gist ID\uFF1A\u8BF7\u586B\u5199\uFF0C\u6216\u5207\u6362\u4E3A\u300C\u65B0\u5EFA\u300D\": \"Update mode requires Gist ID: please fill in, or switch to \\\"New\\\"\",\n \"\u9879\u53D8\u66F4\u9700\u91CD\u542F DeepSeek Harness \u540E\u751F\u6548\": \"Item changes will take effect after DeepSeek Harness is restarted\",\n \"\u4E5F\u53EF\u80FD\u8BA9 DeepSeek Harness \u8D77\u4E0D\u6765\u3002\": \"It may also make DeepSeek Harness unable to get up.\",\n \"\u53EF\u4EE5\u88C5 {version}\uFF1A\u5B83\u58F0\u660E\u517C\u5BB9\u5F53\u524D DSH\u3002\": \"Can be loaded with {version}: it declares compatibility with the current DSH.\",\n \"\u63D0\u524D\u83B7\u53D6\u5F85\u9A8C\u8BC1\u7248\u672C\uFF0C\u53EF\u80FD\u4E0D\u7A33\u5B9A\u3002\u4EC5\u5F71\u54CD\u63D2\u4EF6\u5E02\u573A\u81EA\u8EAB\u3002\": \"Getting the pending version in advance may be unstable. Affects only the plugin market itself.\",\n \"\u6536\u85CF\u529F\u80FD\u6682\u4E0D\u53EF\u7528\u3002\u8BF7\u5237\u65B0\u9875\u9762\u6216\u91CD\u542F dsh web\u3002\": \"Favorites is temporarily unavailable. Please refresh the page or restart dsh web.\",\n \"\u91CD\u542F DeepSeek Harness \u540E\u5B8C\u5168\u6E05\u7406\u3002\": \"Clean up completely after restarting DeepSeek Harness.\",\n \"\u6062\u590D\u5B8C\u6210\uFF0C\u8BF7\u91CD\u542F DeepSeek Harness\": \"Recovery complete, please restart DeepSeek Harness\",\n \"\u652F\u6301 .zip\u3001\u6280\u80FD\u6587\u4EF6\u5939\u6216\u5355\u4E2A SKILL.md\": \"Supports .zip, a skill folder, or single SKILL.md\",\n \"\u786E\u5B9A\u8981\u5378\u8F7D\u63D2\u4EF6\u5E02\u573A\u5417\uFF1F\u5378\u8F7D\u540E\u9700\u4F7F\u7528\u547D\u4EE4\u884C\u91CD\u65B0\u5B89\u88C5\u3002\": \"Are you sure you want to uninstall the plugin marketplace? It needs to be reinstalled using the command line after uninstallation.\",\n \"\u4E2D\u56FD\u5927\u9646\u8BBF\u95EE\u66F4\u5FEB\u3002\u4EC5\u6539\u53D8\u4E0B\u8F7D\u7EBF\u8DEF\uFF0C\u63D2\u4EF6\u6765\u6E90\u4E0D\u53D8\u3002\": \"Faster in China. Only changes CDN routing; source is identical.\",\n \"\u53E6\u4E00\u4E2A\u5B89\u88C5\u3001\u66F4\u65B0\u6216\u5378\u8F7D\u8FD8\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5B83\u5B8C\u6210\u540E\u518D\u8BD5\": \"Another installation, update or uninstallation is still in progress, please wait for it to complete and try again\",\n \"\u66FF\u6362\u672A\u5B8C\u6210\u3002\u4E0B\u5217\u63D2\u4EF6\u5DF2\u5378\u8F7D\u4E14\u672A\u6062\u590D\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\uFF1A\": \"Replacement incomplete. The following plugins have been uninstalled and not restored, please reinstall:\",\n \"\u7B49\u5F85 DeepSeek Harness \u542F\u52A8\u8D85\u65F6\": \"Timeout waiting for DeepSeek Harness to start\",\n \"\u81EA\u52A8\u914D\u7F6E\u5931\u8D25\u3002\u8BF7\u5BFC\u51FA\u65E5\u5FD7\u5E76\u9644\u5728 issue \u4E2D\u3002\": \"Autoconfiguration failed. Please export the log and attach it to the issue.\",\n \"/{command} \u4E0D\u63A5\u53D7\u9644\u4EF6\uFF0C\u8BF7\u5148\u79FB\u9664\u9644\u4EF6\": \"/{command} does not accept attachments; remove them first\",\n \"bundle = \u4E00\u4E2A\u63D2\u4EF6\u5305\uFF0C\u4F1A\u6309\u987A\u5E8F\u53E0\u52A0\u52A0\u8F7D\": \"bundle = A plugin package that is stacked sequentially\",\n \"\u6700\u8FD1\u63D0\u4EA4\uFF08\u65E0\u6CD5\u5BF9\u5E94\u4F60\u5F53\u524D\u5B89\u88C5\u7684\u7248\u672C\uFF0C\u4EC5\u4F9B\u53C2\u8003\uFF09\": \"Recently Submitted (does not correspond to the version you currently have installed, for reference only)\",\n \"\u5B89\u88C5\u65F6\u4F1A\u7ACB\u523B\u8FD0\u884C\u5B83\u81EA\u5E26\u7684\u811A\u672C\uFF0C\u4E0D\u9700\u8981\u4F60\u6253\u5F00\u63D2\u4EF6\": \"It runs its own script immediately upon installation and does not require you to open the plugin\",\n \"\u62D6\u52A8 \u283F \u8C03\u6574\u987A\u5E8F\uFF0C\u9009\u62E9\u300C\u5E94\u7528\u987A\u5E8F\u300D\u540E\u624D\u4F1A\u4FDD\u5B58\": \"Drag to adjust order, select \\\"Apply order\\\" to save\",\n \"\u672C\u5E02\u573A\u7531\u684C\u9762\u7AEF\u5B89\u88C5\u548C\u66F4\u65B0\uFF0C\u65B0\u7248\u672C\u8BF7\u5728\u684C\u9762\u7AEF\u66F4\u65B0\": \"This market is installed and updated on the desktop, please update the new version on the desktop\",\n \"\u6B8B\u7F3A\u7684\u5305\u76EE\u5F55\uFF08\u7F3A\u5C11 package.json\uFF09\": \"Missing package directory (missing package.json)\",\n \"WebDAV \u5730\u5740\u548C\u7528\u6237\u540D\u53EA\u4FDD\u5B58\u5728\u6B64\u6D4F\u89C8\u5668\u3002\": \"WebDAV addresses and usernames are only saved in this browser.\",\n \"\u521B\u5EFA\u548C\u5BFC\u5165\u5747\u4FDD\u5B58\u5230\u5168\u5C40 DSH\uFF0C\u8DE8\u9879\u76EE\u53EF\u7528\u3002\": \"Created and imported skills are saved to global DSH and available across projects.\",\n \"\u5BF9\u7B49\u4F9D\u8D56 = \u63D2\u4EF6\u8981\u6C42\u5BBF\u4E3B\u73AF\u5883\u63D0\u4F9B\u7684\u53E6\u4E00\u4E2A\u5305\": \"Peer dependency = Another package that the plugin requires from the hosting environment\",\n \"\u5F00\u53D1\u5206\u652F\u6784\u5EFA\uFF0C\u672A\u7ECF\u9A8C\u8BC1\uFF0C\u4E0D\u5EFA\u8BAE\u666E\u901A\u7528\u6237\u4F7F\u7528\u3002\": \"Development branch build, unverified, not recommended for regular users.\",\n \"\u65E0\u6CD5\u8FDE\u63A5 GitHub\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u4EE3\u7406\u8BBE\u7F6E\": \"Unable to connect to GitHub, please check your network or proxy settings\",\n \"\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u63CF\u8FF0\u8FD9\u4E2A\u63D2\u4EF6\uFF0C\u5C06\u4EE3\u66FF\u4F5C\u8005\u7B80\u4ECB\u663E\u793A\": \"Describe the plugin in your own words and it will be displayed instead of the author's profile\",\n \"\u8BE5\u63D2\u4EF6\u5DF2\u88AB\u76EE\u5F55\u6807\u8BB0\u4E3A\u5E9F\u5F03\uFF0C\u4E0D\u5EFA\u8BAE\u65B0\u7528\u6237\u5B89\u88C5\u3002\": \"The plugin has been marked as deprecated by the directory and is not recommended for new users to install.\",\n \"\u8BF7\u9009\u62E9 .zip \u6216\u5355\u4E2A SKILL.md\u3002\": \"Please choose a .zip archive or single SKILL.md.\",\n \"\u8FD9\u4EFD\u5E02\u573A\u7531\u684C\u9762\u7AEF\u5B89\u88C5\uFF0C\u65B0\u7248\u672C\u8BF7\u5728\u684C\u9762\u7AEF\u66F4\u65B0\u3002\": \"Installed via desktop app; please update from the desktop client.\",\n \"\u8FD9\u4F1A\u66F4\u6539\u63D2\u4EF6\u7684\u5B89\u88C5\u6765\u6E90\uFF0C\u800C\u4E0D\u662F\u666E\u901A\u7248\u672C\u66F4\u65B0\u3002\": \"This changes the installation source of the plugin instead of the normal version update.\",\n \"\uFF08\u672A\u80FD\u5199\u5165\u914D\u7F6E\uFF0C\u91CD\u542F\u540E\u4F1A\u56DE\u5230\u4E0A\u6B21\u4FDD\u5B58\u7684\u503C\uFF09\": \"(Could not write to config; it will revert to the last saved value after restart)\",\n \"{n} \u4E2A\u8FD0\u884C\u4E2D\u7684\u5B50\u667A\u80FD\u4F53\uFF1A{names}\": \"{n} running subagents: {names}\",\n \"GitHub \u9650\u6D41\u6216 Token \u6743\u9650\u4E0D\u8DB3\": \"GitHub throttling or insufficient token permissions\",\n \"\u4ECE npm \u548C GitHub \u5B98\u65B9\u6E90\u4E0B\u8F7D\u3002\": \"Download from official npm and GitHub sources.\",\n \"\u4F8B\u5982 code-review-helper\": \"e.g. code-review-helper\",\n \"\u52A0\u8F7D\u6761\u76EE = \u63D2\u4EF6\u5728\u8FD0\u884C\u7EC4\u5408\u91CC\u6CE8\u518C\u7684\u6BCF\u4E00\u9879\": \"Load entries = each item that the plugin registers in the running portfolio\",\n \"\u5907\u4EFD\u5DF2\u5BFC\u5165\uFF0C\u8BF7\u5728\u300C\u5DF2\u5B89\u88C5\u300D\u4E2D\u786E\u8BA4\u540E\u5F00\u59CB\u6062\u590D\": \"Backup has been imported, please confirm in \\\"Installed\\\" to start recovery\",\n \"\u5B89\u88C5\u65F6\u4F1A\u7ACB\u523B\u8FD0\u884C {0}\uFF0C\u4E0D\u9700\u8981\u4F60\u6253\u5F00\u63D2\u4EF6\": \"{0} will run immediately upon installation and does not require you to open the plugin\",\n \"\u5F53\u524D\u987A\u5E8F\u5DF2\u6EE1\u8DB3\u5168\u90E8\u89C4\u5219\u4E0E\u63D2\u4EF6\u4F9D\u8D56\uFF0C\u65E0\u9700\u8C03\u6574\": \"The current order has satisfied all rules and plugin dependencies, no need to adjust\",\n \"\u5F53\u524D\u987A\u5E8F\u7684 before/after \u51B2\u7A81\": \"Conflict before/after of current order\",\n \"\u65E0\u6CD5\u786E\u8BA4\u66F4\u65B0\u524D\u7684\u51C6\u786E\u6765\u6E90\uFF0C\u81EA\u52A8\u56DE\u6EDA\u4E0D\u53EF\u7528\u3002\": \"The exact source before the update could not be confirmed and the automatic rollback is not available.\",\n \"\u68C0\u6D4B\u5230\u517C\u5BB9\u6027\u98CE\u9669\uFF0C\u5EFA\u8BAE\u91CD\u542F\u524D\u5230\u8BCA\u65AD\u9875\u5904\u7406\u3002\": \"A compatibility risk has been detected and it is recommended to go to the diagnostics page before restarting.\",\n \"\u73AF\u5883\u53D8\u91CF DSH_GITHUB_TOKEN\": \"Environment variable DSH_Github_token\",\n \"\u8FD9\u4E9B\u63D2\u4EF6\u4E0D\u5728\u53D1\u73B0\u9875\u663E\u793A\uFF0C\u5168\u90E8\u66F4\u65B0\u4E5F\u4F1A\u8DF3\u8FC7\u3002\": \"These plugins are not shown on the discovery page and all updates are skipped.\",\n \"\u906E\u853D = \u63D2\u4EF6\u81EA\u5E26\u7684\u65E7\u7248\u5305\u76D6\u4F4F\u4E86\u5BBF\u4E3B\u7684\u65B0\u7248\": \"Masking = The old version of the package that comes with the plugin covers the new version of the host\",\n \"{count} \u4E2A\u6587\u4EF6 \u00B7 {size}\": \"{count} files \u00B7 {size}\",\n \"{minutes}\u5206{seconds}\u79D2\": \"{minutes}m {seconds}s\",\n \"GitHub \u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\": \"GitHub request timed out, please check your network and try again\",\n \"\u4F18\u5148\u4F7F\u7528\u81EA\u5B9A\u4E49\u7EBF\u8DEF\uFF0C\u5931\u8D25\u540E\u4ECD\u4F1A\u5C1D\u8BD5\u76F4\u8FDE\u3002\": \"Uses custom mirror first, falls back to direct connection.\",\n \"\u53EA\u6539\u5206\u7EC4\u540D\u79F0\uFF0C\u7EC4\u5185\u63D2\u4EF6\u4E0E\u542F\u7528\u72B6\u6001\u4E0D\u53D7\u5F71\u54CD\": \"Only the group name will be changed, and the in-group plug-in and activation status will not be affected\",\n \"\u5C06\u4ECE\u5F53\u524D profile \u4E2D\u79FB\u9664\u8BE5\u63D2\u4EF6\u3002\": \"The plugin will be removed from the current profile.\",\n \"\u6240\u9009\u6587\u4EF6\u5939\u4E2D\u6CA1\u6709\u627E\u5230 SKILL.md\u3002\": \"No SKILL.md found in the selected folder.\",\n \"\u6392\u961F\u65F6\u5B83\u6709\u53EF\u7528\u66F4\u65B0\uFF0C\u73B0\u5728\u6CA1\u6709\u4E86\uFF0C\u5DF2\u8DF3\u8FC7\u3002\": \"It has an update available while queuing, it is no longer available, it has been skipped.\",\n \"\u65E0\u6CD5\u8BBF\u95EE\u526A\u8D34\u677F\uFF0C\u8BF7\u624B\u52A8\u590D\u5236\u4E0B\u9762\u7684\u8BCA\u65AD\u5185\u5BB9\": \"Unable to access the clipboard, please manually copy the diagnostic content below\",\n \"\u672A\u627E\u5230\u8BE5 Gist\uFF0C\u8BF7\u68C0\u67E5 ID \u6216\u94FE\u63A5\": \"Gist not found, please check ID or link\",\n \"\u70B9\u4E86\u67D0\u4E2A\u5206\u7C7B\uFF0C\u6807\u7B7E\u5C31\u8DD1\u5230\u524D\u9762\u6765\u4E86\uFF0C\u597D\u5947\u602A\": \"I clicked on a certain category, and the tag came to the front, which is strange.\",\n \"\u4E0A\u6B21\u7684\u9009\u62E9\u6CA1\u6709\u5168\u90E8\u4FDD\u5B58\uFF0C\u56E0\u6B64\u6CA1\u6709\u91CD\u542F\uFF1A\": \"The last selection was not all saved, so it was not restarted:\",\n \"\u538B\u7F29\u5305\u6216\u6587\u4EF6\u5939\u9700\u5305\u542B SKILL.md\": \"Archives and folders must contain SKILL.md\",\n \"\u5C1A\u672A\u5B89\u88C5\u793E\u533A\u63D2\u4EF6\uFF0C\u53EF\u524D\u5F80\u300C\u53D1\u73B0\u300D\u9875\u6D4F\u89C8\": \"No community plugins installed, browse to the Discover page\",\n \"\u5F53\u524D profile \u6CA1\u6709\u53EF\u5BFC\u51FA\u7684\u63D2\u4EF6\": \"Current profile has no plugins to export\",\n \"\u63D2\u4EF6\u64CD\u4F5C\u672A\u7ED3\u675F\uFF0C\u6536\u85CF\u672A\u4FDD\u5B58\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\": \"The plugin operation is not over, the collection is not saved, please try again later\",\n \"\u65E0\u6548\u6761\u76EE = \u914D\u7F6E\u91CC\u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u4E1C\u897F\": \"Invalid entry = the configuration refers to something that does not exist\",\n \"\u672C\u90E8\u7F72\u6CA1\u6709\u63A5\u53D7\u8FD9\u4E9B\u503C\uFF0C\u5DF2\u4FDD\u7559\u4F9B\u4F60\u4FEE\u6539\u3002\": \"This deployment did not accept these values; they were preserved for you to edit.\",\n \"\u6CA1\u6709\u627E\u5230\u58F0\u660E\u517C\u5BB9\u5F53\u524D DSH \u7684\u7248\u672C\u3002\": \"Declaration of compatibility with current DSH version not found.\",\n \"\u2026 \u5DF2\u622A\u65AD\uFF0C\u5171 {total} \u5B57\u7B26\": \"\u2026 truncated, {total} characters total\",\n \"{count} \u4E2A subagent\": \"{count} subagents\",\n \"{count} \u4E2A\u5B50\u667A\u80FD\u4F53\uFF0C\u6B63\u5728\u8FD0\u884C\": \"{count} subagents, running\",\n \"Gist \u5185\u5BB9\u65E0\u6548\u6216\u5907\u4EFD\u683C\u5F0F\u4E0D\u53D7\u652F\u6301\": \"Invalid Gist content or unsupported backup format\",\n \"\u4F1A\u6539\u52A8 DSH \u81EA\u5E26\u7684\u7EC4\u4EF6\uFF08{0}\uFF09\": \"Modifies DSH included components ({0})\",\n \"\u4F1A\u76F4\u63A5\u8FDE\u63A5\u56FA\u5B9A IP \u5730\u5740\uFF08{0}\uFF09\": \"Directly connects to a fixed IP address ({0})\",\n \"\u4F1A\u7981\u7528 DSH \u81EA\u5E26\u7684\u7EC4\u4EF6\uFF08{0}\uFF09\": \"Disables DSH included components ({0})\",\n \"\u4F1A\u8986\u76D6 DSH \u81EA\u5E26\u7684\u7EC4\u4EF6\uFF08{0}\uFF09\": \"Will overwrite DSH's own components ({0})\",\n \"\u5206\u7EC4\u4EC5\u7528\u4E8E\u6574\u7406\uFF0C\u4E0D\u4F1A\u6539\u53D8\u63D2\u4EF6\u542F\u7528\u72B6\u6001\": \"Grouping is for collation only and does not change the plugin activation status\",\n \"\u5B89\u88C5\u63D2\u4EF6\u524D\u9700\u8981\u5148\u914D\u7F6E pnpm \u73AF\u5883\": \"The pnpm environment needs to be configured before installing the plugin\",\n \"\u5DF2\u590D\u5236\u4FEE\u590D\u8BF4\u660E\uFF0C\u8BF7\u7C98\u8D34\u5230\u65B0\u5BF9\u8BDD\u4E2D\u53D1\u9001\": \"Repair instructions copied, please paste into new conversation to send\",\n \"\u5DF2\u6839\u636E\u7F51\u7EDC\u72B6\u51B5\u81EA\u52A8\u9009\u62E9\uFF0C\u53EF\u968F\u65F6\u5207\u6362\u3002\": \"It's automatically selected based on your network and can be switched at any time.\",\n \"\u6BCF\u5C0F\u65F6\u7684\u7B2C {minutes} \u5206\u949F\": \"At minute {minutes} of every hour\",\n \"\u793E\u533A\u7B2C\u4E09\u65B9\u63D2\u4EF6\uFF0C\u6784\u5EFA\u811A\u672C\u9ED8\u8BA4\u4E0D\u8FD0\u884C\u3002\": \"Community third-party plugins, build scripts do not run by default.\",\n \"\u88AB\u5378\u8F7D\u7684\u63D2\u4EF6\u914D\u7F6E\u4F1A\u4FDD\u7559\uFF0C\u53EF\u4EE5\u518D\u88C5\u56DE\u6765\": \"The uninstalled plugin configuration will be preserved and can be loaded back\",\n \"\u8BC4\u8BBA\u52A0\u8F7D\u5931\u8D25\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u540E\u91CD\u8BD5\u3002\": \"Comment loading failed. Please check your network connection and try again.\",\n \"\u9A8C\u8BC1\u901A\u8FC7\uFF08Token \u6765\u6E90\uFF1A{0}\uFF09\": \"Validation passed (Token source: {0})\",\n \"{n} \u4E2A\u540E\u53F0\u4EFB\u52A1\uFF1A{names}\": \"{n} background tasks: {names}\",\n \"{n} \u6761\u5B9A\u65F6\u63D0\u9192\uFF1A{names}\": \"{n} scheduled reminders: {names}\",\n \"{n} \u9879\u5176\u4ED6\u5DE5\u4F5C\uFF08{kind}\uFF09\": \"{n} other jobs ({kind})\",\n \"DSH \u6307\u51FA\u4F46\u672C\u9875\u65E0\u6CD5\u5F00\u5173\u7684\u63D2\u4EF6\uFF1A\": \"The DSH points to plugins that cannot be switched on on this page:\",\n \"\u5199\u4E0B\u6280\u80FD\u8981\u9075\u5FAA\u7684\u6307\u4EE4\u3001\u6B65\u9AA4\u548C\u8FB9\u754C\u2026\": \"Write the instructions, steps, and boundaries...\",\n \"\u56DE\u8F66\u4FDD\u5B58\u5355\u4E2A\uFF1B\u6E05\u7A7A\u522B\u540D\u8FD8\u539F\u6587\u4EF6\u5939\u540D\": \"Press Enter to save; clear alias to restore folder name\",\n \"\u5B89\u88C5\u3001\u66F4\u65B0\u4E0E\u5378\u8F7D\u7684\u8FDB\u5EA6\u5C06\u663E\u793A\u5728\u8FD9\u91CC\": \"The progress of installing, updating and uninstalling will be shown here\",\n \"\u5BFC\u5165\u65F6\u590D\u5236\u5B8C\u6574\u5185\u5BB9\uFF0C\u4E0D\u4FEE\u6539\u539F\u59CB\u6765\u6E90\": \"Import copies full content and never modifies original source\",\n \"\u641C\u7D22\u63D2\u4EF6\uFF0C\u4F8B\u5982\uFF1A\u901A\u77E5\u3001\u7EC8\u7AEF\u3001\u8BB0\u5FC6\u2026\": \"Search plugins such as: notifications, terminals, memories...\",\n \"\u8FD9\u662F\u7EC8\u7AEF\u63D2\u4EF6\uFF0C\u7F51\u9875\u7248\u91CC\u53EF\u80FD\u7528\u4E0D\u4E86\u3002\": \"This is a terminal plugin, it may not be available in the web version.\",\n \"{count} \u4E2A\u540E\u53F0\u4EFB\u52A1\u8FD0\u884C\u4E2D\": \"{count} background tasks running\",\n \"\u548C\u5DF2\u5B89\u88C5\u7684\u63D2\u4EF6\u51B2\u7A81\uFF0C\u53EA\u80FD\u7559\u4E00\u4E2A\uFF1A\": \"Conflicts with installed plugins, only one can be left:\",\n \"\u5728 GitHub \u767B\u5F55\u5E76\u53C2\u4E0E\u8BA8\u8BBA\": \"Log in and join the discussion on GitHub\",\n \"\u5907\u4EFD\u4E2D\u6709 {0} \u4E2A\u63D2\u4EF6\u5C1A\u672A\u5B89\u88C5\": \"{0} plugin (s) not installed in backup\",\n \"\u5B9E\u5FC3\u7684\u9879\u5728\u5DF2\u626B\u63CF\u7684\u63D2\u4EF6\u91CC\u8F83\u5C11\u51FA\u73B0\": \"Solid items rarely appear in scanned plugins\",\n \"\u6062\u590D\u5DF2\u5B8C\u6210\uFF0C\u4F46\u4E0B\u5217\u63D2\u4EF6\u5B89\u88C5\u5931\u8D25\uFF1A\": \"Restore completed, but the following plugins failed to install:\",\n \"\u66F4\u65B0\u63D0\u9192\u5DF2\u5173\u95ED\u3002\u65B0\u7248\u672C\u4ECD\u4F1A\u5217\u51FA\u3002\": \"Update alerts are turned off. The new version will still be listed.\",\n \"\u81EA\u52A8\u9009\u62E9\u53EF\u7528\u7EBF\u8DEF\uFF0C\u5931\u8D25\u65F6\u624D\u5207\u6362\u3002\": \"Automatically selects available mirror, falls back on failure.\",\n \"\u8BE5\u63D2\u4EF6\u5F53\u524D\u672A\u52A0\u8F7D\uFF0C\u6682\u65F6\u65E0\u6CD5\u914D\u7F6E\u3002\": \"This plugin is not loaded, so it cannot be configured yet.\",\n \"\u8BE5\u6765\u6E90\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u6682\u65F6\u6CA1\u6709\u6280\u80FD\u3002\": \"This source directory does not exist or has no skills.\",\n \"dsh \u7684\u539F\u59CB\u8F93\u51FA\uFF08\u7ED3\u5C3E\u90E8\u5206\uFF09\": \"raw output of dsh (end)\",\n \"npm \u4E0B\u8F7D\u91CF\uFF08\u8FD1 30 \u5929\uFF09\": \"npm downloads (last 30 days)\",\n \"\u52A0\u8F7D\u6761\u76EE\uFF08loader id\uFF09\": \"Loader entry (loader id)\",\n \"\u5339\u914D\u7684\u63D2\u4EF6\u5728\u300C\u5DF2\u5C4F\u853D\u300D\u6807\u7B7E\u91CC\u3002\": \"The matching plugin is in the Blocked tab.\",\n \"\u540C\u540D\u63D2\u4EF6\uFF08\u4EC5\u4F9B\u53C2\u8003\uFF0C\u4E0D\u7B97\u51B2\u7A81\uFF09\": \"Plugins with the same name (for reference only, not conflict)\",\n \"\u5DF2\u5B89\u88C5\uFF0C\u4E0E\u5F53\u524D dsh \u4E0D\u517C\u5BB9\": \"Installed, incompatible with current dsh\",\n \"\u5F53\u524D\u8FDB\u7A0B\u4EE4\u724C\u4E0D\u53EF\u7528\uFF0C\u8BF7\u5237\u65B0\u770B\u677F\": \"The current process token is unavailable; refresh the dashboard\",\n \"\u65B0\u7248\u672C\u4ECD\u4F1A\u5217\u51FA\uFF0C\u53EA\u662F\u4E0D\u518D\u63D0\u9192\u3002\": \"The new version will still be listed, just no more reminders.\",\n \"\u6682\u65F6\u8BFB\u4E0D\u5230\u66F4\u65B0\u8BF4\u660E\uFF0C\u7A0D\u540E\u518D\u8BD5\u3002\": \"The update instructions could not be read at the moment, please try again later.\",\n \"\u66F4\u65B0\u4F1A\u4E0B\u8F7D\u65B0\u7248\u672C\uFF0C\u91CD\u542F\u540E\u751F\u6548\u3002\": \"Update will download the new version; takes effect upon restart.\",\n \"\u672A\u53D1\u73B0\u51B2\u7A81\u3001\u4F9D\u8D56\u6216\u52A0\u8F7D\u987A\u5E8F\u95EE\u9898\": \"No conflicts, dependencies, or loading order issues found\",\n \"\u7EDF\u8BA1\u533A\u95F4\uFF1A{0} \u81F3 {1}\u3002\": \"Statistical range: {0} to {1}.\",\n \"\u8BF7\u586B\u6570\u5B57\uFF1B\u7559\u7A7A\u8868\u793A\u4F7F\u7528\u9ED8\u8BA4\u503C\u3002\": \"Enter a number; leave blank to use the default.\",\n \"\u2026 \u5176\u4F59 {count} \u884C\": \"\u2026 {count} more lines\",\n \"\uFF08\u5DF2\u5199\u5165\u914D\u7F6E\uFF0C\u91CD\u542F\u540E\u4ECD\u751F\u6548\uFF09\": \"(Written to config; persists after restart)\",\n \"\u4FDD\u5B58\u5931\u8D25\uFF1A{message}\": \"Save failed: {message}\",\n \"\u5168\u90E8 {count} \u4E2A\u6587\u4EF6\": \"All {count} files\",\n \"\u5305\u5143\u4FE1\u606F\u9519\u8BEF\uFF1A{error}\": \"Package metadata error: {error}\",\n \"\u53EF\u79BB\u5F00\u672C\u9875\u9762\uFF0C\u5B8C\u6210\u540E\u5C06\u901A\u77E5\u4F60\": \"You can leave this page and we'll let you know when it's done\",\n \"\u5728 GitHub \u4E0A\u67E5\u770B\u4ED3\u5E93\": \"View repository on GitHub\",\n \"\u575A\u679C\u4E91 / Nutstore\": \"Nut Cloud/Nutstore\",\n \"\u63D2\u4EF6\u52A0\u8F7D\u987A\u5E8F\uFF08bundle\uFF09\": \"Plugin loading order (bundle)\",\n \"\u63D2\u4EF6\u76EE\u5F55\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\": \"Plugin directory failed to load, please try again later\",\n \"\u65E0\u6CD5\u5B89\u88C5\uFF1A\u4E0E\u5DF2\u5B89\u88C5\u7684\u63D2\u4EF6\u51B2\u7A81\": \"Unable to install: conflicts with installed plugins\",\n \"\u680F\u5BBD\u4E0D\u8DB3\uFF0C\u62D6\u5BBD\u4FA7\u8FB9\u680F\u540E\u518D\u5206\u680F\": \"Not enough width; widen the sidebar before splitting\",\n \"\u8BFB\u53D6\u5931\u8D25\uFF1A{message}\": \"Read failed: {message}\",\n \"\u8FD9\u4E2A\u65B0\u7248\u672C\u8981\u6C42\u66F4\u65B0\u7684 DSH\": \"This new version requires an updated DSH\",\n \"{count} \u4E2A\u540E\u53F0\u4EFB\u52A1\": \"{count} background tasks\",\n \"{count} \u4E2A\u5B50\u667A\u80FD\u4F53\": \"{count} subagents\",\n \"{count} \u4E2A\u5DE5\u5177\u8C03\u7528\": \"{count} tool calls\",\n \"{count} \u4E2A\u8BCA\u65AD\u5F02\u5E38\": \"{count} diagnostics issues\",\n \"{count} \u6B21\u5DE5\u5177\u8C03\u7528\": \"{count} tool calls\",\n \"Agent \u7A7A\u95F2\u540E\u81EA\u52A8\u5F00\u59CB\": \"Start automatically when the agent is free\",\n \"npm \u5F53\u524D latest\": \"npm Current latest\",\n \"\u4F1A\u5728\u8FD0\u884C\u65F6\u6267\u884C\u62FC\u51FA\u6765\u7684\u4EE3\u7801\": \"will execute the spelled-out code at runtime\",\n \"\u4F1A\u6539\u52A8 DSH \u81EA\u5E26\u7684\u7EC4\u4EF6\": \"Will change the DSH's own components\",\n \"\u5220\u9664 {provider}\": \"Remove {provider}\",\n \"\u5305\u542B\u914D\u7F6E\u6587\u4EF6\uFF08\u53EF\u80FD\u542B\u5BC6\u94A5\uFF09\": \"Include profile (may include key)\",\n \"\u53E6\u6709 {0} \u6761\u5F85\u786E\u8BA4\u4FE1\u606F\": \"{0} more to confirm\",\n \"\u5728\u4FA7\u8FB9\u680F\u6253\u5F00 {name}\": \"Open {name} in the sidebar\",\n \"\u5DF2\u81EA\u52A8\u64A4\u9500\uFF0C\u672A\u6539\u52A8\u4EFB\u4F55\u63D2\u4EF6\": \"Automatically revoked, no plugins changed\",\n \"\u5DF2\u9009\u62E9\u4FDD\u7559\u73B0\u6709\u63D2\u4EF6\uFF0C\u672A\u5B89\u88C5\": \"Selected to keep existing plugins, not installed\",\n \"\u5F53\u524D\u5DE5\u4F5C\u533A\u6216\u672C\u5730\u5E94\u7528\u4E0D\u53EF\u7528\": \"The current workspace or local application is unavailable\",\n \"\u65E0\u6CD5\u66F4\u65B0\u5C4F\u853D\u5217\u8868\uFF0C\u8BF7\u91CD\u8BD5\u3002\": \"Unable to update the block list, please try again.\",\n \"\u66F4\u65B0\u5230 {version}\": \"Update to {version}\",\n \"\u66F4\u65B0\u5230\u8F93\u5165\u6846\u4E2D\u7684 Gist\": \"Update to Gist in Input\",\n \"\u68C0\u67E5\u66F4\u65B0\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002\": \"Update check failed; try again later.\",\n \"\u6BCF\u5929\u81EA\u52A8\u5907\u4EFD\uFF08\u6253\u5F00\u5E02\u573A\u65F6\uFF09\": \"Automatic daily backups (when market is open)\",\n \"\u6CA1\u6709\u626B\u63CF\u5230\u3002\u8FD9\u4E0D\u7B49\u4E8E\u5B89\u5168\u3002\": \"Not scanned. This does not equal security.\",\n \"\u7528\u5230 DSH \u5BBF\u4E3B\u5185\u90E8\u7684\u5305\": \"Uses packages inside the DSH host\",\n \"\u786E\u8BC1\u4E0E\u5F53\u524D DSH \u4E0D\u517C\u5BB9\": \"Confirm incompatibility with current DSH\",\n \"\u7B2C {0} / {1} \u9875\": \"Page {0} of {1}\",\n \"\u8BE5\u7248\u672C\u4F4E\u4E8E\u5F53\u524D\u5DF2\u5B89\u88C5\u7248\u672C\u3002\": \"This version is lower than the currently installed version.\",\n \"\u8BF7\u8F93\u5165\u81F3\u5C11 1 \u5206\u949F\u7684\u95F4\u9694\": \"Enter an interval of at least 1 minute\",\n \"\u91CD\u6392 {0} \u4E2A\u63D2\u4EF6\u7684\u4F4D\u7F6E\": \"Relocate {0} plugins\",\n \"{count} \u4E2A\u5DF2\u505C\u7528\": \"{count} disabled\",\n \"{count} \u4E2A\u5DF2\u542F\u7528\": \"{count} enabled\",\n \"{count} \u4E2A\u88AB\u8986\u76D6\": \"{count} overridden\",\n \"{n} \u4E2A\u5B50\u667A\u80FD\u4F53\u8FD0\u884C\u4E2D\": \"{n} subagents running\",\n \"{y}\u5E74{m}\u6708{d}\u65E5\": \"{y}-{m}-{d}\",\n \"\u505C\u6B62 Cordis \u63D2\u4EF6\": \"Stop Cordis plugin\",\n \"\u517C\u5BB9\u5F53\u524D DSH {0}\": \"Compatible with current DSH {0}\",\n \"\u5220\u9664\u540E\u8BE5\u5FEB\u7167\u5C06\u65E0\u6CD5\u6062\u590D\u3002\": \"Once deleted, the snapshot cannot be recovered.\",\n \"\u52A0\u5165\u5206\u7EC4\u4E0D\u4F1A\u81EA\u52A8\u542F\u7528\u63D2\u4EF6\": \"Joining a group does not automatically enable the plugin\",\n \"\u5B89\u88C5 {version}\": \"Install {version}\",\n \"\u5C55\u5F00\u5176\u4F59 {n} \u884C\u8F93\u51FA\": \"Show {n} more output lines\",\n \"\u5DF2\u6DFB\u52A0\u5DE5\u5177\uFF1A{name}\": \"Tool added: {name}\",\n \"\u5DF2\u79FB\u9664\u5DE5\u5177\uFF1A{name}\": \"Tool removed: {name}\",\n \"\u6211\u5DF2\u4E86\u89E3\u98CE\u9669\uFF0C\u5E76\u613F\u610F\u7EE7\u7EED\": \"I understand the risk and want to continue\",\n \"\u6536\u85CF\u7684\u6761\u76EE\u5DF2\u4E0D\u5728\u76EE\u5F55\u4E2D\u3002\": \"Favorite entry is no longer in the directory.\",\n \"\u65B0\u589E {count} \u4E2A\": \"Added {count}\",\n \"\u65E0\u6CD5\u663E\u793A\u6587\u4EF6\u4F4D\u7F6E\uFF0C\u8BF7\u91CD\u8BD5\": \"Could not show the file location; try again\",\n \"\u6709\u8FDE\u63A5\u6CA1\u6709\u52A0\u5BC6\uFF08{0}\uFF09\": \"Connection with no encryption ({0})\",\n \"\u67E5\u770B\u63D2\u4EF6\u5E02\u573A\u7248\u672C\u4E0E\u8BBE\u7F6E\u3002\": \"View marketplace version and settings.\",\n \"\u6B63\u6587\uFF08Markdown\uFF09\": \"Body (Markdown)\",\n \"\u6BCF {count} \u5C0F\u65F6\": \"Every {count} hours\",\n \"\u79FB\u9664 {count} \u4E2A\": \"Removed {count}\",\n \"\u79FB\u9664 Cordis \u63D2\u4EF6\": \"Remove Cordis plugin\",\n \"\u7B26\u5408\u5BBF\u4E3B\u8981\u6C42\uFF08\u4F9D\u636E\u58F0\u660E\uFF09\": \"Meets host requirements (per claim)\",\n \"\u7B49\u5F85 {0} \u4E2A\u4F1A\u8BDD\u7A7A\u95F2\": \"Waiting for {0} sessions to be free\",\n \"\u8FD0\u884C Cordis \u63D2\u4EF6\": \"Run Cordis plugin\",\n \"{count} \u4E2A\u6210\u5458\": \"{count} members\",\n \"{count} \u4E2A\u6280\u80FD\": \"{count} skills\",\n \"{count} \u4E2A\u63D0\u9192\": \"{count} reminders\",\n \"{count} \u4E2A\u6B65\u9AA4\": \"{count} steps\",\n \"{count} \u6761\u6D88\u606F\": \"{count} messages\",\n \"DeepSeek \u8D26\u53F7\": \"DeepSeek account\",\n \"\u4E00\u53E5\u8BDD\u8BF4\u660E\u4EC0\u4E48\u65F6\u5019\u4F7F\u7528\": \"One sentence describing when to use it\",\n \"\u4ECE WebDAV \u6062\u590D\": \"Restore from WebDAV\",\n \"\u4F1A\u8054\u7F51\uFF0C\u5E76\u7528\u5230\u4F60\u7684\u5BC6\u94A5\": \"will be connected to the network and will use your key\",\n \"\u4FE1\u53F7 {signal}\": \"Signal {signal}\",\n \"\u53E6\u6709 {0} \u9879\u5DF2\u7701\u7565\": \"{0} more items omitted\",\n \"\u540C\u65F6\u6E05\u9664\u5E02\u573A\u81EA\u5DF1\u7684\u6570\u636E\": \"while clearing the market's own data\",\n \"\u5DF2\u53D6\u6D88\uFF0C\u90E8\u5206\u66F4\u6539\u5DF2\u5E94\u7528\": \"Cancelled, some changes applied\",\n \"\u65B0\u5EFA\u4E00\u4E2A\u79C1\u6709 Gist\": \"Create a new private Gist\",\n \"\u65E5\u5FD7\u91CC\u6CA1\u6709\u8BF4\u660E\u5177\u4F53\u539F\u56E0\": \"No specific reason was given in the log\",\n \"\u6765\u6E90\u6838\u9A8C\u65F6\u95F4\uFF1A{0}\u3002\": \"Source verification time: {0}.\",\n \"\u6765\u6E90\u6838\u9A8C\u65F6\u95F4\uFF1A\u672A\u63D0\u4F9B\u3002\": \"Source verification time: Not provided.\",\n \"\u6BCF {step} \u5206\u949F\": \"Every {step} minutes\",\n \"\u6CA1\u6709\u672A\u5206\u7EC4\u7684\u63D2\u4EF6\u53EF\u52A0\u5165\": \"No ungrouped plugins to join\",\n \"\u8BE5\u63D2\u4EF6\u672A\u63D0\u4F9B\u66F4\u65B0\u8BF4\u660E\u3002\": \"No update instructions were provided for this plugin.\",\n \"\u8BE5\u683C\u5F0F\u6587\u4EF6\u6682\u65F6\u65E0\u6CD5\u9884\u89C8\": \"This file format cannot be previewed yet\",\n \"\u901B\u4E00\u901B\uFF0C\u70B9\u4E00\u4E0B\uFF0C\u88C5\u597D\u3002\": \"Browse, click, and install.\",\n \"\u987A\u5E8F\u68C0\u67E5\u672A\u901A\u8FC7\uFF1A{0}\": \"Sequence check failed: {0}\",\n \"\u2026 \u5176\u4F59 {n} \u884C\": \"\u2026 {n} more lines\",\n \"\uFF08\u672A\u83B7\u53D6\u5230\u8D26\u53F7\u4FE1\u606F\uFF09\": \"(no account information available)\",\n \"{seconds}\u79D2\": \"{seconds}s\",\n \"HTTPS \u52A0\u901F\u524D\u7F00\": \"HTTPS Mirror Prefix\",\n \"\u4E3A\u300C{0}\u300D\u9009\u62E9\u4E3B\u9898\": \"Select a topic for '{0}'\",\n \"\u4EC5\u63A5\u6536\u6B63\u5F0F\u53D1\u5E03\u7248\u672C\u3002\": \"Only official releases are accepted.\",\n \"\u505C\u7528 {0} \u4E2A\u63D2\u4EF6\": \"Deactivate {0} plugins\",\n \"\u542F\u52A8\u5931\u8D25\u2014\u2014\u8C03\u6574\u63D2\u4EF6\": \"Launch Failure - Adjust Plugin\",\n \"\u542F\u7528 {0} \u4E2A\u63D2\u4EF6\": \"Activate {0} plugins\",\n \"\u5B8C\u6574\u8D39\u7387\u8BBE\u7F6E\u52A0\u8F7D\u5931\u8D25\": \"Failed to load the full rate settings\",\n \"\u5DF2\u505C\u7528\uFF0C\u529F\u80FD\u7ACB\u5373\u5931\u6548\": \"Disabled, features expire immediately\",\n \"\u5DF2\u5904\u7406 {0} \u4E2A\u5305\": \"{0} packages processed\",\n \"\u5DF2\u7EE7\u7EED\u5DE5\u4F5C\uFF0C\u4ECD\u53EF\u56DE\u7B54\": \"Work resumed; still answerable\",\n \"\u6362\u7528 npm \u7248\u672C\uFF1F\": \"Switch to npm version?\",\n \"\u6536\u85CF\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\": \"Collection failed, please try again later\",\n \"\u65B0\u589E\uFF1A{names}\": \"Added: {names}\",\n \"\u6682\u65F6\u67E5\u4E0D\u5230\u517C\u5BB9\u7248\u672C\u3002\": \"A compatible version is temporarily unavailable.\",\n \"\u672C\u90E8\u7F72\u7684\u8BBE\u7F6E\u4E3A\u53EA\u8BFB\u3002\": \"This deployment's settings are read-only.\",\n \"\u6B63\u5728\u52A0\u8F7D\u66F4\u65E9\u7684\u5386\u53F2\u2026\": \"Loading earlier history\u2026\",\n \"\u6CA1\u6709\u5DF2\u6EE1\u8DB3\u7684\u4F9D\u8D56\u6761\u76EE\": \"No Dependent Entries Satisfied\",\n \"\u7528 {app} \u6253\u5F00\": \"Open with {app}\",\n \"\u79FB\u9664\uFF1A{names}\": \"Removed: {names}\",\n \"\u7B2C {turn} \u8F6E\": \"Turn {turn}\",\n \"\u8FD8\u6CA1\u6709\u5C4F\u853D\u4EFB\u4F55\u63D2\u4EF6\u3002\": \"No plugins have been blocked yet.\",\n \"\u9000\u51FA\u7801 {code}\": \"Exit code {code}\",\n \"{app}\uFF08\u9ED8\u8BA4\uFF09\": \"{app} (default)\",\n \"### \u4EC0\u4E48\u65F6\u5019\u9009\": \"### When to choose\",\n \"Cordis \u63D2\u4EF6\": \"Cordis plugin\",\n \"GitHub \u52A0\u901F\": \"GitHub Mirror\",\n \"pnpm \u4E34\u65F6\u76EE\u5F55\": \"pnpm temporary directory\",\n \"\u4E2D\u56FD\u7248\u7AEF\u70B9\u4E0E\u6A21\u578B\u6C60\": \"China Endpoints & Model Pool\",\n \"\u4ECE Gist \u5BFC\u5165\": \"Import from Gist\",\n \"\u4F1A\u8C03\u7528 AI \u6A21\u578B\": \"will invoke the AI model\",\n \"\u5141\u8BB8\u6784\u5EFA\u811A\u672C\u5E76\u91CD\u8BD5\": \"Allow build scripts and retry\",\n \"\u5171 {0} \u4E2A\u6536\u85CF\": \"Total {0} Collections\",\n \"\u53EF\u80FD\u4E0D\u9002\u7528\u4E8E\u7F51\u9875\u7248\": \"May not be available on the web\",\n \"\u5B89\u88C5\u65F6\u5C31\u4F1A\u8FD0\u884C\u4EE3\u7801\": \"The code will run at installation time\",\n \"\u5BFC\u5165\u5230\u5168\u5C40 DSH\": \"Import to global DSH\",\n \"\u5C1A\u65E0\u5206\u7EC4\uFF0C\u8BF7\u5148\u65B0\u5EFA\": \"There are no groups yet, please create a new one first\",\n \"\u5DF2\u56DE\u6EDA\uFF0C\u91CD\u542F\u540E\u751F\u6548\": \"Rolled back, effective after restart\",\n \"\u5DF2\u5B89\u88C5\uFF0C\u6821\u9A8C\u672A\u901A\u8FC7\": \"Installed, checksum failed\",\n \"\u5DF2\u5B89\u88C5\uFF0C\u91CD\u542F\u540E\u751F\u6548\": \"Installed, effective after reboot\",\n \"\u5DF2\u5BFC\u51FA\u5230 Gist\": \"Exported to Gist\",\n \"\u5DF2\u5E94\u7528\uFF0C\u91CD\u542F\u540E\u751F\u6548\": \"Applied, effective after restart\",\n \"\u5DF2\u6355\u83B7\u5E76\u4FDD\u5B58\u51ED\u8BC1\u3002\": \"Credentials captured and saved.\",\n \"\u5DF2\u9009\u62E9 {0} \u9879\": \"{0} items selected\",\n \"\u5FEB\u7167\u5217\u8868\u52A0\u8F7D\u5931\u8D25\uFF1A\": \"Failed to load snapshot list:\",\n \"\u603B\u5904\u7406 Token\": \"Total processed tokens\",\n \"\u6062\u590D\u540E\u4ECD\u65E0\u6CD5\u542F\u52A8\uFF1A\": \"Unable to start after recovery:\",\n \"\u6362\u7528 npm \u7248\u672C\": \"Switch to npm version\",\n \"\u641C\u7D22\u63D2\u4EF6\u540D\u79F0\u6216\u4F5C\u8005\": \"Search by plugin name or author...\",\n \"\u65B0\u7684 npm \u6765\u6E90\": \"New npm source\",\n \"\u65E0\u6CD5\u4FDD\u5B58\uFF0C\u8BF7\u91CD\u8BD5\u3002\": \"Unable to save, please try again.\",\n \"\u67E5\u770B {name}\": \"View {name}\",\n \"\u6B63\u5728\u52A0\u8F7D\u63D2\u4EF6\u76EE\u5F55\u2026\": \"Loading plugin directory...\",\n \"\u6B63\u5728\u68C0\u67E5\u66F4\u65B0...\": \"Checking for updates...\",\n \"\u6B63\u5728\u8BC6\u522B\u5BBF\u4E3B\u7248\u672C\u2026\": \"Identifying host version...\",\n \"\u6B63\u5728\u8BFB\u53D6\u5931\u8D25\u8BE6\u60C5\u2026\": \"Reading failure details...\",\n \"\u6B63\u5728\u8BFB\u53D6\u5BBF\u4E3B\u8981\u6C42\u2026\": \"Reading host requirements...\",\n \"\u6CA1\u6709\u4F9D\u8D56\u7248\u672C\u4E0D\u5339\u914D\": \"No dependent version mismatch\",\n \"\u6CA1\u6709\u53D1\u73B0\u6B8B\u7559\u76EE\u5F55\u3002\": \"No residual directories found.\",\n \"\u6CA1\u6709\u91CD\u590D\u7684\u63D2\u4EF6\u6761\u76EE\": \"No duplicate plugin entries\",\n \"\u786E\u8BA4\u542F\u7528\u5B8C\u5168\u6743\u9650\uFF1F\": \"Enable full access?\",\n \"\u7EC4\u5408\u5217\u8868\u52A0\u8F7D\u5931\u8D25\uFF1A\": \"Failed to load portfolio list:\",\n \"\u7EDF\u8BA1\u533A\u95F4\uFF1A\u672A\u63D0\u4F9B\u3002\": \"Statistical interval: not provided.\",\n \"\u9000\u51FA\u5E76\u767B\u5F55\u5176\u5B83\u8D26\u53F7\": \"Sign out and sign in to another account\",\n \"\u9879\u53D8\u66F4\uFF0C\u5237\u65B0\u540E\u751F\u6548\": \"Item changes, effective after refresh\",\n \"\u9879\u76EE Skills\": \"Project Skills\",\n \"API \u5BC6\u94A5\u65E0\u6548\": \"Invalid API key\",\n \"patch \u6587\u4EF6\": \"patch file\",\n \"\u4E0A\u4E0B\u6587\u7F13\u5B58\u547D\u4E2D\u7387\": \"Context Cache Hit Rate\",\n \"\u4F1A\u81EA\u5DF1\u5F00\u4EFB\u52A1\u5E72\u6D3B\": \"Will work on his own tasks\",\n \"\u4F1A\u8BFB\u4F60\u7684\u73AF\u5883\u53D8\u91CF\": \"will read your environment variables\",\n \"\u4F7F\u7528\u63D0\u4F9B\u5546\u9ED8\u8BA4\u503C\": \"Use provider default\",\n \"\u4F9B\u5E94\u5546 / \u6A21\u578B\": \"Provider / Model\",\n \"\u5141\u8BB8\u5E76\u884C\u8C03\u7528\u5DE5\u5177\": \"Allow parallel tool calls\",\n \"\u516C\u5171 Agent\": \"Shared Agent\",\n \"\u5907\u4EFD\u6587\u4EF6 URL\": \"Backup file URL\",\n \"\u5DF2\u6062\u590D\u66F4\u65B0\u63D0\u9192\u3002\": \"The update reminder has been restored.\",\n \"\u5E02\u573A\u81EA\u8EAB\u4E0D\u80FD\u505C\u7528\": \"Market itself cannot be deactivated\",\n \"\u6253\u5F00\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\": \"Open failed; try again\",\n \"\u63A8\u7406 Token\": \"Reasoning tokens\",\n \"\u63D2\u4EF6\u5E02\u573A\u65E0\u6CD5\u663E\u793A\": \"Plugin Marketplace cannot be displayed\",\n \"\u6587\u6863\u6E32\u67D3\u4E2D...\": \"Rendering document...\",\n \"\u65E0\u6CD5\u83B7\u53D6\u5E94\u7528\u5217\u8868\": \"Could not retrieve the application list\",\n \"\u6682\u65E0\u8FDB\u884C\u4E2D\u7684\u64CD\u4F5C\": \"No actions in progress\",\n \"\u6709\u65B0\u7248\u672C {0}\": \"Update Available\",\n \"\u672A\u53D1\u73B0\u8BCA\u65AD\u95EE\u9898\u3002\": \"No diagnostic issues found.\",\n \"\u672A\u914D\u7F6E\u4EFB\u4F55\u63D2\u4EF6\u5305\": \"No plugin packages configured\",\n \"\u6B63\u5728\u4FDD\u5B58\u5E76\u91CD\u542F\u2026\": \"Saving and restarting...\",\n \"\u6CA1\u6709\u5339\u914D\u7684\u6280\u80FD\u3002\": \"No matching skills.\",\n \"\u6CA1\u6709\u5339\u914D\u7684\u6A21\u578B\u3002\": \"No matching models.\",\n \"\u6CA1\u6709\u591A\u7248\u672C\u6838\u5FC3\u5305\": \"No multi-version core packages\",\n \"\u6CA1\u6709\u65E0\u6548\u914D\u7F6E\u6761\u76EE\": \"There are no invalid configuration entries\",\n \"\u6CA1\u6709\u672A\u5206\u7EC4\u7684\u4E3B\u9898\": \"No ungrouped topics\",\n \"\u6DFB\u52A0 {0} \u9879\": \"Add {0} items\",\n \"\u6DFB\u52A0\u5230\u300C{0}\u300D\": \"Add To\",\n \"\u7F13\u5B58\u5199 / 1M\": \"Cache write / 1M\",\n \"\u7F13\u5B58\u8BFB / 1M\": \"Cache read / 1M\",\n \"\u81EA\u52A8\uFF08\u5F15\u64CE\u9ED8\u8BA4\uFF09\": \"Auto (engine default)\",\n \"\u8F93\u5165 Token\": \"Input tokens\",\n \"\u8F93\u51FA Token\": \"Output tokens\",\n \"\u8FD8\u6CA1\u6709\u4FDD\u5B58\u8FC7\u7EC4\u5408\": \"No groups saved yet\",\n \"\u9009\u62E9\u8981\u5BFC\u51FA\u7684\u63D2\u4EF6\": \"Select plugins to export\",\n \"\u91CD\u542F\u524D\u90FD\u4E0D\u518D\u63D0\u9192\": \"Don't remind me again before restarting\",\n \"\u91CD\u5F00\u94FE\u65F6\u6362\u65B0\u4F1A\u8BDD\": \"Start a new session when reopening the chain\",\n \"\u9879\u76EE Agent\": \"Project Agent\",\n \"{n} \u4E2A\u4F1A\u8BDD\": \"{n} sessions\",\n \"AI \u56FE\u50CF\u5DE5\u574A\": \"AI Image Studio\",\n \"\u4E00\u76F4\u4E0D\u63D0\u9192\u66F4\u65B0\": \"Never remind me to update\",\n \"\u4E3A\u4EC0\u4E48\u672A\u751F\u6548\uFF1F\": \"Why didn't it go into effect?\",\n \"\u4E3B\u9898\uFF08{0}\uFF09\": \"WordPress.org themes\",\n \"\u4ECD\u5B89\u88C5 {0}\": \"Install {0} anyway\",\n \"\u4ECE\u516C\u5F00\u65E5\u5386\u8F7D\u5165\": \"Load from Public Calendar\",\n \"\u4F1A\u5199\u5165\u672C\u673A\u6587\u4EF6\": \"will write to the native file\",\n \"\u4F1A\u8BFB\u53D6\u672C\u673A\u6587\u4EF6\": \"Reads native files\",\n \"\u4F9D\u8D56\u7248\u672C\u4E0D\u5339\u914D\": \"Dependency version mismatch\",\n \"\u4FDD\u6301\u73B0\u5728\u7684\u7248\u672C\": \"Keep Current Version\",\n \"\u6700\u8FD1 30 \u5929\": \"Latest 30 days\",\n \"\u6700\u8FD1 90 \u5929\": \"Last 90 days\",\n \"\u521B\u5EFA\u5FEB\u7167\u5931\u8D25\uFF1A\": \"Failed to create snapshot:\",\n \"\u5220\u9664\u5FEB\u7167\u5931\u8D25\uFF1A\": \"Failed to delete snapshot:\",\n \"\u5230\u671F\u524D\u81EA\u52A8\u91CD\u767B\": \"Auto re-login before expiry\",\n \"\u53C2\u6570 JSON\": \"Parameters JSON\",\n \"\u590D\u5236 HTML\": \"Copy HTML\",\n \"\u5DF2\u5B89\u88C5\uFF0C\u672A\u751F\u6548\": \"Installed, Not Active\",\n \"\u5DF2\u5B89\u88C5\u5E76\u5DF2\u751F\u6548\": \"Installed and Active\",\n \"\u5E94\u7528\u6B64\u7EC4\u5408\u5C06\uFF1A\": \"Applying this combination will:\",\n \"\u6253\u5F00\u72EC\u7ACB\u6062\u590D\u9875\": \"Open Independent Recovery Page\",\n \"\u626B\u63CF\u4E8E {0}\": \"Scanned on {0}\",\n \"\u62D6\u62FD\u6280\u80FD\u5230\u6B64\u5904\": \"Drop skill here\",\n \"\u63D2\u4EF6\uFF08{0}\uFF09\": \"Plugin\",\n \"\u641C\u7D22\u63D2\u4EF6...\": \"Search plugins...\",\n \"\u65E0\u6548\u7684\u914D\u7F6E\u6761\u76EE\": \"Invalid configuration entry\",\n \"\u6709\u672A\u4FDD\u5B58\u7684\u4FEE\u6539\": \"Unsaved changes\",\n \"\u672A\u58F0\u660E\u5BBF\u4E3B\u8981\u6C42\": \"Host requirement not declared\",\n \"\u672A\u627E\u5230\u76F8\u5173\u63D2\u4EF6\": \"No matching plugins\",\n \"\u6B63\u5728\u52A0\u8F7D\u6280\u80FD\u2026\": \"Loading skills...\",\n \"\u6B63\u5728\u52A0\u8F7D\u6A21\u578B\u2026\": \"Loading models\u2026\",\n \"\u6B63\u5728\u52A0\u8F7D\u8BC4\u8BBA\u2026\": \"Loading comments...\",\n \"\u6B63\u5728\u6253\u5F00\u5DE5\u4F5C\u533A\": \"Opening workspace\",\n \"\u6B63\u5728\u68C0\u67E5\u66F4\u65B0\u2026\": \"Checking for updates...\",\n \"\u6B63\u5728\u751F\u6210\u56FE\u7247\u2026\": \"Generating image\u2026\",\n \"\u6B63\u5728\u8BFB\u53D6\u63D2\u4EF6\u2026\": \"Reading plugins\u2026\",\n \"\u6CA1\u6709\u5339\u914D\u7684\u6280\u80FD\": \"No matching skills\",\n \"\u6CA1\u6709\u5339\u914D\u7684\u63D2\u4EF6\": \"No matching plugins\",\n \"\u6D4F\u89C8\u5668\u7A97\u53E3\u767B\u5F55\": \"Browser window login\",\n \"\u7528\u6237\u540D\uFF08\u53EF\u9009\uFF09\": \"Notification E-Mail auth username (optional)\",\n \"\u7531\u4F60\u7684\u914D\u7F6E\u52A0\u8F7D\": \"Loaded by your configuration\",\n \"\u76EE\u5F55\u4E2D\u6682\u65E0\u4E3B\u9898\": \"There are currently no topics in the directory\",\n \"\u7701 Token\": \"Save tokens\",\n \"\u7EC4\u5408\u64CD\u4F5C\u5931\u8D25\uFF1A\": \"Combination operation failed:\",\n \"\u7ED3\u679C JSON\": \"Result JSON\",\n \"\u81EA\u5B9A\u4E49\u65F6\u95F4\u8303\u56F4\": \"Custom time range\",\n \"\u8BCA\u65AD\u52A0\u8F7D\u5931\u8D25\uFF1A\": \"Diagnostics failed to load:\",\n \"\u8BF7\u8F93\u5165\u7EC4\u5408\u540D\u79F0\": \"Please enter a portfolio name\",\n \"\u8F93\u5165 / 1M\": \"Input / 1M\",\n \"\u8F93\u51FA / 1M\": \"Output / 1M\",\n \"\u8FD8\u6CA1\u6709\u626B\u63CF\u7ED3\u679C\": \"No scans yet\",\n \"\u91CD\u542F\u524D\u4E0D\u518D\u63D0\u9192\": \"Don't remind me again before restarting\",\n \"\u91CD\u590D\u7684\u63D2\u4EF6\u6761\u76EE\": \"Duplicate plugin entry\",\n \"DSH \u5185\u90E8\": \"DSH Internal\",\n \"DSH \u6280\u80FD\": \"DSH Skills\",\n \"EAC \u6A21\u578B\": \"EAC models\",\n \"Star \u6570\": \"Number of Stars\",\n \"\u4E0A\u4E0B\u6587\u5DF2\u538B\u7F29\": \"Context compacted\",\n \"\u4E0D\u518D\u663E\u793A\u8FD9\u6761\": \"Don't show this again\",\n \"\u4E86\u89E3\u9879\u76EE\u7ED3\u6784\": \"Inspect Project Structure\",\n \"\u4F1A\u7528\u4F60\u7684\u5BC6\u94A5\": \"will use your key\",\n \"\u4F4E\u4E8E\u58F0\u660E\u4E0B\u9650\": \"Below Claim Lower Limit\",\n \"\u4FDD\u5B58\u5F53\u524D\u72B6\u6001\": \"Save Current State\",\n \"\u4FDD\u5B58\u73AF\u5883\u53D8\u91CF\": \"Save Environment Variables\",\n \"\u4FDD\u7559\u73B0\u6709\u63D2\u4EF6\": \"Keep existing plugins\",\n \"\u5168\u5C40 DSH\": \"Global DSH\",\n \"\u5173\u95ED\u6210\u672C\u8BBE\u7F6E\": \"Close cost settings\",\n \"\u5173\u95ED\u7528\u91CF\u7EDF\u8BA1\": \"Close usage statistics\",\n \"\u5173\u95ED\u81EA\u52A8\u5237\u65B0\": \"Disable auto refresh\",\n \"\u6700\u8FD1 1 \u5929\": \"Last 1 day\",\n \"\u6700\u8FD1 1 \u5E74\": \"Last year\",\n \"\u6700\u8FD1 7 \u5929\": \"In the last 7 days\",\n \"\u5220\u9664\u8D39\u7387\u6863\u4F4D\": \"Delete rate tier\",\n \"\u5237\u65B0\u7EDF\u8BA1\u6570\u636E\": \"Refresh statistics\",\n \"\u5378\u8F7D\u63D2\u4EF6\u5E02\u573A\": \"Uninstall Plugin Marketplace\",\n \"\u53D1\u5E03\u65F6\u95F4\u8303\u56F4\": \"Publish Time Range\",\n \"\u542F\u7528\u5B8C\u5168\u6743\u9650\": \"Enable full access\",\n \"\u56DE\u6536\u7AD9\u4E3A\u7A7A\u3002\": \"Trash is empty.\",\n \"\u590D\u5236\u5B89\u88C5\u547D\u4EE4\": \"Copy Install Command\",\n \"\u5B89\u88C5\u524D\u8BF7\u6CE8\u610F\": \"Please note before installation\",\n \"\u5B89\u88C5\u540E\u5B83\u53EF\u4EE5\": \"After installation it can be\",\n \"\u5BBF\u4E3B\u7248\u672C\u672A\u77E5\": \"Host version unknown\",\n \"\u5BBF\u4E3B\u8981\u6C42\u672A\u77E5\": \"Unknown host request\",\n \"\u5BC6\u7801\uFF08\u53EF\u9009\uFF09\": \"Password (optional)\",\n \"\u5C55\u5F00 {0}\": \"Expand\",\n \"\u5DE5\u4F5C\u533A\u5185\u4FEE\u6539\": \"Modify within workspace\",\n \"\u5DF2\u662F\u6700\u65B0\u7248\u672C\": \"Up to date\",\n \"\u5DF2\u6EE1\u8DB3\u7684\u4F9D\u8D56\": \"Satisfied Dependencies\",\n \"\u5DF2\u8FBE\u4E24\u683C\u4E0A\u9650\": \"Two-pane limit reached\",\n \"\u5E02\u573A\u663E\u793A\u7A7A\u767D\": \"Market Show Blank\",\n \"\u5F00\u542F\u81EA\u52A8\u5237\u65B0\": \"Enable auto refresh\",\n \"\u6062\u590D\u66F4\u65B0\u63D0\u9192\": \"Resume update alerts\",\n \"\u6210\u672C\u7EDF\u8BA1\u8BBE\u7F6E\": \"Cost statistics settings\",\n \"\u6362\u7528\u6765\u6E90\u5931\u8D25\": \"Failed to swap source\",\n \"\u6362\u7528\u7EBF\u4E0A\u7248\u672C\": \"Switch to online version\",\n \"\u63D2\u4EF6\u5E02\u573A\u8BBE\u7F6E\": \"Marketplace Settings\",\n \"\u6536\u8D77 {0}\": \"Collapse\",\n \"\u6539\u4E3A\u5B89\u88C5\u8FD9\u4E2A\": \"Install this instead\",\n \"\u65E5\u5FD7\u5BFC\u51FA\u5931\u8D25\": \"Log export failed\",\n \"\u663E\u793A\u6587\u4EF6\u4F4D\u7F6E\": \"Show file location\",\n \"\u66F4\u591A\u6253\u5F00\u65B9\u5F0F\": \"More ways to open\",\n \"\u66F4\u65B0\u63D2\u4EF6\u5E02\u573A\": \"Update Plugin Marketplace\",\n \"\u672C\u9875\u65E0\u6CD5\u5F00\u5173\": \"This page cannot be switched on or off\",\n \"\u6784\u5EFA\u73AF\u5883\u53D8\u91CF\": \"Build Environment Variables\",\n \"\u67E5\u627E\u8FD9\u4E2A\u63D2\u4EF6\": \"Find this plugin\",\n \"\u67E5\u770B\u4F5C\u8005\u7B80\u4ECB\": \"View author bio\",\n \"\u6838\u5FC3\u5305\u591A\u7248\u672C\": \"Core Package Multiple Versions\",\n \"\u6CA1\u6709\u4F9D\u8D56\u4FE1\u606F\": \"No dependency information\",\n \"\u6CA1\u6709\u4F9D\u8D56\u8B66\u544A\": \"No Dependency Warning\",\n \"\u6CA1\u6709\u4F9D\u8D56\u98CE\u9669\": \"No reliance on risk\",\n \"\u6CA1\u6709\u8986\u76D6\u5173\u7CFB\": \"No override relationships\",\n \"\u6E05\u9664\u5931\u6548\u6536\u85CF\": \"Clear Expired Favorites\",\n \"\u7248\u672C\u53D1\u5E03\u65F6\u95F4\": \"Version release time\",\n \"\u767D\u5AD6\u6A21\u578B\u63A5\u5165\": \"Free model access\",\n \"\u76EE\u5F55\u5EFA\u8BAE\u6539\u7528\": \"Catalog recommended to use instead\",\n \"\u76EE\u6807\u4E0D\u662F\u5206\u7EC4\": \"Target is not a group\",\n \"\u79FB\u9664\u6240\u9009\u5185\u5BB9\": \"Remove selection\",\n \"\u7F51\u5173\u6682\u4E0D\u53EF\u8FBE\": \"Gateway unreachable\",\n \"\u8BE5\u7EC4\u6682\u65E0\u6210\u5458\": \"There are no members in this group\",\n \"\u8BF7\u5148\u9009\u62E9\u4F1A\u8BDD\": \"Select a session first\",\n \"\u8D85\u51FA\u58F0\u660E\u4E0A\u9650\": \"Claim limit exceeded\",\n \"\u8FD0\u884C\u6784\u5EFA\u811A\u672C\": \"Run the build script\",\n \"\u8FD1 30 \u5929\": \"Last 30 days\",\n \"\u8FD1 90 \u5929\": \"Last 90 days\",\n \"\u8FD4\u56DE\u6211\u7684\u5907\u6CE8\": \"Back to my notes\",\n \"\u9000\u51FA\u5F53\u524D\u8D26\u53F7\": \"Sign out of this account\",\n \"\u91C7\u7528\u5EFA\u8BAE\u987A\u5E8F\": \"Adopt Suggested Order\",\n \"\u9879\u76EE DSH\": \"Project DSH\",\n \"\u9AD8\u4E8E\u663E\u5F0F\u4E0A\u9650\": \"Above Explicit Upper Limit\",\n \"\uFF08\u5DF2\u5220\u9664\uFF09\": \"(deleted)\",\n \"{n}\u4E2A\u6708\": \"{n} months\",\n \"{n}\u5206\u949F\": \"{n} minutes\",\n \"{n}\u5C0F\u65F6\": \"{n} hours\",\n \"\u26AA \u672A\u767B\u5F55\": \"\u26AA Not signed in\",\n \"\u2713 \u5DF2\u5B89\u88C5\": \"installed\",\n \"AI \u4FEE\u590D\": \"AI Repair\",\n \"\u4E0A\u4E0B\u6587\u7A97\u53E3\": \"Context window\",\n \"\u4EFB\u52A1 ID\": \"Task ID\",\n \"\u4F9B\u5E94\u5546\u7528\u91CF\": \"Provider Usage\",\n \"\u4F9B\u5E94\u5546\u7B5B\u9009\": \"Provider filter\",\n \"\u4FDD\u5B58\u5931\u8D25\uFF1A\": \"SAVE FAILED:\",\n \"\u4FDD\u5B58\u5E76\u91CD\u542F\": \"Save & Restart\",\n \"\u5168\u90E8\u4F9B\u5E94\u5546\": \"All providers\",\n \"\u5168\u90E8\u5DE5\u4F5C\u533A\": \"All workspaces\",\n \"\u5173\u95ED\u6B64\u63D0\u793A\": \"Dismiss this notice\",\n \"\u5207\u6362\u4E2D\u2026\u2026\": \"Switching\u2026\",\n \"\u521B\u5EFA\u65B0\u6280\u80FD\": \"Create Skill\",\n \"\u5220\u9664\u5206\u7EC4\uFF1F\": \"Remove group\",\n \"\u53D1\u73B0\u65B0\u7248\u672C\": \"New version available\",\n \"\u540D\u79F0\u4E0D\u5339\u914D\": \"Name mismatch\",\n \"\u542F\u52A8\u5931\u8D25\uFF1A\": \"Activation failed:\",\n \"\u56DE\u6536\u7AD9\u4E3A\u7A7A\": \"Trash is empty\",\n \"\u56DE\u6EDA\u5931\u8D25\uFF1A\": \"Rollback failed:\",\n \"\u5728\u672C\u5730\u6253\u5F00\": \"Open locally\",\n \"\u5907\u4EFD\u4E0E\u6062\u590D\": \"Backup and Recovery\",\n \"\u5907\u4EFD\u5DF2\u4E0A\u4F20\": \"Backup uploaded\",\n \"\u590D\u5236\u63D0\u793A\u8BCD\": \"Copy prompt\",\n \"\u5B83\u4F1A\u505A\u4EC0\u4E48\": \"What it will do\",\n \"\u5B89\u88C5\u66FF\u4EE3\u54C1\": \"Install Substitute\",\n \"\u5B8C\u6574\u65E5\u5FD7\uFF1A\": \"Full Log\",\n \"\u5BFC\u5165\u5E76\u9884\u89C8\": \"Import and preview\",\n \"\u5CF0\u8C37\u8BA1\u5212 \": \"Peak/off-peak plan\",\n \"\u5DE5\u4F5C\u533A\u522B\u540D\": \"Workspace Aliases\",\n \"\u5DE5\u4F5C\u533A\u7528\u91CF\": \"Workspace Usage\",\n \"\u5DE5\u4F5C\u533A\u7B5B\u9009\": \"Workspace filter\",\n \"\u5DE5\u5177\u5DF2\u66F4\u65B0\": \"Tools updated\",\n \"\u5DF2\u5B89\u88C5\u6280\u80FD\": \"Installed Skills\",\n \"\u5DF2\u5B89\u88C5\u63D2\u4EF6\": \"Installed Plugins\",\n \"\u5F53\u524D\u4E0D\u53EF\u7528\": \"Currently unavailable\",\n \"\u5FEB\u7167\u4E0E\u56DE\u6EDA\": \"Snapshots & Rollbacks\",\n \"\u5FEB\u7167\u5DF2\u521B\u5EFA\": \"Snapshot created\",\n \"\u5FEB\u7167\u5DF2\u5220\u9664\": \"Snapshots have been deleted.\",\n \"\u624B\u673A\u53F7\u767B\u5F55\": \"Phone number login\",\n \"\u6253\u5F00\u4FA7\u8FB9\u680F\": \"Open sidebar\",\n \"\u6280\u80FD\u7BA1\u7406\u5668\": \"Skills Manager\",\n \"\u63D0\u9192\u5DF2\u5173\u95ED\": \"Reminders are off\",\n \"\u641C\u7D22\u63D2\u4EF6\u2026\": \"Search plugins by\",\n \"\u641C\u7D22\u6536\u85CF\u2026\": \"Search Collection\",\n \"\u6536\u8D77\u4FA7\u8FB9\u680F\": \"Collapse sidebar\",\n \"\u6587\u4EF6\u4E0E\u73AF\u5883\": \"Documents & Environment\",\n \"\u6682\u65E0\u5DE5\u4F5C\u533A\": \"No workspaces yet\",\n \"\u670D\u52A1\u5546\u9884\u8BBE\": \"Provider Presets\",\n \"\u672A\u63D0\u4F9B\u7B80\u4ECB\": \"No description provided\",\n \"\u672A\u6B63\u5E38\u9000\u51FA\": \"Exited abnormally\",\n \"\u672A\u77E5\u4F9B\u5E94\u5546\": \"Unknown provider\",\n \"\u672A\u77E5\u5DE5\u4F5C\u533A\": \"Unknown workspace\",\n \"\u67E5\u770B\u66FF\u4EE3\u54C1\": \"View substitutions\",\n \"\u6821\u9A8C\u672A\u901A\u8FC7\": \"Verification failed\",\n \"\u68C0\u67E5\u5E76\u66F4\u65B0\": \"Check & Update\",\n \"\u6B63\u5728\u5220\u9664\u2026\": \"Deleting\u2026\",\n \"\u6B63\u5728\u52A0\u8F7D\u2026\": \"Loading...\",\n \"\u6B63\u5728\u5378\u8F7D\u2026\": \"Uninstalling\",\n \"\u6B63\u5728\u53D6\u6D88\u2026\": \"Cancelling...\",\n \"\u6B63\u5728\u66F4\u65B0\u2026\": \"Updating\u2026\",\n \"\u6B63\u5728\u66FF\u6362\u2026\": \"Replacing...\",\n \"\u6B63\u5728\u68C0\u67E5\u2026\": \"Checking\u2026\",\n \"\u6B63\u5728\u8BFB\u53D6\u2026\": \"Reading\u2026\",\n \"\u6B63\u5728\u914D\u7F6E\u2026\": \"Configuring\",\n \"\u6B63\u5728\u91CD\u542F\u2026\": \"restarting\",\n \"\u6E05\u7A7A\u56DE\u6536\u7AD9\": \"Empty Trash\",\n \"\u6E05\u7A7A\u5DF2\u5B8C\u6210\": \"Emptying completed\",\n \"\u6E90\u6587\u4EF6\u53EA\u8BFB\": \"Read-only\",\n \"\u767B\u5F55\u6001\u63A2\u6D3B\": \"Login health check\",\n \"\u76EE\u6807\u4E0D\u5B58\u5728\": \"The target does not exist\",\n \"\u786E\u8BA4\u5378\u8F7D\uFF1F\": \"Uninstall Confirmation\",\n \"\u79FB\u5165\u56DE\u6536\u7AD9\": \"Move to Trash\",\n \"\u79FB\u5230\u56DE\u6536\u7AD9\": \"Move to Trash\",\n \"\u7CFB\u7EDF\u63D0\u793A\u8BCD\": \"System Prompt\",\n \"\u7EC4\u5408\u5DF2\u4FDD\u5B58\": \"Portfolio saved.\",\n \"\u7EC4\u5408\u5DF2\u5220\u9664\": \"Group deleted\",\n \"\u7F13\u5B58\u547D\u4E2D\u7387\": \"Cache hit rate\",\n \"\u80FD\u8FD0\u884C\u547D\u4EE4\": \"Ability to run commands\",\n \"\u81EA\u52A8\u5316\u4EFB\u52A1\": \"Automated tasks\",\n \"\u81EA\u5B9A\u4E49\u89C4\u5219\": \"Custom rules\",\n \"\u8BF7\u9009\u62E9\u6A21\u578B\": \"Select a model\",\n \"\u8FD1 7 \u5929\": \"Last 7 days\",\n \"\u8FD8\u6CA1\u6709\u5FEB\u7167\": \"No snapshots yet\",\n \"\u8FDE\u901A\u6027\u6D4B\u8BD5\": \"Connectivity test\",\n \"\u9009\u62E9\u6587\u4EF6\u5939\": \"Choose Folder\",\n \"\u91CD\u542F\u540E\u751F\u6548\": \"Reboot after changes are installed\",\n \"\u91CD\u547D\u540D\u5206\u7EC4\": \"Rename Group\",\n \"\u9884\u89C8\u5931\u8D25\uFF1A\": \"Preview failed\",\n \"\uFF08\u672A\u77E5\uFF09\": \"(unknown)\",\n \"{n}\u5929\": \"{n} days\",\n \"{n}\u5E74\": \"{n} years\",\n \"\u4E00\u952E\u5B89\u88C5\": \"Install\",\n \"\u4E00\u952E\u66F4\u65B0\": \"Update\",\n \"\u4E00\u952E\u9886\u53D6\": \"Claim with 1-Click\",\n \"\u4E0A\u4F20\u5907\u4EFD\": \"Upload Backup\",\n \"\u4E0A\u6B21\u68C0\u67E5\": \"Last Checked\",\n \"\u4E0A\u6E38\u8BF7\u6C42\": \"Upstream Requests\",\n \"\u4E0B\u6B21\u8FD0\u884C\": \"Next run\",\n \"\u4E0B\u8F7D\u533A\u57DF\": \"Download Region\",\n \"\u4E0B\u8F7D\u56FE\u50CF\": \"Download image\",\n \"\u4E0D\u53EF\u9A71\u52A8\": \"Cannot Drive\",\n \"\u4E13\u5BB6\u7BA1\u7406\": \"Expert Manager\",\n \"\u4E2D\u56FD\u5927\u9646\": \"China Mainland\",\n \"\u4E2D\u7EE7\u5BC6\u94A5\": \"Relay API Key\",\n \"\u4EC5\u53EF\u67E5\u770B\": \"View only\",\n \"\u4ECD\u7136\u5B89\u88C5\": \"Install Anyway\",\n \"\u4ECD\u7136\u66F4\u65B0\": \"Update Anyway\",\n \"\u4ED3\u5E93\u7BA1\u7406\": \"Repositories\",\n \"\u4ED3\u5E93\u8BA2\u9605\": \"Repositories\",\n \"\u4EE3\u7801\u5BA1\u67E5\": \"Code Review\",\n \"\u4EFB\u52A1\u603B\u89C8\": \"Tasks Overview\",\n \"\u4EFB\u52A1\u8BBE\u7F6E\": \"Task Settings\",\n \"\u4F1A\u8BDD\u6280\u80FD\": \"Session Skills\",\n \"\u4F30\u7B97\u6210\u672C\": \"Estimated Cost\",\n \"\u4F7F\u7528\u8BF4\u660E\": \"Instructions\",\n \"\u4F9D\u8D56\u4FE1\u606F\": \"Dependency Info\",\n \"\u4F9D\u8D56\u8B66\u544A\": \"Dependency Warnings\",\n \"\u4F9D\u8D56\u98CE\u9669\": \"Dependency Risks\",\n \"\u4FDD\u5B58\u4E2D\u2026\": \"Saving...\",\n \"\u4FDD\u5B58\u4FEE\u6539\": \"Save changes\",\n \"\u4FDD\u5B58\u5931\u8D25\": \"Save failed\",\n \"\u505C\u6B62\u751F\u6210\": \"Stop generating\",\n \"\u505C\u7528\u5176\u4ED6\": \"Deactivate Other\",\n \"\u5141\u8BB8\u5E76\u53D1\": \"Allow concurrency\",\n \"\u514D\u8D39\u6A21\u578B\": \"Free models\",\n \"\u514D\u8D39\u989D\u5EA6\": \"Free quota\",\n \"\u5168\u5C40\u6280\u80FD\": \"Global Skills\",\n \"\u5168\u5C4F\u6D4F\u89C8\": \"Fullscreen\",\n \"\u5168\u90E8\u4FDD\u5B58\": \"Save All\",\n \"\u5168\u90E8\u505C\u7528\": \"Disable All\",\n \"\u5168\u90E8\u542F\u7528\": \"Enable All\",\n \"\u5168\u90E8\u63D2\u4EF6\": \"All Plugins\",\n \"\u5168\u90E8\u65F6\u95F4\": \"Full Time\",\n \"\u5168\u90E8\u66F4\u65B0\": \"Update All\",\n \"\u5168\u90E8\u6765\u6E90\": \"All Sources\",\n \"\u5168\u90E8\u6A21\u578B\": \"All models\",\n \"\u5168\u90E8\u72B6\u6001\": \"All Statuses\",\n \"\u5173\u95ED\u63D0\u793A\": \"Closure Prompt\",\n \"\u5173\u95ED\u8BE6\u60C5\": \"Close details\",\n \"\u5173\u95ED\u9884\u89C8\": \"Close Preview\",\n \"\u5185\u7F6E\u63D2\u4EF6\": \"Built-in plugins\",\n \"\u6700\u65B0\u7248\u672C\": \"Latest Version\",\n \"\u51C6\u5907\u4F9D\u8D56\": \"Prepare Dependencies\",\n \"\u51ED\u8BC1\u6765\u6E90\": \"Credential source\",\n \"\u5206\u7EC4\u540D\u79F0\": \"Group name\",\n \"\u5207\u6362\u5931\u8D25\": \"Switch failed\",\n \"\u521B\u5EFA\u4E2D\u2026\": \"Creating...\",\n \"\u521B\u5EFA\u4F4D\u7F6E\": \"Location\",\n \"\u521B\u5EFA\u5FEB\u7167\": \"Create Snapshot\",\n \"\u521B\u5EFA\u6280\u80FD\": \"Create Skill\",\n \"\u521B\u5EFA\u65F6\u95F4\": \"Created\",\n \"\u5220\u9664\u4E2D\u2026\": \"deleting...\",\n \"\u5220\u9664\u5206\u7EC4\": \"Remove group\",\n \"\u5220\u9664\u65F6\u6BB5\": \"Delete period\",\n \"\u5220\u9664\u89C4\u5219\": \"Delete rule\",\n \"\u5237\u65B0\u9875\u9762\": \"Refresh page \",\n \"\u524D\u9762\u8FD8\u6709\": \"There's more up ahead.\",\n \"\u52A0\u5165\u6536\u85CF\": \"Add Favorites\",\n \"\u52A0\u8F7D\u4E2D\u2026\": \"Loading...\",\n \"\u52A0\u8F7D\u5931\u8D25\": \"Load failed\",\n \"\u52A0\u8F7D\u66F4\u591A\": \"Load more\",\n \"\u5305\u542B\u6587\u4EF6\": \"File Inlcuded\",\n \"\u5378\u8F7D\u4E2D\u2026\": \"Uninstalling\",\n \"\u5386\u53F2\u4F1A\u8BDD\": \"History\",\n \"\u53D1\u5E03\u65F6\u95F4\": \"Release time\",\n \"\u53D1\u73B0\u6280\u80FD\": \"Discover Skills\",\n \"\u53D1\u73B0\u95EE\u9898\": \"Recognise there is a problem\",\n \"\u53D1\u9001\u6D88\u606F\": \"Send message\",\n \"\u53D6\u6D88\u5B89\u88C5\": \"Cancel the installation\",\n \"\u53D6\u6D88\u5C4F\u853D\": \"Unmask\",\n \"\u53D6\u6D88\u5F52\u6863\": \"Unarchive\",\n \"\u53D6\u6D88\u6536\u85CF\": \"Uncollect\",\n \"\u53D6\u6D88\u6807\u8BB0\": \"Unmark\",\n \"\u53D6\u6D88\u7F16\u8F91\": \"Cancel edit\",\n \"\u53D6\u6D88\u7F6E\u9876\": \"Unpin\",\n \"\u53EF\u7528\u6280\u80FD\": \"Available Skills\",\n \"\u53EF\u9009\u4F9D\u8D56\": \"Optional Dependencies\",\n \"\u540C\u6B65\u4E2D\u2026\": \"Syncing\u2026\",\n \"\u542F\u505C\u6280\u80FD\": \"Toggle Skill\",\n \"\u542F\u505C\u6765\u6E90\": \"Toggle Source\",\n \"\u542F\u52A8\u5931\u8D25\": \"Start failed\",\n \"\u56DE\u5230\u9876\u90E8\": \"Back to the top\",\n \"\u56DE\u6EDA\u4E2D\u2026\": \"Rolling back...\",\n \"\u56FE\u7247\u9884\u89C8\": \"Image preview\",\n \"\u5904\u7406\u4E2D\u2026\": \"Processing\u2026\",\n \"\u590D\u5236\u5931\u8D25\": \"Copy failed\",\n \"\u590D\u5236\u6210\u529F\": \"Copied\",\n \"\u590D\u5236\u6307\u4EE4\": \"Copy instructions\",\n \"\u590D\u5236\u8DEF\u5F84\": \"Copy path\",\n \"\u5916\u89C2\u8BBE\u7F6E\": \"Appearance\",\n \"\u5B50\u667A\u80FD\u4F53\": \"Subagent\",\n \"\u5B89\u88C5\u4E2D\u2026\": \"Installing...\",\n \"\u5B89\u88C5\u547D\u4EE4\": \"Installation Commands\",\n \"\u5B89\u88C5\u5931\u8D25\": \"Installation was unsuccessful\",\n \"\u5B8C\u5168\u6743\u9650\": \"Full access\",\n \"\u5B9E\u9645\u7248\u672C\": \"Actual Version\",\n \"\u5BBF\u4E3B\u7248\u672C\": \"Host Version\",\n \"\u5BFC\u5165\u6280\u80FD\": \"Import Skill\",\n \"\u5BFC\u51FA\u4E2D\u2026\": \"Exporting\",\n \"\u5BFC\u51FA\u5907\u4EFD\": \"Exported Backups\",\n \"\u5BFC\u51FA\u6280\u80FD\": \"Export Skill\",\n \"\u5BFC\u51FA\u65E5\u5FD7\": \"Export As JSON\",\n \"\u5C55\u5F00\u5168\u90E8\": \"Expand All\",\n \"\u5DE5\u5177\u8C03\u7528\": \"Tool call\",\n \"\u5DF2\u5BFC\u51FA\uFF1A\": \"Exported\",\n \"\u5DF2\u662F\u6700\u65B0\": \"Up To Date\",\n \"\u5DF2\u6709\u4E3B\u9898\": \"Existing topic\",\n \"\u5E94\u7528\u987A\u5E8F\": \"Order of Application\",\n \"\u5F00\u59CB\u6062\u590D\": \"Begin Rollback\",\n \"\u5F00\u59CB\u65F6\u95F4\": \"Start time\",\n \"\u5F02\u5E38\u8BCA\u65AD\": \"Diagnostics\",\n \"\u5F52\u6863\u4F1A\u8BDD\": \"Archive session\",\n \"\u5F53\u524D\u51FA\u53E3\": \"Current egress\",\n \"\u5F53\u524D\u6765\u6E90\": \"Current Source:\",\n \"\u5F53\u524D\u7248\u672C\": \"Current Version\",\n \"\u5FEB\u6377\u9884\u8BBE\": \"Quick presets\",\n \"\u6062\u590D\u5931\u8D25\": \"Backup succeeded with an warning.\",\n \"\u6062\u590D\u63D0\u9192\": \"Resume Reminder\",\n \"\u6062\u590D\u81EA\u52A8\": \"Restore Auto\",\n \"\u6062\u590D\u9ED8\u8BA4\": \"Restore Defaults\",\n \"\u6211\u7684\u5907\u6CE8\": \"My notes\",\n \"\u624B\u52A8\u8F93\u5165\": \"Manual input.\",\n \"\u6267\u884C\u4E2D\u2026\": \"Running\u2026\",\n \"\u6280\u80FD\u5217\u8868\": \"Skills List\",\n \"\u6280\u80FD\u6765\u6E90\": \"Skill Sources\",\n \"\u6280\u80FD\u7BA1\u7406\": \"Skills Manager\",\n \"\u62D6\u62FD\u6392\u5E8F\": \"Drag to Reorder\",\n \"\u6307\u7EB9\u6E05\u7406\": \"Fingerprint cleanup\",\n \"\u6392\u5E8F\u65B9\u5411\": \"SORT DIRECTION\",\n \"\u6392\u961F\u53D1\u9001\": \"Queued to send\",\n \"\u63D0\u4EA4\u8BB0\u5F55\": \"Submit Record\",\n \"\u63D2\u4EF6\u5217\u8868\": \"Plugin list\",\n \"\u63D2\u4EF6\u5347\u7EA7\": \"Plugin upgrade\",\n \"\u63D2\u4EF6\u5E02\u573A\": \"Plugin Marketplace\",\n \"\u63D2\u4EF6\u7EC4\u5408\": \"Plugin Portfolio\",\n \"\u63D2\u8BDD\u53D1\u9001\": \"Send interjection\",\n \"\u641C\u7D22\u4F1A\u8BDD\": \"Search sessions\",\n \"\u641C\u7D22\u63D2\u4EF6\": \"Search plugins...\",\n \"\u64CD\u4F5C\u5931\u8D25\": \"Operation Failed\",\n \"\u6536\u5F55\u65F6\u95F4\": \"Listed on\",\n \"\u6536\u8D77\u8F93\u51FA\": \"Collapse output\",\n \"\u653E\u5F03\u4FEE\u6539\": \"Discard changes\",\n \"\u6570\u636E\u770B\u677F\": \"Dashboard\",\n \"\u6587\u4EF6\u8981\u6C42\": \"File Requirements\",\n \"\u65B0\u5EFA\u5206\u7EC4\": \"Group Adding\",\n \"\u65B0\u5EFA\u6280\u80FD\": \"New Skill\",\n \"\u65E0\u6CD5\u6062\u590D\": \"Can't Redo\",\n \"\u65F6\u95F4\u8303\u56F4\": \"Time range\",\n \"\u663E\u793A\u5168\u90E8\": \"Show All\",\n \"\u663E\u793A\u540D\u79F0\": \"Display name\",\n \"\u6682\u4E0D\u53EF\u7528\": \"Temporarily unavailable\",\n \"\u6682\u65E0\u4F1A\u8BDD\": \"No sessions\",\n \"\u6682\u65E0\u6280\u80FD\": \"No skills available\",\n \"\u6682\u65E0\u6570\u636E\": \"No data available\",\n \"\u6682\u65E0\u9884\u89C8\": \"No preview yet\",\n \"\u66F4\u591A\u5206\u7C7B\": \"More category\",\n \"\u66F4\u6362\u4E3B\u9898\": \"switch_themes\",\n \"\u66F4\u65B0\u4E2D\u2026\": \"Updating...\",\n \"\u66F4\u65B0\u5185\u5BB9\": \"Update of Content\",\n \"\u66F4\u65B0\u5931\u8D25\": \"Gagal Update\",\n \"\u66F4\u65B0\u65F6\u95F4\": \"Updated\",\n \"\u66F4\u65B0\u901A\u9053\": \"Update channel\",\n \"\u6709\u65B0\u7248\u672C\": \"Update Available\",\n \"\u672A\u77E5\u539F\u56E0\": \"Unknown reason\",\n \"\u672A\u77E5\u6A21\u578B\": \"Unknown model\",\n \"\u672A\u77E5\u7248\u672C\": \"unknown\",\n \"\u672C\u5730\u5F00\u53D1\": \"Native Development\",\n \"\u672C\u5730\u6587\u4EF6\": \"Local File\",\n \"\u672F\u8BED\u8BF4\u660E\": \"A few words about terms\",\n \"\u67E5\u770B\u4ED3\u5E93\": \"View Repository\",\n \"\u67E5\u770B\u8BCA\u65AD\": \"View Diagnostics\",\n \"\u67E5\u770B\u8BE6\u60C5\": \"View Details\",\n \"\u67E5\u770B\u8BF4\u660E\": \"View Documentation\",\n \"\u67E5\u8BE2\u4E2D\u2026\": \"Querying\u2026\",\n \"\u683C\u5F0F\u9519\u8BEF\": \"Format salah.\",\n \"\u68C0\u67E5\u4E2D\u2026\": \"Checking\u2026\",\n \"\u68C0\u67E5\u66F4\u65B0\": \"Check Updates\",\n \"\u6A21\u578B\u6E05\u5355\": \"Model catalog\",\n \"\u6A21\u578B\u7528\u91CF\": \"Model Usage\",\n \"\u6A21\u578B\u7B5B\u9009\": \"Model filter\",\n \"\u6A21\u578B\u8BBE\u7F6E\": \"Model Settings\",\n \"\u6B63\u5728\u4E0B\u8F7D\": \"Downloading...\",\n \"\u6B63\u5728\u5904\u7406\": \"(In work)\",\n \"\u6B63\u5728\u5B89\u88C5\": \"Installing...\",\n \"\u6B8B\u7559\u76EE\u5F55\": \"Residual Catalog\",\n \"\u6C38\u4E45\u5220\u9664\": \"Delete Forever\",\n \"\u6CA1\u6709\u8B66\u544A\": \"No warnings\",\n \"\u6CA1\u6709\u9519\u8BEF\": \"No Errors\",\n \"\u6D45\u8272\u6A21\u5F0F\": \"Light Mode\",\n \"\u6D4B\u8BD5\u4E2D\u2026\": \"Testing\u2026\",\n \"\u6D4B\u91CF\u4E2D\u2026\": \"Measuring\u2026\",\n \"\u6DF1\u8272\u6A21\u5F0F\": \"Dark Mode\",\n \"\u6DF7\u5408\u67E5\u770B\": \"Combined view\",\n \"\u6DFB\u52A0\u5907\u6CE8\": \"Add note for seller\",\n \"\u6DFB\u52A0\u6210\u5458\": \"Add Member\",\n \"\u6DFB\u52A0\u63D2\u4EF6\": \"Add plugin\",\n \"\u6DFB\u52A0\u8D26\u53F7\": \"Add account\",\n \"\u6E05\u7A7A\u641C\u7D22\": \"Clear search\",\n \"\u6E05\u9664\u4E2D\u2026\": \"Cleaning...\",\n \"\u6E05\u9664\u641C\u7D22\": \"Clear search\",\n \"\u6E05\u9664\u7B5B\u9009\": \"Clear filters\",\n \"\u7248\u672C\u8BF4\u660E\": \"Imprint\",\n \"\u7528\u91CF\u7EDF\u8BA1\": \"Usage Statistics\",\n \"\u754C\u9762\u8BED\u8A00\": \"Interface language\",\n \"\u767B\u5F55\u72B6\u6001\": \"Login status\",\n \"\u76D1\u542C\u5730\u5740\": \"Listen address\",\n \"\u786E\u8BA4\u5220\u9664\": \"Confirm Deletion\",\n \"\u786E\u8BA4\u5378\u8F7D\": \"Uninstall Confirmation\",\n \"\u786E\u8BA4\u56DE\u6EDA\": \"Confirm Rollback\",\n \"\u786E\u8BA4\u5B89\u88C5\": \"Install Confirmation\",\n \"\u786E\u8BA4\u6062\u590D\": \"Confirm to resume\",\n \"\u786E\u8BA4\u6362\u7528\": \"Confirm Replacement\",\n \"\u786E\u8BA4\u66F4\u65B0\": \"Confirm Update\",\n \"\u786E\u8BA4\u79FB\u9664\": \"Confirm removal\",\n \"\u79FB\u51FA\u4E3B\u9898\": \"Move out of topic\",\n \"\u79FB\u51FA\u961F\u5217\": \"Move out of queue\",\n \"\u7ACB\u5373\u521B\u5EFA\": \"Create Now\",\n \"\u7ACB\u5373\u6267\u884C\": \"Execute Now\",\n \"\u7ACB\u5373\u66F4\u65B0\": \"Update Now\",\n \"\u7ACB\u5373\u91CD\u542F\": \"Restart immediately\",\n \"\u7B49\u5F85\u4F9D\u8D56\": \"Waiting for dependencies\",\n \"\u7B49\u5F85\u56DE\u7B54\": \"Awaiting answer\",\n \"\u7B49\u5F85\u5BA1\u6279\": \"Awaiting approval\",\n \"\u7B80\u4F53\u4E2D\u6587\": \"Simplified Chinese\",\n \"\u7BA1\u7406\u66F4\u65B0\": \"Manage Updates\",\n \"\u7EC4\u5408\u540D\u79F0\": \"Combo Name\",\n \"\u7EE7\u7EED\u66F4\u65B0\": \"Continue updating\",\n \"\u7F13\u5B58\u5199\u5165\": \"Cache Write\",\n \"\u7F13\u5B58\u547D\u4E2D\": \"Cache Hit\",\n \"\u7F13\u5B58\u8BFB\u53D6\": \"Cache read\",\n \"\u7F16\u8F91\u5907\u6CE8\": \"Edit note\",\n \"\u7F3A\u5C11\u6807\u8BC6\": \"id is missing\",\n \"\u7F51\u5173\u8BBE\u7F6E\": \"Gateway settings\",\n \"\u7F51\u9875\u641C\u7D22\": \"Web search\",\n \"\u7F6E\u9876\u4F1A\u8BDD\": \"Pin session\",\n \"\u805A\u5408\u6E20\u9053\": \"Aggregated channels\",\n \"\u81EA\u52A8\u5237\u65B0\": \"Auto refresh\",\n \"\u81EA\u52A8\u6362\u884C\": \"Word Wrap\",\n \"\u81EA\u52A8\u6392\u5E8F\": \"AutoSort\",\n \"\u81EA\u52A8\u914D\u7F6E\": \"Automatic Configuration\",\n \"\u8981\u6C42\u7248\u672C\": \"Requires Version\",\n \"\u8986\u76D6\u5173\u7CFB\": \"Override Relationship\",\n \"\u8BA1\u5212\u5F85\u5BA1\": \"Plan awaiting review\",\n \"\u8BCA\u65AD\u5F02\u5E38\": \"Diagnostics\",\n \"\u8BED\u8A00\u8BBE\u7F6E\": \"Language\",\n \"\u8BF7\u6C42\u65E5\u5FD7\": \"Request log\",\n \"\u8BFB\u53D6\u4E2D\u2026\": \"Reading\u2026\",\n \"\u8C03\u6574\u63D2\u4EF6\": \"Tweak plugin\",\n \"\u8C03\u7528\u53F0\u8D26\": \"Call ledger\",\n \"\u8C03\u7528\u6B21\u6570\": \"Call count\",\n \"\u8C03\u7528\u72B6\u6001\": \"Invocation Status\",\n \"\u8DDF\u968F\u7CFB\u7EDF\": \"Follow System\",\n \"\u8F93\u5165\u53E3\u5F84\": \"Input basis\",\n \"\u8FD0\u884C\u547D\u4EE4\": \"Run command\",\n \"\u8FD0\u884C\u65E5\u5FD7\": \"Runtime log\",\n \"\u8FD0\u884C\u7248\u672C\": \"Running version\",\n \"\u8FD130\u5929\": \"Last 30 Days\",\n \"\u8FDB\u5165\u76EE\u5F55\": \"Enter directory\",\n \"\u9000\u51FA\u5168\u5C4F\": \"Exit fullscreen\",\n \"\u9000\u51FA\u767B\u5F55\": \"Sign out\",\n \"\u9009\u62E9\u4E3B\u9898\": \"Theme selection\",\n \"\u9009\u62E9\u6587\u4EF6\": \"Choose File\",\n \"\u901A\u7528\u8BBE\u7F6E\": \"General Settings\",\n \"\u90E8\u5206\u542F\u7528\": \"Partially enabled\",\n \"\u91CD\u542F\u5931\u8D25\": \"Restart failed\",\n \"\u91CD\u65B0\u52A0\u8F7D\": \"Reload\",\n \"\u91CD\u65B0\u68C0\u67E5\": \"Recheck\",\n \"\u91CD\u65B0\u751F\u6210\": \"Regenerate\",\n \"\u91CD\u7F6E\u8349\u7A3F\": \"Reset to Draft\",\n \"\u94FE\u63A5\u4F9D\u8D56\": \"Link Dependency\",\n \"\u9519\u8BEF\u8BE6\u60C5\": \"Hide Error Details\",\n \"\u95EE\u9898\u53CD\u9988\": \"Issues\",\n \"\u95F4\u9694\u4E0A\u9650\": \"Maximum interval\",\n \"\u95F4\u9694\u4E0B\u9650\": \"Minimum interval\",\n \"\u9879\u76EE\u522B\u540D\": \"Project Alias\",\n \"\u9879\u76EE\u6280\u80FD\": \"Project Skills\",\n \"\u9879\u9700\u5904\u7406\": \"Items need to be processed\",\n \"\u9A8C\u8BC1\u8FDE\u63A5\": \"Verify Connection\",\n \" \u81F3 \": \" to \",\n \"\u4E0A\u4E00\u5F20\": \"Previous\",\n \"\u4E0A\u4E00\u6B65\": \"Back\",\n \"\u4E0A\u4E00\u9875\": \"Previous Page\",\n \"\u4E0A\u4E0B\u6587\": \"Context\",\n \"\u4E0B\u4E00\u5F20\": \"Next\",\n \"\u4E0B\u4E00\u6B65\": \"Next\",\n \"\u4E0B\u4E00\u9875\": \"Next Page\",\n \"\u4E0B\u4E00\u9898\": \"Next question\",\n \"\u4E0B\u8F7D\u4E2D\": \"Downloading...\",\n \"\u4E0B\u8F7D\u91CF\": \"Downloads\",\n \"\u4E0D\u53EF\u7528\": \"Unavailable\",\n \"\u4E0D\u5B89\u88C5\": \"Not Installed\",\n \"\u4E0D\u652F\u6301\": \"Not Supported\",\n \"\u4E0D\u6EE1\u8DB3\": \"Not satisfied\",\n \"\u4E3B\u83DC\u5355\": \"Main Menu\",\n \"\u4EC5\u4E00\u6B21\": \"Once only\",\n \"\u4F1A\u8054\u7F51\": \"Will be networked\",\n \"\u4F7F\u7528\u4E2D\": \"In Use\",\n \"\u5168\u4E0D\u9009\": \"Deselect All\",\n \"\u5206\u914D\u5230\": \"Assigned To\",\n \"\u5207\u6362\u81F3\": \"switch to \",\n \"\u5220\u9664\u4E8E\": \"Deleted at\",\n \"\u52A0\u8F7D\u4E2D\": \"Loading\",\n \"\u5378\u8F7D\u4E2D\": \"Uninstalling...\",\n \"\u53BB\u5145\u503C\": \"Add credit\",\n \"\u53D1\u5E03\u4E8E\": \"In\",\n \"\u542F\u7528\u4E2D\": \"Activating\",\n \"\u547D\u4E2D\u7387\": \"Hit rate\",\n \"\u56DE\u6536\u7AD9\": \"Trash\",\n \"\u5B89\u88C5\u4E2D\": \"Installing...\",\n \"\u5DE5\u4F5C\u533A\": \"Workspace\",\n \"\u5DF2\u4E2D\u65AD\": \"Interrupted\",\n \"\u5DF2\u4FDD\u5B58\": \"Saved\",\n \"\u5DF2\u505C\u6B62\": \"Stopped\",\n \"\u5DF2\u505C\u7528\": \"Disabled\",\n \"\u5DF2\u5173\u95ED\": \"Closed\",\n \"\u5DF2\u5220\u9664\": \"Deleted\",\n \"\u5DF2\u5378\u8F7D\": \"Uninstalled\",\n \"\u5DF2\u538B\u7F29\": \"Compacted\",\n \"\u5DF2\u53D6\u6D88\": \"Canceled\",\n \"\u5DF2\u542F\u7528\": \"Enabled\",\n \"\u5DF2\u590D\u5236\": \"Copied\",\n \"\u5DF2\u5931\u8D25\": \"Failed\",\n \"\u5DF2\u5B89\u88C5\": \"Installed\",\n \"\u5DF2\u5B8C\u6210\": \"Complete\",\n \"\u5DF2\u5C4F\u853D\": \"blocked\",\n \"\u5DF2\u5E9F\u5F03\": \"Obsolete\",\n \"\u5DF2\u622A\u65AD\": \"Truncated\",\n \"\u5DF2\u751F\u6548\": \"Berlaku\",\n \"\u5DF2\u79FB\u9664\": \"Removed\",\n \"\u5DF2\u7ED3\u675F\": \"Ended\",\n \"\u5DF2\u8986\u76D6\": \"Overridden\",\n \"\u5DF2\u89E3\u9664\": \"Cleared\",\n \"\u5F00\u53D1\u7248\": \"The7 Dev\",\n \"\u5F85\u5904\u7406\": \"Pending\",\n \"\u5F85\u5BA1\u6279\": \"Pending approval\",\n \"\u5FEB\u6377\u952E\": \"Shortcuts\",\n \"\u603B\u5904\u7406\": \"Total processed\",\n \"\u6309\u6A21\u578B\": \"By model\",\n \"\u6309\u8D26\u53F7\": \"By account\",\n \"\u6392\u961F\u4E2D\": \"In queue:\",\n \"\u63D0\u4F9B\u5546\": \"Provider\",\n \"\u63D0\u4F9B\u65B9\": \"Provider\",\n \"\u65B0\u4F1A\u8BDD\": \"New Session\",\n \"\u65E0\u5185\u5BB9\": \"No content\",\n \"\u65E0\u53D8\u66F4\": \"No change\",\n \"\u65E0\u8F93\u51FA\": \"No output\",\n \"\u66F4\u65B0\u4E2D\": \"Updating...\",\n \"\u672A\u5206\u7EC4\": \"Not Grouped\",\n \"\u672A\u542F\u7528\": \"Disabled\",\n \"\u672A\u5B89\u88C5\": \"Not Installed\",\n \"\u672A\u751F\u6548\": \"Unactivated\",\n \"\u672A\u786E\u8BA4\": \"Unconfirmed\",\n \"\u672A\u8BA1\u4EF7\": \"Not priced\",\n \"\u672A\u8FD0\u884C\": \"Not running\",\n \"\u672A\u914D\u7F6E\": \"Not configured\",\n \"\u6765\u6E90\uFF1A\": \"Source: \",\n \"\u6BCF\u5206\u949F\": \"Every minute\",\n \"\u6BCF\u5C0F\u65F6\": \"Every hour\",\n \"\u6E90\u6587\u4EF6\": \"Source File\",\n \"\u77E5\u9053\u4E86\": \"Got it\",\n \"\u7A33\u5B9A\u7248\": \"Stable\",\n \"\u7EAF\u6587\u672C\": \"Plain text\",\n \"\u81EA\u5B9A\u4E49\": \"Custom\",\n \"\u88AB\u8986\u76D6\": \"Shadowed\",\n \"\u8986\u76D6\u4E86\": \"Overwritten\",\n \"\u8BF7\u6C42\u6570\": \"Requests\",\n \"\u8D26\u53F7\u5E93\": \"Account pool\",\n \"\u8FD0\u884C\u4E2D\": \"Running\",\n \"\u8FDB\u884C\u4E2D\": \"In progress\",\n \"\u91CD\u547D\u540D\": \"Rename\",\n \"\u963F\u91CC\u7CFB\": \"Alibaba family\",\n \" \u5929\": \" days\",\n \"\u4E0A\u79FB\": \"Move Up\",\n \"\u4E0B\u79FB\": \"Move Down\",\n \"\u4E13\u5BB6\": \"Experts\",\n \"\u4E2A\u4EBA\": \"Personal\",\n \"\u4E2D\u6587\": \"Chinese\",\n \"\u4E3B\u9898\": \"Themes\",\n \"\u4ECA\u65E5\": \"Today\",\n \"\u4EE3\u7801\": \"Code\",\n \"\u4EFB\u52A1\": \"Tasks\",\n \"\u4F1A\u8BDD\": \"Sessions\",\n \"\u4F4D\u7F6E\": \"Location\",\n \"\u4F5C\u8005\": \"Author\",\n \"\u4F7F\u7528\": \"Use\",\n \"\u4F9D\u8D56\": \"Dependencies\",\n \"\u4FDD\u5B58\": \"Save\",\n \"\u4FDD\u7559\": \"Preserve\",\n \"\u4FE1\u606F\": \"information\",\n \"\u505C\u7528\": \"Disable\",\n \"\u5168\u5C4F\": \"Full screen\",\n \"\u5168\u7403\": \"Global\",\n \"\u5168\u9009\": \"Select All\",\n \"\u5168\u90E8\": \"All\",\n \"\u5173\u4E8E\": \"About\",\n \"\u5173\u95ED\": \"Close\",\n \"\u5176\u4ED6\": \"Other\",\n \"\u5185\u5BB9\": \"Content\",\n \"\u6700\u65B0\": \"Recent\",\n \"\u6700\u65E7\": \"Oldest\",\n \"\u51B2\u7A81\": \"Tension\",\n \"\u5206\u7EC4\": \"Group\",\n \"\u5206\u949F\": \"minute\",\n \"\u5217\u8868\": \"Vertical\",\n \"\u521A\u521A\": \"Just now\",\n \"\u521B\u5EFA\": \"Buat\",\n \"\u5220\u9664\": \"Delete\",\n \"\u5237\u65B0\": \"Refresh\",\n \"\u52A0\u5165\": \"Add\",\n \"\u52A9\u624B\": \"Assistant\",\n \"\u5347\u5E8F\": \"ascending\",\n \"\u5355\u6B21\": \"Once\",\n \"\u5378\u8F7D\": \"Uninstall\",\n \"\u538B\u7F29\": \"Compact\",\n \"\u539F\u6587\": \"Original Text\",\n \"\u53C2\u6570\": \"Parameters\",\n \"\u53CD\u9988\": \"Feedback\",\n \"\u53D1\u73B0\": \"Discover\",\n \"\u53D1\u9001\": \"Send\",\n \"\u53D6\u6D88\": \"Cancel\",\n \"\u53EA\u8BFB\": \"Read-only\",\n \"\u53EF\u7528\": \"Available\",\n \"\u540D\u79F0\": \"Name\",\n \"\u542F\u7528\": \"Enable\",\n \"\u5468\u4E00\": \"Monday\",\n \"\u5468\u4E09\": \"Wednesday\",\n \"\u5468\u4E8C\": \"Tuesday\",\n \"\u5468\u4E94\": \"Friday\",\n \"\u5468\u516D\": \"Saturday\",\n \"\u5468\u56DB\": \"Thursday\",\n \"\u5468\u65E5\": \"Sunday\",\n \"\u56DE\u5408\": \"Turn\",\n \"\u56DE\u6EDA\": \"Rollback\",\n \"\u56FE\u7247\": \"Image\",\n \"\u5907\u4EFD\": \"Backup\",\n \"\u590D\u5236\": \"Copy\",\n \"\u5927\u5C0F\": \"Size\",\n \"\u5931\u8D25\": \"Failed\",\n \"\u5B89\u88C5\": \"Install\",\n \"\u5B8C\u6210\": \"Done\",\n \"\u5B98\u65B9\": \"Offical\",\n \"\u5BC6\u94A5\": \"Key\",\n \"\u5BF9\u8BDD\": \"Conversation\",\n \"\u5BFC\u5165\": \"Import\",\n \"\u5BFC\u51FA\": \"Export\",\n \"\u5C0F\u65F6\": \"hour\",\n \"\u5C42\u7EA7\": \"Level\",\n \"\u5C4F\u853D\": \"Block\",\n \"\u5C55\u5F00\": \"Expand\",\n \"\u5DE5\u5177\": \"Tool\",\n \"\u5E94\u7528\": \"Applications\",\n \"\u5F02\u5E38\": \"Error\",\n \"\u5F53\u524D\": \"Current\",\n \"\u601D\u8003\": \"Thinking\",\n \"\u603B\u8BA1\": \"Total\",\n \"\u6062\u590D\": \"Restore\",\n \"\u6210\u672C\": \"Cost\",\n \"\u6253\u5F00\": \"Open\",\n \"\u6267\u884C\": \"Go\",\n \"\u6280\u80FD\": \"Skills\",\n \"\u6298\u53E0\": \"Collapse\",\n \"\u62D2\u7EDD\": \"Deny\",\n \"\u6307\u4EE4\": \"Instructions\",\n \"\u6392\u5E8F\": \"Sort\",\n \"\u63A8\u7406\": \"Reasoning\",\n \"\u63A8\u8350\": \"Featured\",\n \"\u63CF\u8FF0\": \"Description\",\n \"\u63D0\u4EA4\": \"Submit\",\n \"\u63D2\u4EF6\": \"Plugin\",\n \"\u641C\u7D22\": \"Search\",\n \"\u64A4\u9500\": \"Undo\",\n \"\u64CD\u4F5C\": \"Actions\",\n \"\u6536\u85CF\": \"Favorites\",\n \"\u6536\u8D77\": \"Collapse\",\n \"\u6587\u4EF6\": \"File\",\n \"\u65B0\u589E\": \"Added\",\n \"\u65E5\u671F\": \"Date\",\n \"\u65F6\u533A\": \"Time zone\",\n \"\u65F6\u957F\": \"Duration\",\n \"\u65F6\u95F4\": \"Time\",\n \"\u663E\u793A\": \"Show\",\n \"\u66F4\u591A\": \"More\",\n \"\u66F4\u65B0\": \"Update\",\n \"\u672A\u77E5\": \"Unknown\",\n \"\u672C\u5730\": \"Local\",\n \"\u672C\u673A\": \"This machine\",\n \"\u6743\u9650\": \"Permissions\",\n \"\u6765\u6E90\": \"Source\",\n \"\u67E5\u770B\": \"View\",\n \"\u6807\u51C6\": \"Standard\",\n \"\u6A21\u578B\": \"Models\",\n \"\u6B63\u6587\": \"Body\",\n \"\u6B65\u9AA4\": \"Steps\",\n \"\u6BCF\u5468\": \"Weekly\",\n \"\u6BCF\u5929\": \"Daily\",\n \"\u6BCF\u9875\": \"Per page\",\n \"\u6D4B\u8BD5\": \"Test\",\n \"\u6D88\u606F\": \"Message\",\n \"\u6DFB\u52A0\": \"Add\",\n \"\u6E05\u9664\": \"Clear\",\n \"\u6E90\u7801\": \"Source code\",\n \"\u6EE1\u8DB3\": \"Confirmed\",\n \"\u70ED\u95E8\": \"Popular\",\n \"\u7248\u672C\": \"Version\",\n \"\u72B6\u6001\": \"Status\",\n \"\u7528\u6237\": \"User\",\n \"\u7528\u91CF\": \"Usage\",\n \"\u767B\u5F55\": \"Sign in\",\n \"\u76EE\u5F55\": \"Table of Contents\",\n \"\u76EE\u6807\": \"Goal\",\n \"\u786E\u5B9A\": \"OK\",\n \"\u786E\u8BA4\": \"Confirmation\",\n \"\u793E\u533A\": \"COMMUNITY\",\n \"\u79FB\u51FA\": \"Emigration\",\n \"\u79FB\u9664\": \"Remove\",\n \"\u7A7A\u95F2\": \"Idle\",\n \"\u7AEF\u53E3\": \"Port\",\n \"\u7B5B\u9009\": \"Filter Bar\",\n \"\u7B80\u4ECB\": \"Description\",\n \"\u7B80\u6D01\": \"Concise\",\n \"\u7C7B\u578B\": \"Type\",\n \"\u7EC8\u7AEF\": \"Terminal\",\n \"\u7ED3\u679C\": \"Result\",\n \"\u7EE7\u7EED\": \"Continue\",\n \"\u7F16\u8F91\": \"Edit\",\n \"\u7F51\u7EDC\": \"networks\",\n \"\u8017\u65F6\": \"Duration\",\n \"\u811A\u6CE8\": \"Footnote\",\n \"\u82F1\u6587\": \"English\",\n \"\u8303\u56F4\": \"Range\",\n \"\u8BA1\u5212\": \"Plan\",\n \"\u8BBE\u7F6E\": \"Settings\",\n \"\u8BBF\u8FBE\": \"Finder\",\n \"\u8BC4\u5206\": \"Rating\",\n \"\u8BC4\u8BBA\": \"Comments\",\n \"\u8BCA\u65AD\": \"Diagnosis: \",\n \"\u8BE6\u60C5\": \"Details\",\n \"\u8BE6\u7EC6\": \"Detailed\",\n \"\u8BED\u8A00\": \"Language\",\n \"\u8C03\u7528\": \"Call\",\n \"\u8B66\u544A\": \"WARNING\",\n \"\u8D26\u53F7\": \"Account\",\n \"\u8DEF\u7531\": \"Routing\",\n \"\u8DF3\u8FC7\": \"Skip\",\n \"\u8F6E\u6B21\": \"Turns\",\n \"\u8F93\u5165\": \"Input\",\n \"\u8F93\u51FA\": \"Output\",\n \"\u9000\u51FA\": \"Exit\",\n \"\u901F\u5EA6\": \"Speed\",\n \"\u91CD\u542F\": \"Restart\",\n \"\u91CD\u590D\": \"Repeat\",\n \"\u91CD\u8BD5\": \"Retry\",\n \"\u9519\u8BEF\": \"Error:\",\n \"\u964D\u5E8F\": \"descending\",\n \"\u9690\u85CF\": \"Hide\",\n \"\u9876\u5C42\": \"top floor\",\n \"\u987A\u5E8F\": \"Sequence\",\n \"\u9884\u89C8\": \"Prev\",\n \"\u98CE\u9669\": \"Hazard\",\n \"\u9996\u5B57\": \"First token\",\n \"\u9AD8\u7EA7\": \"III\",\n \"\u4E00\": \"1\",\n \"\u4E09\": \"3\",\n \"\u4E8C\": \"2\",\n \"\u4E94\": \"5\",\n \"\u516D\": \"6\",\n \"\u5206\": \"min\",\n \"\u56DB\": \"4\",\n \"\u591A\": \"More\",\n \"\u5929\": \"Day\",\n \"\u5C11\": \"Less\",\n \"\u65E0\": \"None\",\n \"\u65E5\": \"Day\",\n \"\u6708\": \"Month\",\n \"\u79D2\": \"sec\"\n}\n", "// String-literal scanner: finds JavaScript string/template literals without a\n// parser, skipping comments and regex literals so their contents stay intact.\n\nconst REGEX_PREFIX = new Set([\n \"\", \"(\", \",\", \"=\", \":\", \"[\", \"!\", \"&\", \"|\", \"?\", \"{\", \"}\", \";\", \"+\", \"-\", \"*\", \"%\", \"~\", \"^\", \"<\", \">\", \"\\n\",\n]);\n\nexport interface LiteralSpan {\n start: number;\n end: number;\n quote: string;\n raw: string;\n}\n\nexport function scanLiterals(src: string): LiteralSpan[] {\n const out: LiteralSpan[] = [];\n const n = src.length;\n let i = 0;\n let lastSig = \"\";\n while (i < n) {\n const c = src[i];\n if (c === \"/\" && src[i + 1] === \"/\") {\n const e = src.indexOf(\"\\n\", i);\n i = e < 0 ? n : e + 1;\n continue;\n }\n if (c === \"/\" && src[i + 1] === \"*\") {\n const e = src.indexOf(\"*/\", i + 2);\n i = e < 0 ? n : e + 2;\n continue;\n }\n if (c === \"/\" && REGEX_PREFIX.has(lastSig)) {\n let j = i + 1;\n let inClass = false;\n let ok = false;\n while (j < n) {\n const d = src[j];\n if (d === \"\\\\\") {\n j += 2;\n continue;\n }\n if (d === \"\\n\") break;\n if (d === \"[\") inClass = true;\n else if (d === \"]\") inClass = false;\n else if (d === \"/\" && !inClass) {\n ok = true;\n break;\n }\n j++;\n }\n if (ok) {\n i = j + 1;\n lastSig = \"/\";\n continue;\n }\n }\n if (c === '\"' || c === \"'\" || c === \"`\") {\n let j = i + 1;\n while (j < n) {\n const d = src[j];\n if (d === \"\\\\\") {\n j += 2;\n continue;\n }\n if (d === c) break;\n j++;\n }\n if (j < n) {\n out.push({ start: i, end: j + 1, quote: c, raw: src.slice(i + 1, j) });\n i = j + 1;\n lastSig = c;\n continue;\n }\n i = n;\n continue;\n }\n if (!/\\s/.test(c)) lastSig = c;\n i++;\n }\n return out;\n}\n\nexport function decodeRaw(raw: string): string {\n if (!raw.includes(\"\\\\\")) return raw;\n let out = \"\";\n for (let i = 0; i < raw.length; i++) {\n const c = raw[i];\n if (c !== \"\\\\\") {\n out += c;\n continue;\n }\n const d = raw[++i];\n switch (d) {\n case \"n\": out += \"\\n\"; break;\n case \"r\": out += \"\\r\"; break;\n case \"t\": out += \"\\t\"; break;\n case \"b\": out += \"\\b\"; break;\n case \"f\": out += \"\\f\"; break;\n case \"v\": out += \"\\v\"; break;\n case \"0\": out += \"\\0\"; break;\n case \"x\": out += String.fromCharCode(parseInt(raw.slice(i + 1, i + 3), 16)); i += 2; break;\n case \"u\":\n if (raw[i + 1] === \"{\") {\n const close = raw.indexOf(\"}\", i + 2);\n if (close < 0) { out += \"u\"; break; }\n out += String.fromCodePoint(parseInt(raw.slice(i + 2, close), 16));\n i = close;\n } else {\n out += String.fromCharCode(parseInt(raw.slice(i + 1, i + 5), 16));\n i += 4;\n }\n break;\n case \"\\n\": break;\n case \"\\r\": if (raw[i + 1] === \"\\n\") i++; break;\n default: out += d;\n }\n }\n return out;\n}\n\nexport function encodeValue(value: string, quote: string): string {\n let out = \"\";\n for (const ch of value) {\n if (ch === \"\\\\\") out += \"\\\\\\\\\";\n else if (ch === quote) out += \"\\\\\" + quote;\n else if (ch === \"\\n\") out += \"\\\\n\";\n else if (ch === \"\\r\") out += \"\\\\r\";\n else if (ch === \"\\u2028\") out += \"\\\\u2028\";\n else if (ch === \"\\u2029\") out += \"\\\\u2029\";\n else out += ch;\n }\n if (quote === \"`\") out = out.replace(/\\$\\{/g, \"\\\\${\");\n return out;\n}\n\n// The character before this literal, ignoring whitespace/comments-free trivia.\n// Used to spot a genuine object key (`{ \"\u4E2D\u6587\": \u2026`) and leave it alone.\nexport function precedingSignificant(src: string, index: number): string {\n let i = index - 1;\n while (i >= 0 && /\\s/.test(src[i])) i--;\n return i < 0 ? \"\" : src[i];\n}\n\nexport function isObjectKeyPosition(src: string, span: LiteralSpan): boolean {\n const prev = precedingSignificant(src, span.start);\n if (prev !== \"{\" && prev !== \",\") return false;\n let j = span.end;\n while (j < src.length && /\\s/.test(src[j])) j++;\n return src[j] === \":\";\n}\n", "import DICTIONARY from \"./dictionary.json\";\nimport { decodeRaw, encodeValue, isObjectKeyPosition, scanLiterals } from \"./strings.js\";\n\nconst CHINESE = /[\\u4e00-\\u9fa5]/;\n\n// Longest key first so the segmentation below prefers `\u7F13\u5B58\u547D\u4E2D\u7387` over `\u7F13\u5B58\u547D\u4E2D`.\nconst KEYS = Object.keys(DICTIONARY).sort((a, b) => b.length - a.length);\n\n// Keys grouped by their first character: the cover search only ever needs to\n// try keys that can actually start at the current offset.\nconst BY_FIRST = new Map();\nfor (const key of KEYS) {\n const first = key[0];\n const bucket = BY_FIRST.get(first);\n if (bucket) bucket.push(key);\n else BY_FIRST.set(first, [key]);\n}\n\n/**\n * Translates a Chinese string only when the whole string is accounted for.\n *\n * Chinese has no word boundaries, so replacing known keys wherever they occur\n * rewrites fragments of larger words: `\u5F53\u524D\u5DE5\u4F5C\u533A` would become\n * `Saat IniWorkspace`. Instead the string is segmented left to right, and a\n * translation is emitted only when every Chinese character is covered by a\n * dictionary key. Anything else is left in Chinese, because half-translated\n * text is worse than untranslated text.\n */\nexport function substitute(value: string): string {\n if (!CHINESE.test(value)) return value;\n if (DICTIONARY[value] !== undefined) return DICTIONARY[value];\n\n const pieces: string[] = [];\n let i = 0;\n\n while (i < value.length) {\n const char = value[i];\n if (!CHINESE.test(char)) {\n // Non-Chinese glue (spaces, ASCII, punctuation, placeholders) is copied\n // through; it never blocks coverage on its own.\n let j = i;\n while (j < value.length && !CHINESE.test(value[j])) j++;\n pieces.push(value.slice(i, j));\n i = j;\n continue;\n }\n\n const candidates = BY_FIRST.get(char);\n let match: string | undefined;\n if (candidates) {\n for (const key of candidates) {\n if (value.startsWith(key, i)) {\n match = key;\n break;\n }\n }\n }\n if (match === undefined) return value;\n pieces.push(DICTIONARY[match]);\n i += match.length;\n }\n\n return pieces.join(\"\");\n}\n\nexport function hasChinese(text: string): boolean {\n return CHINESE.test(text);\n}\n\n/**\n * Rewrites Chinese UI text inside JavaScript string literals.\n *\n * Returns the original string unchanged when nothing was translated, so the\n * caller can skip rebuilding the response. Object keys are deliberately left\n * alone: translating `{ \"\u4E2D\u6587\": 1 }` would break the lookup that reads it.\n */\nexport function rewriteScript(source: string): string {\n if (!hasChinese(source)) return source;\n\n const spans = scanLiterals(source);\n let out = \"\";\n let cursor = 0;\n let changed = false;\n\n for (const span of spans) {\n if (span.quote === \"`\") continue;\n if (span.raw.includes(\"${\")) continue;\n if (isObjectKeyPosition(source, span)) continue;\n\n const value = decodeRaw(span.raw);\n if (!hasChinese(value)) continue;\n\n const next = substitute(value);\n if (next === value) continue;\n\n out += source.slice(cursor, span.start) + span.quote + encodeValue(next, span.quote) + span.quote;\n cursor = span.end;\n changed = true;\n }\n\n return changed ? out + source.slice(cursor) : source;\n}\n\n/** Compiles the candidate so a bad rewrite can never reach the browser. */\nexport function compiles(source: string): boolean {\n try {\n new Function(source);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function translateScript(source: string): string {\n const next = rewriteScript(source);\n if (next === source) return source;\n return compiles(next) ? next : source;\n}\n", "import { translateScript } from \"./rewrite.js\";\n\nexport const name = \"chinese2english\";\nexport const inject = [\"clientModules\"];\n\nconst JS_TYPE = /^text\\/javascript\\b/i;\n// Combo requests look like `/plugins/??a/client.js,b/client.js&rev=...`: the\n// path is only `/plugins/`, so the file names live in the query string and the\n// test has to run against the whole URL. Source maps (`client.js.map`) do not\n// match because `.js` is followed by `.`, not a separator.\nconst JS_URL = /\\.js(?:[,&?]|$)/;\nconst MAX_BODY = 16 * 1024 * 1024;\nconst MAX_CACHE = 64;\n\nfunction isScriptUrl(url: string): boolean {\n return JS_URL.test(url);\n}\n\n/**\n * Translates Chinese UI text at the bundle transport layer.\n *\n * Every third-party plugin bundle is served through `/plugins/...` by the\n * clientModules service, and combination bundles carry several plugins in one\n * body. Intercepting the response here reaches all of them at once, before any\n * code runs, without touching React trees or the locale store.\n *\n * `bundleResource` yields the body as a Buffer, so the wrapper decodes UTF-8,\n * rewrites, and hands the bytes back in the shape the server expects.\n */\nexport function apply(ctx: any) {\n const registry = ctx.clientModules;\n if (!registry || typeof registry.bundleResource !== \"function\") {\n console.error(\"[chinese2english] clientModules.bundleResource unavailable; translation disabled\");\n return;\n }\n\n const original = registry.bundleResource;\n const cache = new Map();\n\n registry.bundleResource = async function (method: string, url: string, ...rest: any[]) {\n const response = await original.call(this, method, url, ...rest);\n\n if (response?.status !== 200) return response;\n if (!isScriptUrl(url)) return response;\n\n const raw = response.body;\n const isBuffer = Buffer.isBuffer(raw);\n if (!isBuffer && typeof raw !== \"string\") return response;\n\n const contentType = response.headers?.[\"content-type\"];\n if (typeof contentType !== \"string\" || !JS_TYPE.test(contentType)) return response;\n if (raw.length > MAX_BODY) return response;\n\n try {\n let body = cache.get(url);\n if (body === undefined) {\n const source = isBuffer ? raw.toString(\"utf8\") : raw;\n const rewritten = translateScript(source);\n // Preserve the incoming body type: the Web route accepts either, but\n // `fetchBundle` hands the value to `Uint8Array.from`.\n body = isBuffer ? Buffer.from(rewritten, \"utf8\") : rewritten;\n if (cache.size >= MAX_CACHE) {\n const oldest = cache.keys().next();\n if (!oldest.done) cache.delete(oldest.value);\n }\n cache.set(url, body);\n }\n if (method === \"HEAD\") return response;\n if (typeof body === \"string\") {\n if (body === raw) return response;\n } else if (body.length === raw.length && (!isBuffer || body.equals(raw))) {\n return response;\n }\n return {\n ...response,\n headers: { ...response.headers, \"cache-control\": \"no-cache\" },\n body,\n };\n } catch (error) {\n console.error(`[chinese2english] could not translate ${url}:`, error);\n return response;\n }\n };\n}\n"],
+ "mappings": "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AU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,oBAAU;AAAA,EACV,oBAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,sCAAU;AAAA,EACV,oBAAU;AAAA,EACV,sCAAU;AAAA,EACV,kCAAS;AAAA,EACT,mBAAS;AAAA,EACT,mBAAS;AAAA,EACT,mBAAS;AAAA,EACT,6BAAS;AAAA,EACT,6BAAS;AAAA,EACT,mBAAS;AAAA,EACT,gCAAS;AAAA,EACT,mBAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,kCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,kCAAS;AAAA,EACT,gCAAS;AAAA,EACT,kCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,kCAAS;AAAA,EACT,gCAAS;AAAA,EACT,kCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,kCAAS;AAAA,EACT,gCAAS;AAAA,EACT,6BAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,kCAAS;AAAA,EACT,kCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,kCAAS;AAAA,EACT,kCAAS;AAAA,EACT,kCAAS;AAAA,EACT,kCAAS;AAAA,EACT,kCAAS;AAAA,EACT,kCAAS;AAAA,EACT,kCAAS;AAAA,EACT,kCAAS;AAAA,EACT,kCAAS;AAAA,EACT,kCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,kCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,mBAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,gCAAS;AAAA,EACT,kCAAS;AAAA,EACT,4BAAQ;AAAA,EACR,aAAQ;AAAA,EACR,aAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,4BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,gBAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,0BAAQ;AAAA,EACR,YAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,sBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,oBAAO;AAAA,EACP,WAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cAAM;AAAA,EACN,cA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",
"names": []
}
diff --git a/package.json b/package.json
index 218c39f..2d78f41 100644
--- a/package.json
+++ b/package.json
@@ -30,16 +30,16 @@
"patch": "./cordis.patch.yml"
},
"client": {
- "immediately": true,
"inject": [
- "@deepseek-ai/dsh-client-locale"
+ "locale"
],
"platform": "web"
}
},
"scripts": {
- "patch": "python3 patch-plugins.py",
- "build": "node scripts/build.mjs"
+ "dict": "node scripts/merge-dict.mjs",
+ "build": "node scripts/build.mjs",
+ "build:dict": "node scripts/merge-dict.mjs && node scripts/build.mjs"
},
"peerDependencies": {
"@deepseek-ai/cordis": ">=4.0.0"
diff --git a/scripts/build.mjs b/scripts/build.mjs
index 02f06f1..56f440d 100644
--- a/scripts/build.mjs
+++ b/scripts/build.mjs
@@ -1,11 +1,19 @@
import { execSync } from "node:child_process";
+// --bundle inlines src/dictionary.json into the server output, so lib/ is the
+// only thing that has to ship.
console.log("Building server backend...");
-execSync("npx esbuild src/index.ts --outfile=lib/index.js --platform=node --format=esm --target=node20 --sourcemap", { stdio: "inherit" });
+execSync(
+ "npx esbuild src/index.ts --outfile=lib/index.js --platform=node --format=esm --target=node20 --bundle --sourcemap",
+ { stdio: "inherit" },
+);
console.log("Building client frontend bundle...");
const banner = 'window.__ModuleLoader__.load({ id: "chinese2english", factory: (require) => { var module = { exports: {} }; var exports = module.exports;';
const footer = 'return module.exports; } });';
-execSync(`npx esbuild src/client/index.ts --outfile=lib/client.js --platform=browser --format=cjs --target=es2022 --bundle --banner:js='${banner}' --footer:js='${footer}' --sourcemap`, { stdio: "inherit" });
+execSync(
+ `npx esbuild src/client/index.ts --outfile=lib/client.js --platform=browser --format=cjs --target=es2022 --bundle --banner:js='${banner}' --footer:js='${footer}' --sourcemap`,
+ { stdio: "inherit" },
+);
console.log("Build complete!");
diff --git a/scripts/merge-dict.mjs b/scripts/merge-dict.mjs
new file mode 100644
index 0000000..f7d69a3
--- /dev/null
+++ b/scripts/merge-dict.mjs
@@ -0,0 +1,63 @@
+import { readFileSync, writeFileSync, existsSync } from "node:fs";
+import { dirname, join } from "node:path";
+import { fileURLToPath } from "node:url";
+
+// Merges the two translation sources already in this repo into one canonical
+// dictionary payload. Dependency-free; rerun with `npm run dict`.
+
+const root = join(dirname(fileURLToPath(import.meta.url)), "..");
+const pairs = new Map();
+
+const marketPath = join(root, "dshmarket_dict.json");
+if (existsSync(marketPath)) {
+ const data = JSON.parse(readFileSync(marketPath, "utf8"));
+ for (const [zh, en] of Object.entries(data)) pairs.set(zh, en);
+}
+
+// patch-plugins.py carries its pairs inline as `"zh": "en",` lines.
+const patchPath = join(root, "patch-plugins.py");
+if (existsSync(patchPath)) {
+ const src = readFileSync(patchPath, "utf8");
+ const body = src.slice(src.indexOf("UI_TRANSLATIONS = {"));
+ const re = /^\s*"((?:[^"\\]|\\.)*)"\s*:\s*"((?:[^"\\]|\\.)*)"\s*,\s*$/gm;
+ let m;
+ while ((m = re.exec(body))) pairs.set(m[1], m[2]);
+}
+
+// Curated supplement, measured against the real served bundles. Merged last so
+// it overrides anything the harvested sources got wrong.
+const extraPath = join(root, "src", "dictionary.extra.json");
+if (existsSync(extraPath)) {
+ const data = JSON.parse(readFileSync(extraPath, "utf8"));
+ for (const [zh, en] of Object.entries(data)) pairs.set(zh, en);
+}
+
+// A handful of upstream entries are Malay, not English. Emitting them would
+// inject foreign words into an English UI, so they are replaced by name.
+const NON_ENGLISH = new Map([
+ ["当前", "Current"],
+ ["本地", "Local"],
+]);
+
+const clean = {};
+let dropped = 0;
+for (const [zh, en] of pairs) {
+ // Guard the substitution contract: a key must be Chinese and must actually
+ // differ from its replacement, otherwise rewriting is a no-op with risk.
+ if (!/[\u4e00-\u9fa5]/.test(zh) || !en || zh === en) {
+ dropped++;
+ continue;
+ }
+ clean[zh] = NON_ENGLISH.get(zh) ?? en;
+}
+
+const sorted = Object.fromEntries(
+ Object.entries(clean).sort((a, b) => b[0].length - a[0].length || a[0].localeCompare(b[0])),
+);
+writeFileSync(join(root, "src", "dictionary.json"), JSON.stringify(sorted, null, 2) + "\n");
+
+const lengths = Object.keys(sorted).map((k) => k.length);
+console.log(
+ `dictionary: ${Object.keys(sorted).length} entries` +
+ ` (dropped ${dropped}), key length ${Math.min(...lengths)}-${Math.max(...lengths)}`,
+);
diff --git a/src/client/dictionary.ts b/src/client/dictionary.ts
deleted file mode 100644
index 9d8c469..0000000
--- a/src/client/dictionary.ts
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * Comprehensive Chinese-to-English translation dictionary for DeepSeek Harness plugins
- */
-export const DICTIONARY: Record = {
- // DSH Marketplace & Store
- "插件市场": "Plugin Marketplace",
- "逛一逛,点一下,装好。": "Browse, click, and install.",
- "全部插件": "All Plugins",
- "已安装插件": "Installed Plugins",
- "插件": "Plugins",
- "市场": "Marketplace",
- "热门插件": "Popular Plugins",
- "最新上架": "Recently Added",
- "推荐插件": "Recommended Plugins",
- "下载量": "Downloads",
- "评分": "Rating",
- "作者": "Author",
- "安装量": "Installs",
- "安装插件": "Install Plugin",
- "卸载插件": "Uninstall Plugin",
- "更新插件": "Update Plugin",
- "第三方插件": "Third-Party Plugins",
- "官方插件": "Official Plugins",
- "搜索插件": "Search plugins...",
- "搜索插件名称或作者": "Search by plugin name or author...",
- "一键安装": "Install",
- "一键更新": "Update",
- "正在下载": "Downloading...",
- "正在安装": "Installing...",
- "安装完成": "Installed",
- "卸载完成": "Uninstalled",
-
- // Skills Manager Navigation & Tabs
- "技能管理": "Skills Manager",
- "技能管理器": "Skills Manager",
- "统一加载和管理本机 Agent Skills。": "Load and manage Agent Skills on this machine in one place.",
- "技能列表": "Skills List",
- "已安装技能": "Installed Skills",
- "可用技能": "Available Skills",
- "发现技能": "Discover Skills",
- "仓库订阅": "Repositories",
- "仓库管理": "Repositories",
- "技能来源": "Skill Sources",
- "全局技能": "Global Skills",
- "项目技能": "Project Skills",
- "公共 Agent": "Shared Agent",
- "项目 Agent": "Project Agent",
- "项目 Skills": "Project Skills",
- "会话技能": "Session Skills",
- "回收站": "Trash",
- "诊断异常": "Diagnostics",
- "异常诊断": "Diagnostics",
- "源文件只读": "Read-only",
- "只读": "Read-only",
- "创建位置": "Location",
- "全局 DSH": "Global DSH",
- "项目 DSH": "Project DSH",
- "DSH 技能": "DSH Skills",
-
- // Actions & Buttons
- "创建技能": "Create Skill",
- "创建新技能": "Create Skill",
- "新建技能": "New Skill",
- "立即创建": "Create Now",
- "导入技能": "Import Skill",
- "导出技能": "Export Skill",
- "导入": "Import",
- "导出": "Export",
- "刷新": "Refresh",
- "检查更新": "Check Updates",
- "正在检查更新…": "Checking for updates...",
- "正在检查更新...": "Checking for updates...",
- "检查并更新": "Check & Update",
- "更新": "Update",
- "管理更新": "Manage Updates",
- "立即更新": "Update Now",
- "确认更新": "Confirm Update",
- "回滚": "Rollback",
- "确认回滚": "Confirm Rollback",
- "恢复": "Restore",
- "移到回收站": "Move to Trash",
- "移入回收站": "Move to Trash",
- "永久删除": "Delete Forever",
- "清空回收站": "Empty Trash",
- "删除": "Delete",
- "启用": "Enable",
- "停用": "Disable",
- "已启用": "Enabled",
- "已停用": "Disabled",
- "全部启用": "Enable All",
- "全部停用": "Disable All",
- "启停来源": "Toggle Source",
- "启停技能": "Toggle Skill",
- "安装": "Install",
- "已安装": "Installed",
- "卸载": "Uninstall",
- "查看详情": "View Details",
- "查看说明": "View Docs",
- "查看": "View",
- "更多": "More",
- "取消": "Cancel",
- "保存": "Save",
- "关闭": "Close",
- "确定": "OK",
- "复制": "Copy",
- "已复制": "Copied",
- "复制成功": "Copied",
- "搜索": "Search",
- "重试": "Retry",
- "选择文件": "Choose File",
- "选择文件夹": "Choose Folder",
- "问题反馈": "Issues",
- "设置": "Settings",
-
- // Status & Filters
- "全部来源": "All Sources",
- "全部状态": "All Statuses",
- "调用状态": "Invocation Status",
- "状态": "Status",
- "来源": "Source",
- "被覆盖": "Shadowed",
- "名称": "Name",
- "版本": "Version",
- "大小": "Size",
- "类型": "Type",
- "操作": "Actions",
- "详情": "Details",
- "描述": "Description",
- "简介": "Description",
- "正文": "Body",
- "源文件": "Source File",
- "更新时间": "Updated",
- "创建时间": "Created",
- "删除于": "Deleted at",
- "来源:": "Source: ",
-
- // Empty & Loading States
- "正在加载技能…": "Loading skills...",
- "正在加载技能...": "Loading skills...",
- "正在加载…": "Loading...",
- "正在加载...": "Loading...",
- "加载中…": "Loading...",
- "加载中...": "Loading...",
- "正在读取说明…": "Loading documentation...",
- "正在读取说明...": "Loading documentation...",
- "没有匹配的技能。": "No matching skills.",
- "没有匹配的技能": "No matching skills",
- "该来源目录不存在或暂时没有技能。": "This source directory does not exist or has no skills.",
- "回收站为空。": "Trash is empty.",
- "回收站为空": "Trash is empty",
- "暂无技能": "No skills available",
- "暂无数据": "No data available",
- "未提供简介": "No description provided",
- "未发现诊断问题。": "No diagnostic issues found.",
-
- // Upload & Import Modal
- "拖拽技能到此处": "Drop skill here",
- "支持 .zip、技能文件夹或单个 SKILL.md": "Supports .zip, a skill folder, or single SKILL.md",
- "文件要求": "Requirements",
- "压缩包或文件夹需包含 SKILL.md": "Archives or folders must contain SKILL.md",
- "SKILL.md 需包含 YAML 格式的技能名称和描述": "SKILL.md must include YAML name and description",
- "导入时复制完整内容,不修改原始来源": "Import copies full content without modifying source",
- "导入到全局 DSH": "Import to global DSH",
- "移除所选内容": "Remove selection",
- "请选择 .zip 或单个 SKILL.md。": "Please choose a .zip or single SKILL.md.",
- "所选文件夹中没有找到 SKILL.md。": "No SKILL.md found in the selected folder.",
-
- // Creation Form
- "例如 code-review-helper": "e.g. code-review-helper",
- "一句话说明什么时候使用": "One sentence describing when to use it",
- "正文(Markdown)": "Body (Markdown)",
- "写下技能要遵循的指令、步骤和边界…": "Write the instructions, steps, and boundaries...",
- "创建和导入均保存到全局 DSH,跨项目可用。": "Created and imported skills are saved to global DSH and available across projects.",
-
- // General Settings & UI
- "通用设置": "General Settings",
- "模型设置": "Model Settings",
- "外观设置": "Appearance",
- "语言设置": "Language",
- "快捷键": "Shortcuts",
- "关于": "About",
- "版本号": "Version",
- "检查新版本": "Check for updates",
- "语言": "Language",
- "简体中文": "Simplified Chinese",
- "英文": "English",
- "深色模式": "Dark Mode",
- "浅色模式": "Light Mode",
- "跟随系统": "Follow System",
- "退出": "Exit",
- "重启": "Restart",
-
- // Model & Chat Concepts
- "模型": "Models",
- "会话": "Sessions",
- "新会话": "New Session",
- "历史会话": "History",
- "工作区": "Workspace",
- "暂无会话": "No sessions",
- "发送": "Send",
- "停止生成": "Stop generating",
- "重新生成": "Regenerate",
- "耗时": "Duration",
- "步骤": "Steps",
- "轮次": "Turns",
-};
-
-// Sorted array of [chinese, english] pairs, longest Chinese phrases first
-// (ensures compound phrases are matched before single words)
-export const SORTED_PAIRS: Array<[string, string]> = Object.entries(DICTIONARY).sort(
- (a, b) => b[0].length - a[0].length
-);
-
-// Dynamic pattern replacements
-export const DYNAMIC_PATTERNS: Array<[RegExp, string]> = [
- [/(\d+)\s*个技能/g, "$1 skills"],
- [/(\d+)\s*个已启用/g, "$1 enabled"],
- [/(\d+)\s*个已停用/g, "$1 disabled"],
- [/(\d+)\s*个被覆盖/g, "$1 shadowed"],
- [/(\d+)\s*个诊断异常/g, "$1 issues"],
- [/(\d+)\s*个文件/g, "$1 files"],
- [/(\d+)\s*个待处理技能/g, "$1 pending skills"],
- [/来源:/g, "Source: "],
- [/创建于\s*([0-9:\-\/ ]+)/g, "Created at $1"],
- [/更新于\s*([0-9:\-\/ ]+)/g, "Updated at $1"],
- [/删除于\s*([0-9:\-\/ ]+)/g, "Deleted at $1"],
- [/被\s*(.+?)\s*覆盖/g, "Shadowed by $1"],
-];
diff --git a/src/client/index.ts b/src/client/index.ts
index 207bd33..b5d6188 100644
--- a/src/client/index.ts
+++ b/src/client/index.ts
@@ -1,264 +1,40 @@
-import { DICTIONARY, SORTED_PAIRS, DYNAMIC_PATTERNS } from "./dictionary.js";
-
-export const name = "chinese2english-client";
+export const name = "chinese2english";
export const inject = ["locale"];
-const CHINESE_REGEX = /[\u4e00-\u9fa5]/;
-
/**
- * Translates a text string safely without corrupting sentences:
- * 1. Checks exact match on the entire string first.
- * 2. Matches full dynamic count/date patterns.
- * 3. Matches multi-word phrases from longest to shortest (never single characters).
+ * Pins the UI language to English.
+ *
+ * Hardcoded Chinese inside plugin bundles is handled on the server by the
+ * bundle-transport rewrite in `src/index.ts`. Text that flows through the
+ * locale service is only English when the active locale is `en`, so this half
+ * makes that selection explicit and durable. Walking the DOM is deliberately
+ * avoided: it corrupts React trees and cannot reach text that arrives as data.
*/
-export function translateText(text: string): string {
- if (!text || !CHINESE_REGEX.test(text)) return text;
-
- const trimmed = text.trim();
- // 1. Direct exact dictionary match (highest fidelity)
- if (DICTIONARY[trimmed]) {
- return text.replace(trimmed, DICTIONARY[trimmed]);
- }
-
- // 2. Dynamic patterns (e.g. "3 个已启用" -> "3 enabled")
- for (const [pattern, replacement] of DYNAMIC_PATTERNS) {
- if (pattern.test(trimmed)) {
- return text.replace(trimmed, trimmed.replace(pattern, replacement));
- }
- }
-
- // 3. Multi-word phrase matches (2+ characters only, longest first)
- let result = text;
- let changed = false;
- for (const [cn, en] of SORTED_PAIRS) {
- if (cn.length >= 2 && result.includes(cn)) {
- result = result.replaceAll(cn, en);
- changed = true;
- if (!CHINESE_REGEX.test(result)) break;
- }
- }
-
- return changed ? result : text;
-}
-
-let isTranslating = false;
-
-/**
- * Traverses elements using TreeWalker and translates whole text nodes.
- */
-export function translateElement(root: Node) {
- if (!root) return;
-
- if (root.nodeType === Node.TEXT_NODE) {
- const val = root.nodeValue;
- if (val && CHINESE_REGEX.test(val)) {
- const t = translateText(val);
- if (t !== val) root.nodeValue = t;
- }
+export function apply(ctx: any) {
+ const locale = ctx.locale;
+ if (!locale || typeof locale.setLocale !== "function") {
+ console.warn("[chinese2english] locale service unavailable; UI language left unchanged");
return;
}
- if (root.nodeType !== Node.ELEMENT_NODE) return;
- const el = root as HTMLElement;
-
- const tag = el.tagName;
- // Ignore code, pre, scripts, styles
- if (tag === "SCRIPT" || tag === "STYLE" || tag === "PRE" || tag === "CODE") return;
-
- // Attributes (placeholder, title, aria-label)
- for (const attr of ["placeholder", "title", "aria-label", "alt"]) {
- const val = el.getAttribute(attr);
- if (val && CHINESE_REGEX.test(val)) {
- el.setAttribute(attr, translateText(val));
- }
- }
-
- // Fast native TreeWalker
- const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null);
- let textNode = walker.nextNode();
- while (textNode) {
- const val = textNode.nodeValue;
- if (val && CHINESE_REGEX.test(val)) {
- const parent = textNode.parentElement;
- if (parent) {
- const pTag = parent.tagName;
- if (pTag !== "SCRIPT" && pTag !== "STYLE" && pTag !== "PRE" && pTag !== "CODE") {
- const t = translateText(val);
- if (t !== val) textNode.nodeValue = t;
- }
- }
- }
- textNode = walker.nextNode();
- }
-}
-
-function startDOMTranslator() {
- if (typeof document === "undefined") return;
-
- // Force document language to English immediately
- document.documentElement.lang = "en";
-
- const queue = new Set();
- let frameRequested = false;
-
- const flush = () => {
- frameRequested = false;
- isTranslating = true;
+ const pin = (reason: string) => {
try {
- const nodes = Array.from(queue);
- queue.clear();
- for (const n of nodes) {
- if (n.isConnected) translateElement(n);
- }
- } finally {
- isTranslating = false;
+ if (locale.getLocale?.().active === "en") return;
+ locale.setLocale("en");
+ } catch (error) {
+ console.error(`[chinese2english] could not select English (${reason}):`, error);
}
};
- const observer = new MutationObserver((mutations) => {
- if (isTranslating) return;
+ pin("initial");
- for (const m of mutations) {
- if (m.type === "childList") {
- for (let i = 0; i < m.addedNodes.length; i++) {
- queue.add(m.addedNodes[i]);
- }
- } else if (m.type === "characterData") {
- if (m.target.nodeValue && CHINESE_REGEX.test(m.target.nodeValue)) {
- queue.add(m.target);
- }
- } else if (m.type === "attributes") {
- queue.add(m.target);
- }
- }
- if (!frameRequested && queue.size > 0) {
- frameRequested = true;
- requestAnimationFrame(flush);
- }
- });
-
- const root = document.documentElement || document.body;
- if (root) {
- translateElement(root);
- observer.observe(root, {
- childList: true,
- subtree: true,
- characterData: true,
- attributes: true,
- attributeFilter: ["placeholder", "title", "aria-label", "alt"],
- });
- }
-
- // Periodic safety check every 1s to sweep any lazily mounted modal content
- setInterval(() => {
- if (document.body && !isTranslating) {
- isTranslating = true;
- try {
- translateElement(document.body);
- } finally {
- isTranslating = false;
- }
- }
- }, 1000);
-}
-
-// Force English locale in localStorage across known plugin keys
-function enforceEnglishStorage() {
- if (typeof window === "undefined" || !window.localStorage) return;
- try {
- for (let i = 0; i < localStorage.length; i++) {
- const key = localStorage.key(i);
- if (key && (key.includes("lang") || key.includes("locale") || key.includes("all-usage") || key.includes("dsh"))) {
- const val = localStorage.getItem(key);
- if (val === "zh" || val === "zh-CN") {
- localStorage.setItem(key, "en");
- }
- }
- }
- } catch {}
-}
-
-export function apply(ctx: any) {
- console.log("[chinese2english] Activating English locale & translation engine...");
-
- enforceEnglishStorage();
-
- // 1. Force DSH core locale service to English
- if (ctx.locale) {
- try {
- // Force active locale to "en"
- if (typeof ctx.locale.setLocale === "function") {
- ctx.locale.setLocale("en");
- }
- if (typeof ctx.locale.resolveActive === "function") {
- ctx.locale.resolveActive = () => "en";
- }
-
- // Intercept snapshot
- if (typeof ctx.locale.getSnapshot === "function") {
- const origSnap = ctx.locale.getSnapshot.bind(ctx.locale);
- ctx.locale.getSnapshot = () => {
- const s = origSnap();
- return s ? { ...s, active: "en" } : s;
- };
- }
-
- // Publish active: "en" to trigger all native bilingual plugin updates
- if (typeof ctx.locale.publish === "function") {
- ctx.locale.publish("en", true);
- }
-
- // Intercept translate function
- if (typeof ctx.locale.translate === "function") {
- const origTranslate = ctx.locale.translate.bind(ctx.locale);
- ctx.locale.translate = function (ns: string, key: string, params: any) {
- const val = origTranslate(ns, key, params);
- if (typeof val === "string" && CHINESE_REGEX.test(val)) {
- return translateText(val);
- }
- return val;
- };
- }
-
- // Auto-patch all plugin registered dictionaries with English translations
- if (ctx.locale.dicts && typeof ctx.locale.dicts.entries === "function") {
- for (const [ns, localesMap] of ctx.locale.dicts.entries()) {
- const zh = localesMap?.get("zh");
- let en = localesMap?.get("en");
- if (!en) {
- en = {};
- localesMap?.set("en", en);
- }
- if (zh) {
- for (const [k, v] of Object.entries(zh)) {
- if ((!en[k] || en[k] === k || CHINESE_REGEX.test(en[k])) && typeof v === "string") {
- en[k] = translateText(v) || v;
- }
- }
- }
- }
- }
- } catch (err) {
- console.error("[dsh-plugin-english] Locale patch error:", err);
- }
- }
-
- // 2. Keep document.documentElement.lang set to "en"
- if (typeof document !== "undefined") {
- document.documentElement.lang = "en";
- const observer = new MutationObserver(() => {
- if (document.documentElement.lang !== "en") {
- document.documentElement.lang = "en";
- }
- });
- observer.observe(document.documentElement, { attributes: true, attributeFilter: ["lang"] });
- }
-
- // 3. DOM translation engine (disabled: direct React DOM mutation causes Market UI crash)
- // startDOMTranslator();
-}
-
-// Start immediately on script load as well
-if (typeof window !== "undefined") {
- enforceEnglishStorage();
+ // A late language pack or an external preference can republish the snapshot
+ // with another active locale; re-assert English when that happens.
+ ctx.effect(
+ () =>
+ ctx.on("locale/change", (snapshot: any) => {
+ if (snapshot?.active !== "en") pin("locale change");
+ }),
+ "chinese2english: keep the UI locale on English",
+ );
}
diff --git a/src/dictionary.extra.json b/src/dictionary.extra.json
new file mode 100644
index 0000000..0ec24bf
--- /dev/null
+++ b/src/dictionary.extra.json
@@ -0,0 +1,402 @@
+{
+ "输出": "Output",
+ "运行中": "Running",
+ "输入": "Input",
+ "失败": "Failed",
+ "移除": "Remove",
+ "恢复默认": "Restore Defaults",
+ "缓存命中": "Cache Hit",
+ "已删除": "Deleted",
+ "推理": "Reasoning",
+ "文档渲染中...": "Rendering document...",
+ "进行中": "In progress",
+ "时间": "Time",
+ "缓存写入": "Cache Write",
+ "账号": "Account",
+ "成本": "Cost",
+ "自动换行": "Word Wrap",
+ "图片": "Image",
+ "已关闭": "Closed",
+ "结果": "Result",
+ "思考": "Thinking",
+ "秒": "sec",
+ "未知模型": "Unknown model",
+ "用量统计": "Usage Statistics",
+ "打开": "Open",
+ "文件": "File",
+ "未运行": "Not running",
+ "系统提示词": "System Prompt",
+ "对话": "Conversation",
+ "小时": "hour",
+ "刚刚": "Just now",
+ "计划": "Plan",
+ "已覆盖": "Overridden",
+ "本部署的设置为只读。": "This deployment's settings are read-only.",
+ "该插件当前未加载,暂时无法配置。": "This plugin is not loaded, so it cannot be configured yet.",
+ "本部署没有接受这些值,已保留供你修改。": "This deployment did not accept these values; they were preserved for you to edit.",
+ "工具": "Tool",
+ "浏览器窗口登录": "Browser window login",
+ "(未知)": "(unknown)",
+ "{count} 个技能": "{count} skills",
+ "总处理": "Total processed",
+ "未知工作区": "Unknown workspace",
+ "关闭成本设置": "Close cost settings",
+ "AI 图像工坊": "AI Image Studio",
+ "终端": "Terminal",
+ "去充值": "Add credit",
+ "跳过": "Skip",
+ "复制失败": "Copy failed",
+ "退出登录": "Sign out",
+ "无": "None",
+ "脚注": "Footnote",
+ "请先选择会话": "Select a session first",
+ "加载更多": "Load more",
+ "代码": "Code",
+ "没有匹配的模型。": "No matching models.",
+ "插件": "Plugin",
+ "加载中": "Loading",
+ "正在检查…": "Checking…",
+ "无输出": "No output",
+ "收起输出": "Collapse output",
+ "退出码 {code}": "Exit code {code}",
+ "信号 {signal}": "Signal {signal}",
+ "未正常退出": "Exited abnormally",
+ "插话发送": "Send interjection",
+ "周一": "Monday",
+ "周二": "Tuesday",
+ "周三": "Wednesday",
+ "周四": "Thursday",
+ "周五": "Friday",
+ "周六": "Saturday",
+ "周日": "Sunday",
+ "消息": "Message",
+ "{count} 个后台任务": "{count} background tasks",
+ "已中断": "Interrupted",
+ "已停止": "Stopped",
+ "查看": "View",
+ "工具调用": "Tool call",
+ "网页搜索": "Web search",
+ "… 其余 {count} 行": "… {count} more lines",
+ "拒绝": "Deny",
+ "自动化任务": "Automated tasks",
+ "{seconds}秒": "{seconds}s",
+ "{minutes}分{seconds}秒": "{minutes}m {seconds}s",
+ "工具已更新": "Tools updated",
+ "指令": "Instructions",
+ "计划待审": "Plan awaiting review",
+ "子智能体": "Subagent",
+ "目标": "Goal",
+ "反馈": "Feedback",
+ "压缩": "Compact",
+ "权限": "Permissions",
+ "请填数字;留空表示使用默认值。": "Enter a number; leave blank to use the default.",
+ "当前不可用": "Currently unavailable",
+ "调用": "Call",
+ "账号库": "Account pool",
+ "切换中……": "Switching…",
+ "登录态探活": "Login health check",
+ "近 7 天": "Last 7 days",
+ "近 30 天": "Last 30 days",
+ "输出 Token": "Output tokens",
+ "(已写入配置,重启后仍生效)": "(Written to config; persists after restart)",
+ "分钟": "minute",
+ "时区": "Time zone",
+ "每周": "Weekly",
+ "检查中…": "Checking…",
+ "测试中…": "Testing…",
+ "全部模型": "All models",
+ "速度": "Speed",
+ "测试": "Test",
+ "输入 / 1M": "Input / 1M",
+ "输出 / 1M": "Output / 1M",
+ "缓存读 / 1M": "Cache read / 1M",
+ "缓存写 / 1M": "Cache write / 1M",
+ "(已删除)": "(deleted)",
+ "缓存命中率": "Cache hit rate",
+ "未启用": "Disabled",
+ " 天": " days",
+ "回合": "Turn",
+ "首字": "First token",
+ "已保存": "Saved",
+ "保存失败": "Save failed",
+ "下一步": "Next",
+ "继续": "Continue",
+ "上一步": "Back",
+ "登录": "Sign in",
+ "加载失败": "Load failed",
+ "提交": "Submit",
+ "已截断": "Truncated",
+ "… 已截断,共 {total} 字符": "… truncated, {total} characters total",
+ "清空搜索": "Clear search",
+ "打开侧边栏": "Open sidebar",
+ "收起侧边栏": "Collapse sidebar",
+ "已达两格上限": "Two-pane limit reached",
+ "栏宽不足,拖宽侧边栏后再分栏": "Not enough width; widen the sidebar before splitting",
+ "全屏": "Full screen",
+ "自动刷新": "Auto refresh",
+ "开启自动刷新": "Enable auto refresh",
+ "关闭自动刷新": "Disable auto refresh",
+ "纯文本": "Plain text",
+ "该格式文件暂时无法预览": "This file format cannot be previewed yet",
+ "读取失败:{message}": "Read failed: {message}",
+ "正在读取…": "Reading…",
+ "检查更新失败,请稍后重试。": "Update check failed; try again later.",
+ "DeepSeek 账号": "DeepSeek account",
+ "删除 {provider}": "Remove {provider}",
+ "提供商": "Provider",
+ "显示名称": "Display name",
+ "上下文窗口": "Context window",
+ "使用提供商默认值": "Use provider default",
+ "正在读取插件…": "Reading plugins…",
+ "添加插件": "Add plugin",
+ "异常": "Error",
+ "包元信息错误:{error}": "Package metadata error: {error}",
+ "等待依赖": "Waiting for dependencies",
+ "查看 {name}": "View {name}",
+ "插件列表": "Plugin list",
+ "未找到相关插件": "No matching plugins",
+ "展开其余 {n} 行输出": "Show {n} more output lines",
+ "… 其余 {n} 行": "… {n} more lines",
+ "完成": "Done",
+ "启动失败": "Start failed",
+ "发送消息": "Send message",
+ "排队发送": "Queued to send",
+ "待处理": "Pending",
+ "新增": "Added",
+ "单次": "Once",
+ "重复": "Repeat",
+ "搜索会话": "Search sessions",
+ "空闲": "Idle",
+ "提供方": "Provider",
+ "内容": "Content",
+ "层级": "Level",
+ "任务 ID": "Task ID",
+ "/{command} 不接受附件,请先移除附件": "/{command} does not accept attachments; remove them first",
+ "等待回答": "Awaiting answer",
+ "已继续工作,仍可回答": "Work resumed; still answerable",
+ "已结束": "Ended",
+ "运行命令": "Run command",
+ "运行 Cordis 插件": "Run Cordis plugin",
+ "停止 Cordis 插件": "Stop Cordis plugin",
+ "移除 Cordis 插件": "Remove Cordis plugin",
+ "取消编辑": "Cancel edit",
+ "当前会话已被占用,可能是其他正在运行的 DSH 导致的(如其他 dsh web、桌面端),请退出其他正在运行的 DSH 后重试。": "This session is already in use, possibly by another running DSH instance (such as another dsh web or the desktop app). Quit the other DSH instances and try again.",
+ "等待审批": "Awaiting approval",
+ "图片预览": "Image preview",
+ "第 {turn} 轮": "Turn {turn}",
+ "简洁": "Concise",
+ "详细": "Detailed",
+ "标准": "Standard",
+ "已添加工具:{name}": "Tool added: {name}",
+ "已移除工具:{name}": "Tool removed: {name}",
+ "新增:{names}": "Added: {names}",
+ "新增 {count} 个": "Added {count}",
+ "新增 {added} 个,移除 {removed} 个": "Added {added}, removed {removed}",
+ "移除:{names}": "Removed: {names}",
+ "移除 {count} 个": "Removed {count}",
+ "已移除": "Removed",
+ "上下文已压缩": "Context compacted",
+ "{count} 次工具调用": "{count} tool calls",
+ "{count} 条消息": "{count} messages",
+ "{count} 个 subagent": "{count} subagents",
+ "API 密钥无效": "Invalid API key",
+ "缓存读取": "Cache read",
+ "分": "min",
+ "执行中…": "Running…",
+ "{y}年{m}月{d}日": "{y}-{m}-{d}",
+ "待审批": "Pending approval",
+ "Cordis 插件": "Cordis plugin",
+ "读取中…": "Reading…",
+ "归档会话": "Archive session",
+ "取消归档": "Unarchive",
+ "置顶会话": "Pin session",
+ "取消置顶": "Unpin",
+ "{n} 个运行中的子智能体:{names}": "{n} running subagents: {names}",
+ "{n} 个后台任务:{names}": "{n} background tasks: {names}",
+ "{n} 条定时提醒:{names}": "{n} scheduled reminders: {names}",
+ "{n} 项其他工作({kind})": "{n} other jobs ({kind})",
+ "撤销": "Undo",
+ "{n} 个会话": "{n} sessions",
+ "{n} 个子智能体运行中": "{n} subagents running",
+ "{n}分钟": "{n} minutes",
+ "{n}小时": "{n} hours",
+ "{n}天": "{n} days",
+ "{n}个月": "{n} months",
+ "{n}年": "{n} years",
+ "{count} 个成员": "{count} members",
+ "进入目录": "Enter directory",
+ "添加": "Add",
+ "{count} 个子智能体": "{count} subagents",
+ "{count} 个子智能体,正在运行": "{count} subagents, running",
+ "{count} 个后台任务运行中": "{count} background tasks running",
+ "已失败": "Failed",
+ "取消标记": "Unmark",
+ "请选择模型": "Select a model",
+ "正在加载模型…": "Loading models…",
+ "仅可查看": "View only",
+ "工作区内修改": "Modify within workspace",
+ "完全权限": "Full access",
+ "确认启用完全权限?": "Enable full access?",
+ "我已了解风险,并愿意继续": "I understand the risk and want to continue",
+ "启用完全权限": "Enable full access",
+ "### 什么时候选": "### When to choose",
+ "内置插件": "Built-in plugins",
+ "下一题": "Next question",
+ "时长": "Duration",
+ "用户": "User",
+ "已压缩": "Compacted",
+ "助手": "Assistant",
+ "开始时间": "Start time",
+ "参数": "Parameters",
+ "用量": "Usage",
+ "无内容": "No content",
+ "结果 JSON": "Result JSON",
+ "参数 JSON": "Parameters JSON",
+ "正在加载更早的历史…": "Loading earlier history…",
+ "{count} 个工具调用": "{count} tool calls",
+ "{count} 个步骤": "{count} steps",
+ "关闭详情": "Close details",
+ "已解除": "Cleared",
+ "登录状态": "Login status",
+ "⚪ 未登录": "⚪ Not signed in",
+ "退出当前账号": "Sign out of this account",
+ "退出并登录其它账号": "Sign out and sign in to another account",
+ "折叠": "Collapse",
+ "未知原因": "Unknown reason",
+ "已捕获并保存凭证。": "Credentials captured and saved.",
+ "连通性测试": "Connectivity test",
+ "(未获取到账号信息)": "(no account information available)",
+ "凭证来源": "Credential source",
+ "指纹清理": "Fingerprint cleanup",
+ "允许并发": "Allow concurrency",
+ "间隔下限": "Minimum interval",
+ "间隔上限": "Maximum interval",
+ "快捷预设": "Quick presets",
+ "允许并行调用工具": "Allow parallel tool calls",
+ "到期前自动重登": "Auto re-login before expiry",
+ "调用台账": "Call ledger",
+ "调用次数": "Call count",
+ "按账号": "By account",
+ "总计": "Total",
+ "输入 Token": "Input tokens",
+ "按模型": "By model",
+ "重开链时换新会话": "Start a new session when reopening the chain",
+ "(未能写入配置,重启后会回到上次保存的值)": "(Could not write to config; it will revert to the last saved value after restart)",
+ "每分钟": "Every minute",
+ "每 {step} 分钟": "Every {step} minutes",
+ "每小时": "Every hour",
+ "每 {count} 小时": "Every {count} hours",
+ "每小时的第 {minutes} 分钟": "At minute {minutes} of every hour",
+ "一": "1",
+ "二": "2",
+ "三": "3",
+ "四": "4",
+ "五": "5",
+ "六": "6",
+ "日": "Day",
+ "天": "Day",
+ "正在删除…": "Deleting…",
+ "{count} 个提醒": "{count} reminders",
+ "下次运行": "Next run",
+ "仅一次": "Once only",
+ "日期": "Date",
+ "请输入至少 1 分钟的间隔": "Enter an interval of at least 1 minute",
+ "有未保存的修改": "Unsaved changes",
+ "保存修改": "Save changes",
+ "每天": "Daily",
+ "复制指令": "Copy instructions",
+ "未配置": "Not configured",
+ "自动(引擎默认)": "Auto (engine default)",
+ "时间范围": "Time range",
+ "保存失败:{message}": "Save failed: {message}",
+ "查询中…": "Querying…",
+ "添加账号": "Add account",
+ "正在生成图片…": "Generating image…",
+ "在侧边栏打开 {name}": "Open {name} in the sidebar",
+ "全部 {count} 个文件": "All {count} files",
+ "本机": "This machine",
+ "确认移除": "Confirm removal",
+ "处理中…": "Processing…",
+ "范围": "Range",
+ "位置": "Location",
+ "知道了": "Got it",
+ "正在更新…": "Updating…",
+ "运行版本": "Running version",
+ "{count} 个已启用": "{count} enabled",
+ "{count} 个已停用": "{count} disabled",
+ "{count} 个被覆盖": "{count} overridden",
+ "{count} 个诊断异常": "{count} diagnostics issues",
+ "{count} 个文件 · {size}": "{count} files · {size}",
+ "未计价": "Not priced",
+ "月": "Month",
+ "少": "Less",
+ "多": "More",
+ "请求日志": "Request log",
+ "同步中…": "Syncing…",
+ "未知供应商": "Unknown provider",
+ "混合查看": "Combined view",
+ "峰谷计划 ": "Peak/off-peak plan",
+ "自定义规则": "Custom rules",
+ "删除时段": "Delete period",
+ "删除规则": "Delete rule",
+ "当前进程令牌不可用,请刷新看板": "The current process token is unavailable; refresh the dashboard",
+ "删除费率档位": "Delete rate tier",
+ "输入口径": "Input basis",
+ "成本统计设置": "Cost statistics settings",
+ "完整费率设置加载失败": "Failed to load the full rate settings",
+ " 至 ": " to ",
+ "近 90 天": "Last 90 days",
+ "自定义时间范围": "Custom time range",
+ "界面语言": "Interface language",
+ "推理 Token": "Reasoning tokens",
+ "总处理 Token": "Total processed tokens",
+ "工作区筛选": "Workspace filter",
+ "供应商筛选": "Provider filter",
+ "模型筛选": "Model filter",
+ "刷新统计数据": "Refresh statistics",
+ "全部工作区": "All workspaces",
+ "全部供应商": "All providers",
+ "清除筛选": "Clear filters",
+ "命中率": "Hit rate",
+ "关闭用量统计": "Close usage statistics",
+ "收录时间": "Listed on",
+ "可用": "Available",
+ "暂不可用": "Temporarily unavailable",
+ "模型清单": "Model catalog",
+ "网关暂不可达": "Gateway unreachable",
+ "当前出口": "Current egress",
+ "测量中…": "Measuring…",
+ "请求数": "Requests",
+ "监听地址": "Listen address",
+ "端口": "Port",
+ "显示": "Show",
+ "隐藏": "Hide",
+ "插件升级": "Plugin upgrade",
+ "免费模型": "Free models",
+ "EAC 模型": "EAC models",
+ "白嫖模型接入": "Free model access",
+ "免费额度": "Free quota",
+ "数据看板": "Dashboard",
+ "运行日志": "Runtime log",
+ "网关设置": "Gateway settings",
+ "聚合渠道": "Aggregated channels",
+ "省 Token": "Save tokens",
+ "路由": "Routing",
+ "阿里系": "Alibaba family",
+ "手机号登录": "Phone number login",
+ "复制提示词": "Copy prompt",
+ "放弃修改": "Discard changes",
+ "复制 HTML": "Copy HTML",
+ "下载图像": "Download image",
+ "用 {app} 打开": "Open with {app}",
+ "{app}(默认)": "{app} (default)",
+ "无法获取应用列表": "Could not retrieve the application list",
+ "正在打开工作区": "Opening workspace",
+ "当前工作区或本地应用不可用": "The current workspace or local application is unavailable",
+ "在本地打开": "Open locally",
+ "更多打开方式": "More ways to open",
+ "显示文件位置": "Show file location",
+ "打开失败,请重试": "Open failed; try again",
+ "无法显示文件位置,请重试": "Could not show the file location; try again",
+ "访达": "Finder"
+}
diff --git a/src/dictionary.json b/src/dictionary.json
new file mode 100644
index 0000000..503332b
--- /dev/null
+++ b/src/dictionary.json
@@ -0,0 +1,1197 @@
+{
+ "DSH 正在运行时无法更新,而更新前的版本也已经损坏。为避免下次启动卡住,市场把它从 profile 里移除。插件目录还在原处,退出 DSH 后重新安装即可。": "DSH cannot be updated while it is running, and the pre-update version is corrupted. To avoid getting stuck on the next launch, the market removes it from the profile. The plugin directory is still in place, just exit DSH and reinstall.",
+ "取消时,旧版本已被清掉一部分。为避免下次启动卡住,市场把它从 profile 里移除。插件目录还在原处,重新安装即可;若再次失败,先退出 DSH 再装。": "When cancelled, the old version was partially cleared. To avoid getting stuck on the next launch, the market removes it from the profile. The plugin directory is still in place, just reinstall it; if it fails again, exit DSH and install it again.",
+ "GitHub token(仅本次会话内存,刷新后需重新输入;留空则使用服务端 DSH_GITHUB_TOKEN 或已登录的 gh CLI)": "GitHub token (only the memory of this session needs to be re-entered after refreshing; leave blank to use the server DSH_GITHUB_token or the logged-in gh CLI)",
+ "将删除:市场的停用清单与自定义分组,以及它写进配置文件的停用记录——被停用的插件将恢复运行。不涉及密码或密钥,市场从不把它们存在磁盘上。": "Will delete: the deactivation list of the market with the custom grouping, and the deactivation record it writes to the profile - the deactivated plugin will resume operation. There are no passwords or keys involved, and the market never stores them on disk.",
+ "评论来自 GitHub Discussions。打开后会连接 giscus.app 与 GitHub;发表评论需要 GitHub 账号。": "Comment from GitHub Discussions. Opening it will connect giscus.app to GitHub; a GitHub account is required to leave a comment.",
+ "有 Agent 正在运行,请等它完成或先取消,再更新——更新会直接替换插件文件,运行中的 Agent 可能中途报错或新旧版本混用。": "There is an agent running, please wait for it to complete or cancel before updating - the update will directly replace the plugin file. The running agent may report errors or mix old and new versions.",
+ "当前会话已被占用,可能是其他正在运行的 DSH 导致的(如其他 dsh web、桌面端),请退出其他正在运行的 DSH 后重试。": "This session is already in use, possibly by another running DSH instance (such as another dsh web or the desktop app). Quit the other DSH instances and try again.",
+ "已安装,但不是最新版:这个 profile 的 minimumReleaseAge 挡住了 {0},安装的是 {1}。": "Installed, but not the latest version: This profile's minimumReleaseAge blocks {0}, installing {1}.",
+ "npm 近30天滚动下载量:{0}。这不是累计下载量,也不代表独立用户数。统计可能延迟,来源核验时间不保证数据完整。": "npm rolling downloads in the last 30 days: {0}. This is not a cumulative download and does not represent the number of unique users. Statistics may be delayed, and the source verification time does not guarantee the completeness of the data.",
+ "当前 dsh 进程正被调试器连接。请从 IDE 或终端停止该进程后重新启动,市场不能从界面里结束正在调试的 dsh。": "The current dsh process is being connected by the debugger. Please restart the process after stopping it from the IDE or terminal, the market cannot end the dsh being debugged from the interface.",
+ "在这里登录会离开本页,返回时需重新打开 dsh web——这不是故障。发表评论请到 GitHub,本页只用于阅读。": "Logging in here will leave this page, and you will need to reopen the dsh web when you return - this is not a glitch. Leave a comment on GitHub, this page is for reading only.",
+ "有 Agent 正在运行,请等它完成或先取消,再安装——安装会改动插件文件,运行中的 Agent 可能中途报错。": "There is an Agent running, please wait for it to complete or cancel before installing--Installation will change the plugin file, and the running Agent may report errors halfway.",
+ "这些目录不被任何插件使用,也不影响启动,是更新中断后留下的。退出 DSH 后可以删除,或重新安装对应的插件。": "These directories are not used by any plugins and do not affect startup, they are left after the update is interrupted. After exiting DSH, you can remove or reinstall the corresponding plugin.",
+ "另一个安装、更新或卸载还在进行,现在还不能开始:这一条留在队列里,等它完成后会自动开始,不需要再点一次。": "Another installation, update or uninstallation is still in progress and cannot be started yet: this one stays in the queue and will start automatically once it is completed, no need to click again.",
+ "本次重启没有成功,dsh 已经退出。勾选你希望下次启动时启用的插件;本次启动报错的插件已标红并取消勾选。": "This reboot was unsuccessful and dsh has exited. Check the plugin that you want to enable the next time you start; the plugin that reported an error on this startup has been red and unchecked.",
+ "这一条要装的插件在当前目录里找不到了(目录刷新过或换了页),已从队列移除。请在目录里重新找到它再装一次。": "This plugin to be installed cannot be found in the current directory (the directory has been refreshed or changed pages), it has been removed from the queue. Please find it again in the catalog and install it again.",
+ "cordis 不接受重复的条目 id,保留它会让 DeepSeek Harness 下次启动失败。": "cordis does not accept duplicate entry ids, keeping it will cause DeepSeek Harness to fail the next time it starts.",
+ "插件把 DSH 自带的公共包列进了依赖,可能和 DSH 自己的版本互相干扰(仅依据声明,未确认):": "The plugin lists the public packages that come with DSH as dependencies, which may interfere with DSH's own version (by declaration only, unconfirmed):",
+ "等待 DeepSeek Harness 启动超时。可点「调整插件」,检查是否某个插件导致无法启动。": "Timeout waiting for DeepSeek Harness to start. Click \"Adjust Plugin\" to check if a plugin cannot be started.",
+ "请帮我修复 DeepSeek Harness 的插件问题(profile:{0})。诊断发现如下:": "Please help me fix a plugin issue for DeepSeek Harness (profile: {0}). The diagnostic findings are as follows:",
+ "已下载完成。重启 DeepSeek Harness 后新版本才会生效——页面会先显示新版本号。": "Download complete. Restart DeepSeek Harness to activate the update.",
+ "精选目录里有同名插件,但与你本地仓库不一致,无法安全恢复。可以卸载本地版,或继续用本地开发。": "There is a plugin with the same name in the featured directory, but it does not match your local repository and cannot be safely recovered. You can uninstall the local version or continue with local development.",
+ "该插件需要运行构建脚本才能工作,出于安全考虑已默认阻止。确认来源可信后,可放行并重新安装:": "The plugin requires a build script to run in order to work and has been blocked by default for security reasons. Once the source is verified, it can be released and reinstalled:",
+ "把当前的插件顺序和已停用的插件保存为组合,随时切换;应用前会先试启动一次并自动创建快照。": "Save the current plugin order and deactivated plugins as a combination and switch at any time; try to launch it once and automatically create a snapshot before applying.",
+ "WebDAV 地址与用户名仅保存在当前浏览器;密码只存于服务端,每次会话需重新输入。": "The WebDAV address and username are only saved in the current browser; the password is only stored on the server side and needs to be re-entered each session.",
+ "还没有收藏。在「发现」或「主题」里点书签图标,或在「已安装」的「···」里加入收藏。": "No favorites yet. Tap the bookmark icon in Discover or Themes, or add a collection to Installed.",
+ "保留市场数据。注意:被市场停用的插件会保持停用,且移除后将没有界面可将其重新启用。": "Keep market data. Note: Plugins that are deactivated by the market will remain deactivated and there will be no interface to re-enable them once removed.",
+ "将诊断问题交由新对话中的 Agent 修复(内容已复制到剪贴板,由你决定是否发送)": "Refer the diagnostic issue to the Agent in the new conversation for repair (the content has been copied to the clipboard and you decide whether to send it or not)",
+ "目录记录的 npm 版本;目录每日刷新,可能滞后于 npm 上的实际 latest": "The npm version of the directory record; the directory is refreshed daily and may lag behind the actual latest on npm",
+ "全选 = 完整备份(含配置文件);否则只导出勾选的插件,可另勾「包含配置文件」。": "Select All = Full backup (including configuration files); otherwise, only checked plug-ins can be exported, and \"Include configuration files\" can be checked separately.",
+ "安装来源是另一台电脑上的本地路径,本机找不到。请重新安装该插件,或改为本机路径": "The installation source is a local path on another computer, which the machine cannot find. Please reinstall the plugin or change to the native path",
+ "已卸载,但 pnpm 在收尾阶段报错(通常是文件被占用);配置已同步,无需重试": "Uninstalled, but pnpm reported an error at the closing stage (usually the file is occupied); the configuration is synchronized, no need to retry",
+ "精选目录里没有这个插件,无法恢复到线上版本。可以卸载本地版,或继续用本地开发。": "This plugin is not available in the featured directory and cannot be restored to the online version. You can uninstall the local version or continue with local development.",
+ "仅包含插件清单和 profile 配置,不含插件文件;恢复时按清单重新安装。": "Only the plugin manifest and profile configuration are included, no plugin files are included; reinstall according to the manifest when restoring.",
+ "日志已导出:dsh-market-log.txt,请将其附在 issue 中": "Log exported: dsh-market-log.txt, please attach it to issue",
+ "目录({0} 刷新)记录的 npm 版本;之后发布的版本要等下次刷新才会出现": "The npm version of the directory ({0} refresh) record; subsequent releases will not appear until the next refresh",
+ "社区 bundle 加载顺序与插件声明的 before/after 规则冲突": "The community bundle loading order conflicts with the before/after rules declared by the plugin",
+ "GitHub 认证失败:Token 无效、已过期,或 gh CLI 未登录": "GitHub authentication failed: Token is invalid, expired, or gh CLI is not logged in",
+ "该顺序会改变组合:{0} 处覆盖、{1} 个无效条目、{2} 个重复条目": "This order changes the combination: {0} overrides, {1} invalid entries, {2} duplicate entries",
+ "Agent 正忙,已排队,空闲后自动卸载(可在右上角「任务」里取消)。": "Agent is busy, queued, and uninstalled automatically when idle (can be canceled in Tasks in the top right corner).",
+ "Agent 正忙,已排队,空闲后自动安装(可在右上角「任务」里取消)。": "The agent is busy, queued, and automatically installed when it is free (can be canceled in the \"Tasks\" in the top right corner).",
+ "Agent 正忙,已排队,空闲后自动更新(可在右上角「任务」里取消)。": "The agent is busy, queued, and will automatically update when it is free (can be canceled in the \"Tasks\" in the top right corner).",
+ "回滚会用快照覆盖当前的插件与配置,且不可撤销(可先创建新快照再回滚)。": "Rollbacks overwrite the current plugin and configuration with a snapshot and are irreversible (you can create a new snapshot before rolling back).",
+ "正在重启:dsh 启动后本页会刷新;若又失败,会带着新的报错回到这里。": "Restarting: This page will refresh after dsh starts; if it fails again, it will return here with a new error report.",
+ "由环境变量 DSHM_GITHUB_PROXY 管理,界面中不可修改。": "Managed by DSHM_GITHUB_PROXY environment variable.",
+ "下面标红的插件在本次启动时报了错,取消勾选后下次启动不再启用它们。": "The plugins marked red below reported an error on this startup, and they will not be enabled on the next startup after unchecking them.",
+ "重启方式:关闭当前 dsh 进程后重新运行(例如 dsh web)": "Restart method: Run again after closing the current dsh process (e.g. dsh web)",
+ "将卸载本地版本并安装线上版本,之后照常检查更新。此操作无法撤销。": "The local version will be uninstalled and the online version will be installed, after which the update will be checked as usual. This action cannot be undone.",
+ "已按 DSH {0} 筛选;未声明或无法确认兼容性的插件仍会显示": "Filtered by DSH {0}; undeclared or incompatible plugins will still show",
+ "恢复将覆盖当前 profile 配置并重新安装插件,确定继续吗?": "Restoring will overwrite the current profile configuration and reinstall the plugin, are you sure you want to continue?",
+ "正在检查宿主要求 {0}/{1};未声明或无法确认的插件仍会显示": "Checking host requirements {0}/{1}; undeclared or unconfirmed plugins will still be displayed",
+ "该 npm 包可能由其他人发布,并非同一插件;确认可信后再继续。": "The npm package may be published by someone else and is not the same plugin; confirm it is trusted before proceeding.",
+ "一组只有一个主题。选择不会启用它,更换会把原来的主题移出该组。": "A group has only one subject. Choosing not to enable it and replacing it will move the original topic out of the group.",
+ "应用变更前会自动创建快照;也可手动创建,随时回滚到任意状态。": "Snapshots are automatically created before changes are applied, or they can be created manually and rolled back to any state at any time.",
+ "排队时它还在已安装列表里,现在已不在,因此跳过(没有卸载)。": "It was still in the installed list at the time of queuing and is no longer there, so it was skipped (not uninstalled).",
+ "从这个 profile 卸载市场。已装的其它插件不受影响。": "Uninstall the market from this profile. Other installed plugins are not affected.",
+ "本页检查插件冲突、依赖版本不匹配与加载顺序问题。常用术语:": "This page checks for plugin conflicts, dependency version mismatches, and loading order issues. Common terms:",
+ "检测到兼容性风险,建议重启前到诊断页处理,或回滚本次操作。": "Compatibility risk detected, it is recommended to go to the diagnostics page before restarting, or roll back this operation.",
+ "静态扫描只能证明「有」,不能证明「没有」。这不代表它安全。": "A static scan can only prove yes, not no. This does not mean it is safe.",
+ "SKILL.md 需包含 YAML 格式的技能名称和描述": "SKILL.md must include YAML name and description",
+ "下列插件的界面文件已损坏,刷新后页面可能空白,建议回滚:": "The interface files of the following plugins are corrupted. After refreshing, the page may be blank. It is recommended to roll back:",
+ "加载顺序 = 插件被激活的先后,后加载者可能覆盖先加载者": "Loading order = the order in which the plugin is activated, the last loader may override the first loader",
+ "发现社区为 DeepSeek Harness 开发的插件": "Discover plugins developed by the community for DeepSeek Harness",
+ "可以更新到 {version}:它声明兼容当前 DSH。": "Can update to {version}: it declares compatibility with the current DSH.",
+ "已从发现页移出。在「已安装」后面的「已屏蔽」里可以取消。": "Moved out of the discovery page. You can cancel in Blocked after Installed.",
+ "建议顺序(按 before/after 规则自动排序):": "Suggested order (automatically sorted by before/after rule):",
+ "此操作后,同一个插件名出现在两处,重启后只有一个会生效:": "After this operation, the same plugin name appears in two places, and only one will take effect after restart:",
+ "首次安装需下载插件的依赖包,大型插件可能需 1-3 分钟": "The first installation requires the download of the plugin dependency package, large plugins may take 1-3 minutes",
+ "Gist ID 或链接(导出留空则新建私有 Gist)": "Gist ID or link (leave the export blank to create a new private Gist)",
+ "新增 {added} 个,移除 {removed} 个": "Added {added}, removed {removed}",
+ "日志没有指出具体插件,下面按启用状态列出可调整的插件。": "The log does not indicate a specific plug-in, the list of adjustable plug-ins is shown below by activation status.",
+ "更新模式需要 Gist ID:请填写,或切换为「新建」": "Update mode requires Gist ID: please fill in, or switch to \"New\"",
+ "项变更需重启 DeepSeek Harness 后生效": "Item changes will take effect after DeepSeek Harness is restarted",
+ "也可能让 DeepSeek Harness 起不来。": "It may also make DeepSeek Harness unable to get up.",
+ "可以装 {version}:它声明兼容当前 DSH。": "Can be loaded with {version}: it declares compatibility with the current DSH.",
+ "提前获取待验证版本,可能不稳定。仅影响插件市场自身。": "Getting the pending version in advance may be unstable. Affects only the plugin market itself.",
+ "收藏功能暂不可用。请刷新页面或重启 dsh web。": "Favorites is temporarily unavailable. Please refresh the page or restart dsh web.",
+ "重启 DeepSeek Harness 后完全清理。": "Clean up completely after restarting DeepSeek Harness.",
+ "恢复完成,请重启 DeepSeek Harness": "Recovery complete, please restart DeepSeek Harness",
+ "支持 .zip、技能文件夹或单个 SKILL.md": "Supports .zip, a skill folder, or single SKILL.md",
+ "确定要卸载插件市场吗?卸载后需使用命令行重新安装。": "Are you sure you want to uninstall the plugin marketplace? It needs to be reinstalled using the command line after uninstallation.",
+ "中国大陆访问更快。仅改变下载线路,插件来源不变。": "Faster in China. Only changes CDN routing; source is identical.",
+ "另一个安装、更新或卸载还在进行,请等它完成后再试": "Another installation, update or uninstallation is still in progress, please wait for it to complete and try again",
+ "替换未完成。下列插件已卸载且未恢复,请重新安装:": "Replacement incomplete. The following plugins have been uninstalled and not restored, please reinstall:",
+ "等待 DeepSeek Harness 启动超时": "Timeout waiting for DeepSeek Harness to start",
+ "自动配置失败。请导出日志并附在 issue 中。": "Autoconfiguration failed. Please export the log and attach it to the issue.",
+ "/{command} 不接受附件,请先移除附件": "/{command} does not accept attachments; remove them first",
+ "bundle = 一个插件包,会按顺序叠加加载": "bundle = A plugin package that is stacked sequentially",
+ "最近提交(无法对应你当前安装的版本,仅供参考)": "Recently Submitted (does not correspond to the version you currently have installed, for reference only)",
+ "安装时会立刻运行它自带的脚本,不需要你打开插件": "It runs its own script immediately upon installation and does not require you to open the plugin",
+ "拖动 ⠿ 调整顺序,选择「应用顺序」后才会保存": "Drag to adjust order, select \"Apply order\" to save",
+ "本市场由桌面端安装和更新,新版本请在桌面端更新": "This market is installed and updated on the desktop, please update the new version on the desktop",
+ "残缺的包目录(缺少 package.json)": "Missing package directory (missing package.json)",
+ "WebDAV 地址和用户名只保存在此浏览器。": "WebDAV addresses and usernames are only saved in this browser.",
+ "创建和导入均保存到全局 DSH,跨项目可用。": "Created and imported skills are saved to global DSH and available across projects.",
+ "对等依赖 = 插件要求宿主环境提供的另一个包": "Peer dependency = Another package that the plugin requires from the hosting environment",
+ "开发分支构建,未经验证,不建议普通用户使用。": "Development branch build, unverified, not recommended for regular users.",
+ "无法连接 GitHub,请检查网络或代理设置": "Unable to connect to GitHub, please check your network or proxy settings",
+ "用你自己的话描述这个插件,将代替作者简介显示": "Describe the plugin in your own words and it will be displayed instead of the author's profile",
+ "该插件已被目录标记为废弃,不建议新用户安装。": "The plugin has been marked as deprecated by the directory and is not recommended for new users to install.",
+ "请选择 .zip 或单个 SKILL.md。": "Please choose a .zip archive or single SKILL.md.",
+ "这份市场由桌面端安装,新版本请在桌面端更新。": "Installed via desktop app; please update from the desktop client.",
+ "这会更改插件的安装来源,而不是普通版本更新。": "This changes the installation source of the plugin instead of the normal version update.",
+ "(未能写入配置,重启后会回到上次保存的值)": "(Could not write to config; it will revert to the last saved value after restart)",
+ "{n} 个运行中的子智能体:{names}": "{n} running subagents: {names}",
+ "GitHub 限流或 Token 权限不足": "GitHub throttling or insufficient token permissions",
+ "从 npm 和 GitHub 官方源下载。": "Download from official npm and GitHub sources.",
+ "例如 code-review-helper": "e.g. code-review-helper",
+ "加载条目 = 插件在运行组合里注册的每一项": "Load entries = each item that the plugin registers in the running portfolio",
+ "备份已导入,请在「已安装」中确认后开始恢复": "Backup has been imported, please confirm in \"Installed\" to start recovery",
+ "安装时会立刻运行 {0},不需要你打开插件": "{0} will run immediately upon installation and does not require you to open the plugin",
+ "当前顺序已满足全部规则与插件依赖,无需调整": "The current order has satisfied all rules and plugin dependencies, no need to adjust",
+ "当前顺序的 before/after 冲突": "Conflict before/after of current order",
+ "无法确认更新前的准确来源,自动回滚不可用。": "The exact source before the update could not be confirmed and the automatic rollback is not available.",
+ "检测到兼容性风险,建议重启前到诊断页处理。": "A compatibility risk has been detected and it is recommended to go to the diagnostics page before restarting.",
+ "环境变量 DSH_GITHUB_TOKEN": "Environment variable DSH_Github_token",
+ "这些插件不在发现页显示,全部更新也会跳过。": "These plugins are not shown on the discovery page and all updates are skipped.",
+ "遮蔽 = 插件自带的旧版包盖住了宿主的新版": "Masking = The old version of the package that comes with the plugin covers the new version of the host",
+ "{count} 个文件 · {size}": "{count} files · {size}",
+ "{minutes}分{seconds}秒": "{minutes}m {seconds}s",
+ "GitHub 请求超时,请检查网络后重试": "GitHub request timed out, please check your network and try again",
+ "优先使用自定义线路,失败后仍会尝试直连。": "Uses custom mirror first, falls back to direct connection.",
+ "只改分组名称,组内插件与启用状态不受影响": "Only the group name will be changed, and the in-group plug-in and activation status will not be affected",
+ "将从当前 profile 中移除该插件。": "The plugin will be removed from the current profile.",
+ "所选文件夹中没有找到 SKILL.md。": "No SKILL.md found in the selected folder.",
+ "排队时它有可用更新,现在没有了,已跳过。": "It has an update available while queuing, it is no longer available, it has been skipped.",
+ "无法访问剪贴板,请手动复制下面的诊断内容": "Unable to access the clipboard, please manually copy the diagnostic content below",
+ "未找到该 Gist,请检查 ID 或链接": "Gist not found, please check ID or link",
+ "点了某个分类,标签就跑到前面来了,好奇怪": "I clicked on a certain category, and the tag came to the front, which is strange.",
+ "上次的选择没有全部保存,因此没有重启:": "The last selection was not all saved, so it was not restarted:",
+ "压缩包或文件夹需包含 SKILL.md": "Archives and folders must contain SKILL.md",
+ "尚未安装社区插件,可前往「发现」页浏览": "No community plugins installed, browse to the Discover page",
+ "当前 profile 没有可导出的插件": "Current profile has no plugins to export",
+ "插件操作未结束,收藏未保存,请稍后重试": "The plugin operation is not over, the collection is not saved, please try again later",
+ "无效条目 = 配置里引用了不存在的东西": "Invalid entry = the configuration refers to something that does not exist",
+ "本部署没有接受这些值,已保留供你修改。": "This deployment did not accept these values; they were preserved for you to edit.",
+ "没有找到声明兼容当前 DSH 的版本。": "Declaration of compatibility with current DSH version not found.",
+ "… 已截断,共 {total} 字符": "… truncated, {total} characters total",
+ "{count} 个 subagent": "{count} subagents",
+ "{count} 个子智能体,正在运行": "{count} subagents, running",
+ "Gist 内容无效或备份格式不受支持": "Invalid Gist content or unsupported backup format",
+ "会改动 DSH 自带的组件({0})": "Modifies DSH included components ({0})",
+ "会直接连接固定 IP 地址({0})": "Directly connects to a fixed IP address ({0})",
+ "会禁用 DSH 自带的组件({0})": "Disables DSH included components ({0})",
+ "会覆盖 DSH 自带的组件({0})": "Will overwrite DSH's own components ({0})",
+ "分组仅用于整理,不会改变插件启用状态": "Grouping is for collation only and does not change the plugin activation status",
+ "安装插件前需要先配置 pnpm 环境": "The pnpm environment needs to be configured before installing the plugin",
+ "已复制修复说明,请粘贴到新对话中发送": "Repair instructions copied, please paste into new conversation to send",
+ "已根据网络状况自动选择,可随时切换。": "It's automatically selected based on your network and can be switched at any time.",
+ "每小时的第 {minutes} 分钟": "At minute {minutes} of every hour",
+ "社区第三方插件,构建脚本默认不运行。": "Community third-party plugins, build scripts do not run by default.",
+ "被卸载的插件配置会保留,可以再装回来": "The uninstalled plugin configuration will be preserved and can be loaded back",
+ "评论加载失败。请检查网络连接后重试。": "Comment loading failed. Please check your network connection and try again.",
+ "验证通过(Token 来源:{0})": "Validation passed (Token source: {0})",
+ "{n} 个后台任务:{names}": "{n} background tasks: {names}",
+ "{n} 条定时提醒:{names}": "{n} scheduled reminders: {names}",
+ "{n} 项其他工作({kind})": "{n} other jobs ({kind})",
+ "DSH 指出但本页无法开关的插件:": "The DSH points to plugins that cannot be switched on on this page:",
+ "写下技能要遵循的指令、步骤和边界…": "Write the instructions, steps, and boundaries...",
+ "回车保存单个;清空别名还原文件夹名": "Press Enter to save; clear alias to restore folder name",
+ "安装、更新与卸载的进度将显示在这里": "The progress of installing, updating and uninstalling will be shown here",
+ "导入时复制完整内容,不修改原始来源": "Import copies full content and never modifies original source",
+ "搜索插件,例如:通知、终端、记忆…": "Search plugins such as: notifications, terminals, memories...",
+ "这是终端插件,网页版里可能用不了。": "This is a terminal plugin, it may not be available in the web version.",
+ "{count} 个后台任务运行中": "{count} background tasks running",
+ "和已安装的插件冲突,只能留一个:": "Conflicts with installed plugins, only one can be left:",
+ "在 GitHub 登录并参与讨论": "Log in and join the discussion on GitHub",
+ "备份中有 {0} 个插件尚未安装": "{0} plugin (s) not installed in backup",
+ "实心的项在已扫描的插件里较少出现": "Solid items rarely appear in scanned plugins",
+ "恢复已完成,但下列插件安装失败:": "Restore completed, but the following plugins failed to install:",
+ "更新提醒已关闭。新版本仍会列出。": "Update alerts are turned off. The new version will still be listed.",
+ "自动选择可用线路,失败时才切换。": "Automatically selects available mirror, falls back on failure.",
+ "该插件当前未加载,暂时无法配置。": "This plugin is not loaded, so it cannot be configured yet.",
+ "该来源目录不存在或暂时没有技能。": "This source directory does not exist or has no skills.",
+ "dsh 的原始输出(结尾部分)": "raw output of dsh (end)",
+ "npm 下载量(近 30 天)": "npm downloads (last 30 days)",
+ "加载条目(loader id)": "Loader entry (loader id)",
+ "匹配的插件在「已屏蔽」标签里。": "The matching plugin is in the Blocked tab.",
+ "同名插件(仅供参考,不算冲突)": "Plugins with the same name (for reference only, not conflict)",
+ "已安装,与当前 dsh 不兼容": "Installed, incompatible with current dsh",
+ "当前进程令牌不可用,请刷新看板": "The current process token is unavailable; refresh the dashboard",
+ "新版本仍会列出,只是不再提醒。": "The new version will still be listed, just no more reminders.",
+ "暂时读不到更新说明,稍后再试。": "The update instructions could not be read at the moment, please try again later.",
+ "更新会下载新版本,重启后生效。": "Update will download the new version; takes effect upon restart.",
+ "未发现冲突、依赖或加载顺序问题": "No conflicts, dependencies, or loading order issues found",
+ "统计区间:{0} 至 {1}。": "Statistical range: {0} to {1}.",
+ "请填数字;留空表示使用默认值。": "Enter a number; leave blank to use the default.",
+ "… 其余 {count} 行": "… {count} more lines",
+ "(已写入配置,重启后仍生效)": "(Written to config; persists after restart)",
+ "保存失败:{message}": "Save failed: {message}",
+ "全部 {count} 个文件": "All {count} files",
+ "包元信息错误:{error}": "Package metadata error: {error}",
+ "可离开本页面,完成后将通知你": "You can leave this page and we'll let you know when it's done",
+ "在 GitHub 上查看仓库": "View repository on GitHub",
+ "坚果云 / Nutstore": "Nut Cloud/Nutstore",
+ "插件加载顺序(bundle)": "Plugin loading order (bundle)",
+ "插件目录加载失败,请稍后重试": "Plugin directory failed to load, please try again later",
+ "无法安装:与已安装的插件冲突": "Unable to install: conflicts with installed plugins",
+ "栏宽不足,拖宽侧边栏后再分栏": "Not enough width; widen the sidebar before splitting",
+ "读取失败:{message}": "Read failed: {message}",
+ "这个新版本要求更新的 DSH": "This new version requires an updated DSH",
+ "{count} 个后台任务": "{count} background tasks",
+ "{count} 个子智能体": "{count} subagents",
+ "{count} 个工具调用": "{count} tool calls",
+ "{count} 个诊断异常": "{count} diagnostics issues",
+ "{count} 次工具调用": "{count} tool calls",
+ "Agent 空闲后自动开始": "Start automatically when the agent is free",
+ "npm 当前 latest": "npm Current latest",
+ "会在运行时执行拼出来的代码": "will execute the spelled-out code at runtime",
+ "会改动 DSH 自带的组件": "Will change the DSH's own components",
+ "删除 {provider}": "Remove {provider}",
+ "包含配置文件(可能含密钥)": "Include profile (may include key)",
+ "另有 {0} 条待确认信息": "{0} more to confirm",
+ "在侧边栏打开 {name}": "Open {name} in the sidebar",
+ "已自动撤销,未改动任何插件": "Automatically revoked, no plugins changed",
+ "已选择保留现有插件,未安装": "Selected to keep existing plugins, not installed",
+ "当前工作区或本地应用不可用": "The current workspace or local application is unavailable",
+ "无法更新屏蔽列表,请重试。": "Unable to update the block list, please try again.",
+ "更新到 {version}": "Update to {version}",
+ "更新到输入框中的 Gist": "Update to Gist in Input",
+ "检查更新失败,请稍后重试。": "Update check failed; try again later.",
+ "每天自动备份(打开市场时)": "Automatic daily backups (when market is open)",
+ "没有扫描到。这不等于安全。": "Not scanned. This does not equal security.",
+ "用到 DSH 宿主内部的包": "Uses packages inside the DSH host",
+ "确证与当前 DSH 不兼容": "Confirm incompatibility with current DSH",
+ "第 {0} / {1} 页": "Page {0} of {1}",
+ "该版本低于当前已安装版本。": "This version is lower than the currently installed version.",
+ "请输入至少 1 分钟的间隔": "Enter an interval of at least 1 minute",
+ "重排 {0} 个插件的位置": "Relocate {0} plugins",
+ "{count} 个已停用": "{count} disabled",
+ "{count} 个已启用": "{count} enabled",
+ "{count} 个被覆盖": "{count} overridden",
+ "{n} 个子智能体运行中": "{n} subagents running",
+ "{y}年{m}月{d}日": "{y}-{m}-{d}",
+ "停止 Cordis 插件": "Stop Cordis plugin",
+ "兼容当前 DSH {0}": "Compatible with current DSH {0}",
+ "删除后该快照将无法恢复。": "Once deleted, the snapshot cannot be recovered.",
+ "加入分组不会自动启用插件": "Joining a group does not automatically enable the plugin",
+ "安装 {version}": "Install {version}",
+ "展开其余 {n} 行输出": "Show {n} more output lines",
+ "已添加工具:{name}": "Tool added: {name}",
+ "已移除工具:{name}": "Tool removed: {name}",
+ "我已了解风险,并愿意继续": "I understand the risk and want to continue",
+ "收藏的条目已不在目录中。": "Favorite entry is no longer in the directory.",
+ "新增 {count} 个": "Added {count}",
+ "无法显示文件位置,请重试": "Could not show the file location; try again",
+ "有连接没有加密({0})": "Connection with no encryption ({0})",
+ "查看插件市场版本与设置。": "View marketplace version and settings.",
+ "正文(Markdown)": "Body (Markdown)",
+ "每 {count} 小时": "Every {count} hours",
+ "移除 {count} 个": "Removed {count}",
+ "移除 Cordis 插件": "Remove Cordis plugin",
+ "符合宿主要求(依据声明)": "Meets host requirements (per claim)",
+ "等待 {0} 个会话空闲": "Waiting for {0} sessions to be free",
+ "运行 Cordis 插件": "Run Cordis plugin",
+ "{count} 个成员": "{count} members",
+ "{count} 个技能": "{count} skills",
+ "{count} 个提醒": "{count} reminders",
+ "{count} 个步骤": "{count} steps",
+ "{count} 条消息": "{count} messages",
+ "DeepSeek 账号": "DeepSeek account",
+ "一句话说明什么时候使用": "One sentence describing when to use it",
+ "从 WebDAV 恢复": "Restore from WebDAV",
+ "会联网,并用到你的密钥": "will be connected to the network and will use your key",
+ "信号 {signal}": "Signal {signal}",
+ "另有 {0} 项已省略": "{0} more items omitted",
+ "同时清除市场自己的数据": "while clearing the market's own data",
+ "已取消,部分更改已应用": "Cancelled, some changes applied",
+ "新建一个私有 Gist": "Create a new private Gist",
+ "日志里没有说明具体原因": "No specific reason was given in the log",
+ "来源核验时间:{0}。": "Source verification time: {0}.",
+ "来源核验时间:未提供。": "Source verification time: Not provided.",
+ "每 {step} 分钟": "Every {step} minutes",
+ "没有未分组的插件可加入": "No ungrouped plugins to join",
+ "该插件未提供更新说明。": "No update instructions were provided for this plugin.",
+ "该格式文件暂时无法预览": "This file format cannot be previewed yet",
+ "逛一逛,点一下,装好。": "Browse, click, and install.",
+ "顺序检查未通过:{0}": "Sequence check failed: {0}",
+ "… 其余 {n} 行": "… {n} more lines",
+ "(未获取到账号信息)": "(no account information available)",
+ "{seconds}秒": "{seconds}s",
+ "HTTPS 加速前缀": "HTTPS Mirror Prefix",
+ "为「{0}」选择主题": "Select a topic for '{0}'",
+ "仅接收正式发布版本。": "Only official releases are accepted.",
+ "停用 {0} 个插件": "Deactivate {0} plugins",
+ "启动失败——调整插件": "Launch Failure - Adjust Plugin",
+ "启用 {0} 个插件": "Activate {0} plugins",
+ "完整费率设置加载失败": "Failed to load the full rate settings",
+ "已停用,功能立即失效": "Disabled, features expire immediately",
+ "已处理 {0} 个包": "{0} packages processed",
+ "已继续工作,仍可回答": "Work resumed; still answerable",
+ "换用 npm 版本?": "Switch to npm version?",
+ "收藏失败,请稍后重试": "Collection failed, please try again later",
+ "新增:{names}": "Added: {names}",
+ "暂时查不到兼容版本。": "A compatible version is temporarily unavailable.",
+ "本部署的设置为只读。": "This deployment's settings are read-only.",
+ "正在加载更早的历史…": "Loading earlier history…",
+ "没有已满足的依赖条目": "No Dependent Entries Satisfied",
+ "用 {app} 打开": "Open with {app}",
+ "移除:{names}": "Removed: {names}",
+ "第 {turn} 轮": "Turn {turn}",
+ "还没有屏蔽任何插件。": "No plugins have been blocked yet.",
+ "退出码 {code}": "Exit code {code}",
+ "{app}(默认)": "{app} (default)",
+ "### 什么时候选": "### When to choose",
+ "Cordis 插件": "Cordis plugin",
+ "GitHub 加速": "GitHub Mirror",
+ "pnpm 临时目录": "pnpm temporary directory",
+ "中国版端点与模型池": "China Endpoints & Model Pool",
+ "从 Gist 导入": "Import from Gist",
+ "会调用 AI 模型": "will invoke the AI model",
+ "允许构建脚本并重试": "Allow build scripts and retry",
+ "共 {0} 个收藏": "Total {0} Collections",
+ "可能不适用于网页版": "May not be available on the web",
+ "安装时就会运行代码": "The code will run at installation time",
+ "导入到全局 DSH": "Import to global DSH",
+ "尚无分组,请先新建": "There are no groups yet, please create a new one first",
+ "已回滚,重启后生效": "Rolled back, effective after restart",
+ "已安装,校验未通过": "Installed, checksum failed",
+ "已安装,重启后生效": "Installed, effective after reboot",
+ "已导出到 Gist": "Exported to Gist",
+ "已应用,重启后生效": "Applied, effective after restart",
+ "已捕获并保存凭证。": "Credentials captured and saved.",
+ "已选择 {0} 项": "{0} items selected",
+ "快照列表加载失败:": "Failed to load snapshot list:",
+ "总处理 Token": "Total processed tokens",
+ "恢复后仍无法启动:": "Unable to start after recovery:",
+ "换用 npm 版本": "Switch to npm version",
+ "搜索插件名称或作者": "Search by plugin name or author...",
+ "新的 npm 来源": "New npm source",
+ "无法保存,请重试。": "Unable to save, please try again.",
+ "查看 {name}": "View {name}",
+ "正在加载插件目录…": "Loading plugin directory...",
+ "正在检查更新...": "Checking for updates...",
+ "正在识别宿主版本…": "Identifying host version...",
+ "正在读取失败详情…": "Reading failure details...",
+ "正在读取宿主要求…": "Reading host requirements...",
+ "没有依赖版本不匹配": "No dependent version mismatch",
+ "没有发现残留目录。": "No residual directories found.",
+ "没有重复的插件条目": "No duplicate plugin entries",
+ "确认启用完全权限?": "Enable full access?",
+ "组合列表加载失败:": "Failed to load portfolio list:",
+ "统计区间:未提供。": "Statistical interval: not provided.",
+ "退出并登录其它账号": "Sign out and sign in to another account",
+ "项变更,刷新后生效": "Item changes, effective after refresh",
+ "项目 Skills": "Project Skills",
+ "API 密钥无效": "Invalid API key",
+ "patch 文件": "patch file",
+ "上下文缓存命中率": "Context Cache Hit Rate",
+ "会自己开任务干活": "Will work on his own tasks",
+ "会读你的环境变量": "will read your environment variables",
+ "使用提供商默认值": "Use provider default",
+ "供应商 / 模型": "Provider / Model",
+ "允许并行调用工具": "Allow parallel tool calls",
+ "公共 Agent": "Shared Agent",
+ "备份文件 URL": "Backup file URL",
+ "已恢复更新提醒。": "The update reminder has been restored.",
+ "市场自身不能停用": "Market itself cannot be deactivated",
+ "打开失败,请重试": "Open failed; try again",
+ "推理 Token": "Reasoning tokens",
+ "插件市场无法显示": "Plugin Marketplace cannot be displayed",
+ "文档渲染中...": "Rendering document...",
+ "无法获取应用列表": "Could not retrieve the application list",
+ "暂无进行中的操作": "No actions in progress",
+ "有新版本 {0}": "Update Available",
+ "未发现诊断问题。": "No diagnostic issues found.",
+ "未配置任何插件包": "No plugin packages configured",
+ "正在保存并重启…": "Saving and restarting...",
+ "没有匹配的技能。": "No matching skills.",
+ "没有匹配的模型。": "No matching models.",
+ "没有多版本核心包": "No multi-version core packages",
+ "没有无效配置条目": "There are no invalid configuration entries",
+ "没有未分组的主题": "No ungrouped topics",
+ "添加 {0} 项": "Add {0} items",
+ "添加到「{0}」": "Add To",
+ "缓存写 / 1M": "Cache write / 1M",
+ "缓存读 / 1M": "Cache read / 1M",
+ "自动(引擎默认)": "Auto (engine default)",
+ "输入 Token": "Input tokens",
+ "输出 Token": "Output tokens",
+ "还没有保存过组合": "No groups saved yet",
+ "选择要导出的插件": "Select plugins to export",
+ "重启前都不再提醒": "Don't remind me again before restarting",
+ "重开链时换新会话": "Start a new session when reopening the chain",
+ "项目 Agent": "Project Agent",
+ "{n} 个会话": "{n} sessions",
+ "AI 图像工坊": "AI Image Studio",
+ "一直不提醒更新": "Never remind me to update",
+ "为什么未生效?": "Why didn't it go into effect?",
+ "主题({0})": "WordPress.org themes",
+ "仍安装 {0}": "Install {0} anyway",
+ "从公开日历载入": "Load from Public Calendar",
+ "会写入本机文件": "will write to the native file",
+ "会读取本机文件": "Reads native files",
+ "依赖版本不匹配": "Dependency version mismatch",
+ "保持现在的版本": "Keep Current Version",
+ "最近 30 天": "Latest 30 days",
+ "最近 90 天": "Last 90 days",
+ "创建快照失败:": "Failed to create snapshot:",
+ "删除快照失败:": "Failed to delete snapshot:",
+ "到期前自动重登": "Auto re-login before expiry",
+ "参数 JSON": "Parameters JSON",
+ "复制 HTML": "Copy HTML",
+ "已安装,未生效": "Installed, Not Active",
+ "已安装并已生效": "Installed and Active",
+ "应用此组合将:": "Applying this combination will:",
+ "打开独立恢复页": "Open Independent Recovery Page",
+ "扫描于 {0}": "Scanned on {0}",
+ "拖拽技能到此处": "Drop skill here",
+ "插件({0})": "Plugin",
+ "搜索插件...": "Search plugins...",
+ "无效的配置条目": "Invalid configuration entry",
+ "有未保存的修改": "Unsaved changes",
+ "未声明宿主要求": "Host requirement not declared",
+ "未找到相关插件": "No matching plugins",
+ "正在加载技能…": "Loading skills...",
+ "正在加载模型…": "Loading models…",
+ "正在加载评论…": "Loading comments...",
+ "正在打开工作区": "Opening workspace",
+ "正在检查更新…": "Checking for updates...",
+ "正在生成图片…": "Generating image…",
+ "正在读取插件…": "Reading plugins…",
+ "没有匹配的技能": "No matching skills",
+ "没有匹配的插件": "No matching plugins",
+ "浏览器窗口登录": "Browser window login",
+ "用户名(可选)": "Notification E-Mail auth username (optional)",
+ "由你的配置加载": "Loaded by your configuration",
+ "目录中暂无主题": "There are currently no topics in the directory",
+ "省 Token": "Save tokens",
+ "组合操作失败:": "Combination operation failed:",
+ "结果 JSON": "Result JSON",
+ "自定义时间范围": "Custom time range",
+ "诊断加载失败:": "Diagnostics failed to load:",
+ "请输入组合名称": "Please enter a portfolio name",
+ "输入 / 1M": "Input / 1M",
+ "输出 / 1M": "Output / 1M",
+ "还没有扫描结果": "No scans yet",
+ "重启前不再提醒": "Don't remind me again before restarting",
+ "重复的插件条目": "Duplicate plugin entry",
+ "DSH 内部": "DSH Internal",
+ "DSH 技能": "DSH Skills",
+ "EAC 模型": "EAC models",
+ "Star 数": "Number of Stars",
+ "上下文已压缩": "Context compacted",
+ "不再显示这条": "Don't show this again",
+ "了解项目结构": "Inspect Project Structure",
+ "会用你的密钥": "will use your key",
+ "低于声明下限": "Below Claim Lower Limit",
+ "保存当前状态": "Save Current State",
+ "保存环境变量": "Save Environment Variables",
+ "保留现有插件": "Keep existing plugins",
+ "全局 DSH": "Global DSH",
+ "关闭成本设置": "Close cost settings",
+ "关闭用量统计": "Close usage statistics",
+ "关闭自动刷新": "Disable auto refresh",
+ "最近 1 天": "Last 1 day",
+ "最近 1 年": "Last year",
+ "最近 7 天": "In the last 7 days",
+ "删除费率档位": "Delete rate tier",
+ "刷新统计数据": "Refresh statistics",
+ "卸载插件市场": "Uninstall Plugin Marketplace",
+ "发布时间范围": "Publish Time Range",
+ "启用完全权限": "Enable full access",
+ "回收站为空。": "Trash is empty.",
+ "复制安装命令": "Copy Install Command",
+ "安装前请注意": "Please note before installation",
+ "安装后它可以": "After installation it can be",
+ "宿主版本未知": "Host version unknown",
+ "宿主要求未知": "Unknown host request",
+ "密码(可选)": "Password (optional)",
+ "展开 {0}": "Expand",
+ "工作区内修改": "Modify within workspace",
+ "已是最新版本": "Up to date",
+ "已满足的依赖": "Satisfied Dependencies",
+ "已达两格上限": "Two-pane limit reached",
+ "市场显示空白": "Market Show Blank",
+ "开启自动刷新": "Enable auto refresh",
+ "恢复更新提醒": "Resume update alerts",
+ "成本统计设置": "Cost statistics settings",
+ "换用来源失败": "Failed to swap source",
+ "换用线上版本": "Switch to online version",
+ "插件市场设置": "Marketplace Settings",
+ "收起 {0}": "Collapse",
+ "改为安装这个": "Install this instead",
+ "日志导出失败": "Log export failed",
+ "显示文件位置": "Show file location",
+ "更多打开方式": "More ways to open",
+ "更新插件市场": "Update Plugin Marketplace",
+ "本页无法开关": "This page cannot be switched on or off",
+ "构建环境变量": "Build Environment Variables",
+ "查找这个插件": "Find this plugin",
+ "查看作者简介": "View author bio",
+ "核心包多版本": "Core Package Multiple Versions",
+ "没有依赖信息": "No dependency information",
+ "没有依赖警告": "No Dependency Warning",
+ "没有依赖风险": "No reliance on risk",
+ "没有覆盖关系": "No override relationships",
+ "清除失效收藏": "Clear Expired Favorites",
+ "版本发布时间": "Version release time",
+ "白嫖模型接入": "Free model access",
+ "目录建议改用": "Catalog recommended to use instead",
+ "目标不是分组": "Target is not a group",
+ "移除所选内容": "Remove selection",
+ "网关暂不可达": "Gateway unreachable",
+ "该组暂无成员": "There are no members in this group",
+ "请先选择会话": "Select a session first",
+ "超出声明上限": "Claim limit exceeded",
+ "运行构建脚本": "Run the build script",
+ "近 30 天": "Last 30 days",
+ "近 90 天": "Last 90 days",
+ "返回我的备注": "Back to my notes",
+ "退出当前账号": "Sign out of this account",
+ "采用建议顺序": "Adopt Suggested Order",
+ "项目 DSH": "Project DSH",
+ "高于显式上限": "Above Explicit Upper Limit",
+ "(已删除)": "(deleted)",
+ "{n}个月": "{n} months",
+ "{n}分钟": "{n} minutes",
+ "{n}小时": "{n} hours",
+ "⚪ 未登录": "⚪ Not signed in",
+ "✓ 已安装": "installed",
+ "AI 修复": "AI Repair",
+ "上下文窗口": "Context window",
+ "任务 ID": "Task ID",
+ "供应商用量": "Provider Usage",
+ "供应商筛选": "Provider filter",
+ "保存失败:": "SAVE FAILED:",
+ "保存并重启": "Save & Restart",
+ "全部供应商": "All providers",
+ "全部工作区": "All workspaces",
+ "关闭此提示": "Dismiss this notice",
+ "切换中……": "Switching…",
+ "创建新技能": "Create Skill",
+ "删除分组?": "Remove group",
+ "发现新版本": "New version available",
+ "名称不匹配": "Name mismatch",
+ "启动失败:": "Activation failed:",
+ "回收站为空": "Trash is empty",
+ "回滚失败:": "Rollback failed:",
+ "在本地打开": "Open locally",
+ "备份与恢复": "Backup and Recovery",
+ "备份已上传": "Backup uploaded",
+ "复制提示词": "Copy prompt",
+ "它会做什么": "What it will do",
+ "安装替代品": "Install Substitute",
+ "完整日志:": "Full Log",
+ "导入并预览": "Import and preview",
+ "峰谷计划 ": "Peak/off-peak plan",
+ "工作区别名": "Workspace Aliases",
+ "工作区用量": "Workspace Usage",
+ "工作区筛选": "Workspace filter",
+ "工具已更新": "Tools updated",
+ "已安装技能": "Installed Skills",
+ "已安装插件": "Installed Plugins",
+ "当前不可用": "Currently unavailable",
+ "快照与回滚": "Snapshots & Rollbacks",
+ "快照已创建": "Snapshot created",
+ "快照已删除": "Snapshots have been deleted.",
+ "手机号登录": "Phone number login",
+ "打开侧边栏": "Open sidebar",
+ "技能管理器": "Skills Manager",
+ "提醒已关闭": "Reminders are off",
+ "搜索插件…": "Search plugins by",
+ "搜索收藏…": "Search Collection",
+ "收起侧边栏": "Collapse sidebar",
+ "文件与环境": "Documents & Environment",
+ "暂无工作区": "No workspaces yet",
+ "服务商预设": "Provider Presets",
+ "未提供简介": "No description provided",
+ "未正常退出": "Exited abnormally",
+ "未知供应商": "Unknown provider",
+ "未知工作区": "Unknown workspace",
+ "查看替代品": "View substitutions",
+ "校验未通过": "Verification failed",
+ "检查并更新": "Check & Update",
+ "正在删除…": "Deleting…",
+ "正在加载…": "Loading...",
+ "正在卸载…": "Uninstalling",
+ "正在取消…": "Cancelling...",
+ "正在更新…": "Updating…",
+ "正在替换…": "Replacing...",
+ "正在检查…": "Checking…",
+ "正在读取…": "Reading…",
+ "正在配置…": "Configuring",
+ "正在重启…": "restarting",
+ "清空回收站": "Empty Trash",
+ "清空已完成": "Emptying completed",
+ "源文件只读": "Read-only",
+ "登录态探活": "Login health check",
+ "目标不存在": "The target does not exist",
+ "确认卸载?": "Uninstall Confirmation",
+ "移入回收站": "Move to Trash",
+ "移到回收站": "Move to Trash",
+ "系统提示词": "System Prompt",
+ "组合已保存": "Portfolio saved.",
+ "组合已删除": "Group deleted",
+ "缓存命中率": "Cache hit rate",
+ "能运行命令": "Ability to run commands",
+ "自动化任务": "Automated tasks",
+ "自定义规则": "Custom rules",
+ "请选择模型": "Select a model",
+ "近 7 天": "Last 7 days",
+ "还没有快照": "No snapshots yet",
+ "连通性测试": "Connectivity test",
+ "选择文件夹": "Choose Folder",
+ "重启后生效": "Reboot after changes are installed",
+ "重命名分组": "Rename Group",
+ "预览失败:": "Preview failed",
+ "(未知)": "(unknown)",
+ "{n}天": "{n} days",
+ "{n}年": "{n} years",
+ "一键安装": "Install",
+ "一键更新": "Update",
+ "一键领取": "Claim with 1-Click",
+ "上传备份": "Upload Backup",
+ "上次检查": "Last Checked",
+ "上游请求": "Upstream Requests",
+ "下次运行": "Next run",
+ "下载区域": "Download Region",
+ "下载图像": "Download image",
+ "不可驱动": "Cannot Drive",
+ "专家管理": "Expert Manager",
+ "中国大陆": "China Mainland",
+ "中继密钥": "Relay API Key",
+ "仅可查看": "View only",
+ "仍然安装": "Install Anyway",
+ "仍然更新": "Update Anyway",
+ "仓库管理": "Repositories",
+ "仓库订阅": "Repositories",
+ "代码审查": "Code Review",
+ "任务总览": "Tasks Overview",
+ "任务设置": "Task Settings",
+ "会话技能": "Session Skills",
+ "估算成本": "Estimated Cost",
+ "使用说明": "Instructions",
+ "依赖信息": "Dependency Info",
+ "依赖警告": "Dependency Warnings",
+ "依赖风险": "Dependency Risks",
+ "保存中…": "Saving...",
+ "保存修改": "Save changes",
+ "保存失败": "Save failed",
+ "停止生成": "Stop generating",
+ "停用其他": "Deactivate Other",
+ "允许并发": "Allow concurrency",
+ "免费模型": "Free models",
+ "免费额度": "Free quota",
+ "全局技能": "Global Skills",
+ "全屏浏览": "Fullscreen",
+ "全部保存": "Save All",
+ "全部停用": "Disable All",
+ "全部启用": "Enable All",
+ "全部插件": "All Plugins",
+ "全部时间": "Full Time",
+ "全部更新": "Update All",
+ "全部来源": "All Sources",
+ "全部模型": "All models",
+ "全部状态": "All Statuses",
+ "关闭提示": "Closure Prompt",
+ "关闭详情": "Close details",
+ "关闭预览": "Close Preview",
+ "内置插件": "Built-in plugins",
+ "最新版本": "Latest Version",
+ "准备依赖": "Prepare Dependencies",
+ "凭证来源": "Credential source",
+ "分组名称": "Group name",
+ "切换失败": "Switch failed",
+ "创建中…": "Creating...",
+ "创建位置": "Location",
+ "创建快照": "Create Snapshot",
+ "创建技能": "Create Skill",
+ "创建时间": "Created",
+ "删除中…": "deleting...",
+ "删除分组": "Remove group",
+ "删除时段": "Delete period",
+ "删除规则": "Delete rule",
+ "刷新页面": "Refresh page ",
+ "前面还有": "There's more up ahead.",
+ "加入收藏": "Add Favorites",
+ "加载中…": "Loading...",
+ "加载失败": "Load failed",
+ "加载更多": "Load more",
+ "包含文件": "File Inlcuded",
+ "卸载中…": "Uninstalling",
+ "历史会话": "History",
+ "发布时间": "Release time",
+ "发现技能": "Discover Skills",
+ "发现问题": "Recognise there is a problem",
+ "发送消息": "Send message",
+ "取消安装": "Cancel the installation",
+ "取消屏蔽": "Unmask",
+ "取消归档": "Unarchive",
+ "取消收藏": "Uncollect",
+ "取消标记": "Unmark",
+ "取消编辑": "Cancel edit",
+ "取消置顶": "Unpin",
+ "可用技能": "Available Skills",
+ "可选依赖": "Optional Dependencies",
+ "同步中…": "Syncing…",
+ "启停技能": "Toggle Skill",
+ "启停来源": "Toggle Source",
+ "启动失败": "Start failed",
+ "回到顶部": "Back to the top",
+ "回滚中…": "Rolling back...",
+ "图片预览": "Image preview",
+ "处理中…": "Processing…",
+ "复制失败": "Copy failed",
+ "复制成功": "Copied",
+ "复制指令": "Copy instructions",
+ "复制路径": "Copy path",
+ "外观设置": "Appearance",
+ "子智能体": "Subagent",
+ "安装中…": "Installing...",
+ "安装命令": "Installation Commands",
+ "安装失败": "Installation was unsuccessful",
+ "完全权限": "Full access",
+ "实际版本": "Actual Version",
+ "宿主版本": "Host Version",
+ "导入技能": "Import Skill",
+ "导出中…": "Exporting",
+ "导出备份": "Exported Backups",
+ "导出技能": "Export Skill",
+ "导出日志": "Export As JSON",
+ "展开全部": "Expand All",
+ "工具调用": "Tool call",
+ "已导出:": "Exported",
+ "已是最新": "Up To Date",
+ "已有主题": "Existing topic",
+ "应用顺序": "Order of Application",
+ "开始恢复": "Begin Rollback",
+ "开始时间": "Start time",
+ "异常诊断": "Diagnostics",
+ "归档会话": "Archive session",
+ "当前出口": "Current egress",
+ "当前来源": "Current Source:",
+ "当前版本": "Current Version",
+ "快捷预设": "Quick presets",
+ "恢复失败": "Backup succeeded with an warning.",
+ "恢复提醒": "Resume Reminder",
+ "恢复自动": "Restore Auto",
+ "恢复默认": "Restore Defaults",
+ "我的备注": "My notes",
+ "手动输入": "Manual input.",
+ "执行中…": "Running…",
+ "技能列表": "Skills List",
+ "技能来源": "Skill Sources",
+ "技能管理": "Skills Manager",
+ "拖拽排序": "Drag to Reorder",
+ "指纹清理": "Fingerprint cleanup",
+ "排序方向": "SORT DIRECTION",
+ "排队发送": "Queued to send",
+ "提交记录": "Submit Record",
+ "插件列表": "Plugin list",
+ "插件升级": "Plugin upgrade",
+ "插件市场": "Plugin Marketplace",
+ "插件组合": "Plugin Portfolio",
+ "插话发送": "Send interjection",
+ "搜索会话": "Search sessions",
+ "搜索插件": "Search plugins...",
+ "操作失败": "Operation Failed",
+ "收录时间": "Listed on",
+ "收起输出": "Collapse output",
+ "放弃修改": "Discard changes",
+ "数据看板": "Dashboard",
+ "文件要求": "File Requirements",
+ "新建分组": "Group Adding",
+ "新建技能": "New Skill",
+ "无法恢复": "Can't Redo",
+ "时间范围": "Time range",
+ "显示全部": "Show All",
+ "显示名称": "Display name",
+ "暂不可用": "Temporarily unavailable",
+ "暂无会话": "No sessions",
+ "暂无技能": "No skills available",
+ "暂无数据": "No data available",
+ "暂无预览": "No preview yet",
+ "更多分类": "More category",
+ "更换主题": "switch_themes",
+ "更新中…": "Updating...",
+ "更新内容": "Update of Content",
+ "更新失败": "Gagal Update",
+ "更新时间": "Updated",
+ "更新通道": "Update channel",
+ "有新版本": "Update Available",
+ "未知原因": "Unknown reason",
+ "未知模型": "Unknown model",
+ "未知版本": "unknown",
+ "本地开发": "Native Development",
+ "本地文件": "Local File",
+ "术语说明": "A few words about terms",
+ "查看仓库": "View Repository",
+ "查看诊断": "View Diagnostics",
+ "查看详情": "View Details",
+ "查看说明": "View Documentation",
+ "查询中…": "Querying…",
+ "格式错误": "Format salah.",
+ "检查中…": "Checking…",
+ "检查更新": "Check Updates",
+ "模型清单": "Model catalog",
+ "模型用量": "Model Usage",
+ "模型筛选": "Model filter",
+ "模型设置": "Model Settings",
+ "正在下载": "Downloading...",
+ "正在处理": "(In work)",
+ "正在安装": "Installing...",
+ "残留目录": "Residual Catalog",
+ "永久删除": "Delete Forever",
+ "没有警告": "No warnings",
+ "没有错误": "No Errors",
+ "浅色模式": "Light Mode",
+ "测试中…": "Testing…",
+ "测量中…": "Measuring…",
+ "深色模式": "Dark Mode",
+ "混合查看": "Combined view",
+ "添加备注": "Add note for seller",
+ "添加成员": "Add Member",
+ "添加插件": "Add plugin",
+ "添加账号": "Add account",
+ "清空搜索": "Clear search",
+ "清除中…": "Cleaning...",
+ "清除搜索": "Clear search",
+ "清除筛选": "Clear filters",
+ "版本说明": "Imprint",
+ "用量统计": "Usage Statistics",
+ "界面语言": "Interface language",
+ "登录状态": "Login status",
+ "监听地址": "Listen address",
+ "确认删除": "Confirm Deletion",
+ "确认卸载": "Uninstall Confirmation",
+ "确认回滚": "Confirm Rollback",
+ "确认安装": "Install Confirmation",
+ "确认恢复": "Confirm to resume",
+ "确认换用": "Confirm Replacement",
+ "确认更新": "Confirm Update",
+ "确认移除": "Confirm removal",
+ "移出主题": "Move out of topic",
+ "移出队列": "Move out of queue",
+ "立即创建": "Create Now",
+ "立即执行": "Execute Now",
+ "立即更新": "Update Now",
+ "立即重启": "Restart immediately",
+ "等待依赖": "Waiting for dependencies",
+ "等待回答": "Awaiting answer",
+ "等待审批": "Awaiting approval",
+ "简体中文": "Simplified Chinese",
+ "管理更新": "Manage Updates",
+ "组合名称": "Combo Name",
+ "继续更新": "Continue updating",
+ "缓存写入": "Cache Write",
+ "缓存命中": "Cache Hit",
+ "缓存读取": "Cache read",
+ "编辑备注": "Edit note",
+ "缺少标识": "id is missing",
+ "网关设置": "Gateway settings",
+ "网页搜索": "Web search",
+ "置顶会话": "Pin session",
+ "聚合渠道": "Aggregated channels",
+ "自动刷新": "Auto refresh",
+ "自动换行": "Word Wrap",
+ "自动排序": "AutoSort",
+ "自动配置": "Automatic Configuration",
+ "要求版本": "Requires Version",
+ "覆盖关系": "Override Relationship",
+ "计划待审": "Plan awaiting review",
+ "诊断异常": "Diagnostics",
+ "语言设置": "Language",
+ "请求日志": "Request log",
+ "读取中…": "Reading…",
+ "调整插件": "Tweak plugin",
+ "调用台账": "Call ledger",
+ "调用次数": "Call count",
+ "调用状态": "Invocation Status",
+ "跟随系统": "Follow System",
+ "输入口径": "Input basis",
+ "运行命令": "Run command",
+ "运行日志": "Runtime log",
+ "运行版本": "Running version",
+ "近30天": "Last 30 Days",
+ "进入目录": "Enter directory",
+ "退出全屏": "Exit fullscreen",
+ "退出登录": "Sign out",
+ "选择主题": "Theme selection",
+ "选择文件": "Choose File",
+ "通用设置": "General Settings",
+ "部分启用": "Partially enabled",
+ "重启失败": "Restart failed",
+ "重新加载": "Reload",
+ "重新检查": "Recheck",
+ "重新生成": "Regenerate",
+ "重置草稿": "Reset to Draft",
+ "链接依赖": "Link Dependency",
+ "错误详情": "Hide Error Details",
+ "问题反馈": "Issues",
+ "间隔上限": "Maximum interval",
+ "间隔下限": "Minimum interval",
+ "项目别名": "Project Alias",
+ "项目技能": "Project Skills",
+ "项需处理": "Items need to be processed",
+ "验证连接": "Verify Connection",
+ " 至 ": " to ",
+ "上一张": "Previous",
+ "上一步": "Back",
+ "上一页": "Previous Page",
+ "上下文": "Context",
+ "下一张": "Next",
+ "下一步": "Next",
+ "下一页": "Next Page",
+ "下一题": "Next question",
+ "下载中": "Downloading...",
+ "下载量": "Downloads",
+ "不可用": "Unavailable",
+ "不安装": "Not Installed",
+ "不支持": "Not Supported",
+ "不满足": "Not satisfied",
+ "主菜单": "Main Menu",
+ "仅一次": "Once only",
+ "会联网": "Will be networked",
+ "使用中": "In Use",
+ "全不选": "Deselect All",
+ "分配到": "Assigned To",
+ "切换至": "switch to ",
+ "删除于": "Deleted at",
+ "加载中": "Loading",
+ "卸载中": "Uninstalling...",
+ "去充值": "Add credit",
+ "发布于": "In",
+ "启用中": "Activating",
+ "命中率": "Hit rate",
+ "回收站": "Trash",
+ "安装中": "Installing...",
+ "工作区": "Workspace",
+ "已中断": "Interrupted",
+ "已保存": "Saved",
+ "已停止": "Stopped",
+ "已停用": "Disabled",
+ "已关闭": "Closed",
+ "已删除": "Deleted",
+ "已卸载": "Uninstalled",
+ "已压缩": "Compacted",
+ "已取消": "Canceled",
+ "已启用": "Enabled",
+ "已复制": "Copied",
+ "已失败": "Failed",
+ "已安装": "Installed",
+ "已完成": "Complete",
+ "已屏蔽": "blocked",
+ "已废弃": "Obsolete",
+ "已截断": "Truncated",
+ "已生效": "Berlaku",
+ "已移除": "Removed",
+ "已结束": "Ended",
+ "已覆盖": "Overridden",
+ "已解除": "Cleared",
+ "开发版": "The7 Dev",
+ "待处理": "Pending",
+ "待审批": "Pending approval",
+ "快捷键": "Shortcuts",
+ "总处理": "Total processed",
+ "按模型": "By model",
+ "按账号": "By account",
+ "排队中": "In queue:",
+ "提供商": "Provider",
+ "提供方": "Provider",
+ "新会话": "New Session",
+ "无内容": "No content",
+ "无变更": "No change",
+ "无输出": "No output",
+ "更新中": "Updating...",
+ "未分组": "Not Grouped",
+ "未启用": "Disabled",
+ "未安装": "Not Installed",
+ "未生效": "Unactivated",
+ "未确认": "Unconfirmed",
+ "未计价": "Not priced",
+ "未运行": "Not running",
+ "未配置": "Not configured",
+ "来源:": "Source: ",
+ "每分钟": "Every minute",
+ "每小时": "Every hour",
+ "源文件": "Source File",
+ "知道了": "Got it",
+ "稳定版": "Stable",
+ "纯文本": "Plain text",
+ "自定义": "Custom",
+ "被覆盖": "Shadowed",
+ "覆盖了": "Overwritten",
+ "请求数": "Requests",
+ "账号库": "Account pool",
+ "运行中": "Running",
+ "进行中": "In progress",
+ "重命名": "Rename",
+ "阿里系": "Alibaba family",
+ " 天": " days",
+ "上移": "Move Up",
+ "下移": "Move Down",
+ "专家": "Experts",
+ "个人": "Personal",
+ "中文": "Chinese",
+ "主题": "Themes",
+ "今日": "Today",
+ "代码": "Code",
+ "任务": "Tasks",
+ "会话": "Sessions",
+ "位置": "Location",
+ "作者": "Author",
+ "使用": "Use",
+ "依赖": "Dependencies",
+ "保存": "Save",
+ "保留": "Preserve",
+ "信息": "information",
+ "停用": "Disable",
+ "全屏": "Full screen",
+ "全球": "Global",
+ "全选": "Select All",
+ "全部": "All",
+ "关于": "About",
+ "关闭": "Close",
+ "其他": "Other",
+ "内容": "Content",
+ "最新": "Recent",
+ "最旧": "Oldest",
+ "冲突": "Tension",
+ "分组": "Group",
+ "分钟": "minute",
+ "列表": "Vertical",
+ "刚刚": "Just now",
+ "创建": "Buat",
+ "删除": "Delete",
+ "刷新": "Refresh",
+ "加入": "Add",
+ "助手": "Assistant",
+ "升序": "ascending",
+ "单次": "Once",
+ "卸载": "Uninstall",
+ "压缩": "Compact",
+ "原文": "Original Text",
+ "参数": "Parameters",
+ "反馈": "Feedback",
+ "发现": "Discover",
+ "发送": "Send",
+ "取消": "Cancel",
+ "只读": "Read-only",
+ "可用": "Available",
+ "名称": "Name",
+ "启用": "Enable",
+ "周一": "Monday",
+ "周三": "Wednesday",
+ "周二": "Tuesday",
+ "周五": "Friday",
+ "周六": "Saturday",
+ "周四": "Thursday",
+ "周日": "Sunday",
+ "回合": "Turn",
+ "回滚": "Rollback",
+ "图片": "Image",
+ "备份": "Backup",
+ "复制": "Copy",
+ "大小": "Size",
+ "失败": "Failed",
+ "安装": "Install",
+ "完成": "Done",
+ "官方": "Offical",
+ "密钥": "Key",
+ "对话": "Conversation",
+ "导入": "Import",
+ "导出": "Export",
+ "小时": "hour",
+ "层级": "Level",
+ "屏蔽": "Block",
+ "展开": "Expand",
+ "工具": "Tool",
+ "应用": "Applications",
+ "异常": "Error",
+ "当前": "Current",
+ "思考": "Thinking",
+ "总计": "Total",
+ "恢复": "Restore",
+ "成本": "Cost",
+ "打开": "Open",
+ "执行": "Go",
+ "技能": "Skills",
+ "折叠": "Collapse",
+ "拒绝": "Deny",
+ "指令": "Instructions",
+ "排序": "Sort",
+ "推理": "Reasoning",
+ "推荐": "Featured",
+ "描述": "Description",
+ "提交": "Submit",
+ "插件": "Plugin",
+ "搜索": "Search",
+ "撤销": "Undo",
+ "操作": "Actions",
+ "收藏": "Favorites",
+ "收起": "Collapse",
+ "文件": "File",
+ "新增": "Added",
+ "日期": "Date",
+ "时区": "Time zone",
+ "时长": "Duration",
+ "时间": "Time",
+ "显示": "Show",
+ "更多": "More",
+ "更新": "Update",
+ "未知": "Unknown",
+ "本地": "Local",
+ "本机": "This machine",
+ "权限": "Permissions",
+ "来源": "Source",
+ "查看": "View",
+ "标准": "Standard",
+ "模型": "Models",
+ "正文": "Body",
+ "步骤": "Steps",
+ "每周": "Weekly",
+ "每天": "Daily",
+ "每页": "Per page",
+ "测试": "Test",
+ "消息": "Message",
+ "添加": "Add",
+ "清除": "Clear",
+ "源码": "Source code",
+ "满足": "Confirmed",
+ "热门": "Popular",
+ "版本": "Version",
+ "状态": "Status",
+ "用户": "User",
+ "用量": "Usage",
+ "登录": "Sign in",
+ "目录": "Table of Contents",
+ "目标": "Goal",
+ "确定": "OK",
+ "确认": "Confirmation",
+ "社区": "COMMUNITY",
+ "移出": "Emigration",
+ "移除": "Remove",
+ "空闲": "Idle",
+ "端口": "Port",
+ "筛选": "Filter Bar",
+ "简介": "Description",
+ "简洁": "Concise",
+ "类型": "Type",
+ "终端": "Terminal",
+ "结果": "Result",
+ "继续": "Continue",
+ "编辑": "Edit",
+ "网络": "networks",
+ "耗时": "Duration",
+ "脚注": "Footnote",
+ "英文": "English",
+ "范围": "Range",
+ "计划": "Plan",
+ "设置": "Settings",
+ "访达": "Finder",
+ "评分": "Rating",
+ "评论": "Comments",
+ "诊断": "Diagnosis: ",
+ "详情": "Details",
+ "详细": "Detailed",
+ "语言": "Language",
+ "调用": "Call",
+ "警告": "WARNING",
+ "账号": "Account",
+ "路由": "Routing",
+ "跳过": "Skip",
+ "轮次": "Turns",
+ "输入": "Input",
+ "输出": "Output",
+ "退出": "Exit",
+ "速度": "Speed",
+ "重启": "Restart",
+ "重复": "Repeat",
+ "重试": "Retry",
+ "错误": "Error:",
+ "降序": "descending",
+ "隐藏": "Hide",
+ "顶层": "top floor",
+ "顺序": "Sequence",
+ "预览": "Prev",
+ "风险": "Hazard",
+ "首字": "First token",
+ "高级": "III",
+ "一": "1",
+ "三": "3",
+ "二": "2",
+ "五": "5",
+ "六": "6",
+ "分": "min",
+ "四": "4",
+ "多": "More",
+ "天": "Day",
+ "少": "Less",
+ "无": "None",
+ "日": "Day",
+ "月": "Month",
+ "秒": "sec"
+}
diff --git a/src/index.ts b/src/index.ts
index b5b569a..0025e05 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,6 +1,84 @@
-export const name = "chinese2english";
-export const inject = [];
+import { translateScript } from "./rewrite.js";
-export function apply(ctx: any) {
- // Service initialized
+export const name = "chinese2english";
+export const inject = ["clientModules"];
+
+const JS_TYPE = /^text\/javascript\b/i;
+// Combo requests look like `/plugins/??a/client.js,b/client.js&rev=...`: the
+// path is only `/plugins/`, so the file names live in the query string and the
+// test has to run against the whole URL. Source maps (`client.js.map`) do not
+// match because `.js` is followed by `.`, not a separator.
+const JS_URL = /\.js(?:[,&?]|$)/;
+const MAX_BODY = 16 * 1024 * 1024;
+const MAX_CACHE = 64;
+
+function isScriptUrl(url: string): boolean {
+ return JS_URL.test(url);
+}
+
+/**
+ * Translates Chinese UI text at the bundle transport layer.
+ *
+ * Every third-party plugin bundle is served through `/plugins/...` by the
+ * clientModules service, and combination bundles carry several plugins in one
+ * body. Intercepting the response here reaches all of them at once, before any
+ * code runs, without touching React trees or the locale store.
+ *
+ * `bundleResource` yields the body as a Buffer, so the wrapper decodes UTF-8,
+ * rewrites, and hands the bytes back in the shape the server expects.
+ */
+export function apply(ctx: any) {
+ const registry = ctx.clientModules;
+ if (!registry || typeof registry.bundleResource !== "function") {
+ console.error("[chinese2english] clientModules.bundleResource unavailable; translation disabled");
+ return;
+ }
+
+ const original = registry.bundleResource;
+ const cache = new Map();
+
+ registry.bundleResource = async function (method: string, url: string, ...rest: any[]) {
+ const response = await original.call(this, method, url, ...rest);
+
+ if (response?.status !== 200) return response;
+ if (!isScriptUrl(url)) return response;
+
+ const raw = response.body;
+ const isBuffer = Buffer.isBuffer(raw);
+ if (!isBuffer && typeof raw !== "string") return response;
+
+ const contentType = response.headers?.["content-type"];
+ if (typeof contentType !== "string" || !JS_TYPE.test(contentType)) return response;
+ if (raw.length > MAX_BODY) return response;
+
+ try {
+ let body = cache.get(url);
+ if (body === undefined) {
+ const source = isBuffer ? raw.toString("utf8") : raw;
+ const rewritten = translateScript(source);
+ // Preserve the incoming body type: the Web route accepts either, but
+ // `fetchBundle` hands the value to `Uint8Array.from`.
+ body = isBuffer ? Buffer.from(rewritten, "utf8") : rewritten;
+ if (cache.size >= MAX_CACHE) {
+ const oldest = cache.keys().next();
+ if (!oldest.done) cache.delete(oldest.value);
+ }
+ cache.set(url, body);
+ }
+ if (method === "HEAD") return response;
+ if (typeof body === "string") {
+ if (body === raw) return response;
+ } else if (body.length === raw.length && (!isBuffer || body.equals(raw))) {
+ return response;
+ }
+ return {
+ ...response,
+ headers: { ...response.headers, "cache-control": "no-cache" },
+ body,
+ };
+ } catch (error) {
+ console.error(`[chinese2english] could not translate ${url}:`, error);
+ return response;
+ }
+ };
}
diff --git a/src/rewrite.ts b/src/rewrite.ts
new file mode 100644
index 0000000..bae8ebb
--- /dev/null
+++ b/src/rewrite.ts
@@ -0,0 +1,118 @@
+import DICTIONARY from "./dictionary.json";
+import { decodeRaw, encodeValue, isObjectKeyPosition, scanLiterals } from "./strings.js";
+
+const CHINESE = /[\u4e00-\u9fa5]/;
+
+// Longest key first so the segmentation below prefers `缓存命中率` over `缓存命中`.
+const KEYS = Object.keys(DICTIONARY).sort((a, b) => b.length - a.length);
+
+// Keys grouped by their first character: the cover search only ever needs to
+// try keys that can actually start at the current offset.
+const BY_FIRST = new Map();
+for (const key of KEYS) {
+ const first = key[0];
+ const bucket = BY_FIRST.get(first);
+ if (bucket) bucket.push(key);
+ else BY_FIRST.set(first, [key]);
+}
+
+/**
+ * Translates a Chinese string only when the whole string is accounted for.
+ *
+ * Chinese has no word boundaries, so replacing known keys wherever they occur
+ * rewrites fragments of larger words: `当前工作区` would become
+ * `Saat IniWorkspace`. Instead the string is segmented left to right, and a
+ * translation is emitted only when every Chinese character is covered by a
+ * dictionary key. Anything else is left in Chinese, because half-translated
+ * text is worse than untranslated text.
+ */
+export function substitute(value: string): string {
+ if (!CHINESE.test(value)) return value;
+ if (DICTIONARY[value] !== undefined) return DICTIONARY[value];
+
+ const pieces: string[] = [];
+ let i = 0;
+
+ while (i < value.length) {
+ const char = value[i];
+ if (!CHINESE.test(char)) {
+ // Non-Chinese glue (spaces, ASCII, punctuation, placeholders) is copied
+ // through; it never blocks coverage on its own.
+ let j = i;
+ while (j < value.length && !CHINESE.test(value[j])) j++;
+ pieces.push(value.slice(i, j));
+ i = j;
+ continue;
+ }
+
+ const candidates = BY_FIRST.get(char);
+ let match: string | undefined;
+ if (candidates) {
+ for (const key of candidates) {
+ if (value.startsWith(key, i)) {
+ match = key;
+ break;
+ }
+ }
+ }
+ if (match === undefined) return value;
+ pieces.push(DICTIONARY[match]);
+ i += match.length;
+ }
+
+ return pieces.join("");
+}
+
+export function hasChinese(text: string): boolean {
+ return CHINESE.test(text);
+}
+
+/**
+ * Rewrites Chinese UI text inside JavaScript string literals.
+ *
+ * Returns the original string unchanged when nothing was translated, so the
+ * caller can skip rebuilding the response. Object keys are deliberately left
+ * alone: translating `{ "中文": 1 }` would break the lookup that reads it.
+ */
+export function rewriteScript(source: string): string {
+ if (!hasChinese(source)) return source;
+
+ const spans = scanLiterals(source);
+ let out = "";
+ let cursor = 0;
+ let changed = false;
+
+ for (const span of spans) {
+ if (span.quote === "`") continue;
+ if (span.raw.includes("${")) continue;
+ if (isObjectKeyPosition(source, span)) continue;
+
+ const value = decodeRaw(span.raw);
+ if (!hasChinese(value)) continue;
+
+ const next = substitute(value);
+ if (next === value) continue;
+
+ out += source.slice(cursor, span.start) + span.quote + encodeValue(next, span.quote) + span.quote;
+ cursor = span.end;
+ changed = true;
+ }
+
+ return changed ? out + source.slice(cursor) : source;
+}
+
+/** Compiles the candidate so a bad rewrite can never reach the browser. */
+export function compiles(source: string): boolean {
+ try {
+ new Function(source);
+ return true;
+ } catch {
+ return false;
+ }
+}
+
+export function translateScript(source: string): string {
+ const next = rewriteScript(source);
+ if (next === source) return source;
+ return compiles(next) ? next : source;
+}
diff --git a/src/strings.ts b/src/strings.ts
new file mode 100644
index 0000000..57c67d3
--- /dev/null
+++ b/src/strings.ts
@@ -0,0 +1,150 @@
+// String-literal scanner: finds JavaScript string/template literals without a
+// parser, skipping comments and regex literals so their contents stay intact.
+
+const REGEX_PREFIX = new Set([
+ "", "(", ",", "=", ":", "[", "!", "&", "|", "?", "{", "}", ";", "+", "-", "*", "%", "~", "^", "<", ">", "\n",
+]);
+
+export interface LiteralSpan {
+ start: number;
+ end: number;
+ quote: string;
+ raw: string;
+}
+
+export function scanLiterals(src: string): LiteralSpan[] {
+ const out: LiteralSpan[] = [];
+ const n = src.length;
+ let i = 0;
+ let lastSig = "";
+ while (i < n) {
+ const c = src[i];
+ if (c === "/" && src[i + 1] === "/") {
+ const e = src.indexOf("\n", i);
+ i = e < 0 ? n : e + 1;
+ continue;
+ }
+ if (c === "/" && src[i + 1] === "*") {
+ const e = src.indexOf("*/", i + 2);
+ i = e < 0 ? n : e + 2;
+ continue;
+ }
+ if (c === "/" && REGEX_PREFIX.has(lastSig)) {
+ let j = i + 1;
+ let inClass = false;
+ let ok = false;
+ while (j < n) {
+ const d = src[j];
+ if (d === "\\") {
+ j += 2;
+ continue;
+ }
+ if (d === "\n") break;
+ if (d === "[") inClass = true;
+ else if (d === "]") inClass = false;
+ else if (d === "/" && !inClass) {
+ ok = true;
+ break;
+ }
+ j++;
+ }
+ if (ok) {
+ i = j + 1;
+ lastSig = "/";
+ continue;
+ }
+ }
+ if (c === '"' || c === "'" || c === "`") {
+ let j = i + 1;
+ while (j < n) {
+ const d = src[j];
+ if (d === "\\") {
+ j += 2;
+ continue;
+ }
+ if (d === c) break;
+ j++;
+ }
+ if (j < n) {
+ out.push({ start: i, end: j + 1, quote: c, raw: src.slice(i + 1, j) });
+ i = j + 1;
+ lastSig = c;
+ continue;
+ }
+ i = n;
+ continue;
+ }
+ if (!/\s/.test(c)) lastSig = c;
+ i++;
+ }
+ return out;
+}
+
+export function decodeRaw(raw: string): string {
+ if (!raw.includes("\\")) return raw;
+ let out = "";
+ for (let i = 0; i < raw.length; i++) {
+ const c = raw[i];
+ if (c !== "\\") {
+ out += c;
+ continue;
+ }
+ const d = raw[++i];
+ switch (d) {
+ case "n": out += "\n"; break;
+ case "r": out += "\r"; break;
+ case "t": out += "\t"; break;
+ case "b": out += "\b"; break;
+ case "f": out += "\f"; break;
+ case "v": out += "\v"; break;
+ case "0": out += "\0"; break;
+ case "x": out += String.fromCharCode(parseInt(raw.slice(i + 1, i + 3), 16)); i += 2; break;
+ case "u":
+ if (raw[i + 1] === "{") {
+ const close = raw.indexOf("}", i + 2);
+ if (close < 0) { out += "u"; break; }
+ out += String.fromCodePoint(parseInt(raw.slice(i + 2, close), 16));
+ i = close;
+ } else {
+ out += String.fromCharCode(parseInt(raw.slice(i + 1, i + 5), 16));
+ i += 4;
+ }
+ break;
+ case "\n": break;
+ case "\r": if (raw[i + 1] === "\n") i++; break;
+ default: out += d;
+ }
+ }
+ return out;
+}
+
+export function encodeValue(value: string, quote: string): string {
+ let out = "";
+ for (const ch of value) {
+ if (ch === "\\") out += "\\\\";
+ else if (ch === quote) out += "\\" + quote;
+ else if (ch === "\n") out += "\\n";
+ else if (ch === "\r") out += "\\r";
+ else if (ch === "\u2028") out += "\\u2028";
+ else if (ch === "\u2029") out += "\\u2029";
+ else out += ch;
+ }
+ if (quote === "`") out = out.replace(/\$\{/g, "\\${");
+ return out;
+}
+
+// The character before this literal, ignoring whitespace/comments-free trivia.
+// Used to spot a genuine object key (`{ "中文": …`) and leave it alone.
+export function precedingSignificant(src: string, index: number): string {
+ let i = index - 1;
+ while (i >= 0 && /\s/.test(src[i])) i--;
+ return i < 0 ? "" : src[i];
+}
+
+export function isObjectKeyPosition(src: string, span: LiteralSpan): boolean {
+ const prev = precedingSignificant(src, span.start);
+ if (prev !== "{" && prev !== ",") return false;
+ let j = span.end;
+ while (j < src.length && /\s/.test(src[j])) j++;
+ return src[j] === ":";
+}