From 8418a9332971e7395305d12b00219e0b9cd2b6ca Mon Sep 17 00:00:00 2001 From: Bastian Wagner Date: Sat, 22 Aug 2026 09:03:13 +0200 Subject: [PATCH] fix: correct final whole-branch review findings for 0.6.6 English content - TRAVELLING spelling: fix TRAVELING -> TRAVELLING in travel-panel.component.html to match UK spelling used everywhere else (world/hunting/combat stores + API error messages) - Grenzwacht -> Border Watch: fix stale German faction display name in reputation-display, reputation.service/controller, turn-in.service specs, and the vertical-slice seed spec test title - Suedtor von Graufurt -> Graufurt South Gate: fix stale ASCII-transliterated German location name in hunting.service.spec.ts - Aschenfelder(n) -> Ashen Fields: fix stale German location name/description in top-bar.component.spec.ts and context-panel.component.spec.ts (key identifiers left untouched) - Fix 7 test titles still describing translated error messages as "German" across world/hunting/inventory/combat store specs - README: update demo location names from German to their current English names (Graufurt South Gate, Burned Road) - item-rarity.enum.ts: fix now-false comment claiming rarity labels are German; the frontend RARITY_LABELS map is English Pure literal-string/comment substitutions; no keys, ids, or logic changed. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01ACkMEDYiwtcfchqKkiUJNX --- README.md | 8 ++++---- .../api/src/database/seeds/vertical-slice.seed.spec.ts | 2 +- apps/api/src/hunting/hunting.service.spec.ts | 2 +- apps/api/src/items/item-rarity.enum.ts | 2 +- apps/api/src/reputation/reputation.controller.spec.ts | 2 +- apps/api/src/reputation/reputation.service.spec.ts | 6 +++--- apps/api/src/turn-in/turn-in.service.spec.ts | 2 +- apps/web/src/app/features/combat/combat.store.spec.ts | 2 +- .../web/src/app/features/hunting/hunting.store.spec.ts | 8 ++++---- .../src/app/features/inventory/inventory.store.spec.ts | 2 +- .../src/app/features/world/travel-panel.component.html | 2 +- apps/web/src/app/features/world/world.store.spec.ts | 2 +- .../context-panel/context-panel.component.spec.ts | 2 +- .../src/app/layout/top-bar/top-bar.component.spec.ts | 2 +- .../reputation-display.component.spec.ts | 10 +++++----- 15 files changed, 27 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 9285b33..a2da761 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ A dark-fantasy browser RPG built as an npm-workspace modular monolith: - `packages/*` — reserved shared boundaries (currently unused) This README documents the first visible vertical slice: a server-authoritative -world/travel loop between two locations (Südtor von Graufurt and Verbrannte -Straße) for one demo character, with no login required. +world/travel loop between two locations (Graufurt South Gate and Burned Road) +for one demo character, with no login required. ## Prerequisites @@ -47,8 +47,8 @@ running. Once both are up: - Web: `http://localhost:4200`, which proxies `/api/*` requests to `http://localhost:3000` in development (see `apps/web/proxy.conf.json`) -Open `http://localhost:4200/world` to see Aric Duskwalker at the Südtor von -Graufurt and travel to the Verbrannte Straße and back. +Open `http://localhost:4200/world` to see Aric Duskwalker at the Graufurt +South Gate and travel to the Burned Road and back. ### Configuration (`.env`) diff --git a/apps/api/src/database/seeds/vertical-slice.seed.spec.ts b/apps/api/src/database/seeds/vertical-slice.seed.spec.ts index bdb0b06..59418bf 100644 --- a/apps/api/src/database/seeds/vertical-slice.seed.spec.ts +++ b/apps/api/src/database/seeds/vertical-slice.seed.spec.ts @@ -606,7 +606,7 @@ describe('seedVisibleVerticalSlice', () => { ); }); - it('seeds the Grenzwacht faction', async () => { + it('seeds the Border Watch faction', async () => { const reputationFactionRepository = new InMemoryRepository(); const dataSource = createDataSource( new InMemoryRepository(), diff --git a/apps/api/src/hunting/hunting.service.spec.ts b/apps/api/src/hunting/hunting.service.spec.ts index 7160b0b..87d14fc 100644 --- a/apps/api/src/hunting/hunting.service.spec.ts +++ b/apps/api/src/hunting/hunting.service.spec.ts @@ -212,7 +212,7 @@ function safeLocation(): LocationDefinition { return { id: SAFE_LOCATION_ID, key: 'south-gate', - name: 'Suedtor von Graufurt', + name: 'Graufurt South Gate', description: 'A safe gate.', regionKey: 'ashen-fields', minRecommendedLevel: 1, diff --git a/apps/api/src/items/item-rarity.enum.ts b/apps/api/src/items/item-rarity.enum.ts index 877f9ee..595b9ee 100644 --- a/apps/api/src/items/item-rarity.enum.ts +++ b/apps/api/src/items/item-rarity.enum.ts @@ -1,5 +1,5 @@ // Mirrors docs/Ashen_Realms_Balancing_Items_Loot_Design_V1.md §19: -// Gewöhnlich / Selten / Episch. German labels live in the frontend. +// Common / Rare / Epic. Display labels live in the frontend. export enum ItemRarity { COMMON = 'COMMON', RARE = 'RARE', diff --git a/apps/api/src/reputation/reputation.controller.spec.ts b/apps/api/src/reputation/reputation.controller.spec.ts index ec42258..197b240 100644 --- a/apps/api/src/reputation/reputation.controller.spec.ts +++ b/apps/api/src/reputation/reputation.controller.spec.ts @@ -33,7 +33,7 @@ describe('ReputationController', () => { const entries = [ { factionKey: 'border-guard', - factionName: 'Grenzwacht', + factionName: 'Border Watch', reputation: 40, rank: 'STRANGER', rankLabel: 'Stranger', diff --git a/apps/api/src/reputation/reputation.service.spec.ts b/apps/api/src/reputation/reputation.service.spec.ts index 48b676f..89941e9 100644 --- a/apps/api/src/reputation/reputation.service.spec.ts +++ b/apps/api/src/reputation/reputation.service.spec.ts @@ -124,7 +124,7 @@ function faction( return { id: FACTION_ID, key: 'border-guard', - name: 'Grenzwacht', + name: 'Border Watch', description: '', regionKey: 'ashen-fields', enabled: true, @@ -312,7 +312,7 @@ describe('ReputationService', () => { expect(result).toEqual([ { factionKey: 'border-guard', - factionName: 'Grenzwacht', + factionName: 'Border Watch', reputation: 0, rank: 'STRANGER', rankLabel: 'Stranger', @@ -330,7 +330,7 @@ describe('ReputationService', () => { expect(result[0]).toEqual({ factionKey: 'border-guard', - factionName: 'Grenzwacht', + factionName: 'Border Watch', reputation: 300, rank: 'KNOWN', rankLabel: 'Known', diff --git a/apps/api/src/turn-in/turn-in.service.spec.ts b/apps/api/src/turn-in/turn-in.service.spec.ts index 6ce1b87..dbdc3be 100644 --- a/apps/api/src/turn-in/turn-in.service.spec.ts +++ b/apps/api/src/turn-in/turn-in.service.spec.ts @@ -177,7 +177,7 @@ function faction( return { id: FACTION_ID, key: 'border-guard', - name: 'Grenzwacht', + name: 'Border Watch', enabled: true, ...overrides, } as ReputationFaction; diff --git a/apps/web/src/app/features/combat/combat.store.spec.ts b/apps/web/src/app/features/combat/combat.store.spec.ts index f727fdf..fbde827 100644 --- a/apps/web/src/app/features/combat/combat.store.spec.ts +++ b/apps/web/src/app/features/combat/combat.store.spec.ts @@ -84,7 +84,7 @@ describe('CombatStore', () => { expect(store.errorCode()).toBe('COMBAT_ALREADY_ACTIVE'); }); - it('maps CHARACTER_TOO_WOUNDED to its German message', async () => { + it('maps CHARACTER_TOO_WOUNDED to its English message', async () => { api.startCombat.mockReturnValue( throwError( () => diff --git a/apps/web/src/app/features/hunting/hunting.store.spec.ts b/apps/web/src/app/features/hunting/hunting.store.spec.ts index 501c29e..f48c030 100644 --- a/apps/web/src/app/features/hunting/hunting.store.spec.ts +++ b/apps/web/src/app/features/hunting/hunting.store.spec.ts @@ -120,7 +120,7 @@ describe('HuntingStore', () => { expect(store.encounters()).toEqual(refreshedHuntResult.encounters); }); - it('maps CHARACTER_NOT_FOUND to its German message', async () => { + it('maps CHARACTER_NOT_FOUND to its English message', async () => { api.startHunt.mockReturnValue( throwError( () => @@ -136,7 +136,7 @@ describe('HuntingStore', () => { expect(store.error()).toBe('Your character could not be found.'); }); - it('maps CHARACTER_TRAVELLING to its German message', async () => { + it('maps CHARACTER_TRAVELLING to its English message', async () => { api.startHunt.mockReturnValue( throwError( () => @@ -152,7 +152,7 @@ describe('HuntingStore', () => { expect(store.error()).toBe("You can't hunt while travelling."); }); - it('maps HUNTING_NOT_AVAILABLE to its German message', async () => { + it('maps HUNTING_NOT_AVAILABLE to its English message', async () => { api.startHunt.mockReturnValue( throwError( () => @@ -168,7 +168,7 @@ describe('HuntingStore', () => { expect(store.error()).toBe("There's no hunting ground at this location."); }); - it('maps NO_HUNT_ENCOUNTERS_AVAILABLE to its German message', async () => { + it('maps NO_HUNT_ENCOUNTERS_AVAILABLE to its English message', async () => { api.startHunt.mockReturnValue( throwError( () => diff --git a/apps/web/src/app/features/inventory/inventory.store.spec.ts b/apps/web/src/app/features/inventory/inventory.store.spec.ts index 298b6e7..9ca4d89 100644 --- a/apps/web/src/app/features/inventory/inventory.store.spec.ts +++ b/apps/web/src/app/features/inventory/inventory.store.spec.ts @@ -132,7 +132,7 @@ describe('InventoryStore', () => { expect(worldStore.refreshCharacter).toHaveBeenCalledOnce(); }); - it('surfaces a German message for a known equip error', async () => { + it('surfaces an English message for a known equip error', async () => { await store.load(); api.equipItem.mockReturnValue( throwError(() => new HttpErrorResponse({ error: { code: 'ITEM_NOT_EQUIPPABLE' }, status: 400 })), diff --git a/apps/web/src/app/features/world/travel-panel.component.html b/apps/web/src/app/features/world/travel-panel.component.html index edf8ddd..4d2de6c 100644 --- a/apps/web/src/app/features/world/travel-panel.component.html +++ b/apps/web/src/app/features/world/travel-panel.component.html @@ -1,6 +1,6 @@
@if (travellingTravel; as travel) { - TRAVELING + TRAVELLING

Destination: {{ travel.targetLocation.name }}

diff --git a/apps/web/src/app/features/world/world.store.spec.ts b/apps/web/src/app/features/world/world.store.spec.ts index 9374450..714a1c3 100644 --- a/apps/web/src/app/features/world/world.store.spec.ts +++ b/apps/web/src/app/features/world/world.store.spec.ts @@ -261,7 +261,7 @@ describe('WorldStore', () => { expect(store.currentTravel()).toEqual({ status: 'IDLE' }); }); - it('maps a known HttpErrorResponse travel error code to a specific German message', async () => { + it('maps a known HttpErrorResponse travel error code to a specific English message', async () => { await store.load(); store.selectConnection(currentLocation.connections[0]); api.startTravel.mockReturnValue( diff --git a/apps/web/src/app/layout/context-panel/context-panel.component.spec.ts b/apps/web/src/app/layout/context-panel/context-panel.component.spec.ts index 5438a04..1e55d26 100644 --- a/apps/web/src/app/layout/context-panel/context-panel.component.spec.ts +++ b/apps/web/src/app/layout/context-panel/context-panel.component.spec.ts @@ -7,7 +7,7 @@ const southGate = { id: 'south-gate-id', key: 'south-gate', name: 'Graufurt South Gate', - description: 'Der letzte sichere Schritt vor den Aschenfeldern.', + description: 'The last safe step before the Ashen Fields.', regionKey: 'ashen-fields', minRecommendedLevel: 1, maxRecommendedLevel: 1, diff --git a/apps/web/src/app/layout/top-bar/top-bar.component.spec.ts b/apps/web/src/app/layout/top-bar/top-bar.component.spec.ts index 1cff7b5..5a9c1e7 100644 --- a/apps/web/src/app/layout/top-bar/top-bar.component.spec.ts +++ b/apps/web/src/app/layout/top-bar/top-bar.component.spec.ts @@ -13,7 +13,7 @@ function characterFixture(overrides: Partial = {}): Character attack: 10, hpRegenPerSecond: 1, hpRegenSince: null, - currentLocation: { id: 'location-1', key: 'aschenfelder', name: 'Aschenfelder' }, + currentLocation: { id: 'location-1', key: 'aschenfelder', name: 'Ashen Fields' }, ...overrides, }; } diff --git a/apps/web/src/app/shared/reputation-display/reputation-display.component.spec.ts b/apps/web/src/app/shared/reputation-display/reputation-display.component.spec.ts index 70faac3..80ffac8 100644 --- a/apps/web/src/app/shared/reputation-display/reputation-display.component.spec.ts +++ b/apps/web/src/app/shared/reputation-display/reputation-display.component.spec.ts @@ -14,7 +14,7 @@ describe('ReputationDisplayComponent', () => { it('renders the faction name and rank', async () => { const fixture = await setup({ factionKey: 'border-guard', - factionName: 'Grenzwacht', + factionName: 'Border Watch', reputation: 320, rank: 'KNOWN', rankLabel: 'Known', @@ -22,14 +22,14 @@ describe('ReputationDisplayComponent', () => { }); const element = fixture.nativeElement as HTMLElement; - expect(element.textContent).toContain('Grenzwacht'); + expect(element.textContent).toContain('Border Watch'); expect(element.textContent).toContain('Known'); }); it('shows current reputation against the next threshold', async () => { const fixture = await setup({ factionKey: 'border-guard', - factionName: 'Grenzwacht', + factionName: 'Border Watch', reputation: 320, rank: 'KNOWN', rankLabel: 'Known', @@ -44,7 +44,7 @@ describe('ReputationDisplayComponent', () => { it('renders a progress fraction between 0 and 100', async () => { const fixture = await setup({ factionKey: 'border-guard', - factionName: 'Grenzwacht', + factionName: 'Border Watch', reputation: 320, rank: 'KNOWN', rankLabel: 'Known', @@ -61,7 +61,7 @@ describe('ReputationDisplayComponent', () => { it('handles the top rank with no next threshold without crashing or showing a bogus progress bar', async () => { const fixture = await setup({ factionKey: 'border-guard', - factionName: 'Grenzwacht', + factionName: 'Border Watch', reputation: 1500, rank: 'ESTEEMED', rankLabel: 'Esteemed',