CONTEXT + README: v0.259.0, and the two probe traps that cost the most
gates / gates (push) Successful in 25s

The composed-sentence-into-page-data class is now five instances and has its
own warning block in the README's i18n section, with the two things that make
a live probe lie: the felhom_lang cookie is ignored behind auth (so an English
probe of /backups returns Hungarian and reads as unfixed), and an apostrophe in
an English value is escaped so no assertion on the rendered page ever matches.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-09-21 08:07:27 +02:00
parent 0fe04bb6d5
commit 19ef0329ab
2 changed files with 28 additions and 5 deletions
+25 -4
View File
@@ -46,7 +46,7 @@ backups, monitoring and notifications. All Proxmox/disk operations are delegated
- [App-to-App Integrations](#15-app-to-app-integrations)
- [Network File Sharing — SMB](#16-network-file-sharing--smb-megosztás-v01440-r-7-slice-1)
- [Async-job feedback](#17-async-job-feedback-v0147x-feedback-slice-1)
- [Dashboard language (i18n)](#18-dashboard-language-i18n-v02470v02500)
- [Dashboard language (i18n)](#18-dashboard-language-i18n-v02470v02590)
- [Repository Layout](#repository-layout)
- [Configuration](#configuration)
- [REST API](#rest-api)
@@ -3614,7 +3614,7 @@ without reaching `Images()`.
---
### 18. Dashboard language (i18n) (v0.247.0–v0.257.0)
### 18. Dashboard language (i18n) (v0.247.0–v0.259.0)
Design: `felhom.eu/documentation/architecture/10-localisation.md`. Inventory:
`felhom.eu/documentation/audits/I18N-INVENTORY-2026-09-17.md`.
@@ -3626,8 +3626,29 @@ debug). Since **v0.252.0** the sentences the program BUILDS follow the language
data, the JSON the page's script reads, the alert banners, the country names, and the four page titles
built around an app name. Since **v0.253.0** every error message carries its key too. Since **v0.254.0** the notes a background
run SAVES follow the language as well, and the switch is a **globe** — on the dashboard and on the
sign-in, claim and recovery pages. Still Hungarian: catalog copy (slice 5) and **everything the hub
reads** (see below).
sign-in, claim and recovery pages. Since **v0.257.0** the app catalog's own copy follows it, and since
**v0.258.0/v0.259.0** so do the last Go-composed sentences: the update and lifecycle badges, the
data-folder promise, the channel banners, **the claim page's nine answers (R-596)** and **the Backup
page's protection warnings and tier names (R-598)**. Still Hungarian: the one R-570 producer, the 18
formal „ön" forms (counted and ratcheted, R-516), **everything the operator reads** (by design), and
the apps' own UIs (not ours).
> **THE ONE FAILURE MODE THIS SECTION EXISTS TO WARN ABOUT: a composed sentence handed to a renderer
> as page DATA.** Five instances — R-566, R-573, R-590, R-596, R-598. The template renders
> `{{.Error}}` correctly in both languages; only the VALUE is Hungarian. **No structural check sees
> it:** not the parity fixtures (they render the field faithfully whatever it holds), not
> `TestI18nEnglishPages` (it reads templates, not structs), not `i18n_missing_gate` (there is no key
> to be missing), not `i18n_go_parity` (it proves the Hungarian is unchanged, not which language
> reached the page). **Only a live English page or a handler-level render test finds one** — and the
> render test must assert the Hungarian sentence is **GONE**, not merely that the English is present.
>
> **Probing it live: the `felhom_lang` cookie works ONLY on anonymous pages** (sign-in, claim,
> recovery, bind). `langFor` step 2 means a request carrying a session reads the household's saved
> setting and deliberately ignores the cookie — so `/backups` with `felhom_lang=en` returns
> **Hungarian**, which reads exactly like an unfixed defect. Use `?lang=` behind auth (R-602).
>
> **And an English value containing an apostrophe never matches on the page** — `html/template`
> escapes `'` to `&#39;`, and the assertion fails saying the sentence never arrived (R-603).
- **Bundles:** `internal/i18n/locales/hu.json` (authoritative, every key) and `en.json`, embedded.
Flat `key → text`; a value may carry template actions (`{{.RecoveryAbandonDate}}`) and inline