# Display names and locale rules (AutoHero) ## Town names on Russian UI For locale `ru`, **town names are not translated by meaning**. They use **pragmatic Cyrillic transliteration** of the English fantasy names (the same names shown in `en`). This keeps a single world identity across languages and avoids awkward calques (for example, not «Зола-крепость» for Cinderkeep). Guidelines: 1. **Read like the English name**: consonants and vowels map so a Russian player can recognize the original (Willowdale → Виллоудейл, Cinderkeep → Синдеркип). 2. **Keep word boundaries** where the English has them (Thorn + watch → Торнвотч; Red + cliff → Редклифф). 3. **Do not translate semantic meaning** of the compound (no «красная скала», «звездопад», etc.) for these labels. 4. **Stable keys**: DB/API use `towns.name_key` (e.g. `town.cinderkeep.v1`); only the `ru` string in `contentLabels` / UI bundle changes. Current Russian labels (transliteration target): | `name_key` | English | Russian (UI) | |------------|---------|----------------| | `town.willowdale.v1` | Willowdale | Виллоудейл | | `town.thornwatch.v1` | Thornwatch | Торнвотч | | `town.ashengard.v1` | Ashengard | Ашенгард | | `town.redcliff.v1` | Redcliff | Редклифф | | `town.boghollow.v1` | Boghollow | Богхоллоу | | `town.cinderkeep.v1` | Cinderkeep | Синдеркип | | `town.starfall.v1` | Starfall | Старфолл | | `town.mossharbor.v1` | Mossharbor | Моссхарбор | | `town.emberwell.v1` | Emberwell | Эмбервелл | | `town.frostmark.v1` | Frostmark | Фростмарк | | `town.duskwatch.v1` | Duskwatch | Дасквотч | Quest descriptions in Russian should use **these same spellings** when they mention a town. ## Quest copy - Server stores English `title` / `description` on `quests` (authoring and fallback). - Client resolves text by `quests.quest_key` using `frontend/src/i18n/quests.en.yml` and `quests.ru.yml` (loaded in `loadLocales.ts` together with `en.yml` / `ru.yml`). Keys must match `quest_key` in the database; EN and RU files must have the same set of keys (validated at startup). - If a key is missing in YAML, the client falls back to the server string (usually English). - For `visit_town` rows, the API includes `quest.targetTownId`. The quest log uses `townDisplayById()` so the destination city name follows the town transliteration rules above, not the raw English `targetTownName` from SQL. ## Related files - Town labels and `towns.id` map: `frontend/src/i18n/contentLabels.ts` - Quest strings: `frontend/src/i18n/quests.en.yml`, `frontend/src/i18n/quests.ru.yml`, `localizedQuestText` in `frontend/src/i18n/loadLocales.ts`