WebGoat 多语言完整指南:3 种方法切换语言并解决中文界面问题
【免费下载链接】WebGoatWebGoat is a deliberately insecure application项目地址: https://gitcode.com/GitHub_Trending/we/WebGoat
打开 WebGoat,满屏英文的课程名和任务描述,一行行啃正文体验确实糟糕。这篇文章带你摸清 WebGoat 多语言支持的全部家底:官方到底支持哪几种语言、语言切换的 3 种实操路径、背后的 Spring 国际化机制,以及 WebGoat 中文界面的两条现实出路,读完即可上手。
能力全景:WebGoat 官方支持哪些语言
根据当前版本源码,src/main/resources/i18n目录下有 5 个翻译资源文件,主页顶部的语言下拉菜单也对应给出 5 个入口:
| 语言 | 资源文件 | 覆盖范围 |
|---|---|---|
| en 英语 | messages.properties | 全部标签 |
| de 德语 | messages_de.properties | 界面主标签 |
| fr 法语 | messages_fr.properties | 界面主标签 |
| nl 荷兰语 | messages_nl.properties | 界面主标签 |
| es 西班牙语 | messages_es.properties | 界面主标签 |
🔍 一个容易被忽略的细节:翻译只覆盖"界面标签"(按钮、导航、提示)。课程正文是 AsciiDoctor 的
.adoc文件,非英文课程默认只提供英文正文,所以切换语言后课程内容仍是英文。
中文(zh)目前不在官方支持范围内,这是基于源码的事实陈述。这里有个小细节你可能会感兴趣:静态资源目录里已经存在cnlang.svg这个中文国旗素材,但对应的翻译文件和切换入口都还没做,相当于留了个半成品。
实操演练:三种语言切换路径由易到难
路径一:浏览器语言偏好自动识别(零配置)
WebGoat 的默认行为是跟随浏览器的Accept-Language请求头选语言:
- 把浏览器首选语言设为已支持的语言(如法语
fr) - 新开一个会话(确保 session 尚未建立语言记录)
- 登录并进入
/WebGoat/start.mvc主页面 - 验证:右上角语言旗标变为对应语言,顶部导航文案同步变化
如果浏览器语言不在支持列表内(比如中文),会自动回退到英文,界面不会出现"半翻译"的混乱状态。
路径二:URL 参数强制指定语言
登录状态下,给主页面地址加上lang参数即可强制切换:
- 登录后访问
/WebGoat/start.mvc - 在地址后追加参数,例如
/WebGoat/start.mvc?lang=de - 页面刷新并自动跳回 Introduction 介绍页
- 验证:顶栏文案已变为德语,课程菜单标题同步变化
注意参数名必须是lang,这是后端配置里写死的,写错成language或其他形式都会无效。
路径三:Session 级下拉菜单持久切换
WebGoat 使用SessionLocaleResolver,你的语言选择会被记录在服务端 session 中:
- 登录后点击主页顶部的语言下拉菜单
- 从 5 种语言里选择目标语言
- 切换后自动回到 Introduction 页面
- 验证:连续跳转几个页面,语言全程保持不变
但"持久"仅限于当前会话:session 过期或关闭浏览器后语言会重置。如果你希望设置跨浏览器重启也生效,需要把解析器换成CookieLocaleResolver——这属于本地改造,见下文机制部分。
机制速览:语言切换背后是怎么跑的
先看一张组件关系图,整个 WebGoat 国际化配置就这条链:
核心配置位于src/main/java/org/owasp/webgoat/container/MvcConfiguration.java:
@Bean public LocaleResolver localeResolver() { SessionLocaleResolver localeResolver = new SessionLocaleResolver(); return localeResolver; }@Bean public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); lci.setParamName("lang"); return lci; }白话解读:SessionLocaleResolver像个"选词官",它自己不翻译内容,只负责记住当前该用哪本词典(存在 session 里);LocaleChangeInterceptor是守在请求入口的开关,发现lang参数就更新这个选择。Language类(src/main/java/org/owasp/webgoat/container/i18n/Language.java)把解析器包了一层,让Messages组件按classpath:i18n/messages这个前缀加载对应语言文件——这就是 WebGoat locale 解析链的全貌,三处源码值得自行翻一遍:上述配置类、Language.java、src/main/resources/i18n/资源目录。
中文支持的两条现实路径
两条路径适用人群不同:能碰源码的读者走官方贡献,一劳永逸;纯使用者用浏览器插件临时汉化,五分钟见效。
贡献路径:参与 WebGoat 翻译贡献
流程按项目自带的README_I18N.md规范走,需要创建或修改的文件:
起点模板(实际需翻译messages.properties里的全部标签,有数十条):
welcome=欢迎使用 WebGoat login.username=用户名 login.password=密码 lesson.sql.title=SQL 注入 lesson.xss.title=跨站脚本攻击⚠️ 集成测试
LabelAndHintIntegrationTest会检查翻译是否漏项,跑不过mvn clean的翻译 PR 是没法合入的,本地先把测试跑绿。
临时汉化路径:浏览器插件代劳
不想碰源码的读者,最快的方式是浏览器翻译插件:
- Chrome 可装"沉浸式翻译",Edge 自带网页翻译
- 选择"仅翻译文本"模式,避免图片、代码块被翻译后布局错乱
- 排除 URL 地址栏和表单字段名的翻译,防止干扰实际操作
WebGoat 的界面标签稳定且重复率高,把 Welcome、Lesson、Submit 等几个词加入自定义词典,体验就够用了。
高频问题速查
| 现象 | 根因 | 处理动作 |
|---|---|---|
lang参数无效 | 参数名写错或请求未走拦截器 | 确认参数是lang且指向主页面地址 |
| 重启后语言重置 | SessionLocaleResolver仅会话内持久 | 重新登录后再切换,或改用CookieLocaleResolver |
| 顶栏翻译了,课程正文仍英文 | 课程 adoc 无对应语言版本 | 预期行为,按 README_I18N 步骤 5 翻译课程 |
| 切换后整页变英文 | 目标语言资源文件缺失或条目不全 | 检查对应.properties文件完整性 |
如果以上都没解决,建议到项目 Issue 区搜索相同报错关键词。
接下来你可以做什么
- 普通使用者:URL 参数加浏览器翻译插件组合使用,五分钟搭好可用环境
- 贡献者:新建
messages_zh.properties,先翻译README_I18N.md第 4 步的核心标签,mvn clean自测通过后提 PR,完成一次 WebGoat 翻译贡献 - 企业培训场景:fork 仓库本地部署,替换为
CookieLocaleResolver并补齐翻译文件,搭一套稳定的中文教学环境
(本文基于 WebGoat 当前版本源码在 Linux 环境下验证编写)
【免费下载链接】WebGoatWebGoat is a deliberately insecure application项目地址: https://gitcode.com/GitHub_Trending/we/WebGoat
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考