diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index b9ae99d..28b461b 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -49,3 +49,19 @@ jobs: - name: Test validate.py directory layout rules run: ./test-validate-py.sh + # Needs GameplanePanel/Gameplane PR #668 (i18n-check --module) merged + # into master first; until then this step cannot resolve the tool. + - uses: actions/setup-go@v5 + with: + go-version: "1.26" + + - name: Check module locales + run: | + set -euo pipefail + for dir in */; do + dir="${dir%/}" + [ -d "$dir/locales" ] || continue + echo ">> i18n-check $dir" + go run github.com/GameplanePanel/gameplane/i18n/cmd/i18n-check@master \ + --module "$dir/template.yaml" "$dir/locales" + done diff --git a/README.md b/README.md new file mode 100644 index 0000000..a85bc70 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# Gameplane modules + +OCI game templates for Gameplane. Each `/` folder holds `module.yaml`, +`template.yaml`, `README.md` and optional `icon.png`, `specs.md`, `samples/`. +`build.sh push` publishes them; `validate.py` preflight-checks them in CI. + +## Translations + +A module can ship translations in `/locales/.json` (flat JSON, +message id to ICU message). + +- `locales/en.json` is the English reference. It is generated, never + hand-written: `gp-module i18n extract `. It is not pushed to the registry. +- To add a language, copy `en.json` to `locales/.json` (a valid language + tag such as `de` or `pt-BR`), translate the values, keep the placeholders, + then run `gp-module i18n stamp ` to record the source hashes. +- `build.sh push` adds one layer per `locales/.json` (except `en.json`). +- CI runs `i18n-check --module` on every module with a `locales/` folder: ids + must match the template, placeholders must match English, and `en.json` + must not drift from the template. diff --git a/build.sh b/build.sh index d57ede2..a9c251d 100755 --- a/build.sh +++ b/build.sh @@ -11,6 +11,11 @@ # modules/build.sh push --registry localhost:5001 --name minecraft-java --insecure # modules/build.sh push --registry $REG --plain-http # all modules, plain-http # +# Translations: every /locales/.json except en.json is pushed as an +# extra layer (media type application/vnd.gameplane.module.locale.v1+json, +# file name annotation locales/.json). en.json is the generated English +# reference and is never shipped. Bundles without locales are unchanged. +# # Required: oras >= 1.2.0 (https://oras.land/docs/installation) # For --sign: cosign >= 2.0 (https://docs.sigstore.dev/cosign/installation) # Signing stays on cosign's classic signature format @@ -25,6 +30,7 @@ MEDIA_METADATA="application/vnd.gameplane.module.metadata.v1+yaml" MEDIA_TEMPLATE="application/vnd.gameplane.module.template.v1+yaml" MEDIA_README="application/vnd.gameplane.module.readme.v1+md" MEDIA_ICON="image/png" +MEDIA_LOCALE="application/vnd.gameplane.module.locale.v1+json" usage() { cat <.json" title annotation. en.json is never shipped. + local loc + for loc in "$dir"/locales/*.json; do + [[ -f "$loc" ]] || continue + [[ "$(basename "$loc")" == "en.json" ]] && continue + layer_args+=( "locales/$(basename "$loc"):$MEDIA_LOCALE" ) + done + # Capture combined output so we can recover the pushed manifest digest # for signing; still echo it so the push stays visible in CI logs. local out diff --git a/minecraft-java/locales/en.json b/minecraft-java/locales/en.json new file mode 100644 index 0000000..a7a79f8 --- /dev/null +++ b/minecraft-java/locales/en.json @@ -0,0 +1,494 @@ +{ + "actions.announce-restart.description": { + "defaultMessage": "Warn players, save the world, then stop the server.", + "description": "Help text of server action announce-restart (template.yaml spec.capabilities.actions)" + }, + "actions.announce-restart.displayName": { + "defaultMessage": "Announce restart", + "description": "Label of server action announce-restart (template.yaml spec.capabilities.actions)" + }, + "actions.announce-restart.group": { + "defaultMessage": "Server", + "description": "Group heading of server action announce-restart (template.yaml spec.capabilities.actions)" + }, + "actions.announce-restart.params.message.displayName": { + "defaultMessage": "Message", + "description": "Label of parameter message of server action announce-restart (template.yaml spec.capabilities.actions)" + }, + "actions.broadcast.description": { + "defaultMessage": "Send a chat message to everyone on the server.", + "description": "Help text of server action broadcast (template.yaml spec.capabilities.actions)" + }, + "actions.broadcast.displayName": { + "defaultMessage": "Broadcast message", + "description": "Label of server action broadcast (template.yaml spec.capabilities.actions)" + }, + "actions.broadcast.group": { + "defaultMessage": "Server", + "description": "Group heading of server action broadcast (template.yaml spec.capabilities.actions)" + }, + "actions.broadcast.params.message.displayName": { + "defaultMessage": "Message", + "description": "Label of parameter message of server action broadcast (template.yaml spec.capabilities.actions)" + }, + "actions.give-item.description": { + "defaultMessage": "Grant an item to a player.", + "description": "Help text of server action give-item (template.yaml spec.capabilities.actions)" + }, + "actions.give-item.displayName": { + "defaultMessage": "Give item", + "description": "Label of server action give-item (template.yaml spec.capabilities.actions)" + }, + "actions.give-item.group": { + "defaultMessage": "Players", + "description": "Group heading of server action give-item (template.yaml spec.capabilities.actions)" + }, + "actions.give-item.params.count.displayName": { + "defaultMessage": "Quantity", + "description": "Label of parameter count of server action give-item (template.yaml spec.capabilities.actions)" + }, + "actions.give-item.params.item.displayName": { + "defaultMessage": "Item ID (e.g. diamond, golden_apple)", + "description": "Label of parameter item of server action give-item (template.yaml spec.capabilities.actions)" + }, + "actions.give-item.params.player.displayName": { + "defaultMessage": "Player name", + "description": "Label of parameter player of server action give-item (template.yaml spec.capabilities.actions)" + }, + "actions.save-world.description": { + "defaultMessage": "Flush the world to disk now.", + "description": "Help text of server action save-world (template.yaml spec.capabilities.actions)" + }, + "actions.save-world.displayName": { + "defaultMessage": "Save world", + "description": "Label of server action save-world (template.yaml spec.capabilities.actions)" + }, + "actions.save-world.group": { + "defaultMessage": "World", + "description": "Group heading of server action save-world (template.yaml spec.capabilities.actions)" + }, + "actions.set-difficulty.displayName": { + "defaultMessage": "Set difficulty", + "description": "Label of server action set-difficulty (template.yaml spec.capabilities.actions)" + }, + "actions.set-difficulty.group": { + "defaultMessage": "World", + "description": "Group heading of server action set-difficulty (template.yaml spec.capabilities.actions)" + }, + "actions.set-difficulty.params.level.displayName": { + "defaultMessage": "Difficulty", + "description": "Label of parameter level of server action set-difficulty (template.yaml spec.capabilities.actions)" + }, + "actions.set-difficulty.params.level.options.easy": { + "defaultMessage": "easy", + "description": "Choice \"easy\" of parameter level of server action set-difficulty (template.yaml spec.capabilities.actions)" + }, + "actions.set-difficulty.params.level.options.hard": { + "defaultMessage": "hard", + "description": "Choice \"hard\" of parameter level of server action set-difficulty (template.yaml spec.capabilities.actions)" + }, + "actions.set-difficulty.params.level.options.normal": { + "defaultMessage": "normal", + "description": "Choice \"normal\" of parameter level of server action set-difficulty (template.yaml spec.capabilities.actions)" + }, + "actions.set-difficulty.params.level.options.peaceful": { + "defaultMessage": "peaceful", + "description": "Choice \"peaceful\" of parameter level of server action set-difficulty (template.yaml spec.capabilities.actions)" + }, + "actions.set-gamemode.description": { + "defaultMessage": "Change one player''s game mode.", + "description": "Help text of server action set-gamemode (template.yaml spec.capabilities.actions)" + }, + "actions.set-gamemode.displayName": { + "defaultMessage": "Set player game mode", + "description": "Label of server action set-gamemode (template.yaml spec.capabilities.actions)" + }, + "actions.set-gamemode.group": { + "defaultMessage": "Players", + "description": "Group heading of server action set-gamemode (template.yaml spec.capabilities.actions)" + }, + "actions.set-gamemode.params.mode.displayName": { + "defaultMessage": "Game mode", + "description": "Label of parameter mode of server action set-gamemode (template.yaml spec.capabilities.actions)" + }, + "actions.set-gamemode.params.mode.options.adventure": { + "defaultMessage": "adventure", + "description": "Choice \"adventure\" of parameter mode of server action set-gamemode (template.yaml spec.capabilities.actions)" + }, + "actions.set-gamemode.params.mode.options.creative": { + "defaultMessage": "creative", + "description": "Choice \"creative\" of parameter mode of server action set-gamemode (template.yaml spec.capabilities.actions)" + }, + "actions.set-gamemode.params.mode.options.spectator": { + "defaultMessage": "spectator", + "description": "Choice \"spectator\" of parameter mode of server action set-gamemode (template.yaml spec.capabilities.actions)" + }, + "actions.set-gamemode.params.mode.options.survival": { + "defaultMessage": "survival", + "description": "Choice \"survival\" of parameter mode of server action set-gamemode (template.yaml spec.capabilities.actions)" + }, + "actions.set-gamemode.params.player.displayName": { + "defaultMessage": "Player name", + "description": "Label of parameter player of server action set-gamemode (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.displayName": { + "defaultMessage": "Set time", + "description": "Label of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.group": { + "defaultMessage": "World", + "description": "Group heading of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.params.time.displayName": { + "defaultMessage": "Time of day", + "description": "Label of parameter time of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.params.time.options.day": { + "defaultMessage": "day", + "description": "Choice \"day\" of parameter time of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.params.time.options.midnight": { + "defaultMessage": "midnight", + "description": "Choice \"midnight\" of parameter time of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.params.time.options.night": { + "defaultMessage": "night", + "description": "Choice \"night\" of parameter time of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.params.time.options.noon": { + "defaultMessage": "noon", + "description": "Choice \"noon\" of parameter time of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-weather.displayName": { + "defaultMessage": "Set weather", + "description": "Label of server action set-weather (template.yaml spec.capabilities.actions)" + }, + "actions.set-weather.group": { + "defaultMessage": "World", + "description": "Group heading of server action set-weather (template.yaml spec.capabilities.actions)" + }, + "actions.set-weather.params.weather.displayName": { + "defaultMessage": "Weather", + "description": "Label of parameter weather of server action set-weather (template.yaml spec.capabilities.actions)" + }, + "actions.set-weather.params.weather.options.clear": { + "defaultMessage": "clear", + "description": "Choice \"clear\" of parameter weather of server action set-weather (template.yaml spec.capabilities.actions)" + }, + "actions.set-weather.params.weather.options.rain": { + "defaultMessage": "rain", + "description": "Choice \"rain\" of parameter weather of server action set-weather (template.yaml spec.capabilities.actions)" + }, + "actions.set-weather.params.weather.options.thunder": { + "defaultMessage": "thunder", + "description": "Choice \"thunder\" of parameter weather of server action set-weather (template.yaml spec.capabilities.actions)" + }, + "actions.toggle-daylight-cycle.description": { + "defaultMessage": "Freeze or resume the day/night cycle.", + "description": "Help text of server action toggle-daylight-cycle (template.yaml spec.capabilities.actions)" + }, + "actions.toggle-daylight-cycle.displayName": { + "defaultMessage": "Toggle daylight cycle", + "description": "Label of server action toggle-daylight-cycle (template.yaml spec.capabilities.actions)" + }, + "actions.toggle-daylight-cycle.group": { + "defaultMessage": "World", + "description": "Group heading of server action toggle-daylight-cycle (template.yaml spec.capabilities.actions)" + }, + "actions.toggle-daylight-cycle.params.value.displayName": { + "defaultMessage": "Daylight cycle", + "description": "Label of parameter value of server action toggle-daylight-cycle (template.yaml spec.capabilities.actions)" + }, + "actions.toggle-daylight-cycle.params.value.options.false": { + "defaultMessage": "false", + "description": "Choice \"false\" of parameter value of server action toggle-daylight-cycle (template.yaml spec.capabilities.actions)" + }, + "actions.toggle-daylight-cycle.params.value.options.true": { + "defaultMessage": "true", + "description": "Choice \"true\" of parameter value of server action toggle-daylight-cycle (template.yaml spec.capabilities.actions)" + }, + "actions.toggle-keep-inventory.description": { + "defaultMessage": "Whether players keep their items on death.", + "description": "Help text of server action toggle-keep-inventory (template.yaml spec.capabilities.actions)" + }, + "actions.toggle-keep-inventory.displayName": { + "defaultMessage": "Toggle keep inventory", + "description": "Label of server action toggle-keep-inventory (template.yaml spec.capabilities.actions)" + }, + "actions.toggle-keep-inventory.group": { + "defaultMessage": "World", + "description": "Group heading of server action toggle-keep-inventory (template.yaml spec.capabilities.actions)" + }, + "actions.toggle-keep-inventory.params.value.displayName": { + "defaultMessage": "Keep inventory", + "description": "Label of parameter value of server action toggle-keep-inventory (template.yaml spec.capabilities.actions)" + }, + "actions.toggle-keep-inventory.params.value.options.false": { + "defaultMessage": "false", + "description": "Choice \"false\" of parameter value of server action toggle-keep-inventory (template.yaml spec.capabilities.actions)" + }, + "actions.toggle-keep-inventory.params.value.options.true": { + "defaultMessage": "true", + "description": "Choice \"true\" of parameter value of server action toggle-keep-inventory (template.yaml spec.capabilities.actions)" + }, + "config.DIFFICULTY.displayName": { + "defaultMessage": "Difficulty", + "description": "Label of configuration field DIFFICULTY (template.yaml spec.configSchema)" + }, + "config.DIFFICULTY.options.easy": { + "defaultMessage": "easy", + "description": "Choice \"easy\" of configuration field DIFFICULTY (template.yaml spec.configSchema)" + }, + "config.DIFFICULTY.options.hard": { + "defaultMessage": "hard", + "description": "Choice \"hard\" of configuration field DIFFICULTY (template.yaml spec.configSchema)" + }, + "config.DIFFICULTY.options.normal": { + "defaultMessage": "normal", + "description": "Choice \"normal\" of configuration field DIFFICULTY (template.yaml spec.configSchema)" + }, + "config.DIFFICULTY.options.peaceful": { + "defaultMessage": "peaceful", + "description": "Choice \"peaceful\" of configuration field DIFFICULTY (template.yaml spec.configSchema)" + }, + "config.HARDCORE.displayName": { + "defaultMessage": "Hardcore mode", + "description": "Label of configuration field HARDCORE (template.yaml spec.configSchema)" + }, + "config.INIT_MEMORY.description": { + "defaultMessage": "Starting heap size (-Xms), at most JVM max heap. Leave empty to match the automatic max heap (a fixed heap avoids GC resizes).", + "description": "Help text of configuration field INIT_MEMORY (template.yaml spec.configSchema)" + }, + "config.INIT_MEMORY.displayName": { + "defaultMessage": "JVM initial heap", + "description": "Label of configuration field INIT_MEMORY (template.yaml spec.configSchema)" + }, + "config.LEVEL_SEED.description": { + "defaultMessage": "Leave blank for a random seed.", + "description": "Help text of configuration field LEVEL_SEED (template.yaml spec.configSchema)" + }, + "config.LEVEL_SEED.displayName": { + "defaultMessage": "World seed", + "description": "Label of configuration field LEVEL_SEED (template.yaml spec.configSchema)" + }, + "config.MAX_MEMORY.description": { + "defaultMessage": "Java heap ceiling (-Xmx, e.g. 2G, 3072M). Leave empty to size it automatically to 75% of the container memory limit — it then tracks the limit whenever you resize the server. If you set it yourself, keep roughly 25% below the limit: the JVM needs headroom for non-heap memory, and exceeding the limit gets the server OOM-killed.", + "description": "Help text of configuration field MAX_MEMORY (template.yaml spec.configSchema)" + }, + "config.MAX_MEMORY.displayName": { + "defaultMessage": "JVM max heap", + "description": "Label of configuration field MAX_MEMORY (template.yaml spec.configSchema)" + }, + "config.MAX_PLAYERS.displayName": { + "defaultMessage": "Max players", + "description": "Label of configuration field MAX_PLAYERS (template.yaml spec.configSchema)" + }, + "config.MODE.displayName": { + "defaultMessage": "Game mode", + "description": "Label of configuration field MODE (template.yaml spec.configSchema)" + }, + "config.MODE.options.adventure": { + "defaultMessage": "adventure", + "description": "Choice \"adventure\" of configuration field MODE (template.yaml spec.configSchema)" + }, + "config.MODE.options.creative": { + "defaultMessage": "creative", + "description": "Choice \"creative\" of configuration field MODE (template.yaml spec.configSchema)" + }, + "config.MODE.options.spectator": { + "defaultMessage": "spectator", + "description": "Choice \"spectator\" of configuration field MODE (template.yaml spec.configSchema)" + }, + "config.MODE.options.survival": { + "defaultMessage": "survival", + "description": "Choice \"survival\" of configuration field MODE (template.yaml spec.configSchema)" + }, + "config.MOTD.description": { + "defaultMessage": "Server description shown in the multiplayer list.", + "description": "Help text of configuration field MOTD (template.yaml spec.configSchema)" + }, + "config.MOTD.displayName": { + "defaultMessage": "MOTD", + "description": "Label of configuration field MOTD (template.yaml spec.configSchema)" + }, + "config.ONLINE_MODE.description": { + "defaultMessage": "Verify players with Mojang. Disable only for offline/LAN setups.", + "description": "Help text of configuration field ONLINE_MODE (template.yaml spec.configSchema)" + }, + "config.ONLINE_MODE.displayName": { + "defaultMessage": "Online mode", + "description": "Label of configuration field ONLINE_MODE (template.yaml spec.configSchema)" + }, + "config.PVP.displayName": { + "defaultMessage": "PvP enabled", + "description": "Label of configuration field PVP (template.yaml spec.configSchema)" + }, + "config.VIEW_DISTANCE.displayName": { + "defaultMessage": "View distance (chunks)", + "description": "Label of configuration field VIEW_DISTANCE (template.yaml spec.configSchema)" + }, + "config.WHITELIST_ENABLED.displayName": { + "defaultMessage": "Enforce whitelist", + "description": "Label of configuration field WHITELIST_ENABLED (template.yaml spec.configSchema)" + }, + "metrics.difficulty.displayName": { + "defaultMessage": "Difficulty", + "description": "Label of status metric difficulty (template.yaml spec.capabilities.status.metrics)" + }, + "metrics.seed.displayName": { + "defaultMessage": "World seed", + "description": "Label of status metric seed (template.yaml spec.capabilities.status.metrics)" + }, + "mods.bukkit.displayName": { + "defaultMessage": "Plugins (Bukkit)", + "description": "Label of the mod volume bukkit in the Mods tab (template.yaml spec.capabilities.mods.loaders)" + }, + "mods.fabric.displayName": { + "defaultMessage": "Mods (Fabric)", + "description": "Label of the mod volume fabric in the Mods tab (template.yaml spec.capabilities.mods.loaders)" + }, + "mods.forge.displayName": { + "defaultMessage": "Mods (Forge)", + "description": "Label of the mod volume forge in the Mods tab (template.yaml spec.capabilities.mods.loaders)" + }, + "mods.neoforge.displayName": { + "defaultMessage": "Mods (NeoForge)", + "description": "Label of the mod volume neoforge in the Mods tab (template.yaml spec.capabilities.mods.loaders)" + }, + "mods.paper.displayName": { + "defaultMessage": "Plugins (Paper)", + "description": "Label of the mod volume paper in the Mods tab (template.yaml spec.capabilities.mods.loaders)" + }, + "mods.purpur.displayName": { + "defaultMessage": "Plugins (Purpur)", + "description": "Label of the mod volume purpur in the Mods tab (template.yaml spec.capabilities.mods.loaders)" + }, + "mods.quilt.displayName": { + "defaultMessage": "Mods (Quilt)", + "description": "Label of the mod volume quilt in the Mods tab (template.yaml spec.capabilities.mods.loaders)" + }, + "mods.spigot.displayName": { + "defaultMessage": "Plugins (Spigot)", + "description": "Label of the mod volume spigot in the Mods tab (template.yaml spec.capabilities.mods.loaders)" + }, + "module.displayName": { + "defaultMessage": "Minecraft (Java Edition)", + "description": "Display name of the module (module.yaml displayName)" + }, + "module.summary": { + "defaultMessage": "Vanilla / Paper / Spigot / Bukkit / Purpur / Forge / NeoForge / Fabric / Quilt servers (itzg/minecraft-server) with a version+loader picker spanning 1.16.5–latest, per-loader mod volumes, and in-app Modrinth browse.", + "description": "One-line summary of the module (module.yaml summary)" + }, + "template.description": { + "defaultMessage": "Vanilla, Paper, Spigot, Bukkit, Purpur, Forge, NeoForge, Fabric, or Quilt\nMinecraft: Java Edition servers using the community\n[itzg/minecraft-server](https://github.com/itzg/docker-minecraft-server)\nimage. Pick a version+loader in the New Server wizard; each loader''s\nmods/plugins live on their own volume so switching never clobbers another.\n", + "description": "Description of the game template (template.yaml spec.description)" + }, + "template.displayName": { + "defaultMessage": "Minecraft (Java Edition)", + "description": "Display name of the game template (template.yaml spec.displayName)" + }, + "versions.1~116~15-forge.displayName": { + "defaultMessage": "1.16.5 · Forge", + "description": "Label of game version 1.16.5-forge in the version picker (template.yaml spec.versions)" + }, + "versions.1~116~15-paper.displayName": { + "defaultMessage": "1.16.5 · Paper", + "description": "Label of game version 1.16.5-paper in the version picker (template.yaml spec.versions)" + }, + "versions.1~118~12-forge.displayName": { + "defaultMessage": "1.18.2 · Forge", + "description": "Label of game version 1.18.2-forge in the version picker (template.yaml spec.versions)" + }, + "versions.1~118~12-paper.displayName": { + "defaultMessage": "1.18.2 · Paper", + "description": "Label of game version 1.18.2-paper in the version picker (template.yaml spec.versions)" + }, + "versions.1~119~14-forge.displayName": { + "defaultMessage": "1.19.4 · Forge", + "description": "Label of game version 1.19.4-forge in the version picker (template.yaml spec.versions)" + }, + "versions.1~119~14-paper.displayName": { + "defaultMessage": "1.19.4 · Paper", + "description": "Label of game version 1.19.4-paper in the version picker (template.yaml spec.versions)" + }, + "versions.1~120~11-fabric.displayName": { + "defaultMessage": "1.20.1 · Fabric", + "description": "Label of game version 1.20.1-fabric in the version picker (template.yaml spec.versions)" + }, + "versions.1~120~11-forge.displayName": { + "defaultMessage": "1.20.1 · Forge", + "description": "Label of game version 1.20.1-forge in the version picker (template.yaml spec.versions)" + }, + "versions.1~120~11-paper.displayName": { + "defaultMessage": "1.20.1 · Paper", + "description": "Label of game version 1.20.1-paper in the version picker (template.yaml spec.versions)" + }, + "versions.1~120~14-fabric.displayName": { + "defaultMessage": "1.20.4 · Fabric", + "description": "Label of game version 1.20.4-fabric in the version picker (template.yaml spec.versions)" + }, + "versions.1~120~14-forge.displayName": { + "defaultMessage": "1.20.4 · Forge", + "description": "Label of game version 1.20.4-forge in the version picker (template.yaml spec.versions)" + }, + "versions.1~120~14-paper.displayName": { + "defaultMessage": "1.20.4 · Paper", + "description": "Label of game version 1.20.4-paper in the version picker (template.yaml spec.versions)" + }, + "versions.1~121~11-fabric.displayName": { + "defaultMessage": "1.21.1 · Fabric", + "description": "Label of game version 1.21.1-fabric in the version picker (template.yaml spec.versions)" + }, + "versions.1~121~11-neoforge.displayName": { + "defaultMessage": "1.21.1 · NeoForge", + "description": "Label of game version 1.21.1-neoforge in the version picker (template.yaml spec.versions)" + }, + "versions.1~121~11-paper.displayName": { + "defaultMessage": "1.21.1 · Paper", + "description": "Label of game version 1.21.1-paper in the version picker (template.yaml spec.versions)" + }, + "versions.1~121~11-vanilla.displayName": { + "defaultMessage": "1.21.1 · Vanilla", + "description": "Label of game version 1.21.1-vanilla in the version picker (template.yaml spec.versions)" + }, + "versions.1~121~14-fabric.displayName": { + "defaultMessage": "1.21.4 · Fabric", + "description": "Label of game version 1.21.4-fabric in the version picker (template.yaml spec.versions)" + }, + "versions.1~121~14-forge.displayName": { + "defaultMessage": "1.21.4 · Forge", + "description": "Label of game version 1.21.4-forge in the version picker (template.yaml spec.versions)" + }, + "versions.1~121~14-neoforge.displayName": { + "defaultMessage": "1.21.4 · NeoForge", + "description": "Label of game version 1.21.4-neoforge in the version picker (template.yaml spec.versions)" + }, + "versions.1~121~14-paper.displayName": { + "defaultMessage": "1.21.4 · Paper", + "description": "Label of game version 1.21.4-paper in the version picker (template.yaml spec.versions)" + }, + "versions.1~121~14-purpur.displayName": { + "defaultMessage": "1.21.4 · Purpur", + "description": "Label of game version 1.21.4-purpur in the version picker (template.yaml spec.versions)" + }, + "versions.1~121~14-quilt.displayName": { + "defaultMessage": "1.21.4 · Quilt", + "description": "Label of game version 1.21.4-quilt in the version picker (template.yaml spec.versions)" + }, + "versions.1~121~14-vanilla.displayName": { + "defaultMessage": "1.21.4 · Vanilla", + "description": "Label of game version 1.21.4-vanilla in the version picker (template.yaml spec.versions)" + }, + "versions.latest-fabric.displayName": { + "defaultMessage": "Latest · Fabric", + "description": "Label of game version latest-fabric in the version picker (template.yaml spec.versions)" + }, + "versions.latest-paper.displayName": { + "defaultMessage": "Latest · Paper", + "description": "Label of game version latest-paper in the version picker (template.yaml spec.versions)" + }, + "versions.latest-vanilla.displayName": { + "defaultMessage": "Latest · Vanilla", + "description": "Label of game version latest-vanilla in the version picker (template.yaml spec.versions)" + } +} diff --git a/terraria/locales/en.json b/terraria/locales/en.json new file mode 100644 index 0000000..bd786f7 --- /dev/null +++ b/terraria/locales/en.json @@ -0,0 +1,278 @@ +{ + "actions.ban-player.description": { + "defaultMessage": "Disconnect and ban a player.", + "description": "Help text of server action ban-player (template.yaml spec.capabilities.actions)" + }, + "actions.ban-player.displayName": { + "defaultMessage": "Ban player", + "description": "Label of server action ban-player (template.yaml spec.capabilities.actions)" + }, + "actions.ban-player.group": { + "defaultMessage": "Players", + "description": "Group heading of server action ban-player (template.yaml spec.capabilities.actions)" + }, + "actions.ban-player.params.player.displayName": { + "defaultMessage": "Player name", + "description": "Label of parameter player of server action ban-player (template.yaml spec.capabilities.actions)" + }, + "actions.broadcast.displayName": { + "defaultMessage": "Broadcast message", + "description": "Label of server action broadcast (template.yaml spec.capabilities.actions)" + }, + "actions.broadcast.group": { + "defaultMessage": "Server", + "description": "Group heading of server action broadcast (template.yaml spec.capabilities.actions)" + }, + "actions.broadcast.params.message.displayName": { + "defaultMessage": "Message", + "description": "Label of parameter message of server action broadcast (template.yaml spec.capabilities.actions)" + }, + "actions.kick-player.description": { + "defaultMessage": "Disconnect a player from the server.", + "description": "Help text of server action kick-player (template.yaml spec.capabilities.actions)" + }, + "actions.kick-player.displayName": { + "defaultMessage": "Kick player", + "description": "Label of server action kick-player (template.yaml spec.capabilities.actions)" + }, + "actions.kick-player.group": { + "defaultMessage": "Players", + "description": "Group heading of server action kick-player (template.yaml spec.capabilities.actions)" + }, + "actions.kick-player.params.player.displayName": { + "defaultMessage": "Player name", + "description": "Label of parameter player of server action kick-player (template.yaml spec.capabilities.actions)" + }, + "actions.save-world.displayName": { + "defaultMessage": "Save world", + "description": "Label of server action save-world (template.yaml spec.capabilities.actions)" + }, + "actions.save-world.group": { + "defaultMessage": "World", + "description": "Group heading of server action save-world (template.yaml spec.capabilities.actions)" + }, + "actions.set-motd.displayName": { + "defaultMessage": "Set MOTD", + "description": "Label of server action set-motd (template.yaml spec.capabilities.actions)" + }, + "actions.set-motd.group": { + "defaultMessage": "Server", + "description": "Group heading of server action set-motd (template.yaml spec.capabilities.actions)" + }, + "actions.set-motd.params.message.displayName": { + "defaultMessage": "Message", + "description": "Label of parameter message of server action set-motd (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.displayName": { + "defaultMessage": "Set time", + "description": "Label of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.group": { + "defaultMessage": "World", + "description": "Group heading of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.params.time.displayName": { + "defaultMessage": "Time of day", + "description": "Label of parameter time of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.params.time.options.dawn": { + "defaultMessage": "dawn", + "description": "Choice \"dawn\" of parameter time of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.params.time.options.dusk": { + "defaultMessage": "dusk", + "description": "Choice \"dusk\" of parameter time of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.params.time.options.midnight": { + "defaultMessage": "midnight", + "description": "Choice \"midnight\" of parameter time of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.set-time.params.time.options.noon": { + "defaultMessage": "noon", + "description": "Choice \"noon\" of parameter time of server action set-time (template.yaml spec.capabilities.actions)" + }, + "actions.settle-water.description": { + "defaultMessage": "Settle all flowing liquids.", + "description": "Help text of server action settle-water (template.yaml spec.capabilities.actions)" + }, + "actions.settle-water.displayName": { + "defaultMessage": "Settle water", + "description": "Label of server action settle-water (template.yaml spec.capabilities.actions)" + }, + "actions.settle-water.group": { + "defaultMessage": "World", + "description": "Group heading of server action settle-water (template.yaml spec.capabilities.actions)" + }, + "config.AUTOCREATE.description": { + "defaultMessage": "World size to generate if the world doesn''t exist. 1 small, 2 medium, 3 large.", + "description": "Help text of configuration field AUTOCREATE (template.yaml spec.configSchema)" + }, + "config.AUTOCREATE.displayName": { + "defaultMessage": "World size", + "description": "Label of configuration field AUTOCREATE (template.yaml spec.configSchema)" + }, + "config.AUTOCREATE.options.1": { + "defaultMessage": "1", + "description": "Choice \"1\" of configuration field AUTOCREATE (template.yaml spec.configSchema)" + }, + "config.AUTOCREATE.options.2": { + "defaultMessage": "2", + "description": "Choice \"2\" of configuration field AUTOCREATE (template.yaml spec.configSchema)" + }, + "config.AUTOCREATE.options.3": { + "defaultMessage": "3", + "description": "Choice \"3\" of configuration field AUTOCREATE (template.yaml spec.configSchema)" + }, + "config.DIFFICULTY.description": { + "defaultMessage": "0 classic, 1 expert, 2 master, 3 journey.", + "description": "Help text of configuration field DIFFICULTY (template.yaml spec.configSchema)" + }, + "config.DIFFICULTY.displayName": { + "defaultMessage": "Difficulty", + "description": "Label of configuration field DIFFICULTY (template.yaml spec.configSchema)" + }, + "config.DIFFICULTY.options.0": { + "defaultMessage": "0", + "description": "Choice \"0\" of configuration field DIFFICULTY (template.yaml spec.configSchema)" + }, + "config.DIFFICULTY.options.1": { + "defaultMessage": "1", + "description": "Choice \"1\" of configuration field DIFFICULTY (template.yaml spec.configSchema)" + }, + "config.DIFFICULTY.options.2": { + "defaultMessage": "2", + "description": "Choice \"2\" of configuration field DIFFICULTY (template.yaml spec.configSchema)" + }, + "config.DIFFICULTY.options.3": { + "defaultMessage": "3", + "description": "Choice \"3\" of configuration field DIFFICULTY (template.yaml spec.configSchema)" + }, + "config.LANGUAGE.displayName": { + "defaultMessage": "Language", + "description": "Label of configuration field LANGUAGE (template.yaml spec.configSchema)" + }, + "config.LANGUAGE.options.de-DE": { + "defaultMessage": "de-DE", + "description": "Choice \"de-DE\" of configuration field LANGUAGE (template.yaml spec.configSchema)" + }, + "config.LANGUAGE.options.en-US": { + "defaultMessage": "en-US", + "description": "Choice \"en-US\" of configuration field LANGUAGE (template.yaml spec.configSchema)" + }, + "config.LANGUAGE.options.es-ES": { + "defaultMessage": "es-ES", + "description": "Choice \"es-ES\" of configuration field LANGUAGE (template.yaml spec.configSchema)" + }, + "config.LANGUAGE.options.fr-FR": { + "defaultMessage": "fr-FR", + "description": "Choice \"fr-FR\" of configuration field LANGUAGE (template.yaml spec.configSchema)" + }, + "config.LANGUAGE.options.it-IT": { + "defaultMessage": "it-IT", + "description": "Choice \"it-IT\" of configuration field LANGUAGE (template.yaml spec.configSchema)" + }, + "config.LANGUAGE.options.ja-JP": { + "defaultMessage": "ja-JP", + "description": "Choice \"ja-JP\" of configuration field LANGUAGE (template.yaml spec.configSchema)" + }, + "config.LANGUAGE.options.pl-PL": { + "defaultMessage": "pl-PL", + "description": "Choice \"pl-PL\" of configuration field LANGUAGE (template.yaml spec.configSchema)" + }, + "config.LANGUAGE.options.pt-BR": { + "defaultMessage": "pt-BR", + "description": "Choice \"pt-BR\" of configuration field LANGUAGE (template.yaml spec.configSchema)" + }, + "config.LANGUAGE.options.ru-RU": { + "defaultMessage": "ru-RU", + "description": "Choice \"ru-RU\" of configuration field LANGUAGE (template.yaml spec.configSchema)" + }, + "config.LANGUAGE.options.zh-Hans": { + "defaultMessage": "zh-Hans", + "description": "Choice \"zh-Hans\" of configuration field LANGUAGE (template.yaml spec.configSchema)" + }, + "config.MAXPLAYERS.displayName": { + "defaultMessage": "Max players", + "description": "Label of configuration field MAXPLAYERS (template.yaml spec.configSchema)" + }, + "config.MODPACK.description": { + "defaultMessage": "tModLoader only — a modpack folder name under ModPacks. Leave blank for the built-in empty \"vanilla\" pack.", + "description": "Help text of configuration field MODPACK (template.yaml spec.configSchema)" + }, + "config.MODPACK.displayName": { + "defaultMessage": "Active modpack", + "description": "Label of configuration field MODPACK (template.yaml spec.configSchema)" + }, + "config.MOTD.displayName": { + "defaultMessage": "MOTD", + "description": "Label of configuration field MOTD (template.yaml spec.configSchema)" + }, + "config.PASSWORD.description": { + "defaultMessage": "Leave blank for an open server.", + "description": "Help text of configuration field PASSWORD (template.yaml spec.configSchema)" + }, + "config.PASSWORD.displayName": { + "defaultMessage": "Server password", + "description": "Label of configuration field PASSWORD (template.yaml spec.configSchema)" + }, + "config.SECURE.displayName": { + "defaultMessage": "Cheat protection", + "description": "Label of configuration field SECURE (template.yaml spec.configSchema)" + }, + "config.SECURE.options.0": { + "defaultMessage": "0", + "description": "Choice \"0\" of configuration field SECURE (template.yaml spec.configSchema)" + }, + "config.SECURE.options.1": { + "defaultMessage": "1", + "description": "Choice \"1\" of configuration field SECURE (template.yaml spec.configSchema)" + }, + "config.SEED.description": { + "defaultMessage": "Used when a new world is generated. Leave blank for random.", + "description": "Help text of configuration field SEED (template.yaml spec.configSchema)" + }, + "config.SEED.displayName": { + "defaultMessage": "World seed", + "description": "Label of configuration field SEED (template.yaml spec.configSchema)" + }, + "config.WORLDNAME.displayName": { + "defaultMessage": "World name", + "description": "Label of configuration field WORLDNAME (template.yaml spec.configSchema)" + }, + "mods.tmodloader.displayName": { + "defaultMessage": "tModLoader ModPacks", + "description": "Label of the mod volume tmodloader in the Mods tab (template.yaml spec.capabilities.mods.loaders)" + }, + "module.displayName": { + "defaultMessage": "Terraria", + "description": "Display name of the module (module.yaml displayName)" + }, + "module.summary": { + "defaultMessage": "Terraria + tModLoader dedicated server (passivelemon/terraria-docker) with a vanilla/tModLoader version picker and a tModLoader ModPacks volume. Console via container stdin.", + "description": "One-line summary of the module (module.yaml summary)" + }, + "template.description": { + "defaultMessage": "Terraria + tModLoader dedicated server using\n[passivelemon/terraria-docker](https://github.com/PassiveLemon/terraria-docker).\nChoose vanilla or tModLoader (and the build) in the wizard — the choice\nmaps to an image tag. tModLoader modpacks are managed from the Mods tab.\nConsole attaches to container stdin (pty); no RCON.\n", + "description": "Description of the game template (template.yaml spec.description)" + }, + "template.displayName": { + "defaultMessage": "Terraria", + "description": "Display name of the game template (template.yaml spec.displayName)" + }, + "versions.tmodloader-2026.displayName": { + "defaultMessage": "tModLoader · 2026 stable", + "description": "Label of game version tmodloader-2026 in the version picker (template.yaml spec.versions)" + }, + "versions.tmodloader-latest.displayName": { + "defaultMessage": "tModLoader · latest", + "description": "Label of game version tmodloader-latest in the version picker (template.yaml spec.versions)" + }, + "versions.tmodloader-preview.displayName": { + "defaultMessage": "tModLoader · latest preview", + "description": "Label of game version tmodloader-preview in the version picker (template.yaml spec.versions)" + }, + "versions.vanilla-latest.displayName": { + "defaultMessage": "Vanilla · latest", + "description": "Label of game version vanilla-latest in the version picker (template.yaml spec.versions)" + } +} diff --git a/terraria/specs.md b/terraria/specs.md index 56b9f79..3889d65 100644 --- a/terraria/specs.md +++ b/terraria/specs.md @@ -84,3 +84,5 @@ Declared ports under `spec.ports`: - Official Game Documentation: https://terraria.org/ - Upstream Container Repository: https://github.com/PassiveLemon/terraria-docker - Steam Dedicated Server AppID: `105600` + +This module ships `locales/en.json`, generated by `gp-module i18n extract` (never hand-edited). diff --git a/valheim/locales/en.json b/valheim/locales/en.json new file mode 100644 index 0000000..f1ba00f --- /dev/null +++ b/valheim/locales/en.json @@ -0,0 +1,74 @@ +{ + "config.BACKUPS.description": { + "defaultMessage": "lloesche image also rolls backups. The Gameplane Backup CRD is the preferred path; leave off.", + "description": "Help text of configuration field BACKUPS (template.yaml spec.configSchema)" + }, + "config.BACKUPS.displayName": { + "defaultMessage": "In-container backups", + "description": "Label of configuration field BACKUPS (template.yaml spec.configSchema)" + }, + "config.BEPINEX.description": { + "defaultMessage": "Turn on the BepInEx mod loader. Required to use the Mods tab.", + "description": "Help text of configuration field BEPINEX (template.yaml spec.configSchema)" + }, + "config.BEPINEX.displayName": { + "defaultMessage": "Enable BepInEx mods", + "description": "Label of configuration field BEPINEX (template.yaml spec.configSchema)" + }, + "config.SERVER_NAME.displayName": { + "defaultMessage": "Server name", + "description": "Label of configuration field SERVER_NAME (template.yaml spec.configSchema)" + }, + "config.SERVER_PASS.description": { + "defaultMessage": "5+ characters. Required by Valheim.", + "description": "Help text of configuration field SERVER_PASS (template.yaml spec.configSchema)" + }, + "config.SERVER_PASS.displayName": { + "defaultMessage": "Password", + "description": "Label of configuration field SERVER_PASS (template.yaml spec.configSchema)" + }, + "config.SERVER_PUBLIC.displayName": { + "defaultMessage": "List publicly", + "description": "Label of configuration field SERVER_PUBLIC (template.yaml spec.configSchema)" + }, + "config.UPDATE_CRON.description": { + "defaultMessage": "When to check Steam for a game update. Blank disables.", + "description": "Help text of configuration field UPDATE_CRON (template.yaml spec.configSchema)" + }, + "config.UPDATE_CRON.displayName": { + "defaultMessage": "Auto-update cron", + "description": "Label of configuration field UPDATE_CRON (template.yaml spec.configSchema)" + }, + "config.WORLD_NAME.displayName": { + "defaultMessage": "World", + "description": "Label of configuration field WORLD_NAME (template.yaml spec.configSchema)" + }, + "mods.bepinex.displayName": { + "defaultMessage": "BepInEx plugins", + "description": "Label of the mod volume bepinex in the Mods tab (template.yaml spec.capabilities.mods.loaders)" + }, + "module.displayName": { + "defaultMessage": "Valheim (Dedicated)", + "description": "Display name of the module (module.yaml displayName)" + }, + "module.summary": { + "defaultMessage": "Valheim dedicated server (lloesche/valheim-server) with a stable/public-test channel picker, a BepInEx mod volume, and in-app Thunderstore browse. Crossplay-friendly.", + "description": "One-line summary of the module (module.yaml summary)" + }, + "template.description": { + "defaultMessage": "Valheim dedicated server using\n[lloesche/valheim-server](https://github.com/lloesche/valheim-server-docker).\nWorld persistence, password, crossplay, and BepInEx mods. Choose the\nstable or public-test channel in the New Server wizard.\n", + "description": "Description of the game template (template.yaml spec.description)" + }, + "template.displayName": { + "defaultMessage": "Valheim (Dedicated)", + "description": "Display name of the game template (template.yaml spec.displayName)" + }, + "versions.public-test.displayName": { + "defaultMessage": "Public Test (beta)", + "description": "Label of game version public-test in the version picker (template.yaml spec.versions)" + }, + "versions.stable.displayName": { + "defaultMessage": "Stable", + "description": "Label of game version stable in the version picker (template.yaml spec.versions)" + } +} diff --git a/valheim/specs.md b/valheim/specs.md index b463155..7c00fde 100644 --- a/valheim/specs.md +++ b/valheim/specs.md @@ -85,3 +85,5 @@ Declared ports under `spec.ports`: - Valheim Dedicated Server Guide: https://valheim.fandom.com/wiki/Dedicated_servers - Upstream Container Repository: https://github.com/lloesche/valheim-server-docker - Steam Dedicated Server AppID: 896660 + +This module ships `locales/en.json`, generated by `gp-module i18n extract` (never hand-edited).