十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

GitHub MCP Server 多语言支持:三级降级让工具描述零改码完成本地化

GitHub MCP Server 多语言支持:三级降级让工具描述零改码完成本地化 GitHub MCP Server 多语言支持三级降级让工具描述零改码完成本地化【免费下载链接】github-mcp-serverGitHubs official MCP Server项目地址: https://gitcode.com/GitHub_Trending/gi/github-mcp-serverGitHub MCP Server 多语言机制拆解工具描述按「环境变量 配置文件 硬编码默认值」三级覆盖不改一行源码、不重新编译用一个环境变量或一份 JSON 就能把整台服务器的工具文案换成中文或日文。为什么需要它改一个描述词就要重编译这活没人干得完这台服务器把上百个 GitHub 工具提交、PR、Issue、Actions……注册给 MCP 客户端每个工具都带一段 Description 和一个 UI 标题是给 LLM 和用户看的说明书。问题来了这些文案全部硬编码在 Go 源码里。想让 IDE 里显示中文描述只能 fork 源码逐个文件搜字符串改掉重新编译自己维护一个分叉。上游每发一个版本分叉就得追一次工具名改了、描述改了你的翻译全漂移。这不是国际化是持续还债。另一个脏活是发现键。你想覆盖某个工具的文案得先知道它的翻译键叫什么名字。这些键散落在 git.go、actions.go 等几十个文件里手动 grep 一遍又慢又容易漏。官方把导出全部键做成了命令行参数但前提是那套覆盖机制本身存在。没有这套机制本地化团队的工作就是改源码 → 编译 → 被上游覆盖。有了它工作变成设个变量 → 重启进程。机制拆解一个闭包、一张缓存表、一条三级查找链先说白话。服务器启动时translations.go 里的TranslationHelper()被调用一次它干两件事用 viper 加载当前目录下的github-mcp-server-config.json然后返回一个闭包函数t和一个导出函数。每个工具注册函数都以参数形式接收这个t注册 MCP 工具时调用t(键名, 英文默认值)。查找时依次走内存缓存 → 环境变量GITHUB_MCP_键名→ 配置文件 → 硬编码默认值命中的结果写进缓存同一个键一个进程只解析一次。核心查找逻辑不长全部在这段代码里return func(key string, defaultValue string) string { key strings.ToUpper(key) // ① 键统一转大写大小写写错也能命中 if value, exists : translationKeyMap[key]; exists { return value // ② 缓存表先查一个键只解析一次 } if value, exists : os.LookupEnv(GITHUB_MCP_ key); exists { translationKeyMap[key] value // ③ 环境变量优先级最高 return value } v.SetDefault(key, defaultValue) translationKeyMap[key] v.GetString(key) // 查配置文件查不到落默认值 return translationKeyMap[key] }人话翻译这个闭包就是全部翻译的唯一入口。第①行是容错设计你写小写键也能命中第③行是核心判断环境变量像便利贴优先级最高但撕了就没最后的v.GetString同时覆盖配置文件有值和落默认值两种情况因为前面用SetDefault垫了底。缓存表则像办公室白板写过的答案没人再问第二遍。三级来源对比来源优先级生效条件典型示例环境变量1存在GITHUB_MCP_前缀键GITHUB_MCP_SERVER_TITLE配置文件2github-mcp-server-config.json有该键键值对见下节硬编码默认值3前两者都没有t()的第二个参数工具侧怎么用它看 git.go 里的一个真实例子func GetRepositoryTree(t translations.TranslationHelperFunc) inventory.ServerTool { return NewTool( ToolsetMetadataGit, mcp.Tool{ Name: get_repository_tree, Description: t(TOOL_GET_REPOSITORY_TREE_DESCRIPTION, Get the tree structure ... of a GitHub repository ...), Annotations: mcp.ToolAnnotations{ Title: t(TOOL_GET_REPOSITORY_TREE_USER_TITLE, Get repository tree), ReadOnlyHint: true, }, // InputSchema 与 handler 从略 }, // ... ) }人话翻译工具函数不持有文案字符串持有的是取文案的函数。t由服务器启动时统一注入所以单测里可以传一个永远返回默认值的NullTranslationHelper工具代码不用改。键名即接口TOOL_GET_REPOSITORY_TREE_DESCRIPTION这个键既是源码里的参数也是你设环境变量、写配置文件的键中间没有第二套命名。另外main.go 里注册了--export-translations参数服务器初始化完成后调用前面提到的第二个返回值把缓存表里所有键值 dump 成github-mcp-server-config.json。这就是发现键的答案下节直接用。命名与约定速查新增一个覆盖时该抄哪份模板把散在代码里的规则收拢成一张表要改什么键名格式默认值在哪覆盖入口工具描述TOOL_工具名_DESCRIPTION对应文件里t()第二参同名环境变量 / JSONUI 标题TOOL_工具名_USER_TITLE同上同上服务器名/标题SERVER_NAME/SERVER_TITLE硬编码GITHUB_MCP_SERVER_NAME等最小实操路径先跑github-mcp-server --export-translations在生成的 JSON 里 grep 到你想要的键再照着键名设环境变量即可。详见 server-configuration.md。接入实操环境变量或配置文件二选一方式 A环境变量。适合单机、临时或值放在密钥管理里的场景export GITHUB_MCP_TOOL_GET_REPOSITORY_TREE_DESCRIPTION获取仓库指定 ref 的目录树结构 export GITHUB_MCP_TOOL_GET_REPOSITORY_TREE_USER_TITLE获取仓库目录 github-mcp-server --export-translations grep -i repository_tree github-mcp-server-config.json最后两条就是验证导出文件里若是中文值说明覆盖已生效。方式 B配置文件。适合团队共享、需要进版本库审查的场景。在服务进程的工作目录放一个github-mcp-server-config.json{ TOOL_GET_REPOSITORY_TREE_DESCRIPTION: 获取仓库指定 ref 的目录树结构, TOOL_GET_REPOSITORY_TREE_USER_TITLE: 获取仓库目录 }然后正常启动即可viper 只认这个确切文件名github-mcp-server怎么选踩坑清单都是工位上问过的问题现象设了环境变量描述还是英文。 原因键名拼错工具名和键之间不是一一对应的直觉拼写差一个词就查不到。 解法github-mcp-server --export-translations导出真实键表再 grep 你要改的键。现象配置文件放好了完全没生效。 原因viper 只找当前工作目录且文件名必须一字不差是github-mcp-server-config.json。 解法在启动进程的那个目录里ls github-mcp-server-config.json确认文件在场。现象改完配置重启个别键还是旧值。 原因缓存表按进程存活进程内改环境变量对已解析的键无效。 解法先export再起进程顺序不能反。现象工作目录多了个 JSON 文件误以为脏了仓库。 原因--export-translations会往当前目录写github-mcp-server-config.json。 解法在临时目录里跑导出别把文件误当配置源提交。想看当前全量翻译状态就跑这条调试命令它把进程里所有已解析的键值都摊在文件里github-mcp-server --export-translations cat github-mcp-server-config.json带走三句话如果只能记住三件事三级降级查找、键名即接口、缓存意味着变量必须先于启动就位。你自己项目里但凡有用户可覆盖的文案或配置需求这个闭包加缓存表的模式可以直接搬走。【免费下载链接】github-mcp-serverGitHubs official MCP Server项目地址: https://gitcode.com/GitHub_Trending/gi/github-mcp-server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表