# REPORT — controller v0.247.0: the i18n spike — English on three pages, Hungarian byte-identical **Date:** 2026-09-17 · **Task:** localisation starter (spike + design), Phase 1 · **Baseline:** `main` `89dd3e94b1de` (v0.246.0, MinAgent 0.131.0) · **Released:** `612c417` → image `gitea.dooplex.hu/admin/felhom-controller:0.247.0` · **MinAgent:** 0.131.0 (unchanged). **Architecture read before any claim:** `felhom.eu/documentation/architecture/02-controller-module-map.md` (templates, setup wizard obsolete) and `05-hub-architecture.md` (report ingestion, config push). **Design written after the spike ran:** `felhom.eu/documentation/architecture/10-localisation.md`. **Inventory:** `felhom.eu/documentation/audits/I18N-INVENTORY-2026-09-17.md`. ## Claims in the brief that turned out wrong — named first The brief named four already. Further ones (details and methods in the inventory §0): 1. **„`fmtTime`, `fmtBytes`, `timeAgo` do not exist; `fmtMB` is the one size helper"** — all three exist (`internal/web/funcmap.go` L265/L318/L403), plus nine more copy- or locale-producing helpers and four size helpers. `timeAgo` builds „%d perce" — the plural problem lives there. 2. **„`fmtMB` used 10× in templates"** — 8×. 3. **„~13 `.Format(` layout calls in `internal/web`"** — 10 at the baseline (plus 8 `time.RFC3339`). 4. **Template lines 1 613 / 1 838** — 1 553, by two methods; neither figure reproduced by four variants. 5. **Go literals 1 234 in 99 files** — 1 141 in 84 (a lexer, comments skipped); comments explain most of the difference. 6. **Banner 33 lines** — 34 once ASCII-only Hungarian words count (method difference). ## What shipped - **Mechanism (b), expanded at template LOAD:** `internal/i18n` (`Bundle`, `Expand`, `Msg`, `Plural`, embedded `locales/hu.json` + `en.json`). `loadTemplates` parses one template set per language via `parseTemplateSet` (= `ParseFS` + `Expand`); `s.tmpl` stays Hungarian. Why not a runtime `T` func: the escaper changes `+ ' "` bytes and 618 of 1 867 template strings are inside `