diff --git a/internal/app/middleware/swagger.go b/internal/app/middleware/swagger.go index dbc1785..4bc30c6 100644 --- a/internal/app/middleware/swagger.go +++ b/internal/app/middleware/swagger.go @@ -23,6 +23,15 @@ func SwaggerHandler() gin.HandlerFunc { } isCSS := strings.HasSuffix(relPath, "swagger-ui.css") + isInitializer := strings.HasSuffix(relPath, "swagger-initializer.js") + + if isInitializer { + c.Header("Content-Type", "application/javascript; charset=utf-8") + c.Writer.WriteHeader(200) + c.Writer.Write([]byte(chineseInitializer)) + c.Request.URL.Path = rawPath + return + } if isCSS { crw := &captureResponseWriter{ @@ -83,6 +92,74 @@ func (w *captureResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { func (w *captureResponseWriter) CloseNotify() <-chan bool { return w.ginWriter.CloseNotify() } func (w *captureResponseWriter) Flush() {} +const chineseInitializer = ` +window.onload = function() { + window.ui = SwaggerUIBundle({ + url: "./doc.json", + dom_id: '#swagger-ui', + deepLinking: true, + presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIStandalonePreset + ], + plugins: [ + SwaggerUIBundle.plugins.DownloadUrl + ], + layout: "StandaloneLayout", + validatorUrl: null, + defaultModelsExpandDepth: 1, + defaultModelExpandDepth: 1, + docExpansion: "list", + filter: true, + showExtensions: true, + showCommonExtensions: true, + withCredentials: false, + persistAuthorization: true, + tryItOutEnabled: false, + requestSnippetsEnabled: true, + displayRequestDuration: true, + syntaxHighlight: { + activate: true, + theme: "agate" + } + }); + + setTimeout(function() { + const translations = { + 'Available authorizations': '可用授权', + 'Close': '关闭', + 'Scopes for': '作用域', + 'Authorize': '授权', + 'Cancel': '取消', + 'Authorized': '已授权', + 'Logout': '登出', + 'Edit': '编辑', + 'Select a definition': '选择定义', + 'Search': '搜索', + 'Top': '顶部', + 'Parameters': '参数', + 'Responses': '响应', + 'Try it out': '试一试', + 'Clear': '清除', + 'Download': '下载', + 'Show/Hide': '显示/隐藏', + 'List Operations': '列表操作', + 'Expand Operations': '展开操作', + 'Models': '模型' + }; + + document.querySelectorAll('span, button, div, label').forEach(function(el) { + const text = el.textContent.trim(); + if (translations[text]) { + el.textContent = translations[text]; + } + }); + + document.title = 'MengStack API 文档'; + }, 500); +}; +` + const brandingCSS = ` /* MengStack API branding — replace Swagger SmartBear logo */ .topbar {