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

1233.jpg

如果你也是 Homelab 爱好者,大概率也在用 Wallos 来管理这一大堆 Netflix、Spotify 和 VPS 的续费日期。它界面简洁、功能够用,唯一的遗憾就是——本地化做得不够彻底

无论你在 Docker 环境变量里怎么设置时区,首页卡片上的日期永远是一副“高冷”的英文面孔:Jan 29Feb 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 代码。这段代码在本地运行,自动扫描网页上的日期并进行汉化。

优点:

  1. 零侵入:不动 Docker 镜像,升级无忧。
  2. 高性能:服务器不需要进行文本匹配,压力为零。
  3. 智能:自动补全“日”字,支持闰年等所有情况。

操作步骤

如果你使用 Nginx Proxy Manager (NPM) ,操作如下:

  1. 编辑 Wallos 的代理记录,点击 Advanced (高级)
  2. 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>';
  1. 点击 Save 保存。
  2. 回到 Wallos 页面,按下 Ctrl + F5 强制刷新。

效果展示

原本的 Jan 29 变成了 1月29日,原本的 Mar 10 变成了 3月10日

这段代码使用了 TreeWalker 技术,它只修改纯文本,绝对安全,不会误伤网页里的按钮、链接或样式。

折腾 Homelab 的乐趣往往不在于结果,而在于解决这些“强迫症”细节的过程。希望这个小技巧能帮到同样对界面有要求的你!

评论