> For the complete documentation index, see [llms.txt](https://docs-nightbeam.gitbook.io/infinity-rifts/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs-nightbeam.gitbook.io/infinity-rifts/docs/messages-and-localization.md).

# Messages and localization

InfinityRifts has no locale selector, language files, fallback locale, or runtime translation loader. Configurable main messages live under `messages` in `config.yml`; condition and random-spawn messages live in each gateway file. Many command, party, GUI, reward, and lifecycle strings remain hard-coded English.

`MessageService` parses MiniMessage and prepends the legacy-formatted `Rifts »` prefix. MiniMessage supports named colors, decorations, gradients, and hex tags such as `<#FF4500>`. It does not translate `&` legacy codes, including in random-spawn announcement lists. The packaged gateway announcements use `&` codes, so those codes may appear literally; convert them to MiniMessage tags for reliable color.

## Main messages

| Path                          | Placeholders      | Used by                                                                     |
| ----------------------------- | ----------------- | --------------------------------------------------------------------------- |
| `messages.gateway-started`    | `<name>`          | Legacy `RiftInstance` start                                                 |
| `messages.gateway-completed`  | none              | Legacy `RiftInstance` completion                                            |
| `messages.gateway-failed`     | none              | Present in model; active gateway failure uses per-gateway `failure.message` |
| `messages.wave-started`       | `<wave>`, `<max>` | Legacy `RiftInstance`                                                       |
| `messages.wave-completed`     | `<wave>`          | Present but no current direct read found                                    |
| `messages.no-permission`      | none              | Command permission failures                                                 |
| `messages.gateway-not-found`  | `<id>`            | Manager/command lookup failures                                             |
| `messages.already-in-gateway` | none              | Legacy manager path                                                         |
| `messages.reload-success`     | none              | Command/admin GUI reload                                                    |
| `messages.player-not-found`   | `<name>`          | Command player lookup                                                       |

Placeholders are replaced as plain strings before MiniMessage parsing. Because placeholder names use angle brackets, an unreplaced token can be interpreted as an unknown MiniMessage tag and disappear.

## Per-gateway text

* `spawn-conditions.messages.world-denied`, `biome-denied`, `height-denied`, `location-denied`, `time-denied`, `weather-denied`, `permission-denied`, `gamemode-denied`, `too-close-to-rift`, `too-close-to-spawn`
* `level-denied` supports `{required}`.
* `cooldown-denied` supports `{time}` (formatted remaining time).
* `failure.message` is MiniMessage.
* `rewards.broadcast` supports `%player%`.
* `random-spawn.announcements.messages.spawn/despawn` are parsed as MiniMessage and support `{x}`, `{y}`, `{z}`, `{world}`, `{type}`, `{time}`; `{type}` becomes the configured display name. Do not use `&` color codes despite their presence in packaged presets.
* Boss-bar titles use `<name>`, `<time>`, `<wave>`, `<max>`, `<wave-time>`, and `<mobs>` as applicable.

## Custom translation

Translate every configurable string in `config.yml` and the gateway files, retaining placeholders exactly. Then reload. A complete translation is not possible without changing source because help, party feedback, admin GUI labels, reward messages, and several errors are hard-coded.

There is no separate message reload boundary: `/rift reload` refreshes configuration-backed strings, while already-open GUIs and existing boss bars may retain content until rebuilt/updated.
