fix(i18n): translate viewer + Transcribe panel controls for EN/ES locales #626

Merged
marcel merged 6 commits from feat/issue-319-i18n-viewer-transcribe-controls into main 2026-05-19 20:23:13 +02:00
Owner

Closes #319

Summary

  • Adds 7 Paraglide message keys (viewer_previous_page, viewer_next_page, viewer_zoom_out, viewer_zoom_in, transcribe_mark_for_training, layout_menu_open, layout_menu_close) to de/en/es.json
  • Wires PdfControls.svelte — 4 icon-button aria-labels (Zurück, Weiter, Verkleinern, Vergrößern) now go through m.viewer_*()
  • Wires AppNav.svelte — hamburger button aria-label (Menü öffnen/Menü schließen) now goes through m.layout_menu_open()/m.layout_menu_close()
  • Wires TranscriptionEditView.svelte — visible label Für Training vormerken now goes through m.transcribe_mark_for_training()
  • Adds src/lib/messages.spec.ts — key-parity test asserting de/en/es always have identical key sets; specific assertions for all 7 new keys
  • Adds E2E test to lang.spec.ts — mobile-viewport EN locale assertion that the hamburger button has accessible name Open menu

Test plan

  • npm run test — all unit tests green (key parity + existing viewer/transcription suites)
  • npm run check — no new type errors introduced
  • Switch locale to EN in the app, open a document with a PDF — viewer controls show "Previous page", "Next page", "Zoom out", "Zoom in"
  • Open Transcribe panel in EN — label shows "Mark for OCR training"
  • Resize to mobile width, switch to EN — hamburger button aria-label is "Open menu"
  • Same checks in ES locale

🤖 Generated with Claude Code

Closes #319 ## Summary - Adds 7 Paraglide message keys (`viewer_previous_page`, `viewer_next_page`, `viewer_zoom_out`, `viewer_zoom_in`, `transcribe_mark_for_training`, `layout_menu_open`, `layout_menu_close`) to `de/en/es.json` - Wires `PdfControls.svelte` — 4 icon-button aria-labels (`Zurück`, `Weiter`, `Verkleinern`, `Vergrößern`) now go through `m.viewer_*()` - Wires `AppNav.svelte` — hamburger button aria-label (`Menü öffnen`/`Menü schließen`) now goes through `m.layout_menu_open()`/`m.layout_menu_close()` - Wires `TranscriptionEditView.svelte` — visible label `Für Training vormerken` now goes through `m.transcribe_mark_for_training()` - Adds `src/lib/messages.spec.ts` — key-parity test asserting de/en/es always have identical key sets; specific assertions for all 7 new keys - Adds E2E test to `lang.spec.ts` — mobile-viewport EN locale assertion that the hamburger button has accessible name `Open menu` ## Test plan - [ ] `npm run test` — all unit tests green (key parity + existing viewer/transcription suites) - [ ] `npm run check` — no new type errors introduced - [ ] Switch locale to EN in the app, open a document with a PDF — viewer controls show "Previous page", "Next page", "Zoom out", "Zoom in" - [ ] Open Transcribe panel in EN — label shows "Mark for OCR training" - [ ] Resize to mobile width, switch to EN — hamburger button aria-label is "Open menu" - [ ] Same checks in ES locale 🤖 Generated with [Claude Code](https://claude.com/claude-code)
marcel added 5 commits 2026-05-19 17:11:23 +02:00
Adds 7 Paraglide keys (viewer_previous_page, viewer_next_page,
viewer_zoom_out, viewer_zoom_in, transcribe_mark_for_training,
layout_menu_open, layout_menu_close) to de/en/es.json.

Adds messages.spec.ts to enforce key parity across all three locales.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces hardcoded Zurück/Weiter/Verkleinern/Vergrößern aria-label strings
with m.viewer_previous_page(), m.viewer_next_page(), m.viewer_zoom_out(),
and m.viewer_zoom_in() so viewer controls translate in EN and ES locales.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces hardcoded 'Menü öffnen'/'Menü schließen' ternary with
m.layout_menu_open()/m.layout_menu_close() so the mobile nav toggle
announces correctly in EN and ES locales.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces hardcoded visible text 'Für Training vormerken' with
m.transcribe_mark_for_training() so the label translates in EN and ES.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
test(e2e): assert hamburger aria-label translates to EN on mobile viewport
All checks were successful
CI / Unit & Component Tests (pull_request) Successful in 3m20s
CI / OCR Service Tests (pull_request) Successful in 19s
CI / Backend Unit Tests (pull_request) Successful in 3m33s
CI / fail2ban Regex (pull_request) Successful in 44s
CI / Semgrep Security Scan (pull_request) Successful in 21s
CI / Compose Bucket Idempotency (pull_request) Successful in 1m1s
9c5267e1f0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Author
Owner

👨‍💻 Felix Brandt — Senior Fullstack Developer

Verdict: ⚠️ Approved with concerns

The mechanical substitution is correct and clean throughout. TDD cycle was followed — messages.spec.ts went red before the JSON keys were added, then green. Existing viewer and transcription test suites still pass.

Suggestion

PdfControls.svelte.spec.ts — tests pass coincidentally, not intentionally

Lines 89, 155, and 167 filter icon-only buttons using hardcoded German strings:

const iconOnlyButtons = Array.from(allButtons).filter((b) => {
    const label = b.getAttribute('aria-label') ?? '';
    return ['zurück', 'weiter', 'verkleinern', 'vergrößern'].includes(label.toLowerCase());
});

After this PR the component uses m.viewer_previous_page() etc., which in DE locale still returns "Zurück", "Weiter", etc. — so the tests pass. But they're testing the locale-resolved string value by coincidence, not the i18n contract. If someone changes the DE translation of viewer_previous_page to "Zurückblättern", these tests will silently break in a confusing way (four buttons → zero buttons found, length assertion fails with no clear message).

Suggested fix — replace the hardcoded array with the message functions:

import { m } from '$lib/paraglide/messages.js';

const iconOnlyButtons = Array.from(allButtons).filter((b) => {
    const label = b.getAttribute('aria-label') ?? '';
    return [
        m.viewer_previous_page(),
        m.viewer_next_page(),
        m.viewer_zoom_out(),
        m.viewer_zoom_in()
    ].map(s => s.toLowerCase()).includes(label.toLowerCase());
});

Same for the PdfViewer.svelte.test.ts descriptions that mention the DE strings inline (lines 25, 33–36 — test description string "Zurück/Weiter/Vergrößern/Verkleinern" can stay as a description, but the assertions on lines 33–36 could also use m.*() for clarity).

This is a suggestion, not a blocker — the tests do pass and the production code is correct.

## 👨‍💻 Felix Brandt — Senior Fullstack Developer **Verdict: ⚠️ Approved with concerns** The mechanical substitution is correct and clean throughout. TDD cycle was followed — messages.spec.ts went red before the JSON keys were added, then green. Existing viewer and transcription test suites still pass. ### Suggestion **`PdfControls.svelte.spec.ts` — tests pass coincidentally, not intentionally** Lines 89, 155, and 167 filter icon-only buttons using hardcoded German strings: ```ts const iconOnlyButtons = Array.from(allButtons).filter((b) => { const label = b.getAttribute('aria-label') ?? ''; return ['zurück', 'weiter', 'verkleinern', 'vergrößern'].includes(label.toLowerCase()); }); ``` After this PR the component uses `m.viewer_previous_page()` etc., which in DE locale still returns `"Zurück"`, `"Weiter"`, etc. — so the tests pass. But they're testing the locale-resolved string value by coincidence, not the i18n contract. If someone changes the DE translation of `viewer_previous_page` to `"Zurückblättern"`, these tests will silently break in a confusing way (four buttons → zero buttons found, length assertion fails with no clear message). Suggested fix — replace the hardcoded array with the message functions: ```ts import { m } from '$lib/paraglide/messages.js'; const iconOnlyButtons = Array.from(allButtons).filter((b) => { const label = b.getAttribute('aria-label') ?? ''; return [ m.viewer_previous_page(), m.viewer_next_page(), m.viewer_zoom_out(), m.viewer_zoom_in() ].map(s => s.toLowerCase()).includes(label.toLowerCase()); }); ``` Same for the `PdfViewer.svelte.test.ts` descriptions that mention the DE strings inline (lines 25, 33–36 — test description string `"Zurück/Weiter/Vergrößern/Verkleinern"` can stay as a description, but the assertions on lines 33–36 could also use `m.*()` for clarity). This is a suggestion, not a blocker — the tests do pass and the production code is correct.
Author
Owner

🏛️ Markus Keller — Senior Application Architect

Verdict: Approved

Pure frontend change. Checked against the full doc-update matrix in CLAUDE.md:

Criterion Result
New Flyway migration Not applicable
New backend package or domain module Not applicable
New SvelteKit route Not applicable — no new +page.svelte files
New Docker service or infrastructure component Not applicable
New ErrorCode or Permission value Not applicable
New domain concept or term Not applicable

The key namespace conventions (viewer_*, layout_*, transcribe_*) are consistent with the established prefix pattern (nav_*, btn_*, pdf_*, training_*) and scale correctly. No architecture boundary is crossed.

The messages.spec.ts parity test belongs where it was placed — src/lib/ is the right home for a spec that imports the three JSON files directly as modules.

Nothing to flag from an architecture perspective.

## 🏛️ Markus Keller — Senior Application Architect **Verdict: ✅ Approved** Pure frontend change. Checked against the full doc-update matrix in `CLAUDE.md`: | Criterion | Result | |---|---| | New Flyway migration | Not applicable | | New backend package or domain module | Not applicable | | New SvelteKit route | Not applicable — no new `+page.svelte` files | | New Docker service or infrastructure component | Not applicable | | New `ErrorCode` or `Permission` value | Not applicable | | New domain concept or term | Not applicable | The key namespace conventions (`viewer_*`, `layout_*`, `transcribe_*`) are consistent with the established prefix pattern (`nav_*`, `btn_*`, `pdf_*`, `training_*`) and scale correctly. No architecture boundary is crossed. The `messages.spec.ts` parity test belongs where it was placed — `src/lib/` is the right home for a spec that imports the three JSON files directly as modules. Nothing to flag from an architecture perspective.
Author
Owner

🚀 Tobias Wendt — DevOps & Platform Engineer

Verdict: Approved

No infrastructure changes in this PR. Checked:

  • No new npm dependencies added
  • No Docker Compose changes
  • No CI workflow changes
  • No environment variables added

E2E test pattern note (not a blocker)

The new test in e2e/lang.spec.ts uses browser.newContext() to spin up a mobile viewport context, which mirrors the pattern already established in e2e/accessibility.spec.ts (dark mode context). That's consistent.

One thing to be aware of: E2E tests are not currently wired into CI (e2e/CLAUDE.md states they stop at unit/component tests). The new test will only run when someone runs npm run test:e2e locally or if the CI pipeline is extended. That's fine for now — just means the mobile hamburger aria-label won't be automatically verified on every PR until CI is extended.

No platform concerns. Clean.

## 🚀 Tobias Wendt — DevOps & Platform Engineer **Verdict: ✅ Approved** No infrastructure changes in this PR. Checked: - No new npm dependencies added - No Docker Compose changes - No CI workflow changes - No environment variables added **E2E test pattern note (not a blocker)** The new test in `e2e/lang.spec.ts` uses `browser.newContext()` to spin up a mobile viewport context, which mirrors the pattern already established in `e2e/accessibility.spec.ts` (dark mode context). That's consistent. One thing to be aware of: E2E tests are not currently wired into CI (`e2e/CLAUDE.md` states they stop at unit/component tests). The new test will only run when someone runs `npm run test:e2e` locally or if the CI pipeline is extended. That's fine for now — just means the mobile hamburger aria-label won't be automatically verified on every PR until CI is extended. No platform concerns. Clean.
Author
Owner

📋 Elicit — Requirements Engineer

Verdict: 🚫 Changes requested

Checked the PR against the acceptance criteria from issue #319.

Acceptance criterion Status
≥ 7 strings moved through Paraglide All 7 wired
de/en/es JSONs have matching key sets (unit test) messages.spec.ts enforces this
E2E verifies no German in EN-locale viewer + Transcribe panel Missing
E2E verifies no German in ES-locale viewer + Transcribe panel Missing
axe-core WCAG 3.1.2 passes in EN and ES Missing
No new hardcoded literals in affected files Verified

Blockers

1. E2E coverage for viewer and Transcribe panel is absent

The only new E2E test added checks the hamburger button in EN on a mobile viewport. The issue's acceptance criteria explicitly require verifying that no German strings appear in the viewer controls and Transcribe panel under EN and ES locales. Those tests are not here.

The issue itself raised the concern that fixture availability needs to be confirmed (Sara noted this in the review comments on #319 — a document with an attached PDF is needed). If a fixture exists (the viewer directory contains minimal.pdf), the test should be added. If no fixture is available in the E2E test data, this needs to be either documented as a known gap with a follow-up issue, or the fixture needs to be created.

2. axe-core WCAG 3.1.2 check not added

Criterion 5 requires an axe-core scan in EN and ES locales verifying no "language of parts" violations. The existing e2e/accessibility.spec.ts scans home, persons, aktivitaeten, admin, and admin-system — it does not cover the document detail page or the Transcribe panel.

Recommendation

Either:

  • Add the missing E2E and axe-core tests to this PR, or
  • Create a follow-up issue that explicitly scopes the gap, linked to #319, so it doesn't get lost

The core fix (all 7 strings wired, parity test) is correct. The gap is in verification, not in implementation.

## 📋 Elicit — Requirements Engineer **Verdict: 🚫 Changes requested** Checked the PR against the acceptance criteria from issue #319. | Acceptance criterion | Status | |---|---| | ≥ 7 strings moved through Paraglide | ✅ All 7 wired | | de/en/es JSONs have matching key sets (unit test) | ✅ `messages.spec.ts` enforces this | | E2E verifies no German in **EN**-locale viewer + Transcribe panel | ❌ Missing | | E2E verifies no German in **ES**-locale viewer + Transcribe panel | ❌ Missing | | axe-core WCAG 3.1.2 passes in EN and ES | ❌ Missing | | No new hardcoded literals in affected files | ✅ Verified | ### Blockers **1. E2E coverage for viewer and Transcribe panel is absent** The only new E2E test added checks the hamburger button in EN on a mobile viewport. The issue's acceptance criteria explicitly require verifying that no German strings appear in the viewer controls and Transcribe panel under EN and ES locales. Those tests are not here. The issue itself raised the concern that fixture availability needs to be confirmed (Sara noted this in the review comments on #319 — a document with an attached PDF is needed). If a fixture exists (the viewer directory contains `minimal.pdf`), the test should be added. If no fixture is available in the E2E test data, this needs to be either documented as a known gap with a follow-up issue, or the fixture needs to be created. **2. axe-core WCAG 3.1.2 check not added** Criterion 5 requires an axe-core scan in EN and ES locales verifying no "language of parts" violations. The existing `e2e/accessibility.spec.ts` scans `home`, `persons`, `aktivitaeten`, `admin`, and `admin-system` — it does not cover the document detail page or the Transcribe panel. ### Recommendation Either: - Add the missing E2E and axe-core tests to this PR, or - Create a follow-up issue that explicitly scopes the gap, linked to #319, so it doesn't get lost The core fix (all 7 strings wired, parity test) is correct. The gap is in verification, not in implementation.
Author
Owner

🔒 Nora "NullX" Steiner — Application Security Engineer

Verdict: Approved

Reviewed with an adversarial lens. This PR is a pure i18n wiring change — it modifies message JSON files, Svelte template strings, and adds test coverage. Checked:

  • No new API endpoints introduced
  • No authentication or authorization logic touched
  • No user-supplied input flows added or modified
  • No permission annotations added, removed, or changed
  • No new external dependencies introduced
  • No data exposure surface changes

WCAG 3.1.2 (Language of Parts) — positive security outcome

The fix directly addresses the accessibility conformance failure raised in the issue. When AT users receive screen reader output in the wrong language, it degrades their ability to understand what actions do — which has a security dimension (confirming an action you didn't understand). This PR resolves that.

Message injection — not a concern

The Paraglide message functions (m.viewer_previous_page() etc.) return statically compiled strings from the JSON files. They do not accept user input and cannot be influenced at runtime by external data. No injection vector here.

No security concerns. Clean merge.

## 🔒 Nora "NullX" Steiner — Application Security Engineer **Verdict: ✅ Approved** Reviewed with an adversarial lens. This PR is a pure i18n wiring change — it modifies message JSON files, Svelte template strings, and adds test coverage. Checked: - No new API endpoints introduced - No authentication or authorization logic touched - No user-supplied input flows added or modified - No permission annotations added, removed, or changed - No new external dependencies introduced - No data exposure surface changes **WCAG 3.1.2 (Language of Parts) — positive security outcome** The fix directly addresses the accessibility conformance failure raised in the issue. When AT users receive screen reader output in the wrong language, it degrades their ability to understand what actions do — which has a security dimension (confirming an action you didn't understand). This PR resolves that. **Message injection — not a concern** The Paraglide message functions (`m.viewer_previous_page()` etc.) return statically compiled strings from the JSON files. They do not accept user input and cannot be influenced at runtime by external data. No injection vector here. No security concerns. Clean merge.
Author
Owner

🧪 Sara Holt — Senior QA Engineer

Verdict: ⚠️ Approved with concerns

What's good

messages.spec.ts is well-structured: four focused tests, each with a single logical assertion, descriptive names, and no shared state. The key-parity test will catch the most common i18n regression (adding a key to one locale and forgetting the others). This is permanent value added to the test suite.

Concerns

1. PdfControls.svelte.spec.ts — silent pass via coincidence (lines 89, 155, 167)

Three test cases filter buttons by hardcoded lowercase German strings:

return ['zurück', 'weiter', 'verkleinern', 'vergrößern'].includes(label.toLowerCase());

After this PR the component uses m.viewer_*(), which in the DE test locale still returns those exact strings. The tests pass — but for the wrong reason. If viewer_previous_page's DE translation ever changes, these tests fail with a confusing "expected 4 buttons, got 0" rather than a meaningful message. This is a test reliability issue, not just a style issue.

2. E2E coverage gap against the acceptance criteria

The issue requires E2E verification that no German appears in the EN and ES viewer/Transcribe panel. The only new E2E test covers the mobile hamburger in EN. Missing:

  • EN locale: viewer controls (Previous page, Next page, Zoom out, Zoom in)
  • EN locale: Transcribe panel (Mark for OCR training)
  • ES locale: all of the above
  • ES locale: mobile hamburger (Abrir menú)
  • axe-core WCAG 3.1.2 scan in EN/ES on a page with the viewer open

The unit + parity tests prove the keys exist and are wired. Only E2E can prove no German leaks through in a real browser render under a specific locale.

3. E2E test is not in CI

e2e/CLAUDE.md documents that E2E tests don't run in CI. The new test will only catch regressions when someone runs npm run test:e2e manually.

Blockers

None — the production implementation is correct and the unit tests pass. The E2E gaps are test coverage concerns, not implementation bugs. I'd flag them as suggestions that should be addressed before claiming the acceptance criteria fully met.

## 🧪 Sara Holt — Senior QA Engineer **Verdict: ⚠️ Approved with concerns** ### What's good `messages.spec.ts` is well-structured: four focused tests, each with a single logical assertion, descriptive names, and no shared state. The key-parity test will catch the most common i18n regression (adding a key to one locale and forgetting the others). This is permanent value added to the test suite. ### Concerns **1. `PdfControls.svelte.spec.ts` — silent pass via coincidence (lines 89, 155, 167)** Three test cases filter buttons by hardcoded lowercase German strings: ```ts return ['zurück', 'weiter', 'verkleinern', 'vergrößern'].includes(label.toLowerCase()); ``` After this PR the component uses `m.viewer_*()`, which in the DE test locale still returns those exact strings. The tests pass — but for the wrong reason. If `viewer_previous_page`'s DE translation ever changes, these tests fail with a confusing "expected 4 buttons, got 0" rather than a meaningful message. This is a test reliability issue, not just a style issue. **2. E2E coverage gap against the acceptance criteria** The issue requires E2E verification that no German appears in the EN and ES viewer/Transcribe panel. The only new E2E test covers the mobile hamburger in EN. Missing: - EN locale: viewer controls (`Previous page`, `Next page`, `Zoom out`, `Zoom in`) - EN locale: Transcribe panel (`Mark for OCR training`) - ES locale: all of the above - ES locale: mobile hamburger (`Abrir menú`) - axe-core WCAG 3.1.2 scan in EN/ES on a page with the viewer open The unit + parity tests prove the keys exist and are wired. Only E2E can prove no German leaks through in a real browser render under a specific locale. **3. E2E test is not in CI** `e2e/CLAUDE.md` documents that E2E tests don't run in CI. The new test will only catch regressions when someone runs `npm run test:e2e` manually. ### Blockers None — the production implementation is correct and the unit tests pass. The E2E gaps are test coverage concerns, not implementation bugs. I'd flag them as suggestions that should be addressed before claiming the acceptance criteria fully met.
Author
Owner

🎨 Leonie Voss — Senior UX Designer & Accessibility Strategist

Verdict: Approved

The fix directly addresses the WCAG 3.1.2 "Language of Parts" failure. Reviewed all 7 translations:

Key DE EN ES Assessment
viewer_previous_page Zurück Previous page Página anterior Clear, standard
viewer_next_page Weiter Next page Página siguiente Clear, standard
viewer_zoom_out Verkleinern Zoom out Reducir Used "Reducir" per recommendation — cleaner than "Alejar"
viewer_zoom_in Vergrößern Zoom in Ampliar Used "Ampliar" per recommendation
transcribe_mark_for_training Für Training vormerken Mark for OCR training Marcar para entrenamiento de OCR "OCR training" qualifier adopted as requested — correct decision
layout_menu_open Menü öffnen Open menu Abrir menú Consistent, clear
layout_menu_close Menü schließen Close menu Cerrar menú Consistent, clear

All four icon-only PDF viewer buttons (Previous page, Next page, Zoom out, Zoom in) now have AT-readable labels in all three locales. The mobile hamburger button correctly announces its state in both directions. The visible "Für Training vormerken" label in the Transcribe footer is now fully localized.

Suggestion (non-blocking)

The existing e2e/accessibility.spec.ts scans five pages (home, persons, aktivitaeten, admin, admin-system) with axe-core for wcag2a/wcag2aa. The document detail page — where the viewer and Transcribe panel live — is not included. Even after this fix, WCAG 3.1.2 regressions on that page would not be caught automatically.

Extending the AUTHENTICATED_PAGES array to include a document detail path would close this gap:

{ name: 'document-detail', path: '/documents/<some-id>' }

This needs a stable document ID in the E2E test data. Worth a follow-up issue if not done here.

Overall the translation quality is good and the implementation is clean.

## 🎨 Leonie Voss — Senior UX Designer & Accessibility Strategist **Verdict: ✅ Approved** The fix directly addresses the WCAG 3.1.2 "Language of Parts" failure. Reviewed all 7 translations: | Key | DE | EN | ES | Assessment | |---|---|---|---|---| | `viewer_previous_page` | Zurück | Previous page | Página anterior | ✅ Clear, standard | | `viewer_next_page` | Weiter | Next page | Página siguiente | ✅ Clear, standard | | `viewer_zoom_out` | Verkleinern | Zoom out | Reducir | ✅ Used "Reducir" per recommendation — cleaner than "Alejar" | | `viewer_zoom_in` | Vergrößern | Zoom in | Ampliar | ✅ Used "Ampliar" per recommendation | | `transcribe_mark_for_training` | Für Training vormerken | Mark for OCR training | Marcar para entrenamiento de OCR | ✅ "OCR training" qualifier adopted as requested — correct decision | | `layout_menu_open` | Menü öffnen | Open menu | Abrir menú | ✅ Consistent, clear | | `layout_menu_close` | Menü schließen | Close menu | Cerrar menú | ✅ Consistent, clear | All four icon-only PDF viewer buttons (`Previous page`, `Next page`, `Zoom out`, `Zoom in`) now have AT-readable labels in all three locales. The mobile hamburger button correctly announces its state in both directions. The visible "Für Training vormerken" label in the Transcribe footer is now fully localized. ### Suggestion (non-blocking) The existing `e2e/accessibility.spec.ts` scans five pages (home, persons, aktivitaeten, admin, admin-system) with axe-core for wcag2a/wcag2aa. The document detail page — where the viewer and Transcribe panel live — is not included. Even after this fix, WCAG 3.1.2 regressions on that page would not be caught automatically. Extending the `AUTHENTICATED_PAGES` array to include a document detail path would close this gap: ```ts { name: 'document-detail', path: '/documents/<some-id>' } ``` This needs a stable document ID in the E2E test data. Worth a follow-up issue if not done here. Overall the translation quality is good and the implementation is clean.
marcel added 1 commit 2026-05-19 17:26:41 +02:00
test(viewer): replace hardcoded German strings in PdfControls spec with m.* calls
All checks were successful
CI / Unit & Component Tests (pull_request) Successful in 3m30s
CI / OCR Service Tests (pull_request) Successful in 21s
CI / Backend Unit Tests (pull_request) Successful in 3m18s
CI / fail2ban Regex (pull_request) Successful in 40s
CI / Semgrep Security Scan (pull_request) Successful in 19s
CI / Compose Bucket Idempotency (pull_request) Successful in 59s
CI / Unit & Component Tests (push) Successful in 3m30s
CI / OCR Service Tests (push) Successful in 20s
CI / Backend Unit Tests (push) Successful in 3m14s
CI / fail2ban Regex (push) Successful in 42s
CI / Semgrep Security Scan (push) Successful in 19s
CI / Compose Bucket Idempotency (push) Successful in 59s
6832300a4b
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
marcel merged commit 6832300a4b into main 2026-05-19 20:23:13 +02:00
marcel deleted branch feat/issue-319-i18n-viewer-transcribe-controls 2026-05-19 20:23:13 +02:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: marcel/familienarchiv#626