Wallos 订阅管理:把 "Jan 29" 优雅变为 "1月29日" 的简单方案

如果你也是 Homelab 爱好者,大概率也在用 Wallos 来管理这一大堆 Netflix、Spotify 和 VPS 的续费日期。它界面简洁、功能够用,唯一的遗憾就是——本地化做得不够彻底。
无论你在 Docker 环境变量里怎么设置时区,首页卡片上的日期永远是一副“高冷”的英文面孔:Jan 29,Feb 14。在一堆中文界面里,这串英文显得格外刺眼,而且不够直观:一眼很难反应过来 "Oct" 到底是几月。
为了把它改成符合国人习惯的 “1月29日” ,我经历了一波三折的折腾,从修改源码到炸掉 Nginx,最后终于找到了一个零侵入、极度优雅的解决方案。
🚫 弯路一:天真的环境变量
刚开始,我以为是我的 Docker 配置没写对。于是我在 docker-compose.yml 里疯狂确认:
YAML
environment:
- TZ=Asia/Shanghai
- LC_ALL=zh_CN.UTF-8 # 试过没用
结果: TZ 只能决定“现在是几点”,决定不了“日期怎么写”。Wallos 底层是用 PHP 的 date('M j') 函数硬编码输出的,跟系统语言环境毫无关系。
✂️ 弯路二:暴力的源码修改
既然是硬编码,那就改代码。我进入容器内部:
Bash
docker exec -it wallos /bin/sh
grep -rl "M j" /var/www/html
找到文件后,把所有的 'M j' 替换成了 'n月j日'。
结果: 成功了!界面瞬间变成了“1月29日”。但是,这是不可持久的。一旦 Watchtower 自动更新了 Wallos 镜像,或者我重建了容器,所有的修改都会重置。虽然可以把文件挂载出来,但为了改个日期格式去维护一个核心 PHP 文件,未免太“重”了。
💥 弯路三:让 Nginx 崩溃的穷举法
既然不能改内部,那就在外部反代层(Nginx Proxy Manager, NPM)做拦截。Nginx 有个 sub_filter 模块可以替换网页内容。
我想:“一年也就 366 天,我写 366 条替换规则不就行了?” 于是我生成了这样的配置:
Nginx
sub_filter "Jan 1" "1月1日";
sub_filter "Jan 2" "1月2日";
...
sub_filter "Dec 31" "12月31日";
结果: NPM 直接崩了。当我把这就几百行代码贴进 NPM 的 Advanced 配置框保存时,要么是前端报错,要么是 Nginx 进程因为配置过大直接卡死。看来暴力穷举法虽然逻辑通,但对配置文件的体积和性能不太友好。
✅ 终极方案:JavaScript 注入法
最后,我找到了最优解。
既然服务端改起来麻烦,为什么不让浏览器自己去改呢? 我只需要让 Nginx 在网页加载时,往 </body> 标签前面“塞”入一小段 JavaScript 代码。这段代码在本地运行,自动扫描网页上的日期并进行汉化。
优点:
- 零侵入:不动 Docker 镜像,升级无忧。
- 高性能:服务器不需要进行文本匹配,压力为零。
- 智能:自动补全“日”字,支持闰年等所有情况。
操作步骤
如果你使用 Nginx Proxy Manager (NPM) ,操作如下:
- 编辑 Wallos 的代理记录,点击 Advanced (高级) 。
- 在 Custom Nginx Configuration 中粘贴以下代码:
Nginx
# 1. 禁用 Gzip 压缩
# 只有禁用压缩,Nginx 才能读取并注入内容,否则是一堆乱码
proxy_set_header Accept-Encoding "";
# 2. 开启替换模式,注入类型为 HTML
sub_filter_once off;
sub_filter_types text/html;
# 3. 注入 JS 脚本
# 原理:找到 </body> 闭合标签,在它前面插入一段自动汉化的脚本
sub_filter '</body>' '<script>
(function(){
// 定义月份映射
var map={"Jan":1,"Feb":2,"Mar":3,"Apr":4,"May":5,"Jun":6,"Jul":7,"Aug":8,"Sep":9,"Oct":10,"Nov":11,"Dec":12};
// 创建遍历器,只查找文本节点,确保不破坏网页标签结构
var walk=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,null,false);
var n;
// 循环查找并正则替换
while(n=walk.nextNode()){
// 正则逻辑:匹配 "英文月 + 空格 + 数字",替换为 "数字月 + 数字 + 日"
n.nodeValue=n.nodeValue.replace(/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{1,2})/g, function(match,m,d){
return map[m]+"月"+d+"日";
});
}
})();
</script></body>';
- 点击 Save 保存。
- 回到 Wallos 页面,按下
Ctrl + F5强制刷新。
效果展示
原本的 Jan 29 变成了 1月29日,原本的 Mar 10 变成了 3月10日。
这段代码使用了 TreeWalker 技术,它只修改纯文本,绝对安全,不会误伤网页里的按钮、链接或样式。
折腾 Homelab 的乐趣往往不在于结果,而在于解决这些“强迫症”细节的过程。希望这个小技巧能帮到同样对界面有要求的你!
评论