fix: close out remaining German player-facing text across web and API tests

Repo-wide grep sweep (apps/web/src, apps/api/src) for leftover German
content strings missed by Tasks 1-9, mostly in spec fixtures/assertions
that mirror already-translated seed content (monster/item names, POI
titles and action labels, location names/descriptions) plus a few real
source-file gaps:

- inventory-detail-panel.component.ts: STAT_LABELS (Waffenschaden,
  Angriff, Leben, Rüstung) were never translated by Task 6; now match
  the identical English labels already used in inventory-page.component.html.
- app-shell.component.html: aria-label="Spielinhalt" -> "Game content"
  (this file was outside every prior task's file list).
- location-interaction-panel.component.spec.ts: dead NPC-quote fixture
  translated to match the real wounded-scout POI text.

Code comments referencing German source-spec section titles or
not-yet-seeded faction names, and inline calculation-documentation
comments, are left as-is per the source spec's scope (dev-facing
comments may stay German).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACkMEDYiwtcfchqKkiUJNX
This commit is contained in:
Bastian Wagner
2026-08-21 22:59:34 +02:00
parent ae163f000a
commit 1322285b0f
38 changed files with 243 additions and 241 deletions

View File

@@ -62,11 +62,11 @@ describe('LocationPageComponent', () => {
it('names the place and its region straight away', async () => {
const { element } = await setup();
expect(element.querySelector('h1')?.textContent).toContain('Verbrannte Straße');
expect(element.textContent).toContain('Gebiet 1');
expect(element.textContent).toContain('Aschenfelder');
expect(element.querySelector('h1')?.textContent).toContain('Burned Road');
expect(element.textContent).toContain('Tier 1');
expect(element.textContent).toContain('Ashen Fields');
expect(element.textContent).toContain(
'Ein alter Handelsweg, der durch Feuer und Krieg in Asche gelegt wurde.',
'An old trade road, burned to ash by fire and war. Charred carts, broken weapons, and silenced cries line the path into the Ashen Fields.',
);
});
@@ -75,7 +75,7 @@ describe('LocationPageComponent', () => {
const image = element.querySelector('img') as HTMLImageElement;
expect(image.getAttribute('src')).toBe('/images/backgrounds/Aschestrasse.png');
expect(image.getAttribute('alt')).toBe('Location view: Verbrannte Straße');
expect(image.getAttribute('alt')).toBe('Location view: Burned Road');
});
it('places every hotspot on the artwork', async () => {
@@ -96,10 +96,10 @@ describe('LocationPageComponent', () => {
const actions = element.querySelectorAll('[data-action]');
expect([...actions].map((action) => action.querySelector('.location-action__label')?.textContent?.trim())).toEqual([
'Jagd beginnen',
'Spuren untersuchen',
'Umgebung durchsuchen',
'Zur Karte',
'Begin Hunt',
'Investigate tracks',
'Search surroundings',
'To Map',
]);
});
@@ -173,13 +173,13 @@ describe('LocationPageComponent', () => {
interactionResult.set({
interactionKey: 'inspect-tracks',
title: 'Verdächtige Spuren',
text: 'Frische Stiefelabdrücke führen nach Osten.',
title: 'Suspicious Tracks',
text: 'Among the ash and broken stones you make out several fresh bootprints. They lead east, toward the abandoned watchpost.',
});
fixture.detectChanges();
expect(element.querySelector('[data-interaction-panel]')?.textContent).toContain(
'Frische Stiefelabdrücke führen nach Osten.',
'Among the ash and broken stones you make out several fresh bootprints. They lead east, toward the abandoned watchpost.',
);
// The scene is not replaced by the panel.
expect(element.querySelector('img')).not.toBeNull();
@@ -234,7 +234,7 @@ describe('LocationPageComponent', () => {
it('renders a second location from its own data alone', async () => {
const { element } = await setup(southGateFixture(southGateContent()));
expect(element.querySelector('h1')?.textContent).toContain('Südtor von Graufurt');
expect(element.querySelector('h1')?.textContent).toContain('Graufurt South Gate');
expect(element.querySelectorAll('app-location-poi')).toHaveLength(1);
expect(element.querySelectorAll('[data-action]')).toHaveLength(1);
});
@@ -245,8 +245,8 @@ function southGateContent(): Partial<CurrentLocationResponse> {
pointsOfInterest: [
{
key: 'gate-watch',
title: 'Torwache',
actionLabel: 'Sprechen',
title: 'Gate Watch',
actionLabel: 'Talk',
type: 'NPC',
iconKey: 'speak',
xPercent: 45,
@@ -257,8 +257,8 @@ function southGateContent(): Partial<CurrentLocationResponse> {
primaryActions: [
{
key: 'talk-to-watch',
label: 'Wache ansprechen',
description: 'Lage erfragen',
label: 'Talk to the watch',
description: 'Ask about the situation',
type: 'NPC',
iconKey: 'speak',
enabled: true,