[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-hujingshuang--MTrans":3,"tool-hujingshuang--MTrans":65},[4,23,32,40,49,57],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":22},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,2,"2026-04-05T10:45:23",[13,14,15,16,17,18,19,20,21],"图像","数据工具","视频","插件","Agent","其他","语言模型","开发框架","音频","ready",{"id":24,"name":25,"github_repo":26,"description_zh":27,"stars":28,"difficulty_score":29,"last_commit_at":30,"category_tags":31,"status":22},2181,"OpenHands","OpenHands\u002FOpenHands","OpenHands 是一个专注于 AI 驱动开发的开源平台，旨在让智能体（Agent）像人类开发者一样理解、编写和调试代码。它解决了传统编程中重复性劳动多、环境配置复杂以及人机协作效率低等痛点，通过自动化流程显著提升开发速度。\n\n无论是希望提升编码效率的软件工程师、探索智能体技术的研究人员，还是需要快速原型验证的技术团队，都能从中受益。OpenHands 提供了灵活多样的使用方式：既可以通过命令行（CLI）或本地图形界面在个人电脑上轻松上手，体验类似 Devin 的流畅交互；也能利用其强大的 Python SDK 自定义智能体逻辑，甚至在云端大规模部署上千个智能体并行工作。\n\n其核心技术亮点在于模块化的软件智能体 SDK，这不仅构成了平台的引擎，还支持高度可组合的开发模式。此外，OpenHands 在 SWE-bench 基准测试中取得了 77.6% 的优异成绩，证明了其解决真实世界软件工程问题的能力。平台还具备完善的企业级功能，支持与 Slack、Jira 等工具集成，并提供细粒度的权限管理，适合从个人开发者到大型企业的各类用户场景。",70612,3,"2026-04-05T11:12:22",[19,17,20,16],{"id":33,"name":34,"github_repo":35,"description_zh":36,"stars":37,"difficulty_score":10,"last_commit_at":38,"category_tags":39,"status":22},3074,"gpt4free","xtekky\u002Fgpt4free","gpt4free 是一个由社区驱动的开源项目，旨在聚合多种可访问的大型语言模型（LLM）和媒体生成接口，让用户能更灵活、便捷地使用前沿 AI 能力。它解决了直接调用各类模型时面临的接口分散、门槛高或成本昂贵等痛点，通过统一的标准将不同提供商的资源整合在一起。\n\n无论是希望快速集成 AI 功能的开发者、需要多模型对比测试的研究人员，还是想免费体验最新技术的普通用户，都能从中受益。gpt4free 提供了丰富的使用方式：既包含易于上手的 Python 和 JavaScript 客户端库，也支持部署本地图形界面（GUI），更提供了兼容 OpenAI 标准的 REST API，方便无缝替换现有应用后端。\n\n其技术亮点在于强大的多提供商支持架构，能够动态调度包括 Opus、Gemini、DeepSeek 等多种主流模型资源，并支持 Docker 一键部署及本地推理。项目秉持社区优先原则，在降低使用门槛的同时，也为贡献者提供了扩展新接口的便利框架，是探索和利用多样化 AI 资源的实用工具。",65970,"2026-04-04T01:02:03",[16,19,17],{"id":41,"name":42,"github_repo":43,"description_zh":44,"stars":45,"difficulty_score":46,"last_commit_at":47,"category_tags":48,"status":22},2234,"scikit-learn","scikit-learn\u002Fscikit-learn","scikit-learn 是一个基于 Python 构建的开源机器学习库，依托于 SciPy、NumPy 等科学计算生态，旨在让机器学习变得简单高效。它提供了一套统一且简洁的接口，涵盖了从数据预处理、特征工程到模型训练、评估及选择的全流程工具，内置了包括线性回归、支持向量机、随机森林、聚类等在内的丰富经典算法。\n\n对于希望快速验证想法或构建原型的数据科学家、研究人员以及 Python 开发者而言，scikit-learn 是不可或缺的基础设施。它有效解决了机器学习入门门槛高、算法实现复杂以及不同模型间调用方式不统一的痛点，让用户无需重复造轮子，只需几行代码即可调用成熟的算法解决分类、回归、聚类等实际问题。\n\n其核心技术亮点在于高度一致的 API 设计风格，所有估算器（Estimator）均遵循相同的调用逻辑，极大地降低了学习成本并提升了代码的可读性与可维护性。此外，它还提供了强大的模型选择与评估工具，如交叉验证和网格搜索，帮助用户系统地优化模型性能。作为一个由全球志愿者共同维护的成熟项目，scikit-learn 以其稳定性、详尽的文档和活跃的社区支持，成为连接理论学习与工业级应用的最",65628,1,"2026-04-05T10:10:46",[20,18,14],{"id":50,"name":51,"github_repo":52,"description_zh":53,"stars":54,"difficulty_score":10,"last_commit_at":55,"category_tags":56,"status":22},51,"gstack","garrytan\u002Fgstack","gstack 是 Y Combinator CEO Garry Tan 亲自开源的一套 AI 工程化配置，旨在将 Claude Code 升级为你的虚拟工程团队。面对单人开发难以兼顾产品战略、架构设计、代码审查及质量测试的挑战，gstack 提供了一套标准化解决方案，帮助开发者实现堪比二十人团队的高效产出。\n\n这套配置特别适合希望提升交付效率的创始人、技术负责人，以及初次尝试 Claude Code 的开发者。gstack 的核心亮点在于内置了 15 个具有明确职责的 AI 角色工具，涵盖 CEO、设计师、工程经理、QA 等职能。用户只需通过简单的斜杠命令（如 `\u002Freview` 进行代码审查、`\u002Fqa` 执行测试、`\u002Fplan-ceo-review` 规划功能），即可自动化处理从需求分析到部署上线的全链路任务。\n\n所有操作基于 Markdown 和斜杠命令，无需复杂配置，完全免费且遵循 MIT 协议。gstack 不仅是一套工具集，更是一种现代化的软件工厂实践，让单人开发者也能拥有严谨的工程流程。",64604,"2026-04-05T23:10:16",[17,16],{"id":58,"name":59,"github_repo":60,"description_zh":61,"stars":62,"difficulty_score":10,"last_commit_at":63,"category_tags":64,"status":22},3364,"keras","keras-team\u002Fkeras","Keras 是一个专为人类设计的深度学习框架，旨在让构建和训练神经网络变得简单直观。它解决了开发者在不同深度学习后端之间切换困难、模型开发效率低以及难以兼顾调试便捷性与运行性能的痛点。\n\n无论是刚入门的学生、专注算法的研究人员，还是需要快速落地产品的工程师，都能通过 Keras 轻松上手。它支持计算机视觉、自然语言处理、音频分析及时间序列预测等多种任务。\n\nKeras 3 的核心亮点在于其独特的“多后端”架构。用户只需编写一套代码，即可灵活选择 TensorFlow、JAX、PyTorch 或 OpenVINO 作为底层运行引擎。这一特性不仅保留了 Keras 一贯的高层易用性，还允许开发者根据需求自由选择：利用 JAX 或 PyTorch 的即时执行模式进行高效调试，或切换至速度最快的后端以获得最高 350% 的性能提升。此外，Keras 具备强大的扩展能力，能无缝从本地笔记本电脑扩展至大规模 GPU 或 TPU 集群，是连接原型开发与生产部署的理想桥梁。",63927,"2026-04-04T15:24:37",[20,14,18],{"id":66,"github_repo":67,"name":68,"description_en":69,"description_zh":70,"ai_summary_zh":70,"readme_en":71,"readme_zh":72,"quickstart_zh":73,"use_case_zh":74,"hero_image_url":75,"owner_login":76,"owner_name":77,"owner_avatar_url":78,"owner_bio":79,"owner_company":80,"owner_location":81,"owner_email":82,"owner_twitter":82,"owner_website":82,"owner_url":83,"languages":84,"stars":93,"forks":94,"last_commit_at":95,"license":82,"difficulty_score":10,"env_os":96,"env_gpu":97,"env_ram":96,"env_deps":98,"category_tags":104,"github_topics":105,"view_count":10,"oss_zip_url":82,"oss_zip_packed_at":82,"status":22,"created_at":119,"updated_at":120,"faqs":121,"releases":152},1661,"hujingshuang\u002FMTrans","MTrans","Multi-source Translation","MTrans 是一款轻量级的多源翻译与语音合成（TTS）开源服务，旨在为开发者提供便捷的集成方案。它通过聚合百度、谷歌、有道、腾讯等主流平台的在线接口，让用户只需发送简单的 HTTP 请求，即可获取高质量的文本翻译结果或生成自然流畅的语音音频。\n\n在日常开发中，接入单一翻译引擎往往面临语种覆盖有限、服务稳定性波动或配置复杂等痛点。MTrans 有效解决了这些问题，它不仅支持中、英、日、韩、法、俄、德等多种语言的互译，还允许开发者灵活切换不同的数据源，从而提升应用的容错能力与服务可用性。其核心亮点在于高度模块化的架构设计，基于 Java 语言构建，提供了清晰的查询器模式（Querier），用户仅需几行代码即可完成从参数设置到结果获取的全流程，极大降低了二次开发的门槛。\n\n这款工具特别适合需要快速集成多语言功能的软件工程师、后端开发人员以及进行自然语言处理研究的技术人员。无论是构建跨语言聊天机器人、开发国际化应用，还是搭建个人辅助工具，MTrans 都能作为一个可靠的基础设施组件，帮助创作者专注于业务逻辑本身，而无需重复造轮子去处理复杂的底层通信与解析工作。","# MTrans 项目介绍\n\n本项目 [**多源翻译**](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans) (Multi-source Translation, MTrans)，提供了集多种主流的 **在线翻译** 及 **TTS** 功能于一身的轻量级服务。通过程序向所支持的在线目标服务器发送 HTTP 请求，获取并解析返回的结果，为使用者提供便利。目前，本项目**免费开源**，开发者可基于此进行二次开发。\n\n目前支持 **源** 及 **语种** 如下:\n\n| 翻译源 | 服务器地址 | 支持语种 | 方式\n| :-: | :-: | :-: | :-: |\n| [百度翻译](http:\u002F\u002Ffanyi.baidu.com\u002F) | http:\u002F\u002Ffanyi.baidu.com\u002Fv2transapi | 中文、英语、日语、韩语、法语、俄语、德语 | 互译\n| [有道翻译](http:\u002F\u002Ffanyi.youdao.com\u002F) | http:\u002F\u002Ffanyi.youdao.com\u002Ftranslate_o | 中文、英语、日语、韩语、法语、俄语 | 互译\n| [谷歌翻译](http:\u002F\u002Ftranslate.google.cn\u002F) | https:\u002F\u002Ftranslate.google.cn\u002Ftranslate_a\u002Fsingle | 中文、英语、日语、韩语、法语、俄语、德语 | 互译\n| [腾讯翻译君](http:\u002F\u002Ffanyi.qq.com\u002F) | http:\u002F\u002Ffanyi.qq.com\u002Fapi\u002Ftranslate | 中文、英语、日语、韩语、法语、俄语、德语 | 互译\n| [欧米翻译](http:\u002F\u002Fwww.omifanyi.com\u002F) | http:\u002F\u002Fwww.omifanyi.com\u002FtransSents.do | 中文、英语 | 互译\n| [TryCan](http:\u002F\u002Fwww.trycan.com\u002F) | http:\u002F\u002Ffanyi.trycan.com\u002FTransfer.do | 中文、英语 | 互译\n| [金山爱词霸](http:\u002F\u002Ffy.iciba.com\u002F) | http:\u002F\u002Ffy.iciba.com\u002Fajax.php?a=fy | 中文、英语、日语、韩语、法语、德语 | 互译\n| [搜狗翻译](http:\u002F\u002Ffanyi.sogou.com\u002F) | http:\u002F\u002Ffanyi.sogou.com\u002Freventondc\u002Ftranslate | 中文、英语、日语、韩语、法语、俄语、德语 | 互译\n\n\n\n| TTS 源  | 服务器地址 | 支持语种\n| :-: | :-: | :-: |\n| [百度 TTS](http:\u002F\u002Ffanyi.baidu.com\u002F) | http:\u002F\u002Ffanyi.baidu.com\u002Fgettts | 中文、英语、日语、韩语、法语、俄语、德语、泰语\n| [有道 TTS](http:\u002F\u002Ffanyi.youdao.com\u002F) | http:\u002F\u002Ftts.youdao.com\u002Ffanyivoice | 英语、日语、韩语、法语\n| [谷歌 TTS](http:\u002F\u002Ftranslate.google.cn\u002F) | https:\u002F\u002Ftranslate.google.cn\u002Ftranslate_tts | 中文、英语、日语、韩语、法语、俄语、德语\n| [腾讯 TTS](http:\u002F\u002Ffanyi.qq.com\u002F) | http:\u002F\u002Faudiodetect.browser.qq.com:8080\u002Ftts | 中文、英语、日语、韩语\n| [搜狗 TTS](http:\u002F\u002Ffanyi.sogou.com\u002F) | http:\u002F\u002Ffanyi.sogou.com\u002Freventondc\u002Fsynthesis | 中文、英语\n\n\n\n# 一、快速开始\n## 1、环境配置\n本项目使用 **IDEA + Maven** 进行开发，请在 *pom.xml* 中添加如下依赖。\n``` xml\n\u003Cdependency>\n    \u003CgroupId>org.apache.httpcomponents\u003C\u002FgroupId>\n    \u003CartifactId>httpclient\u003C\u002FartifactId>\n    \u003Cversion>4.5.5\u003C\u002Fversion>\n\u003C\u002Fdependency>\n\n\u003Cdependency>\n    \u003CgroupId>com.fasterxml.jackson.core\u003C\u002FgroupId>\n    \u003CartifactId>jackson-databind\u003C\u002FartifactId>\n    \u003Cversion>2.9.5\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n\n## 2、最小实例\n- 最小翻译实例\n    ``` java\n    import com.swjtu.lang.LANG;\n    import com.swjtu.querier.Querier;\n    import com.swjtu.trans.AbstractTranslator;\n    import com.swjtu.trans.impl.GoogleTranslator;\n\n    import java.util.List;\n\n    public class Test {\n        public static void main(String[] args) {\n            Querier\u003CAbstractTranslator> querierTrans = new Querier\u003C>();                   \u002F\u002F 获取查询器\n\n            querierTrans.setParams(LANG.ZH, LANG.EN, \"如果这都不算爱，我有什么好悲哀！\");    \u002F\u002F 设置参数\n            \n            querierTrans.attach(new GoogleTranslator());                                  \u002F\u002F 向查询器中添加 Google 翻译器\n\n            List\u003CString> result = querierTrans.execute();                                 \u002F\u002F 执行查询并接收查询结果\n\n            for (String str : result) {\n                System.out.println(str);\n            }\n        }\n    }\n    ```\n- 最小 TTS 实例\n    ``` java\n    import com.swjtu.lang.LANG;\n    import com.swjtu.querier.Querier;\n    import com.swjtu.tts.AbstractTTS;\n    import com.swjtu.tts.impl.BaiduTTS;\n\n    import java.util.List;\n\n    public class Test {\n        public static void main(String[] args) {\n            Querier\u003CAbstractTTS> querierTTS = new Querier\u003C>();                          \u002F\u002F 获取查询器\n\n            querierTTS.setParams(LANG.EN, \"To be or not to be, that is a question.\");   \u002F\u002F 设置参数\n            \n            querierTTS.attach(new BaiduTTS());                                          \u002F\u002F 向查询器中添加 Google 翻译器\n\n            List\u003CString> result = querierTTS.execute();                                 \u002F\u002F 执行查询并接收查询结果\n\n            for (String str : result) {\n                System.out.println(str);\n            }\n        }\n    }\n    ```\n\n\n# 二、MTrans 使用说明\n## 1、包\u002F类 一览表\n本项目中主要定义了如下几个包，其命名及作用如下表：\n\n| 包名 | 包含类 | 说明\n| :- | :-: | :-: |\n| [com.swjtu.lang](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Flang) | [LANG](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc%2Fmain%2Fjava%2Fcom%2Fswjtu%2Flang%2FLang.java) | 枚举类型，支持的语种列表\n| [com.swjtu.util](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Futil) | [Util](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc%2Fmain%2Fjava%2Fcom%2Fswjtu%2Futil%2FUtil.java) | 工具包\n| [com.swjtu.http](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fhttp) | [HttpParams](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fhttp\u002FHttpParams.java)、[AbstractHttpAttribute](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fhttp\u002FAbstractHttpAttribute.java) | HTTP 方法接口及抽象类\n| [com.swjtu.querier](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fquerier) | [Querier](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fquerier\u002FQuerier.java) | 泛型，查询器\n| [com.swjtu.trans](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans) | [AbstractTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002FAbstractTranslator.java) | 翻译器(抽象)类\n| [com.swjtu.trans.impl](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl) | [BaiduTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FBaiduTranslator.java)、[GoogleTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FGoogleTranslator.java)、[YoudaoTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FYoudaoTranslator.java)、[IcibaTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FIcibaTranslator.java)、\u003Cbr>[OmiTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FOmiTranslator.java)、[SogouTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FSogouTranslator.java)、[TencentTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FTencentTranslator.java)、[TrycanTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FTrycanTranslator.java) | 翻译器实体类\n| [com.swjtu.tts](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts) | [AbstractTTS](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002FAbstractTTS.java) | TTS 抽象类\n| [com.swjtu.tts.impl](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl) | [BaiduTTS](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl\u002FBaiduTTS.java)、[YoudaoTTS](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl\u002FYoudaoTTS.java)、[GoogleTTS](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl\u002FGoogleTTS.java)、[TencentTTS](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl\u002FTencentTTS.java)、[SogouTTS](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl\u002FSogouTTS.java) | TTS 实体类\n\n\n## 2、类图\n\n- [项目结构](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu)\n\n    ![总览](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_2b217a0221b8.png)\n\n- [com.swjtu.http](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fhttp) 包 \u002F 类图\n\n    ![com.swjtu.http](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_9978826c5f69.png)\n\n- [com.swjtu.querier](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fquerier) 包 \u002F 类图\n\n    ![com.swjtu.querier](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_21e0b78e9021.png)\n\n- [com.swjtu.trans](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans) 包 \u002F 类图\n\n    ![com.swjtu.trans](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_6606dd7af61e.png)\n\n- [com.swjtu.trans.impl](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl) 包 \u002F 类图\n    \n    ![com.swjtu.trans.impl](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_ab9f75fb4b79.png)\n\n- [com.swjtu.tts](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts) 包 \u002F 类图\n    \n    ![com.swjtu.tts](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_0ace147eb041.png)\n\n- [com.swjtu.tts.impl](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl) 包 \u002F 类图\n\n    ![com.swjtu.tts.impl](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_a4c21f9b1ba7.png)\n\n- [com.swjtu.util](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Futil) 包 \u002F 类图\n\n    ![com.swjtu.util](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsource%2Futil.png)\n\n\n## 3、类说明\n- `LANG` 枚举：定义所支持或将支持的语种，统一并规范了语种列表。\n    ``` java\n    public enum LANG {\n        ZH,             \u002F\u002F 中文\n        EN,             \u002F\u002F 英语\n        JP,             \u002F\u002F 日语\n        JPKA,           \u002F\u002F 日语假名\n        TH,             \u002F\u002F 泰语\n        ...\n    }\n    ```\n\n- `Util` 类：包含并实现了一些实用方法。\n    ``` java\n    public static List\u003CNameValuePair> map2list(Map\u003CString, String> mapParams);              \u002F\u002F 将 Map 转换成 List\n    public static String getUrlWithQueryString(String url, Map\u003CString, String> params);     \u002F\u002F 生成 URL\n\n    \u002F\u002F 各种格式的 MD5\n    public static String md5(String input);\n    public static String md5(File file);\n    public static String md5(InputStream in);\n    ```\n\n- `Querier` 类：定义了 `Querier` 类，使用了观察者模式。该类包含了一个集合，集合中的元素为翻译器类 或 TTS 类，通过 `setParams()` 设定好参数后，执行 `execute()` 方法发送请求，同时返回结果。可以通过 `attach()` 和 `detach()` 方法向集合中添加或移除元素。\n    ``` java\n    public final class Querier\u003CT extends AbstractHttpAttribute> {\n        private List\u003CT> collection;                               \u002F\u002F 集合\n\n        ...\n\n        public void setParams(LANG source, String text);          \u002F\u002F TTS 参数设置， source 源语种，text 待转换为语音的内容\n        public void setParams(LANG from, LANG to, String text);   \u002F\u002F 翻译器参数设置，from 源语种，to 目标语种，text 待翻译内容\n        \n        public List\u003CString> execute() {\n            List\u003CString> result = new ArrayList\u003CString>();\n\n            for (T element : collection) {\n                if (element.getClass().getName().contains(\"Translator\")) {\n                    result.add(element.run(from, to, text));\n                } else if (element.getClass().getName().contains(\"TTS\")) {\n                    result.add(element.run(from, text));\n                }\n            }\n            return result;\n        }\n\n        public void attach(T element);\n        public void detach(T element);\n\n        ...\n    }\n    ```\n- `HttpParams` 接口：定义了设置 HTTP 数据格式的接口方法\n    ``` java\n    public interface HttpParams {\n        public void setFormData(LANG source, String text);           \u002F\u002F 设置 TTS 参数的接口方法\n        public void setFormData(LANG from, LANG to, String text);    \u002F\u002F 设置翻译器参数的接口方法\n    }\n    ```\n\n- `AbstractHttpAttribute` 类：与 HTTP 请求相关的请求及控制流程\n    ``` java\n    public abstract String query() throws Exception;\n    public abstract String run(LANG source, String text);\n    public abstract String run(LANG from, LANG to, String text);\n\n    \u002F\u002F 资源释放\n    public void close(HttpEntity httpEntity, CloseableHttpResponse httpResponse);\n    public void close();\n    ```\n\n- `AbstractTranslator` 类：继承自 `AbstractHttpAttribute` 类，并实现了 `HttpParams` 接口，定义了抽象的翻译器类。\n    ``` java\n    @Override\n    public String run(LANG from, LANG to, String text) {\n        String result = \"\";\n        setFormData(from, to, text);\n        try {\n            result = parses(query());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        close();\n        return result;\n    }\n\n    public abstract void setLangSupport();                              \u002F\u002F 设置支持的语种\n    public abstract String parses(String text) throws IOException;      \u002F\u002F 解析返回结果\n    ```\n- `AbstractTTS` 类：继承自 `AbstractHttpAttribute` 类，并实现了 `HttpParams` 接口，定义了抽象的 TTS 类。\n    ``` java\n    @Override\n    public String run(LANG source, String text) {\n        String saveFile = null;\n        setFormData(source, text);\n        try {\n            saveFile = query();\n            System.out.println(saveFile);\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n        close();\n        return saveFile;\n    }\n\n    public String query() throws IOException {\n        ...\n\n        \u002F\u002F 将 TTS 结果保存为 mp3 音频文件，以待转换文本的 md5 码作为部分文件名\n        StringBuilder saveFile = new StringBuilder();\n        saveFile.append(\".\u002Ftts\u002F\")\n                .append(this.getClass().getName())\n                .append(\"-\")\n                .append(Util.md5(uri))\n                .append(\".mp3\");\n        \n        ...\n    }\n    ```\n\n# 三、提供的 API\n\n本项目封装了若干方法，并通过 `Querier` 泛型类暴露出来的 **5个 API** 方法，非常简单易于使用，[详见实例](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Ftest\u002Fjava\u002Fcom\u002Fswjtu\u002FTest.java):\n``` java\n\u002F\u002F 设置查询器参数\npublic void setParams(LANG source, String text);\npublic void setParams(LANG from, LANG to, String text);\n\npublic List\u003CString> execute();                       \u002F\u002F 执行查询并返回结果\npublic void attach(T element);                       \u002F\u002F 向查询器中添加元素\npublic void detach(T element);                       \u002F\u002F 移除查询器中的元素\n```\n\n# 四、如何扩展？\n本项目支持并提供了主流的 **在线翻译** 及 **TTS** 服务，通过提供的 API 接口可方便的进行相关任务。同时，考虑到用户潜在的需求，现介绍如何基于本项目进行扩展，达到二次开发的目的。在扩展本项目之前，用户需对项目源码及 HTTP 知识有一定的了解。\n\n## 1、扩展语种\n项目代码中枚举 `LANG` 定义了大部分常用的语种，若所支持的语种不能满足用户的需求时，用户可自行扩展。\n- 确定目标服务器支持的语种及该语种代号；\n- 将所需语种自定义代号添加到枚举中；\n- 在实体类 `setLangSupport()` 方法中，将代号映射添加到 `langMap` 变量中；\n\n举例：如对 *Youdao* 翻译器添加 **西班牙语** 的支持：\n- 步骤一：通过查询有道翻译服务器所支持的语种列表可知，支持西班牙语种且其代号为:`es`\n\n- 步骤二：在 `LANG` 中，添加语种自定义代号：\n\t``` java\n\tpublic enum LANG {\n\t\tZH,             \u002F\u002F 中文\n\t\tEN,             \u002F\u002F 英语\n\t\tJP,             \u002F\u002F 日语\n\t\tJPKA,           \u002F\u002F 日语假名\n\t\tTH,             \u002F\u002F 泰语\n\t\tFRA,            \u002F\u002F 法语\n\t\tSPA,            \u002F\u002F 西班牙语    \u003C---  添加语种(自定义语种代号)\n\t\tKOR,            \u002F\u002F 韩语\n\t\t....\n\t}\n\t```\n- 步骤三：在 `YoudaoTranslator` 类中，添加代号映射：\n\t``` java\n    @Override\n    public void setLangSupport() {\n        langMap.put(LANG.ZH, \"zh-CHS\");\n        langMap.put(LANG.EN, \"en\");\n        langMap.put(LANG.JP, \"ja\");\n        langMap.put(LANG.KOR, \"ko\");\n        langMap.put(LANG.FRA, \"fr\");\n        langMap.put(LANG.RU, \"ru\");\n        langMap.put(LANG.SPA, \"es\");                  \u002F\u002F 添加代号映射\n    }\n\t```\n\n## 2、扩展翻译器\n开发者通过继承 `AbstractTranslator` 类来定义自己的翻译器类，并实现该类中的如下抽象方法：\n``` java\n\u002F\u002F 添加语种支持\npublic abstract void setLangSupport();\n\u002F\u002F 用于设置请求参数\npublic abstract void setFormData(LANG from, LANG to, String text);\n\u002F\u002F 发送 HTTP 请求并接收返回结果(通常为 JSON 或 XML 字符串，根据用户请求结果而定)\npublic abstract String query() throws Exception;\n\u002F\u002F 解析字符串，提取翻译结果\npublic abstract String parses(String text) throws IOException;\n```\n> 注意：对于某些需要设置 Cookie 的 HTTP 请求，请先获取并设置好 Cookie 再进行请求。通常，在 Chrome 浏览器中按下 F12 键，并在 Console 控制台中输入: `document.cookie` 即可查看。\n\n## 3、扩展 TTS\n开发者通过继承 `AbstractTTS` 类来定义自己的 TTS 类，并实现该类中的如下抽象方法：\n``` java\n\u002F\u002F 添加语种支持\npublic abstract void setLangSupport();\n\u002F\u002F 用于设置请求参数\npublic abstract void setFormData(LANG source, String text);\n\u002F\u002F 发送 HTTP 请求并接收返回结果(通常为 JSON 或 XML 字符串，根据用户请求结果而定)\npublic abstract String query() throws Exception;\n```\n> 注意：TTS 保存路径默认为：.\u002Ftts\u002F类名-md5(待转换内容).mp3`(如：com.swjtu.tts.impl.GoogleTTS-5757a2c16ce52b5427eb12f961d6362e.mp3)`","# MTrans 项目介绍\n\n本项目 [**多源翻译**](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans) (Multi-source Translation, MTrans)，提供了集多种主流的 **在线翻译** 及 **TTS** 功能于一身的轻量级服务。通过程序向所支持的在线目标服务器发送 HTTP 请求，获取并解析返回的结果，为使用者提供便利。目前，本项目**免费开源**，开发者可基于此进行二次开发。\n\n目前支持 **源** 及 **语种** 如下:\n\n| 翻译源 | 服务器地址 | 支持语种 | 方式\n| :-: | :-: | :-: | :-: |\n| [百度翻译](http:\u002F\u002Ffanyi.baidu.com\u002F) | http:\u002F\u002Ffanyi.baidu.com\u002Fv2transapi | 中文、英语、日语、韩语、法语、俄语、德语 | 互译\n| [有道翻译](http:\u002F\u002Ffanyi.youdao.com\u002F) | http:\u002F\u002Ffanyi.youdao.com\u002Ftranslate_o | 中文、英语、日语、韩语、法语、俄语 | 互译\n| [谷歌翻译](http:\u002F\u002Ftranslate.google.cn\u002F) | https:\u002F\u002Ftranslate.google.cn\u002Ftranslate_a\u002Fsingle | 中文、英语、日语、韩语、法语、俄语、德语 | 互译\n| [腾讯翻译君](http:\u002F\u002Ffanyi.qq.com\u002F) | http:\u002F\u002Ffanyi.qq.com\u002Fapi\u002Ftranslate | 中文、英语、日语、韩语、法语、俄语、德语 | 互译\n| [欧米翻译](http:\u002F\u002Fwww.omifanyi.com\u002F) | http:\u002F\u002Fwww.omifanyi.com\u002FtransSents.do | 中文、英语 | 互译\n| [TryCan](http:\u002F\u002Fwww.trycan.com\u002F) | http:\u002F\u002Ffanyi.trycan.com\u002FTransfer.do | 中文、英语 | 互译\n| [金山爱词霸](http:\u002F\u002Ffy.iciba.com\u002F) | http:\u002F\u002Ffy.iciba.com\u002Fajax.php?a=fy | 中文、英语、日语、韩语、法语、德语 | 互译\n| [搜狗翻译](http:\u002F\u002Ffanyi.sogou.com\u002F) | http:\u002F\u002Ffanyi.sogou.com\u002Freventondc\u002Ftranslate | 中文、英语、日语、韩语、法语、俄语、德语 | 互译\n\n\n\n| TTS 源  | 服务器地址 | 支持语种\n| :-: | :-: | :-: |\n| [百度 TTS](http:\u002F\u002Ffanyi.baidu.com\u002F) | http:\u002F\u002Ffanyi.baidu.com\u002Fgettts | 中文、英语、日语、韩语、法语、俄语、德语、泰语\n| [有道 TTS](http:\u002F\u002Ffanyi.youdao.com\u002F) | http:\u002F\u002Ftts.youdao.com\u002Ffanyivoice | 英语、日语、韩语、法语\n| [谷歌 TTS](http:\u002F\u002Ftranslate.google.cn\u002F) | https:\u002F\u002Ftranslate.google.cn\u002Ftranslate_tts | 中文、英语、日语、韩语、法语、俄语、德语\n| [腾讯 TTS](http:\u002F\u002Ffanyi.qq.com\u002F) | http:\u002F\u002Faudiodetect.browser.qq.com:8080\u002Ftts | 中文、英语、日语、韩语\n| [搜狗 TTS](http:\u002F\u002Ffanyi.sogou.com\u002F) | http:\u002F\u002Ffanyi.sogou.com\u002Freventondc\u002Fsynthesis | 中文、英语\n\n\n\n# 一、快速开始\n## 1、环境配置\n本项目使用 **IDEA + Maven** 进行开发，请在 *pom.xml* 中添加如下依赖。\n``` xml\n\u003Cdependency>\n    \u003CgroupId>org.apache.httpcomponents\u003C\u002FgroupId>\n    \u003CartifactId>httpclient\u003C\u002FartifactId>\n    \u003Cversion>4.5.5\u003C\u002Fversion>\n\u003C\u002Fdependency>\n\n\u003Cdependency>\n    \u003CgroupId>com.fasterxml.jackson.core\u003C\u002FgroupId>\n    \u003CartifactId>jackson-databind\u003C\u002FartifactId>\n    \u003Cversion>2.9.5\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n\n## 2、最小实例\n- 最小翻译实例\n    ``` java\n    import com.swjtu.lang.LANG;\n    import com.swjtu.querier.Querier;\n    import com.swjtu.trans.AbstractTranslator;\n    import com.swjtu.trans.impl.GoogleTranslator;\n\n    import java.util.List;\n\n    public class Test {\n        public static void main(String[] args) {\n            Querier\u003CAbstractTranslator> querierTrans = new Querier\u003C>();                   \u002F\u002F 获取查询器\n\n            querierTrans.setParams(LANG.ZH, LANG.EN, \"如果这都不算爱，我有什么好悲哀！\");    \u002F\u002F 设置参数\n            \n            querierTrans.attach(new GoogleTranslator());                                  \u002F\u002F 向查询器中添加 Google 翻译器\n\n            List\u003CString> result = querierTrans.execute();                                 \u002F\u002F 执行查询并接收查询结果\n\n            for (String str : result) {\n                System.out.println(str);\n            }\n        }\n    }\n    ```\n- 最小 TTS 实例\n    ``` java\n    import com.swjtu.lang.LANG;\n    import com.swjtu.querier.Querier;\n    import com.swjtu.tts.AbstractTTS;\n    import com.swjtu.tts.impl.BaiduTTS;\n\n    import java.util.List;\n\n    public class Test {\n        public static void main(String[] args) {\n            Querier\u003CAbstractTTS> querierTTS = new Querier\u003C>();                          \u002F\u002F 获取查询器\n\n            querierTTS.setParams(LANG.EN, \"To be or not to be, that is a question.\");   \u002F\u002F 设置参数\n            \n            querierTTS.attach(new BaiduTTS());                                          \u002F\u002F 向查询器中添加 Google 翻译器\n\n            List\u003CString> result = querierTTS.execute();                                 \u002F\u002F 执行查询并接收查询结果\n\n            for (String str : result) {\n                System.out.println(str);\n            }\n        }\n    }\n    ```\n\n\n# 二、MTrans 使用说明\n\n## 1、包\u002F类 一览表\n本项目中主要定义了如下几个包，其命名及作用如下表：\n\n| 包名 | 包含类 | 说明\n| :- | :-: | :-: |\n| [com.swjtu.lang](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Flang) | [LANG](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc%2Fmain%2Fjava%2Fcom%2Fswjtu%2Flang%2FLang.java) | 枚举类型，支持的语种列表\n| [com.swjtu.util](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Futil) | [Util](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc%2Fmain%2Fjava%2Fcom%2Fswjtu%2Futil%2FUtil.java) | 工具包\n| [com.swjtu.http](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fhttp) | [HttpParams](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fhttp\u002FHttpParams.java)、[AbstractHttpAttribute](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fhttp\u002FAbstractHttpAttribute.java) | HTTP 方法接口及抽象类\n| [com.swjtu.querier](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fquerier) | [Querier](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fquerier\u002FQuerier.java) | 泛型，查询器\n| [com.swjtu.trans](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans) | [AbstractTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002FAbstractTranslator.java) | 翻译器(抽象)类\n| [com.swjtu.trans.impl](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl) | [BaiduTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FBaiduTranslator.java)、[GoogleTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FGoogleTranslator.java)、[YoudaoTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FYoudaoTranslator.java)、[IcibaTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FIcibaTranslator.java)、\u003Cbr>[OmiTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FOmiTranslator.java)、[SogouTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FSogouTranslator.java)、[TencentTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FTencentTranslator.java)、[TrycanTranslator](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl\u002FTrycanTranslator.java) | 翻译器实体类\n| [com.swjtu.tts](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts) | [AbstractTTS](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002FAbstractTTS.java) | TTS 抽象类\n| [com.swjtu.tts.impl](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl) | [BaiduTTS](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl\u002FBaiduTTS.java)、[YoudaoTTS](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl\u002FYoudaoTTS.java)、[GoogleTTS](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl\u002FGoogleTTS.java)、[TencentTTS](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl\u002FTencentTTS.java)、[SogouTTS](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl\u002FSogouTTS.java) | TTS 实体类\n\n\n## 2、类图\n\n- [项目结构](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu)\n\n    ![总览](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_2b217a0221b8.png)\n\n- [com.swjtu.http](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fhttp) 包 \u002F 类图\n\n    ![com.swjtu.http](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_9978826c5f69.png)\n\n- [com.swjtu.querier](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Fquerier) 包 \u002F 类图\n\n    ![com.swjtu.querier](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_21e0b78e9021.png)\n\n- [com.swjtu.trans](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans) 包 \u002F 类图\n\n    ![com.swjtu.trans](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_6606dd7af61e.png)\n\n- [com.swjtu.trans.impl](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftrans\u002Fimpl) 包 \u002F 类图\n    \n    ![com.swjtu.trans.impl](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_ab9f75fb4b79.png)\n\n- [com.swjtu.tts](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts) 包 \u002F 类图\n    \n    ![com.swjtu.tts](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_0ace147eb041.png)\n\n- [com.swjtu.tts.impl](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Ftts\u002Fimpl) 包 \u002F 类图\n\n    ![com.swjtu.tts.impl](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_a4c21f9b1ba7.png)\n\n- [com.swjtu.util](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Ftree\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fswjtu\u002Futil) 包 \u002F 类图\n\n    ![com.swjtu.util](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_readme_bf91f9e9736d.png)\n\n## 3、类说明\n- `LANG` 枚举：定义所支持或将支持的语种，统一并规范了语种列表。\n    ``` java\n    public enum LANG {\n        ZH,             \u002F\u002F 中文\n        EN,             \u002F\u002F 英语\n        JP,             \u002F\u002F 日语\n        JPKA,           \u002F\u002F 日语假名\n        TH,             \u002F\u002F 泰语\n        ...\n    }\n    ```\n\n- `Util` 类：包含并实现了一些实用方法。\n    ``` java\n    public static List\u003CNameValuePair> map2list(Map\u003CString, String> mapParams);              \u002F\u002F 将 Map 转换成 List\n    public static String getUrlWithQueryString(String url, Map\u003CString, String> params);     \u002F\u002F 生成 URL\n\n    \u002F\u002F 各种格式的 MD5\n    public static String md5(String input);\n    public static String md5(File file);\n    public static String md5(InputStream in);\n    ```\n\n- `Querier` 类：定义了 `Querier` 类，使用了观察者模式。该类包含了一个集合，集合中的元素为翻译器类 或 TTS 类，通过 `setParams()` 设定好参数后，执行 `execute()` 方法发送请求，同时返回结果。可以通过 `attach()` 和 `detach()` 方法向集合中添加或移除元素。\n    ``` java\n    public final class Querier\u003CT extends AbstractHttpAttribute> {\n        private List\u003CT> collection;                               \u002F\u002F 集合\n\n        ...\n\n        public void setParams(LANG source, String text);          \u002F\u002F TTS 参数设置， source 源语种，text 待转换为语音的内容\n        public void setParams(LANG from, LANG to, String text);   \u002F\u002F 翻译器参数设置，from 源语种，to 目标语种，text 待翻译内容\n        \n        public List\u003CString> execute() {\n            List\u003CString> result = new ArrayList\u003CString>();\n\n            for (T element : collection) {\n                if (element.getClass().getName().contains(\"Translator\")) {\n                    result.add(element.run(from, to, text));\n                } else if (element.getClass().getName().contains(\"TTS\")) {\n                    result.add(element.run(from, text));\n                }\n            }\n            return result;\n        }\n\n        public void attach(T element);\n        public void detach(T element);\n\n        ...\n    }\n    ```\n- `HttpParams` 接口：定义了设置 HTTP 数据格式的接口方法\n    ``` java\n    public interface HttpParams {\n        public void setFormData(LANG source, String text);           \u002F\u002F 设置 TTS 参数的接口方法\n        public void setFormData(LANG from, LANG to, String text);    \u002F\u002F 设置翻译器参数的接口方法\n    }\n    ```\n\n- `AbstractHttpAttribute` 类：与 HTTP 请求相关的请求及控制流程\n    ``` java\n    public abstract String query() throws Exception;\n    public abstract String run(LANG source, String text);\n    public abstract String run(LANG from, LANG to, String text);\n\n    \u002F\u002F 资源释放\n    public void close(HttpEntity httpEntity, CloseableHttpResponse httpResponse);\n    public void close();\n    ```\n\n- `AbstractTranslator` 类：继承自 `AbstractHttpAttribute` 类，并实现了 `HttpParams` 接口，定义了抽象的翻译器类。\n    ``` java\n    @Override\n    public String run(LANG from, LANG to, String text) {\n        String result = \"\";\n        setFormData(from, to, text);\n        try {\n            result = parses(query());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        close();\n        return result;\n    }\n\n    public abstract void setLangSupport();                              \u002F\u002F 设置支持的语种\n    public abstract String parses(String text) throws IOException;      \u002F\u002F 解析返回结果\n    ```\n- `AbstractTTS` 类：继承自 `AbstractHttpAttribute` 类，并实现了 `HttpParams` 接口，定义了抽象的 TTS 类。\n    ``` java\n    @Override\n    public String run(LANG source, String text) {\n        String saveFile = null;\n        setFormData(source, text);\n        try {\n            saveFile = query();\n            System.out.println(saveFile);\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n        close();\n        return saveFile;\n    }\n\n    public String query() throws IOException {\n        ...\n\n        \u002F\u002F 将 TTS 结果保存为 mp3 音频文件，以待转换文本的 md5 码作为部分文件名\n        StringBuilder saveFile = new StringBuilder();\n        saveFile.append(\".\u002Ftts\u002F\")\n                .append(this.getClass().getName())\n                .append(\"-\")\n                .append(Util.md5(uri))\n                .append(\".mp3\");\n        \n        ...\n    }\n    ```\n\n# 三、提供的 API\n\n本项目封装了若干方法，并通过 `Querier` 泛型类暴露出来的 **5个 API** 方法，非常简单易于使用，[详见实例](https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fblob\u002Fmaster\u002Fsrc\u002Ftest\u002Fjava\u002Fcom\u002Fswjtu\u002FTest.java):\n``` java\n\u002F\u002F 设置查询器参数\npublic void setParams(LANG source, String text);\npublic void setParams(LANG from, LANG to, String text);\n\npublic List\u003CString> execute();                       \u002F\u002F 执行查询并返回结果\npublic void attach(T element);                       \u002F\u002F 向查询器中添加元素\npublic void detach(T element);                       \u002F\u002F 移除查询器中的元素\n```\n\n# 四、如何扩展？\n本项目支持并提供了主流的 **在线翻译** 及 **TTS** 服务，通过提供的 API 接口可方便的进行相关任务。同时，考虑到用户潜在的需求，现介绍如何基于本项目进行扩展，达到二次开发的目的。在扩展本项目之前，用户需对项目源码及 HTTP 知识有一定的了解。\n\n## 1、扩展语种\n项目代码中枚举 `LANG` 定义了大部分常用的语种，若所支持的语种不能满足用户的需求时，用户可自行扩展。\n- 确定目标服务器支持的语种及该语种代号；\n- 将所需语种自定义代号添加到枚举中；\n- 在实体类 `setLangSupport()` 方法中，将代号映射添加到 `langMap` 变量中；\n\n举例：如对 *Youdao* 翻译器添加 **西班牙语** 的支持：\n- 步骤一：通过查询有道翻译服务器所支持的语种列表可知，支持西班牙语种且其代号为:`es`\n\n- 步骤二：在 `LANG` 中，添加语种自定义代号：\n\t``` java\n\tpublic enum LANG {\n\t\tZH,             \u002F\u002F 中文\n\t\tEN,             \u002F\u002F 英语\n\t\tJP,             \u002F\u002F 日语\n\t\tJPKA,           \u002F\u002F 日语假名\n\t\tTH,             \u002F\u002F 泰语\n\t\tFRA,            \u002F\u002F 法语\n\t\tSPA,            \u002F\u002F 西班牙语    \u003C---  添加语种(自定义语种代号)\n\t\tKOR,            \u002F\u002F 韩语\n\t\t....\n\t}\n\t```\n- 步骤三：在 `YoudaoTranslator` 类中，添加代号映射：\n\t``` java\n    @Override\n    public void setLangSupport() {\n        langMap.put(LANG.ZH, \"zh-CHS\");\n        langMap.put(LANG.EN, \"en\");\n        langMap.put(LANG.JP, \"ja\");\n        langMap.put(LANG.KOR, \"ko\");\n        langMap.put(LANG.FRA, \"fr\");\n        langMap.put(LANG.RU, \"ru\");\n        langMap.put(LANG.SPA, \"es\");                  \u002F\u002F 添加代号映射\n    }\n\t```\n\n## 2、扩展翻译器\n开发者通过继承 `AbstractTranslator` 类来定义自己的翻译器类，并实现该类中的如下抽象方法：\n``` java\n\u002F\u002F 添加语种支持\npublic abstract void setLangSupport();\n\u002F\u002F 用于设置请求参数\npublic abstract void setFormData(LANG from, LANG to, String text);\n\u002F\u002F 发送 HTTP 请求并接收返回结果(通常为 JSON 或 XML 字符串，根据用户请求结果而定)\npublic abstract String query() throws Exception;\n\u002F\u002F 解析字符串，提取翻译结果\npublic abstract String parses(String text) throws IOException;\n```\n> 注意：对于某些需要设置 Cookie 的 HTTP 请求，请先获取并设置好 Cookie 再进行请求。通常，在 Chrome 浏览器中按下 F12 键，并在 Console 控制台中输入: `document.cookie` 即可查看。\n\n## 3、扩展 TTS\n开发者通过继承 `AbstractTTS` 类来定义自己的 TTS 类，并实现该类中的如下抽象方法：\n``` java\n\u002F\u002F 添加语种支持\npublic abstract void setLangSupport();\n\u002F\u002F 用于设置请求参数\npublic abstract void setFormData(LANG source, String text);\n\u002F\u002F 发送 HTTP 请求并接收返回结果(通常为 JSON 或 XML 字符串，根据用户请求结果而定)\npublic abstract String query() throws Exception;\n```\n> 注意：TTS 保存路径默认为：.\u002Ftts\u002F类名-md5(待转换内容).mp3`(如：com.swjtu.tts.impl.GoogleTTS-5757a2c16ce52b5427eb12f961d6362e.mp3)`","# MTrans 快速上手指南\n\nMTrans 是一个轻量级的多源翻译及 TTS（文本转语音）开源工具，集成了百度、有道、谷歌、腾讯等主流在线服务。开发者可通过简单的 Java 代码调用多种翻译引擎和语音合成接口。\n\n## 环境准备\n\n- **开发语言**：Java\n- **构建工具**：Maven\n- **推荐 IDE**：IntelliJ IDEA\n- **前置依赖**：需在 `pom.xml` 中引入以下依赖库：\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>org.apache.httpcomponents\u003C\u002FgroupId>\n    \u003CartifactId>httpclient\u003C\u002FartifactId>\n    \u003Cversion>4.5.5\u003C\u002Fversion>\n\u003C\u002Fdependency>\n\n\u003Cdependency>\n    \u003CgroupId>com.fasterxml.jackson.core\u003C\u002FgroupId>\n    \u003CartifactId>jackson-databind\u003C\u002FartifactId>\n    \u003Cversion>2.9.5\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n> 💡 提示：国内用户建议在 `settings.xml` 中配置阿里云或腾讯云 Maven 镜像以加速依赖下载。\n\n## 安装步骤\n\n1. 克隆项目源码（可选，若仅作为库使用可跳过）：\n   ```bash\n   git clone https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans.git\n   cd MTrans\n   ```\n\n2. 使用 Maven 编译构建：\n   ```bash\n   mvn clean install\n   ```\n\n3. 或在你的项目中直接添加上述依赖，即可开始使用。\n\n## 基本使用\n\n### 最小翻译示例\n\n以下示例演示如何使用谷歌翻译将中文译为英文：\n\n```java\nimport com.swjtu.lang.LANG;\nimport com.swjtu.querier.Querier;\nimport com.swjtu.trans.AbstractTranslator;\nimport com.swjtu.trans.impl.GoogleTranslator;\n\nimport java.util.List;\n\npublic class Test {\n    public static void main(String[] args) {\n        Querier\u003CAbstractTranslator> querierTrans = new Querier\u003C>();                   \u002F\u002F 获取查询器\n\n        querierTrans.setParams(LANG.ZH, LANG.EN, \"如果这都不算爱，我有什么好悲哀！\");    \u002F\u002F 设置参数\n        \n        querierTrans.attach(new GoogleTranslator());                                  \u002F\u002F 向查询器中添加 Google 翻译器\n\n        List\u003CString> result = querierTrans.execute();                                 \u002F\u002F 执行查询并接收查询结果\n\n        for (String str : result) {\n            System.out.println(str);\n        }\n    }\n}\n```\n\n### 最小 TTS 示例\n\n以下示例演示如何使用百度 TTS 将英文文本转换为语音：\n\n```java\nimport com.swjtu.lang.LANG;\nimport com.swjtu.querier.Querier;\nimport com.swjtu.tts.AbstractTTS;\nimport com.swjtu.tts.impl.BaiduTTS;\n\nimport java.util.List;\n\npublic class Test {\n    public static void main(String[] args) {\n        Querier\u003CAbstractTTS> querierTTS = new Querier\u003C>();                          \u002F\u002F 获取查询器\n\n        querierTTS.setParams(LANG.EN, \"To be or not to be, that is a question.\");   \u002F\u002F 设置参数\n        \n        querierTTS.attach(new BaiduTTS());                                          \u002F\u002F 向查询器中添加百度 TTS\n\n        List\u003CString> result = querierTTS.execute();                                 \u002F\u002F 执行查询并接收查询结果\n\n        for (String str : result) {\n            System.out.println(str);\n        }\n    }\n}\n```\n\n> ✅ 支持灵活切换翻译源或 TTS 源，只需替换 `attach()` 中的实例类（如 `BaiduTranslator`、`YoudaoTTS` 等）。","某跨境电商开发团队正在构建一个多语言商品评论自动分析系统，需要实时将全球用户的评论翻译成中文并生成语音播报供运营人员监听。\n\n### 没有 MTrans 时\n- **接口对接繁琐**：开发人员需分别阅读百度、谷歌、有道等各家翻译平台的 API 文档，编写多套独立的 HTTP 请求与解析代码，重复工作量巨大。\n- **单点故障风险高**：系统硬编码绑定单一翻译源（如仅用谷歌），一旦该服务网络波动或被限流，整个评论处理流程即刻中断，缺乏容错机制。\n- **功能扩展困难**：若要增加 TTS 语音合成功能，需重新寻找音频接口并适配新的鉴权逻辑，导致项目迭代周期被迫拉长。\n- **维护成本高昂**：不同厂商的返回数据格式各异，每次上游接口变更都需要人工逐一排查修改，极易引发线上故障。\n\n### 使用 MTrans 后\n- **统一调用标准**：通过 MTrans 提供的标准化 `Querier` 接口，团队仅需几行代码即可灵活切换百度、腾讯、搜狗等七种翻译源，无需关心底层协议差异。\n- **多源冗余备份**：系统可轻松配置“主备模式”，当谷歌翻译响应超时时，MTrans 能自动无缝切换至有道或百度翻译，确保业务 7x24 小时不间断运行。\n- **译音一体化集成**：利用 MTrans 内置的 TTS 模块，开发人员可直接复用同一套架构调用百度或谷歌的语音合成服务，快速实现“文本翻译 + 语音播报”闭环。\n- **轻量级易维护**：作为开源轻量级库，MTrans 屏蔽了各厂商复杂的参数加密与解析逻辑，后续新增语种或更换服务商只需调整配置类即可。\n\nMTrans 通过聚合多源翻译与 TTS 能力，将原本分散脆弱的异构接口整合为稳定统一的标准化服务，显著提升了跨国数据处理的效率与鲁棒性。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fhujingshuang_MTrans_3a86391b.png","hujingshuang","Hu Jingshuang","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fhujingshuang_540be825.jpg","A man who loves life.","CUIT-SWJTU","China",null,"https:\u002F\u002Fgithub.com\u002Fhujingshuang",[85,89],{"name":86,"color":87,"percentage":88},"Java","#b07219",94,{"name":90,"color":91,"percentage":92},"JavaScript","#f1e05a",6,809,206,"2026-02-13T17:23:10","未说明","不需要 GPU",{"notes":99,"python":100,"dependencies":101},"本项目为 Java 开发，需使用 IDEA + Maven 环境。不支持 Python。主要功能是通过 HTTP 请求调用百度、谷歌、有道等在线翻译及 TTS 接口，无需本地模型文件。","不适用",[102,103],"org.apache.httpcomponents:httpclient:4.5.5","com.fasterxml.jackson.core:jackson-databind:2.9.5",[14,21,16],[106,107,108,109,110,111,112,113,114,115,116,117,118],"translate","baidu","youdao","google","trycan","iciba","tencent","sogou","omics","api","java","httpclient","tts","2026-03-27T02:49:30.150509","2026-04-06T07:14:02.123348",[122,127,132,137,142,147],{"id":123,"question_zh":124,"answer_zh":125,"source_url":126},9558,"使用 Google 翻译时出现 'No route to host' 错误怎么办？","这通常是因为请求过于频繁导致 IP 被限制。建议尝试配置代理来解决该问题。如果代理可以正常请求，则确认是被限制了。作者计划在后续版本中加入代理支持功能。","https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fissues\u002F9",{"id":128,"question_zh":129,"answer_zh":130,"source_url":131},9559,"如何修改或自定义语言代码（如法语是 fr 还是 fra）？","Google 翻译使用 'fr' 表示法语（sl 表示源语言，tl 表示目标语言）。由于各在线翻译服务的语言代码不统一，本项目对语言进行了规范。用户可以直接修改源代码中的语言映射来进行自行调整。","https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fissues\u002F4",{"id":133,"question_zh":134,"answer_zh":135,"source_url":136},9560,"调用百度翻译接口时报 401 错误如何解决？","报 401 错误通常是因为没有设置 Cookie。请检查并确保在请求中正确配置了 Cookie 信息。","https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fissues\u002F15",{"id":138,"question_zh":139,"answer_zh":140,"source_url":141},9561,"源码中硬编码的 Cookie (BDUSS) 是否存在安全风险？","是的，源码中硬编码的 BDUSS Cookie 可用于非法登录百度账号，存在泄露个人信息的风险。建议立即去除源码中的敏感 Cookie 信息，作者已对此问题进行修复。","https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fissues\u002F13",{"id":143,"question_zh":144,"answer_zh":145,"source_url":146},9562,"目前支持单词查询（释义、词性、音标）功能吗？","目前项目只开放了翻译功能，尚未支持单词查询。作者已收到该建议，并计划在下一个支持 TTS（语音合成）的版本中考虑此功能需求。","https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fissues\u002F3",{"id":148,"question_zh":149,"answer_zh":150,"source_url":151},9563,"项目是否提供语音（TTS）接口？","当前版本暂未开放语音接口功能。但作者已在规划中，预计在下一次版本更新时将提供语音接口，敬请关注后续更新。","https:\u002F\u002Fgithub.com\u002Fhujingshuang\u002FMTrans\u002Fissues\u002F2",[153,156],{"id":154,"version":155,"summary_zh":82,"released_at":82},106226,"V2.1.0",{"id":157,"version":158,"summary_zh":82,"released_at":82},106227,"V2.0.0"]