如何在C#中对DeepL现有术语表进行增删改操作?
解决DeepL API术语表动态增删改的C#实现
现状说明
DeepL官方API目前不支持术语表的增量更新(添加、修改、删除单个词条),仅提供创建、删除和导出整个术语表的接口。因此需要基于现有接口自行实现词条的动态管理逻辑。
核心实现思路
针对每个语言对(比如EN→DE、EN→FR、EN→ES)维护独立术语表,通过导出现有词条→修改词条→重建术语表的流程实现增删改操作。为避免数据丢失,建议采用「先创建新表,再删除旧表」的顺序操作。
C#代码实现
1. 辅助方法:获取指定语言对的术语表
根据术语表名称和源/目标语言,从DeepL的术语表列表中匹配目标术语表:
private async Task<Glossary> GetGlossaryByLangPairAsync(DeepL.Translator translator, string sourceLang, string targetLang, string glossaryName) { var allGlossaries = await translator.ListGlossariesAsync(); return allGlossaries.FirstOrDefault(g => g.Name == glossaryName && g.SourceLanguage == sourceLang && g.TargetLanguage == targetLang); }
2. 辅助方法:导出术语表词条
将指定术语表的词条转换为字典格式,方便修改:
private async Task<Dictionary<string, string>> ExportGlossaryEntriesAsync(DeepL.Translator translator, Glossary glossary) { var entries = await translator.GetGlossaryEntriesAsync(glossary); return entries.ToDictionary(e => e.SourceTerm, e => e.TargetTerm); }
3. 添加词条
检查词条是否存在,不存在则导出现有词条并添加新词条,重建术语表:
public async Task AddGlossaryTermAsync(DeepL.Translator translator, string sourceLang, string targetLang, string glossaryName, string sourceTerm, string targetTerm) { var existingGlossary = await GetGlossaryByLangPairAsync(translator, sourceLang, targetLang, glossaryName); Dictionary<string, string> termDict; // 术语表不存在则直接创建 if (existingGlossary == null) { termDict = new Dictionary<string, string> { { sourceTerm, targetTerm } }; await translator.CreateGlossaryAsync(glossaryName, sourceLang, targetLang, new GlossaryEntries(termDict)); return; } termDict = await ExportGlossaryEntriesAsync(translator, existingGlossary); if (termDict.ContainsKey(sourceTerm)) return; // 词条已存在,无需操作 termDict.Add(sourceTerm, targetTerm); // 先创建新术语表,成功后再删除旧表 var newGlossary = await translator.CreateGlossaryAsync(glossaryName, sourceLang, targetLang, new GlossaryEntries(termDict)); if (newGlossary != null) { await translator.DeleteGlossaryAsync(existingGlossary.GlossaryId); } }
4. 替换词条
修改指定源术语对应的目标术语,重建术语表:
public async Task UpdateGlossaryTermAsync(DeepL.Translator translator, string sourceLang, string targetLang, string glossaryName, string sourceTerm, string newTargetTerm) { var existingGlossary = await GetGlossaryByLangPairAsync(translator, sourceLang, targetLang, glossaryName); if (existingGlossary == null) throw new InvalidOperationException("目标术语表不存在"); var termDict = await ExportGlossaryEntriesAsync(translator, existingGlossary); if (!termDict.ContainsKey(sourceTerm)) return; // 词条不存在,无需操作 termDict[sourceTerm] = newTargetTerm; var newGlossary = await translator.CreateGlossaryAsync(glossaryName, sourceLang, targetLang, new GlossaryEntries(termDict)); if (newGlossary != null) { await translator.DeleteGlossaryAsync(existingGlossary.GlossaryId); } }
5. 删除词条
移除指定源术语,若词条为空则直接删除术语表,否则重建:
public async Task RemoveGlossaryTermAsync(DeepL.Translator translator, string sourceLang, string targetLang, string glossaryName, string sourceTerm) { var existingGlossary = await GetGlossaryByLangPairAsync(translator, sourceLang, targetLang, glossaryName); if (existingGlossary == null) return; var termDict = await ExportGlossaryEntriesAsync(translator, existingGlossary); if (!termDict.Remove(sourceTerm)) return; // 词条不存在,无需操作 if (termDict.Count == 0) { await translator.DeleteGlossaryAsync(existingGlossary.GlossaryId); } else { var newGlossary = await translator.CreateGlossaryAsync(glossaryName, sourceLang, targetLang, new GlossaryEntries(termDict)); if (newGlossary != null) { await translator.DeleteGlossaryAsync(existingGlossary.GlossaryId); } } }
注意事项
- 避免硬编码术语表ID:每次操作通过术语表名称+语言对获取最新ID,或把ID存储在可动态更新的位置(如配置文件、数据库)。
- 异常处理:添加网络异常捕获逻辑,防止因创建新表失败导致数据丢失。
- 性能优化:若术语表词条量较大,可减少频繁导出重建的操作,批量处理词条修改后再执行重建。
内容的提问来源于stack exchange,提问作者oelgoetz
相关产品推荐
相关产品推荐

