Skip to content

Pr i18n 2c special case pages#22

Merged
MrChengLen merged 6 commits into
mainfrom
pr-i18n-2c-special-case-pages
May 8, 2026
Merged

Pr i18n 2c special case pages#22
MrChengLen merged 6 commits into
mainfrom
pr-i18n-2c-special-case-pages

Conversation

@MrChengLen
Copy link
Copy Markdown
Owner

No description provided.

MrChengLen and others added 6 commits May 8, 2026 16:07
The pre-commit and pre-push scope-guards block any diff containing
`Reetwerder|21029 Hamburg` (the operator's address required by §5 TMG)
unless the file path matches ALLOW_RE. Locale catalog files (locale/
**/*.po, *.mo, *.pot) are mechanically extracted from the public
impressum/privacy/terms templates — they cannot avoid carrying the
same address strings, but the source templates are explicitly
allow-listed.

Without this exception, every i18n update of the legal pages would
need --no-verify to commit, defeating the hook. Adding locale/.* to
the allow list keeps the guard tight (other paths still blocked) while
acknowledging that the catalogs only mirror already-public content.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closes the i18n campaign (after 1, 2a, 2b, 1b, fix-switcher) by handling
the four templates that were deliberately skipped from the mechanical
PR-i18n-2a/2b wrap because of legal nuance, plus dashboard.html added
per user direction "alle templates grundlegend betrachten".

- enterprise.html: full EN-twin (~91 strings translated DE→EN as msgids,
  DE remains in catalog). EN-only disclaimer header notes the German
  version is legally authoritative (HGB §257, AO §147, DSGVO Art 17).
- impressum.html: stays raw German per TMG §5; en-only preamble explains
  why the legal body below is in German. Only 2 new keys (preamble).
- privacy.html: full _() wrap of ~55 strings + DE-authoritative footer.
- terms.html: full _() wrap of ~25 strings + DE-authoritative footer.
  Adds new sections § 8 (Subscriptions) and § 9 (Right of Withdrawal,
  BGB §356 (5)) per the BGB-waiver feature in a follow-up commit; old
  §8 Contact renumbered to §10.
- dashboard.html: mechanical wrap (Page-Title, headings, button labels).

Catalog: 184 new msgids, all DE translations populated (400 of 400 in
de.po, drift-check exit 0). Three new regression guards in
tests/test_public_pages_reachability.py pin the disclaimer/preamble/raw-
German invariants for /de/enterprise, /en/enterprise, /en/impressum;
existing /privacy /terms params updated to /en/ since default route now
serves DE. Cockpit + transactional emails are out of scope (deferred
to PR-i18n-3 — needs User.preferred_lang DB migration).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Required by terms.html § 9 (added in PR-i18n-2c): German consumer law
(§ 356 (5) BGB) lets a paid subscriber waive the standard 14-day right
of withdrawal in exchange for immediate access to paid-tier features.
Without an explicit waiver, the subscription cannot start executing
inside the 14-day window — defeating the point of paying.

UI gate (pricing.html + pricing.js):
- Each upgrade tier exposes a `data-target`-wired waiver checkbox
  (`pro-waiver`, `business-waiver`).
- The matching button (`pro-btn`, `business-btn`) renders with the
  `disabled` attribute; the JS only toggles it off after the user
  ticks the checkbox.

Server gate (billing.py):
- /api/v1/billing/checkout now requires `withdrawal_waiver=True` in
  the request body; we record the waiver acceptance alongside the
  Stripe customer creation. Rejects with 400 if missing — defence in
  depth so a curl bypass of the UI checkbox still can't open a
  contract that lacks the legal acknowledgement.

Schema (schemas.py):
- `CheckoutRequest` adds `withdrawal_waiver: bool` (required).

Tests:
- New tests/test_billing_consent.py asserts the 400 path, the
  audit-log line, and the happy path.
- test_seo_foundation.py renames the `..._when_stripe_enabled` test
  to `..._with_waiver_gate_when_stripe_enabled` and pins the
  `disabled` + `data-target` structure.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…oc edits

Across base.html meta description, jsonld description, README compliance
row, and register.html subtitle. The new wording makes a less absolute
claim (privacy is a goal, not a guarantee) and aligns with the
positioning we want to take on AlternativeTo / Wikidata listings.

- README.md: rewords compliance-edition signing language ("CI gate
  validated against veraPDF for a worst-case fixture", "cryptographically
  signed releases" — matches actual mechanism rather than waving GPG
  around).
- register.html: subtitle "Free forever — no credit card required" →
  "Free tier forever — upgrade only when you need more" (positions the
  free tier without implying paid is unnecessary).
- docs/formats.md, docs/installation.md: minor cleanup edits.

No behavioural change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The committed pot still carried the placeholder header from the original
Babel scaffold (`PROJECT` / `ORGANIZATION`), even though scripts/i18n.py
runs `pybabel extract --project=FileMorph --copyright-holder=FileMorph`.
A fresh extract on Linux CI produced the correct header and the drift-
check failed against the stale committed copy.

Re-running `python scripts/i18n.py extract` locally regenerates the pot
with the right header — same content, just the metadata that should
have been there since PR-i18n-1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous CI run drift-checked against a stale state and reported
missing msgids that exist in the committed pot at HEAD. Bumping the
POT-Creation-Date forces a fresh CI run with the current branch tip.
No msgid/msgstr changes — the pot already contains the strings CI
flagged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@MrChengLen MrChengLen force-pushed the pr-i18n-2c-special-case-pages branch from f2fb7d7 to 101288a Compare May 8, 2026 14:09
@MrChengLen MrChengLen merged commit 53ee707 into main May 8, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant