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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ACkMEDYiwtcfchqKkiUJNX
This commit is contained in:
Bastian Wagner
2026-08-22 09:03:13 +02:00
parent 6b32f14bb5
commit 8418a93329
15 changed files with 27 additions and 27 deletions

View File

@@ -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`)

View File

@@ -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(),

View File

@@ -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,

View File

@@ -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',

View File

@@ -33,7 +33,7 @@ describe('ReputationController', () => {
const entries = [
{
factionKey: 'border-guard',
factionName: 'Grenzwacht',
factionName: 'Border Watch',
reputation: 40,
rank: 'STRANGER',
rankLabel: 'Stranger',

View File

@@ -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',

View File

@@ -177,7 +177,7 @@ function faction(
return {
id: FACTION_ID,
key: 'border-guard',
name: 'Grenzwacht',
name: 'Border Watch',
enabled: true,
...overrides,
} as ReputationFaction;

View File

@@ -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(
() =>

View File

@@ -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(
() =>

View File

@@ -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 })),

View File

@@ -1,6 +1,6 @@
<section class="travel-panel" aria-labelledby="travel-panel-title">
@if (travellingTravel; as travel) {
<span class="travel-panel__eyebrow" role="status">TRAVELING</span>
<span class="travel-panel__eyebrow" role="status">TRAVELLING</span>
<h2 id="travel-panel-title">Destination: {{ travel.targetLocation.name }}</h2>
<dl class="travel-panel__details">
<div>

View File

@@ -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(

View File

@@ -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,

View File

@@ -13,7 +13,7 @@ function characterFixture(overrides: Partial<CharacterResponse> = {}): 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,
};
}

View File

@@ -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',