我们的 Go CMS 现在支持 5 种语言,自行主题化,并对 404 进行沉思
Source: Dev.to
我们一直在构建 ForgeCMS —— 一个基于 Go 的 CMS,它从 Codeberg 仓库拉取内容,并在每月 €1 的 VPS 上提供服务。没有数据库。没有 WordPress。没有后悔。
今天我们发布了一个让人感觉跨过门槛的版本:CMS 不再是原型,而开始像一个真正的产品。
🌍 正式的 i18n – 无需框架
我们没有使用 go-i18n 或任何翻译库,而是直接在 SML 页面系统中实现了语言解析:
- 首次访问时通过
Accept-Language头部检测 /lang切换端点会设置langcookie- 通过
Page{lang: "es"}实现每页语言覆盖
回退链:atesti/es/index.sml → atesti/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:imageImage{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{}andFooter{}– 在app.sml中定义一次,所有页面统一渲染
⚖️ 双重许可证
项目现在以 GPL v3 + 商业许可证 发行,遵循 Qt 的模式。
- 开源用于开源。
- 商业许可证用于商业使用。
收入用于购买土地,以建设有意向的社区基础设施——但那是另一篇文章的内容。
接下来
实时概念验证站点是 atesti.crowdware.info —— Atesti para Dana 的家园,这是一种以 Minuto 框架构建的先礼后币的替代货币。
下一步:使用持久化 IndexedDB 的 SMS/WASM 搜索索引,让 CMS 能在不依赖后端查询的情况下搜索自身内容。
如果你在构建小而人性化、且有点怪异的东西——我们在 Codeberg 上。
属于 Forge 4D 生态系统的一部分——声明式 UI、本地编译、无需云端。