From e81d41e5270ac9205acd10a4f3fbbdf07a6402f1 Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Sun, 20 Sep 2026 14:34:22 +0200 Subject: [PATCH] =?UTF-8?q?English=20copy=20=E2=80=94=20the=20PILOT:=20pri?= =?UTF-8?q?vatebin,=20paperless-ngx,=20romm=20(R-560=20slice=205)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 89 of 1 032 strings. No Hungarian byte moved; no image, pin, catalog_since or compose line changed. EN_MISSING_CEILING 1032 -> 943 in this commit. Chosen for SHAPE: privatebin exercises the plain case (description, tagline, lists); paperless-ngx adds select options, a placeholder and a customer-facing folder label; romm carries the catalog's only optional_config block, whose group has no id of its own and is matched by `match_group` — the Hungarian group name it translates. All three run on the demo box, so the English pages can be fetched rather than reasoned about. Two gate defects fixed while translating, each found by its own decoy rather than by reading: coverage was counted only for the apps NAMED on the command line, so `check-copy-i18n.py privatebin` reported 47 more missing strings than the same tree unscoped and either number could have been made to "pass"; and the ASCII-Hungarian stems matched as bare substrings, so „ird be" convicted "the third best" and „angol" convicted "Angola". Both now have their own case in the decoy suite. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS --- CHANGELOG.md | 23 ++++++++ scripts/check-copy-i18n.py | 29 +++++++--- scripts/test_gate_decoys.py | 66 ++++++++++++++++------ templates/paperless-ngx/.felhom.yml | 72 ++++++++++++++++++++++++ templates/privatebin/.felhom.yml | 32 +++++++++++ templates/romm/.felhom.yml | 87 +++++++++++++++++++++++++++++ 6 files changed, 285 insertions(+), 24 deletions(-) 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.'