src/docs/plugin-sdk-development.md
plugin.json 到运行时服务实例的生命周期。STranslate.Plugin/IPlugin.cs
Init(IPluginContext)、GetSettingUI()、Dispose()。STranslate.Plugin/IPluginContext.cs
HttpService、Logger、AudioPlayer、Snackbar、Notification、配置存储、主题应用。STranslate.Plugin/IHttpService.cs
STranslate.Plugin/ITranslatePlugin.cs
TranslatePluginBase、LlmTranslatePluginBase、DictionaryPluginBase。STranslate.Plugin/IOcrPlugin.cs、ITtsPlugin.cs、IVocabularyPlugin.cs
STranslate.Plugin/PluginMetaData.cs、Service.cs
Plugins/*/Main.csPlugins/*/plugin.jsonplugin.json、执行 dll、图标资源。PluginManager 读取 plugin.json,加载程序集并定位实现 IPlugin 的类型。ServiceManager 基于 PluginMetaData 创建 Service:绑定 Plugin 实例与 PluginContext。Service.Initialize() 调用 Plugin.Init(Context),插件读取自身配置并准备可执行状态。GetSettingUI(),插件返回自身配置面板控件。Init 内调用 context.LoadSettingStorage<T>() 读取配置。context.SaveSettingStorage<T>() 持久化。Service.Dispose() 调用 Context.Dispose() 与 Plugin.Dispose() 释放资源。plugin.json 规范PluginMetaData 对应):
PluginID:插件唯一 ID(升级与去重依据)。NameDescriptionAuthorVersionWebsiteExecuteFileNameIconPathPluginMetaData:插件静态元信息 + 运行时路径与类型。Service:插件实例容器,含 ServiceID、DisplayName、Options。TranslateRequest / TranslateResult、DictionaryResult、OcrRequest / OcrResult、VocabularyResult:能力结果模型。OcrRequest.PixelWidth / PixelHeight 由宿主在截图 OCR、OCR 窗口和图片翻译中传入真实图片尺寸,旧插件可忽略。OcrResult.OcrContents 是兼容旧插件的扁平文本块列表。OcrResult.Regions 可返回结构化分段,层级为 OcrRegion -> OcrParagraph -> OcrContent。OcrContent.BoxPoints、OcrRegion.BoxPoints、OcrParagraph.BoxPoints 均使用图片像素坐标;宿主不再接收归一化坐标单位声明。IOcrPlugin.SupportBoxPoints() 默认返回 false,普通 OCR 不要求插件支持文本坐标框。SupportBoxPoints() 并返回 true,否则不会出现在图片翻译 OCR 选择列表。OcrResult.Regions;Auto / Provider 模式会按是否存在有效 Regions 判断结构化分段。Auto / Provider / Smart 分段策略和结构化分段影响见 flow-image-translation.md。LangEnum:语言枚举,当前包含 Uzbek;新增语言时需要同步主程序语言检测、内置插件语言映射和本地化文本。IOcrPlugin;想进入图片翻译 OCR 下拉列表时,必须实现 SupportBoxPoints() => true。OcrResult.Regions 应按服务商真实区域、段落、行填充。OcrParagraph.Lines 内的每个 OcrContent 应带文本和坐标。OcrParagraph.BoxPoints 可直接返回服务商段落框;不返回时宿主会用行框求外接框。OcrRegion.BoxPoints 可返回区域框;不返回不影响图片翻译。OcrContents:
OcrContent 仍必须有坐标框,否则图片翻译无法稳定覆盖和选中。Smart 分段推断段落、表格和网格项。OcrRequest.PixelWidth / PixelHeight 换算后再写入 BoxPoints。OcrContent;这会让宿主无法恢复准确翻译粒度。GetAsync()、PostAsync()、PostFormAsync(),通过 Options 传入请求头、查询参数、超时与内容类型。DownloadFileAsync(),传入 IProgress<DownloadProgress> 获取下载进度。StreamPostAsync(url, content, onDataReceived, options, cancellationToken) 适合回调式消费。StreamPostAsyncEnumerable(url, content, options, cancellationToken) 适合 await foreach 消费。serviceName 的重载,可复用指定服务 HTTP 客户端配置。CancellationToken 继续传给 HTTP 接口;流式取消会以取消状态向上传播。TranslatePluginBase。LlmTranslatePluginBase(内置 Prompt 选择机制)。DictionaryPluginBase。IOcrPlugin、ITtsPlugin、IVocabularyPlugin。SupportBoxPoints() 返回 true 并为 OCR 内容返回图片像素坐标 BoxPoints。Settings.RequestMode 支持 Default 与 EdgeToken 两种请求方案。EdgeToken 模式会缓存授权 Token,并在过期前刷新。__NEXT_DATA__,需同时处理 Next.js HTML 与直接 JSON 两类响应。DictionaryResultType.NoResult,避免错误词条污染历史。STranslate.Plugin/IPlugin.csSTranslate.Plugin/IPluginContext.csSTranslate.Plugin/IHttpService.csSTranslate.Plugin/ITranslatePlugin.csSTranslate.Plugin/IOcrPlugin.csSTranslate.Plugin/ITtsPlugin.csSTranslate.Plugin/IVocabularyPlugin.csSTranslate.Plugin/PluginMetaData.csSTranslate.Plugin/Service.csPlugins/STranslate.Plugin.Translate.OpenAI/Main.csPlugins/STranslate.Plugin.Ocr.OpenAI/Main.csPlugins/STranslate.Plugin.Tts.MicrosoftEdge/Main.csPlugins/STranslate.Plugin.Vocabulary.Eudict/Main.csMain.cs。plugin.json 与图标。Init 中加载配置并在设置 UI 中可编辑。Settings 模型,再在 GetSettingUI() 对应 VM 中读写并调用 SaveSettingStorage。TranslateAsync / RecognizeAsync / SaveAsync 应尊重 CancellationToken。PluginID 稳定,升级仅提升 Version,避免被识别为新插件。StreamPostAsyncEnumerable(),按行解析服务返回,避免在插件里重复实现 HttpClient 流读取。LangEnum、主程序本地化、语言检测映射、官方插件语言映射与 STranslate.Plugin/README.md 版本说明。