我们的 Go CMS 现在支持 5 种语言,自行主题化,并对 404 进行沉思

发布: (2026年3月29日 GMT+8 04:02)
5 分钟阅读
原文: Dev.to

Source: Dev.to

我们一直在构建 ForgeCMS —— 一个基于 Go 的 CMS,它从 Codeberg 仓库拉取内容,并在每月 €1 的 VPS 上提供服务。没有数据库。没有 WordPress。没有后悔。

今天我们发布了一个让人感觉跨过门槛的版本:CMS 不再是原型,而开始像一个真正的产品。

🌍 正式的 i18n – 无需框架

我们没有使用 go-i18n 或任何翻译库,而是直接在 SML 页面系统中实现了语言解析:

  • 首次访问时通过 Accept-Language 头部检测
  • /lang 切换端点会设置 lang cookie
  • 通过 Page{lang: "es"} 实现每页语言覆盖

回退链:atesti/es/index.smlatesti/index.sml

结果是:来自巴塞罗那的访客会自动进入西班牙语页面,来自加泰罗尼亚的访客会看到 Català。无需 JavaScript。

lang-specific SML pages (atesti/es/index.sml fallback to index.sml)
Page{lang:} override for per-page content language
Markdown{src:} with lang injection and no‑lang fallback

我们还新增了 Markdown{src:} 语法,它会把当前语言注入到源路径中——因此当可用时 content.md 会变成 content-es.md,若不存在则静默回退到默认文件。

🎨 通过 SML 实现主题系统

主题现在是头等公民。两份文件控制一切:

  • theme.sml – 亮色模式的 CSS 自定义属性
  • theme-dark.sml – 暗色模式的覆盖

整个站点的配色、间距和排版都来源于这两份文件。没有硬编码的十六进制颜色散落在模板中。它遵循我们 SML 声明式 UI 的相同理念:声明意图,让系统完成其余工作

🔗 OG 元数据标签 + 图片路径解析

每个页面现在都会输出正确的 OpenGraph 标签:

og:title, og:description, og:url, og:image

Image{src:} 现在会自动将相对路径解析为完整的 Codeberg 原始 URL——这样内容作者就不必考虑图片在 CDN 上的具体位置。

💀 Guru Meditation 错误页面

404 与 500 页面现在渲染为 Amiga 风格的 Guru Meditation 屏幕:

Software Failure. Press left mouse button to continue.

Guru Meditation

#00000404.DEADBEEF

← back to safety

这是一封致 Amiga 的情书,也完全符合由 80 年代 Toolbox 杂志自学编程的作者所打造的 CMS 的品牌调性。

🏗️ 底层实现

一些重要的基础设施改进:

  • ETagFor() – 为资产提供正确的缓存指纹
  • Stale cache fallback – 当 Codeberg 无法访问时,提供最近一次成功的内容
  • ErrNotFound sentinel – 使用干净的错误类型传播,而不是字符串匹配
  • Asset fingerprinting fix – favicon(一个萌芽的种子 🌱 SVG)现在能够正确 bust 缓存
  • Site‑wide Menu{} and Footer{} – 在 app.sml 中定义一次,所有页面统一渲染

⚖️ 双重许可证

项目现在以 GPL v3 + 商业许可证 发行,遵循 Qt 的模式。

  • 开源用于开源。
  • 商业许可证用于商业使用。

收入用于购买土地,以建设有意向的社区基础设施——但那是另一篇文章的内容。

接下来

实时概念验证站点是 atesti.crowdware.info —— Atesti para Dana 的家园,这是一种以 Minuto 框架构建的先礼后币的替代货币。

下一步:使用持久化 IndexedDB 的 SMS/WASM 搜索索引,让 CMS 能在不依赖后端查询的情况下搜索自身内容。

如果你在构建小而人性化、且有点怪异的东西——我们在 Codeberg 上。

属于 Forge 4D 生态系统的一部分——声明式 UI、本地编译、无需云端。

0 浏览
Back to Blog

相关文章

阅读更多 »