ASP.NET Core Web API能否实现Swagger UI的多语言本地化?
ASP.NET Core Web API Swagger UI本地化实现方案
可以实现完整的Swagger UI本地化,同时解决你提到的「仅接口摘要本地化」和「切换语言无法重新生成swagger.json」两个问题,具体实现步骤如下:
1. 动态生成多语言版本swagger.json
- 先配置ASP.NET Core本地化中间件,支持通过Query参数、请求头或路由段传递语言标识,同时创建对应语言的资源文件存储接口、参数、返回值的多语言描述
- 自定义实现
IDocumentFilter接口,将接口描述的翻译逻辑写入过滤器的Apply方法中,运行时实时读取当前请求的上下文文化,拉取对应语言的文本写入swagger节点,不要在启动阶段就生成固定的swagger描述 - 修改Swagger路由规则,在swagger.json的访问路径中加入语言标识,例如
/swagger/{culture}/v1/swagger.json,同时关闭Swagger生成缓存,确保不同语言请求对应独立的json文件,避免浏览器缓存导致的内容不更新
核心示例代码:
// 自定义文档过滤器 public class MultiLanguageDocumentFilter : IDocumentFilter { private readonly IStringLocalizer<MultiLanguageDocumentFilter> _localizer; private readonly IHttpContextAccessor _httpContextAccessor; public MultiLanguageDocumentFilter(IStringLocalizer<MultiLanguageDocumentFilter> localizer, IHttpContextAccessor httpContextAccessor) { _localizer = localizer; _httpContextAccessor = httpContextAccessor; } public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { // 实时读取当前请求的文化 var currentCulture = _httpContextAccessor.HttpContext?.Request.RouteValues["culture"]?.ToString() ?? "zh-CN"; Thread.CurrentThread.CurrentCulture = new CultureInfo(currentCulture); Thread.CurrentThread.CurrentUICulture = new CultureInfo(currentCulture); // 翻译接口标题、描述 swaggerDoc.Info.Title = _localizer[swaggerDoc.Info.Title]; swaggerDoc.Info.Description = _localizer[swaggerDoc.Info.Description]; // 遍历所有接口翻译路径和参数描述 foreach (var path in swaggerDoc.Paths) { foreach (var operation in path.Value.Operations) { operation.Value.Summary = _localizer[operation.Value.Summary]; operation.Value.Description = _localizer[operation.Value.Description]; foreach (var parameter in operation.Value.Parameters) { parameter.Description = _localizer[parameter.Description]; } } } } }
2. Swagger UI原生界面本地化
- 下载Swagger UI官方提供的对应语言翻译包,将语言JS文件存入项目wwwroot目录下
- 在
Program.cs配置Swagger UI时,注入本地化脚本,覆盖默认的英文界面文本,同时可配置多个语言的swagger.json入口,方便用户手动切换语言 - 如果需要自动适配浏览器语言,可在自定义脚本中读取
navigator.language值,自动加载对应语言的翻译并跳转对应语言的swagger.json入口
配置示例代码:
// Program.cs 中Swagger UI配置 app.UseSwaggerUI(options => { // 配置多语言swagger.json入口 options.SwaggerEndpoint("/swagger/zh-CN/v1/swagger.json", "接口文档 V1(中文)"); options.SwaggerEndpoint("/swagger/en-US/v1/swagger.json", "API Docs V1(English)"); // 注入翻译脚本 options.InjectJavascript("/swagger/translations/zh-cn.js"); options.InjectJavascript("/swagger/custom-locale-init.js"); // 配置默认展示的语言版本 options.DefaultModelsExpandDepth = -1; });
内容的提问来源于stack exchange,提问作者Andris
相关产品推荐
相关产品推荐

