diff --git a/CHANGELOG.md b/CHANGELOG.md index fc14e0c..fde85ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ +## English copy — the PILOT: privatebin, paperless-ngx, romm (2026-09-20, R-560 slice 5) + +No image, no pin, no `catalog_since`, no compose line changed. Three apps gained an `i18n: en:` +block at the end of their `.felhom.yml`; **not one Hungarian byte moved**, and the freeze gate +proves it on all 53 apps on every push from now on. + +89 of the catalog's 1 032 customer-facing strings are now English — privatebin 14, paperless-ngx 33, +romm 42. `EN_MISSING_CEILING` 1032 → 943 in the same commit. + +The three were chosen for SHAPE, not for size: between them they exercise every part of the overlay +the controller learned to read in v0.257.0 — a plain app with only a description, tagline and lists +(privatebin); select options, a placeholder and a customer-facing folder label (paperless-ngx); and +the catalog's only `optional_config` block, whose group has no id of its own and is therefore matched +by `match_group`, the Hungarian group name it translates (romm). All three run on the demo box, so +the English pages could be fetched rather than reasoned about. + +A box on a controller older than 0.257.0 ignores the block entirely and keeps rendering Hungarian — +which is every box in the fleet until the floor is raised, and is why this push is safe ahead of it. + +What a gate CANNOT judge, and is listed per app in `REPORT.md`: whether an app's „first steps" name +the buttons that app's ENGLISH interface actually shows. Those lines are marked unverified and belong +to the slice-6 walk. + ## vaultwarden: registration closed by default; paperless-ngx: one worker and room for a batch (2026-09-15, R-512 / R-514 / R-515) No image or version change — same `vaultwarden/server:1.36.0-alpine` and paperless-ngx 2.20.15; the diff --git a/scripts/check-copy-i18n.py b/scripts/check-copy-i18n.py index 7ed2c8c..d71e483 100644 --- a/scripts/check-copy-i18n.py +++ b/scripts/check-copy-i18n.py @@ -67,8 +67,8 @@ SUPPORTED_LANGS = ("en",) # and HU_FORMAL_CEILING. # # Measured on 94bc5febaca2, before any translation: 1 032 copy strings, none with English. -# 1032 → (pilot) → (batch 1) → (batch 2) → 0 -EN_MISSING_CEILING = 1032 +# 1032 → 943 (pilot: privatebin, paperless-ngx, romm) → (batch 1) → (batch 2) → 0 +EN_MISSING_CEILING = 943 # ── What counts as COPY ────────────────────────────────────────────────────────────────────────── # @@ -389,7 +389,10 @@ def check_language(app, path, val, hu_val, display_name, fails): fails.append("%s: an accented Hungarian letter in the English text: %r" % (where, val)) folded = fold(val) for stem in HU_ASCII_STEMS: - if stem in folded: + # WORD BOUNDARIES. A bare substring test convicts honest English: „ird be" is inside + # "the third best", „angol" is inside "Angola". The stems are words, so they are matched + # as words — the negative control below is the case that found it. + if re.search(r"(? API.' + + - env_var: SCREENSCRAPER_USER + label: "ScreenScraper user name" + help_text: 'Sign up on screenscraper.fr. Your account name is the API user name.' + + - env_var: SCREENSCRAPER_PASSWORD + label: "ScreenScraper password" + help_text: 'The password of your screenscraper.fr account.' + + - env_var: MOBYGAMES_API_KEY + label: "MobyGames API Key" + help_text: 'Sign up on MobyGames, then ask for a key on the API page. It gives detailed game information and credits.'