Added modded worldgen catalog

- Captured the worldgen catalog after server start, scanning registries on the server thread and encoding and writing on a worker into config/irisworldgen/catalog/worldgen-catalog.json
- Added WorldgenCatalogFingerprint over namespace versions and registry keys
- Added /iris catalog [namespace|refresh] and /iris ingest mods <source> <target> with keyed dimension, namespaces and replace options
- Added catalog messages and help entries for every shipped locale
- Added tests for catalog assembly, namespace summaries, ingest arguments, the registry scan and command registration
This commit is contained in:
Brian Neumann-Fopiano committed 2026-10-14 20:14:11 -04:00
1 parent 8afb445b1d
commit f6f381f6e4
36 files changed
+2150

No files matched your search

@@ -0,0 +1,66 @@
/*
* Iris is a World Generator for Minecraft Servers
* Copyright (c) 2026 Arcane Arts (Volmit Software)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package art.arcane.iris.pack.ingest.catalog;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HexFormat;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;
public final class WorldgenCatalogFingerprint {
private WorldgenCatalogFingerprint() {
}
public static String of(List<CatalogNamespace> namespaces, Map<String, ? extends Collection<String>> registryKeys) {
Objects.requireNonNull(namespaces, "namespaces");
Objects.requireNonNull(registryKeys, "registryKeys");
MessageDigest digest = sha256();
List<String> versions = new ArrayList<>(namespaces.size());
for (CatalogNamespace namespace : namespaces) {
versions.add(namespace.namespace() + ":" + namespace.version());
}
update(digest, "namespaces", versions);
for (Map.Entry<String, ? extends Collection<String>> registry : new TreeMap<>(registryKeys).entrySet()) {
update(digest, "registry " + registry.getKey(), new ArrayList<>(registry.getValue()));
}
return HexFormat.of().formatHex(digest.digest());
}
private static void update(MessageDigest digest, String section, List<String> values) {
values.sort(null);
digest.update((section + "\n").getBytes(StandardCharsets.UTF_8));
for (String value : values) {
digest.update((value + "\n").getBytes(StandardCharsets.UTF_8));
}
}
private static MessageDigest sha256() {
try {
return MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException missing) {
throw new IllegalStateException("SHA-256 is unavailable", missing);
}
}
}
@@ -361,6 +361,9 @@ operator_instruction = "Führe {command} in der Konsole aus oder aktiviere Cheat
"entry.command.debug" = "Iris-Debugprotokollierung umschalten und iris.json speichern"
"entry.command.reload" = "iris.json neu laden; die Datei wird außerdem automatisch alle 3 Sekunden direkt neu geladen"
"entry.command.download" = "Ein Pack-Projekt herunterladen"
"entry.command.catalog" = "Worldgen-Inhalte geladener Mods auflisten, einen Namespace anzeigen oder neu erfassen"
"entry.group.ingest" = "Iris-Packs aus den Worldgen-Inhalten geladener Mods erstellen"
"entry.command.ingest_mods" = "Ein Quell-Pack in ein neues Ziel-Pack kopieren und das Worldgen geladener Mods übernehmen"
"entry.command.metrics" = "Generierungsmetriken der aktuellen Iris-Dimension anzeigen"
"entry.command.regen" = "Löschen und regenerieren Sie nahe gelegene Chunks an Ort und Stelle"
"entry.group.pregen" = "Eine Iris-Dimension vorgenerieren"
@@ -455,6 +458,26 @@ operator_instruction = "Führe {command} in der Konsole aus oder aktiviere Cheat
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "Inhalte anzeigen, die in dieser Minecraft-Version nicht generiert werden können"
[iris.modded.catalog]
missing = "Es wurde noch kein Worldgen-Katalog erfasst. Führe /iris catalog refresh aus."
header = "Worldgen-Katalog ({name} {version}): {count} Namespaces, {value} Biome, {value2} platzierte Features, {value3} Strukturen, {value4} Dimensionstypen, {value5} Level-Stems"
namespace = "{name} {version}: {value} Biome, {value2} platzierte Features ({detail}), {value3} Strukturen, {value4} Dimensionstypen, {value5} Level-Stems"
quiet = "{count} weitere geladene Mods haben keine Worldgen-Inhalte."
unknown_namespace = "Der Worldgen-Katalog enthält keine Inhalte aus dem Namespace {name}."
detail_biomes = "Biome ({count}): {value}"
detail_features = "Platzierte Features nach Typ ({count}): {value}"
detail_structures = "Strukturen ({count}): {value}"
detail_dimensions = "Dimensionstypen: {value}; Level-Stems: {value2}"
refreshing = "Worldgen-Katalog wird erfasst..."
refreshed = "Worldgen-Katalog in {duration} erfasst: {path}"
refresh_failed = "Erfassung des Worldgen-Katalogs fehlgeschlagen: {reason}"
ingest_invalid = "Ungültige Argumente: {reason}. Verwendung: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "Pack '{pack}' wurde unter {path} nicht gefunden."
ingest_started = "Übernehme Mod-Worldgen aus '{source}' in '{target}' (Dimension {dimension})..."
ingest_failed = "Mod-Übernahme fehlgeschlagen: {reason}"
ingest_line = " {summary}"
ingest_complete = "Mod-Übernahme abgeschlossen: {path}"
[iris.modded.command]
"properties.none" = "Eigenschaften: (keine)"
"properties.list" = "Eigenschaften: {properties}"
@@ -361,6 +361,9 @@ operator_instruction = "Ejecuta {command} desde la consola (o activa los trucos
"entry.command.debug" = "Alternar el registro de depuración de Iris y guardar iris.json"
"entry.command.reload" = "Recargar iris.json (también se recarga en caliente automáticamente cada 3s)"
"entry.command.download" = "Descargar un proyecto de pack"
"entry.command.catalog" = "Listar el contenido de generación de los mods cargados, mostrar un espacio de nombres o volver a capturarlo"
"entry.group.ingest" = "Crear packs de Iris a partir del contenido de generación de los mods cargados"
"entry.command.ingest_mods" = "Copiar un pack de origen en un nuevo pack de destino e incorporar la generación de los mods cargados"
"entry.command.metrics" = "Mostrar métricas de generación de tu dimensión de Iris actual"
"entry.command.regen" = "Eliminar y regenerar chunks cercanos en el mismo lugar"
"entry.group.pregen" = "Pregenerar una dimensión de Iris"
@@ -455,6 +458,26 @@ operator_instruction = "Ejecuta {command} desde la consola (o activa los trucos
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "Muestra el contenido que no puede generarse en esta versión de Minecraft"
[iris.modded.catalog]
missing = "Todavía no se ha capturado ningún catálogo de generación de mundo. Ejecuta /iris catalog refresh."
header = "Catálogo de generación ({name} {version}): {count} espacios de nombres, {value} biomas, {value2} features colocadas, {value3} estructuras, {value4} tipos de dimensión, {value5} level stems"
namespace = "{name} {version}: {value} biomas, {value2} features colocadas ({detail}), {value3} estructuras, {value4} tipos de dimensión, {value5} level stems"
quiet = "Otros {count} mods cargados no tienen contenido de generación de mundo."
unknown_namespace = "El catálogo de generación no tiene contenido del espacio de nombres {name}."
detail_biomes = "Biomas ({count}): {value}"
detail_features = "Features colocadas por tipo ({count}): {value}"
detail_structures = "Estructuras ({count}): {value}"
detail_dimensions = "Tipos de dimensión: {value}; level stems: {value2}"
refreshing = "Capturando el catálogo de generación de mundo..."
refreshed = "Catálogo de generación capturado en {duration}: {path}"
refresh_failed = "Error al capturar el catálogo de generación: {reason}"
ingest_invalid = "Argumentos no válidos: {reason}. Uso: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "No se encontró el pack '{pack}' en {path}."
ingest_started = "Incorporando la generación de mods de '{source}' a '{target}' (dimensión {dimension})..."
ingest_failed = "La incorporación de mods falló: {reason}"
ingest_line = " {summary}"
ingest_complete = "Incorporación de mods terminada: {path}"
[iris.modded.command]
"properties.none" = "Propiedades: (ninguno)"
"properties.list" = "Propiedades: {properties}"
@@ -366,6 +366,9 @@ operator_instruction = "Juokse {command} konsolilta (tai mahdollista huijaukset
"entry.command.debug" = "Vaihda Iris vianetsintä ja tallenna iris.json"
"entry.command.reload" = "Lataa uudelleen iris.json (myös hotloaded automaattisesti joka 3.s)"
"entry.command.download" = "Lataa pakettiprojekti"
"entry.command.catalog" = "Listaa ladattujen modien maailmangenerointisisältö, näytä yksi nimiavaruus tai kerää se uudelleen"
"entry.group.ingest" = "Luo Iris-paketteja ladattujen modien maailmangenerointisisällöstä"
"entry.command.ingest_mods" = "Kopioi lähdepaketti uudeksi kohdepaketiksi ja ota ladattujen modien maailmangenerointi käyttöön"
"entry.command.metrics" = "Tulosta nykyisen sukupolven mittareita Iris ulottuvuus"
"entry.command.regen" = "Poista ja uudista lähistön palaset paikoilleen"
"entry.group.pregen" = "Esiaste Iris ulottuvuus"
@@ -460,6 +463,26 @@ operator_instruction = "Juokse {command} konsolilta (tai mahdollista huijaukset
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "Näytä sisältö, jota ei voi luoda tässä Minecraft-versiossa"
[iris.modded.catalog]
missing = "Maailmangeneroinnin luetteloa ei ole vielä kerätty. Suorita /iris catalog refresh."
header = "Maailmangeneroinnin luettelo ({name} {version}): {count} nimiavaruutta, {value} biomia, {value2} sijoitettua featurea, {value3} rakennelmaa, {value4} ulottuvuustyyppiä, {value5} level stemiä"
namespace = "{name} {version}: {value} biomia, {value2} sijoitettua featurea ({detail}), {value3} rakennelmaa, {value4} ulottuvuustyyppiä, {value5} level stemiä"
quiet = "{count} muulla ladatulla modilla ei ole maailmangenerointisisältöä."
unknown_namespace = "Maailmangeneroinnin luettelossa ei ole sisältöä nimiavaruudesta {name}."
detail_biomes = "Biomit ({count}): {value}"
detail_features = "Sijoitetut featuret tyypeittäin ({count}): {value}"
detail_structures = "Rakennelmat ({count}): {value}"
detail_dimensions = "Ulottuvuustyypit: {value}; level stemit: {value2}"
refreshing = "Kerätään maailmangeneroinnin luetteloa..."
refreshed = "Maailmangeneroinnin luettelo kerätty ajassa {duration}: {path}"
refresh_failed = "Maailmangeneroinnin luettelon kerääminen epäonnistui: {reason}"
ingest_invalid = "Virheelliset argumentit: {reason}. Käyttö: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "Pakettia '{pack}' ei löytynyt kohteesta {path}."
ingest_started = "Tuodaan modien maailmangenerointi paketista '{source}' pakettiin '{target}' (ulottuvuus {dimension})..."
ingest_failed = "Modien tuonti epäonnistui: {reason}"
ingest_line = " {summary}"
ingest_complete = "Modien tuonti valmis: {path}"
[iris.modded.command]
"properties.none" = "Ominaisuudet: (ei)"
"properties.list" = "Ominaisuudet: {properties}"
@@ -361,6 +361,9 @@ operator_instruction = "Exécutez {command} depuis la console (ou activez les co
"entry.command.debug" = "Basculer les journaux de débogage Iris et enregistrer iris.json"
"entry.command.reload" = "Recharger iris.json (également rechargé à chaud automatiquement toutes les 3s)"
"entry.command.download" = "Télécharger un projet de pack"
"entry.command.catalog" = "Lister le contenu de génération des mods chargés, afficher un espace de noms ou le capturer à nouveau"
"entry.group.ingest" = "Créer des packs Iris à partir du contenu de génération des mods chargés"
"entry.command.ingest_mods" = "Copier un pack source dans un nouveau pack cible et y intégrer la génération des mods chargés"
"entry.command.metrics" = "Afficher les métriques de génération de votre dimension Iris actuelle"
"entry.command.regen" = "Supprimer et régénérer sur place les chunks proches"
"entry.group.pregen" = "Prégénérer une dimension Iris"
@@ -455,6 +458,26 @@ operator_instruction = "Exécutez {command} depuis la console (ou activez les co
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "Afficher le contenu qui ne peut pas être généré sur cette version de Minecraft"
[iris.modded.catalog]
missing = "Aucun catalogue de génération n'a encore été capturé. Exécutez /iris catalog refresh."
header = "Catalogue de génération ({name} {version}) : {count} espaces de noms, {value} biomes, {value2} features placées, {value3} structures, {value4} types de dimension, {value5} level stems"
namespace = "{name} {version} : {value} biomes, {value2} features placées ({detail}), {value3} structures, {value4} types de dimension, {value5} level stems"
quiet = "{count} autres mods chargés n'ont aucun contenu de génération."
unknown_namespace = "Le catalogue de génération ne contient rien de l'espace de noms {name}."
detail_biomes = "Biomes ({count}) : {value}"
detail_features = "Features placées par type ({count}) : {value}"
detail_structures = "Structures ({count}) : {value}"
detail_dimensions = "Types de dimension : {value} ; level stems : {value2}"
refreshing = "Capture du catalogue de génération..."
refreshed = "Catalogue de génération capturé en {duration} : {path}"
refresh_failed = "Échec de la capture du catalogue de génération : {reason}"
ingest_invalid = "Arguments invalides : {reason}. Utilisation : /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "Le pack '{pack}' est introuvable dans {path}."
ingest_started = "Intégration de la génération des mods de '{source}' vers '{target}' (dimension {dimension})..."
ingest_failed = "L'intégration des mods a échoué : {reason}"
ingest_line = " {summary}"
ingest_complete = "Intégration des mods terminée : {path}"
[iris.modded.command]
"properties.none" = "Propriétés: (aucune)"
"properties.list" = "Propriétés : {properties}"
@@ -366,6 +366,9 @@ operator_instruction = "לרוץ {command} מן הקונסולה (או לאפש
"entry.command.debug" = "עקבו אחרי Iris debug bug , שמירה iris.json"
"entry.command.reload" = "המונחים טעינה מחדש iris.json (גם חם כל 3s)"
"entry.command.download" = "הורד פרויקט חבילה"
"entry.command.catalog" = "הצג את תוכן יצירת העולם של המודים הטעונים, הצג מרחב שמות אחד או אסוף אותו מחדש"
"entry.group.ingest" = "בנה חבילות Iris מתוכן יצירת העולם של המודים הטעונים"
"entry.command.ingest_mods" = "העתק חבילת מקור לחבילת יעד חדשה ואמץ את יצירת העולם של המודים הטעונים"
"entry.command.metrics" = "הדפסת דור מדדים עבור הנוכחי שלך Iris מימד"
"entry.command.regen" = "למחוק ולחדש חלקים סמוכים במקום"
"entry.group.pregen" = "עקבו אחרי a Iris מימד"
@@ -460,6 +463,26 @@ operator_instruction = "לרוץ {command} מן הקונסולה (או לאפש
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "הצג תוכן שלא ניתן ליצור בגרסת Minecraft הזו"
[iris.modded.catalog]
missing = "עדיין לא נאסף קטלוג יצירת עולם. הרץ /iris catalog refresh."
header = "קטלוג יצירת עולם ({name} {version}): {count} מרחבי שמות, {value} ביומים, {value2} פיצ'רים ממוקמים, {value3} מבנים, {value4} סוגי ממדים, {value5} level stems"
namespace = "{name} {version}: {value} ביומים, {value2} פיצ'רים ממוקמים ({detail}), {value3} מבנים, {value4} סוגי ממדים, {value5} level stems"
quiet = "ל-{count} מודים טעונים נוספים אין תוכן יצירת עולם."
unknown_namespace = "בקטלוג יצירת העולם אין תוכן ממרחב השמות {name}."
detail_biomes = "ביומים ({count}): {value}"
detail_features = "פיצ'רים ממוקמים לפי סוג ({count}): {value}"
detail_structures = "מבנים ({count}): {value}"
detail_dimensions = "סוגי ממדים: {value}; level stems: {value2}"
refreshing = "אוסף את קטלוג יצירת העולם..."
refreshed = "קטלוג יצירת העולם נאסף תוך {duration}: {path}"
refresh_failed = "איסוף קטלוג יצירת העולם נכשל: {reason}"
ingest_invalid = "ארגומנטים לא תקינים: {reason}. שימוש: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "החבילה '{pack}' לא נמצאה תחת {path}."
ingest_started = "מייבא את יצירת העולם של המודים מ-'{source}' אל '{target}' (ממד {dimension})..."
ingest_failed = "ייבוא המודים נכשל: {reason}"
ingest_line = " {summary}"
ingest_complete = "ייבוא המודים הסתיים: {path}"
[iris.modded.command]
"properties.none" = "נכסים: (אין)"
"properties.list" = "נכסים: {properties}"
@@ -361,6 +361,9 @@ operator_instruction = "Esegui {command} dalla console oppure abilita i trucchi
"entry.command.debug" = "Attiva o disattiva la registrazione di debug Iris e salva iris.json"
"entry.command.reload" = "Ricarica iris.json; il file viene anche ricaricato automaticamente ogni 3 secondi"
"entry.command.download" = "Scarica un progetto Pack"
"entry.command.catalog" = "Elenca i contenuti di generazione delle mod caricate, mostra un namespace o acquisiscilo di nuovo"
"entry.group.ingest" = "Crea pack Iris dai contenuti di generazione delle mod caricate"
"entry.command.ingest_mods" = "Copia un pack di origine in un nuovo pack di destinazione e adotta la generazione delle mod caricate"
"entry.command.metrics" = "Mostra le metriche di generazione della dimensione Iris corrente"
"entry.command.regen" = "Eliminare e rigenerare i chunk vicini al posto"
"entry.group.pregen" = "Pregenera una dimensione Iris"
@@ -455,6 +458,26 @@ operator_instruction = "Esegui {command} dalla console oppure abilita i trucchi
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "Mostra i contenuti che non possono essere generati su questa versione di Minecraft"
[iris.modded.catalog]
missing = "Nessun catalogo di generazione è stato ancora acquisito. Esegui /iris catalog refresh."
header = "Catalogo di generazione ({name} {version}): {count} namespace, {value} biomi, {value2} feature piazzate, {value3} strutture, {value4} tipi di dimensione, {value5} level stem"
namespace = "{name} {version}: {value} biomi, {value2} feature piazzate ({detail}), {value3} strutture, {value4} tipi di dimensione, {value5} level stem"
quiet = "Altre {count} mod caricate non hanno contenuti di generazione."
unknown_namespace = "Il catalogo di generazione non contiene nulla dal namespace {name}."
detail_biomes = "Biomi ({count}): {value}"
detail_features = "Feature piazzate per tipo ({count}): {value}"
detail_structures = "Strutture ({count}): {value}"
detail_dimensions = "Tipi di dimensione: {value}; level stem: {value2}"
refreshing = "Acquisizione del catalogo di generazione..."
refreshed = "Catalogo di generazione acquisito in {duration}: {path}"
refresh_failed = "Acquisizione del catalogo di generazione non riuscita: {reason}"
ingest_invalid = "Argomenti non validi: {reason}. Uso: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "Il pack '{pack}' non è stato trovato in {path}."
ingest_started = "Importazione della generazione delle mod da '{source}' a '{target}' (dimensione {dimension})..."
ingest_failed = "Importazione delle mod non riuscita: {reason}"
ingest_line = " {summary}"
ingest_complete = "Importazione delle mod completata: {path}"
[iris.modded.command]
"properties.none" = "Proprietà: (nessuna)"
"properties.list" = "Proprietà: {properties}"
@@ -364,6 +364,9 @@ operator_instruction = "コンソールから {command} を実行してくださ
"entry.command.debug" = "Iris のデバッグログを切り替えて iris.json を保存します"
"entry.command.reload" = "iris.json を再読み込みします(3s ごとの自動ホットロードにも対応)"
"entry.command.download" = "パックプロジェクトをダウンロードします"
"entry.command.catalog" = "読み込まれた Mod のワールド生成コンテンツを一覧表示し、1 つの名前空間を表示し、または再取得します"
"entry.group.ingest" = "読み込まれた Mod のワールド生成コンテンツから Iris パックを作成します"
"entry.command.ingest_mods" = "元のパックを新しいパックにコピーし、読み込まれた Mod のワールド生成を取り込みます"
"entry.command.metrics" = "現在の Iris ディメンションの生成メトリクスを表示します"
"entry.command.regen" = "周囲のチャンクを削除し、その場で再生成します"
"entry.group.pregen" = "Iris ディメンションを事前生成します"
@@ -458,6 +461,26 @@ operator_instruction = "コンソールから {command} を実行してくださ
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "この Minecraft バージョンでは生成できない内容を表示します"
[iris.modded.catalog]
missing = "ワールド生成カタログはまだ取得されていません。/iris catalog refresh を実行してください。"
header = "ワールド生成カタログ ({name} {version}): 名前空間 {count}、バイオーム {value}、配置済みフィーチャー {value2}、構造物 {value3}、ディメンションタイプ {value4}、レベルステム {value5}"
namespace = "{name} {version}: バイオーム {value}、配置済みフィーチャー {value2} ({detail})、構造物 {value3}、ディメンションタイプ {value4}、レベルステム {value5}"
quiet = "ほかに読み込まれた {count} 個の Mod にはワールド生成コンテンツがありません。"
unknown_namespace = "ワールド生成カタログには名前空間 {name} のコンテンツがありません。"
detail_biomes = "バイオーム ({count}): {value}"
detail_features = "種類別の配置済みフィーチャー ({count}): {value}"
detail_structures = "構造物 ({count}): {value}"
detail_dimensions = "ディメンションタイプ: {value}、レベルステム: {value2}"
refreshing = "ワールド生成カタログを取得しています..."
refreshed = "ワールド生成カタログを {duration} で取得しました: {path}"
refresh_failed = "ワールド生成カタログの取得に失敗しました: {reason}"
ingest_invalid = "引数が無効です: {reason}。使い方: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "パック '{pack}' が {path} に見つかりません。"
ingest_started = "'{source}' から '{target}' へ Mod のワールド生成を取り込んでいます (ディメンション {dimension})..."
ingest_failed = "Mod の取り込みに失敗しました: {reason}"
ingest_line = " {summary}"
ingest_complete = "Mod の取り込みが完了しました: {path}"
[iris.modded.command]
"properties.none" = "プロパティ:(なし)"
"properties.list" = "プロパティ: {properties}"
@@ -364,6 +364,9 @@ operator_instruction = "콘솔에서 {command}을(를) 실행하세요(싱글
"entry.command.debug" = "Iris 디버그 로깅을 전환하고 iris.json을 저장합니다"
"entry.command.reload" = "iris.json을 다시 로드합니다(3s마다 자동 핫로드도 수행)"
"entry.command.download" = "팩 프로젝트를 다운로드합니다"
"entry.command.catalog" = "로드된 모드의 월드 생성 콘텐츠를 나열하거나, 네임스페이스 하나를 표시하거나, 다시 수집합니다"
"entry.group.ingest" = "로드된 모드의 월드 생성 콘텐츠로 Iris 팩을 만듭니다"
"entry.command.ingest_mods" = "원본 팩을 새 대상 팩으로 복사하고 로드된 모드의 월드 생성을 적용합니다"
"entry.command.metrics" = "현재 Iris 차원의 생성 측정값을 표시합니다"
"entry.command.regen" = "주변 청크를 삭제하고 제자리에서 다시 생성합니다"
"entry.group.pregen" = "Iris 차원을 사전 생성합니다"
@@ -458,6 +461,26 @@ operator_instruction = "콘솔에서 {command}을(를) 실행하세요(싱글
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "이 Minecraft 버전에서 생성할 수 없는 콘텐츠를 표시합니다"
[iris.modded.catalog]
missing = "아직 월드 생성 카탈로그가 수집되지 않았습니다. /iris catalog refresh를 실행하세요."
header = "월드 생성 카탈로그 ({name} {version}): 네임스페이스 {count}개, 바이옴 {value}개, 배치된 지형지물 {value2}개, 구조물 {value3}개, 차원 유형 {value4}개, 레벨 스템 {value5}개"
namespace = "{name} {version}: 바이옴 {value}개, 배치된 지형지물 {value2}개 ({detail}), 구조물 {value3}개, 차원 유형 {value4}개, 레벨 스템 {value5}개"
quiet = "로드된 다른 모드 {count}개에는 월드 생성 콘텐츠가 없습니다."
unknown_namespace = "월드 생성 카탈로그에 네임스페이스 {name}의 콘텐츠가 없습니다."
detail_biomes = "바이옴 ({count}): {value}"
detail_features = "유형별 배치된 지형지물 ({count}): {value}"
detail_structures = "구조물 ({count}): {value}"
detail_dimensions = "차원 유형: {value}; 레벨 스템: {value2}"
refreshing = "월드 생성 카탈로그를 수집하는 중..."
refreshed = "월드 생성 카탈로그를 {duration} 만에 수집했습니다: {path}"
refresh_failed = "월드 생성 카탈로그 수집에 실패했습니다: {reason}"
ingest_invalid = "잘못된 인수: {reason}. 사용법: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "{path}에서 팩 '{pack}'을(를) 찾을 수 없습니다."
ingest_started = "'{source}'에서 '{target}'(으)로 모드 월드 생성을 가져오는 중 (차원 {dimension})..."
ingest_failed = "모드 가져오기에 실패했습니다: {reason}"
ingest_line = " {summary}"
ingest_complete = "모드 가져오기 완료: {path}"
[iris.modded.command]
"properties.none" = "속성: (없음)"
"properties.list" = "속성: {properties}"
@@ -366,6 +366,9 @@ operator_instruction = "Vykdyti {command} iš konsolės (arba leidžia cheats į
"entry.command.debug" = "Perjungti Iris Derinti prisijungimą ir įrašymą iris.json"
"entry.command.reload" = "Įkelti iš naujo iris.json (taip pat įkeliamas automatiškai kas 3s)"
"entry.command.download" = "Parsisiųsti paketo projektą"
"entry.command.catalog" = "Išvardyti įkeltų modų pasaulio generavimo turinį, parodyti vieną vardų sritį arba surinkti jį iš naujo"
"entry.group.ingest" = "Kurti Iris paketus iš įkeltų modų pasaulio generavimo turinio"
"entry.command.ingest_mods" = "Nukopijuoti šaltinio paketą į naują paskirties paketą ir perimti įkeltų modų pasaulio generavimą"
"entry.command.metrics" = "Spausdinti kartos metrikos savo dabartinę Iris matmuo"
"entry.command.regen" = "Pašalinti ir regeneruoti netoliese gabaliukus vietoje"
"entry.group.pregen" = "Regeneruoti Iris matmuo"
@@ -460,6 +463,26 @@ operator_instruction = "Vykdyti {command} iš konsolės (arba leidžia cheats į
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "Rodyti turinį, kurio negalima sugeneruoti šioje Minecraft versijoje"
[iris.modded.catalog]
missing = "Pasaulio generavimo katalogas dar nesurinktas. Paleisk /iris catalog refresh."
header = "Pasaulio generavimo katalogas ({name} {version}): vardų sritys {count}, biomai {value}, išdėstyti elementai {value2}, struktūros {value3}, dimensijų tipai {value4}, lygio stiebai {value5}"
namespace = "{name} {version}: biomai {value}, išdėstyti elementai {value2} ({detail}), struktūros {value3}, dimensijų tipai {value4}, lygio stiebai {value5}"
quiet = "Dar {count} įkeltų modų neturi pasaulio generavimo turinio."
unknown_namespace = "Pasaulio generavimo kataloge nėra turinio iš vardų srities {name}."
detail_biomes = "Biomai ({count}): {value}"
detail_features = "Išdėstyti elementai pagal tipą ({count}): {value}"
detail_structures = "Struktūros ({count}): {value}"
detail_dimensions = "Dimensijų tipai: {value}; lygio stiebai: {value2}"
refreshing = "Renkamas pasaulio generavimo katalogas..."
refreshed = "Pasaulio generavimo katalogas surinktas per {duration}: {path}"
refresh_failed = "Nepavyko surinkti pasaulio generavimo katalogo: {reason}"
ingest_invalid = "Netinkami argumentai: {reason}. Naudojimas: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "Paketas '{pack}' nerastas {path}."
ingest_started = "Perkeliamas modų pasaulio generavimas iš '{source}' į '{target}' (dimensija {dimension})..."
ingest_failed = "Modų perkėlimas nepavyko: {reason}"
ingest_line = " {summary}"
ingest_complete = "Modų perkėlimas baigtas: {path}"
[iris.modded.command]
"properties.none" = "Savybės: (nėra)"
"properties.list" = "Savybės: {properties}"
@@ -361,6 +361,9 @@ operator_instruction = "Start {command} vanaf de console (of schakel bedrog in s
"entry.command.debug" = "Schakelen Iris debug loggen en opslaan iris.json"
"entry.command.reload" = "Herladen iris.json (ook automatisch gehotload elke 3s)"
"entry.command.download" = "Een pakketproject downloaden"
"entry.command.catalog" = "De wereldgeneratie-inhoud van geladen mods tonen, één namespace weergeven of opnieuw vastleggen"
"entry.group.ingest" = "Iris-packs maken van de wereldgeneratie-inhoud van geladen mods"
"entry.command.ingest_mods" = "Een bronpack naar een nieuw doelpack kopiëren en de wereldgeneratie van geladen mods overnemen"
"entry.command.metrics" = "Generatiegegevens afdrukken voor uw huidige Iris dimensie"
"entry.command.regen" = "Verwijderen en regenereren nabijgelegen chunks in plaats"
"entry.group.pregen" = "Pregeneer een Iris dimensie"
@@ -455,6 +458,26 @@ operator_instruction = "Start {command} vanaf de console (of schakel bedrog in s
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "Toon inhoud die niet kan worden gegenereerd op deze Minecraft-versie"
[iris.modded.catalog]
missing = "Er is nog geen wereldgeneratiecatalogus vastgelegd. Voer /iris catalog refresh uit."
header = "Wereldgeneratiecatalogus ({name} {version}): {count} namespaces, {value} biomen, {value2} geplaatste features, {value3} structuren, {value4} dimensietypen, {value5} level stems"
namespace = "{name} {version}: {value} biomen, {value2} geplaatste features ({detail}), {value3} structuren, {value4} dimensietypen, {value5} level stems"
quiet = "{count} andere geladen mods hebben geen wereldgeneratie-inhoud."
unknown_namespace = "De wereldgeneratiecatalogus bevat geen inhoud uit namespace {name}."
detail_biomes = "Biomen ({count}): {value}"
detail_features = "Geplaatste features per type ({count}): {value}"
detail_structures = "Structuren ({count}): {value}"
detail_dimensions = "Dimensietypen: {value}; level stems: {value2}"
refreshing = "Wereldgeneratiecatalogus wordt vastgelegd..."
refreshed = "Wereldgeneratiecatalogus vastgelegd in {duration}: {path}"
refresh_failed = "Vastleggen van de wereldgeneratiecatalogus mislukt: {reason}"
ingest_invalid = "Ongeldige argumenten: {reason}. Gebruik: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "Pack '{pack}' is niet gevonden in {path}."
ingest_started = "Wereldgeneratie van mods wordt overgenomen van '{source}' naar '{target}' (dimensie {dimension})..."
ingest_failed = "Overnemen van mods mislukt: {reason}"
ingest_line = " {summary}"
ingest_complete = "Overnemen van mods voltooid: {path}"
[iris.modded.command]
"properties.none" = "Eigenschappen: (geen)"
"properties.list" = "Eigenschappen: {properties}"
@@ -366,6 +366,9 @@ operator_instruction = "Biegnij {command} z konsoli (lub włączyć cheats w sin
"entry.command.debug" = "Włączenie / wyłączenie Iris debugowanie logowania i zapisywanie iris.json"
"entry.command.reload" = "Wczytaj ponownie iris.json (także automatycznie naświetlane co 3)"
"entry.command.download" = "Pobierz projekt pakietu"
"entry.command.catalog" = "Wyświetl zawartość generowania świata wczytanych modów, pokaż jedną przestrzeń nazw lub zbierz ją ponownie"
"entry.group.ingest" = "Twórz paczki Iris z zawartości generowania świata wczytanych modów"
"entry.command.ingest_mods" = "Skopiuj paczkę źródłową do nowej paczki docelowej i przejmij generowanie świata wczytanych modów"
"entry.command.metrics" = "Wydrukuj wskaźniki generacji dla bieżącego Iris wymiar"
"entry.command.regen" = "Usuń i zregeneruj pobliskie chunki w miejscu"
"entry.group.pregen" = "Przed Iris wymiar"
@@ -460,6 +463,26 @@ operator_instruction = "Biegnij {command} z konsoli (lub włączyć cheats w sin
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "Pokaż zawartość, której nie można wygenerować w tej wersji Minecraft"
[iris.modded.catalog]
missing = "Katalog generowania świata nie został jeszcze zebrany. Uruchom /iris catalog refresh."
header = "Katalog generowania świata ({name} {version}): przestrzenie nazw: {count}, biomy: {value}, umieszczone obiekty: {value2}, struktury: {value3}, typy wymiarów: {value4}, level stemy: {value5}"
namespace = "{name} {version}: biomy: {value}, umieszczone obiekty: {value2} ({detail}), struktury: {value3}, typy wymiarów: {value4}, level stemy: {value5}"
quiet = "Kolejne wczytane mody ({count}) nie mają zawartości generowania świata."
unknown_namespace = "Katalog generowania świata nie zawiera nic z przestrzeni nazw {name}."
detail_biomes = "Biomy ({count}): {value}"
detail_features = "Umieszczone obiekty według typu ({count}): {value}"
detail_structures = "Struktury ({count}): {value}"
detail_dimensions = "Typy wymiarów: {value}; level stemy: {value2}"
refreshing = "Zbieranie katalogu generowania świata..."
refreshed = "Katalog generowania świata zebrany w {duration}: {path}"
refresh_failed = "Nie udało się zebrać katalogu generowania świata: {reason}"
ingest_invalid = "Nieprawidłowe argumenty: {reason}. Użycie: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "Nie znaleziono paczki '{pack}' w {path}."
ingest_started = "Przenoszenie generowania świata modów z '{source}' do '{target}' (wymiar {dimension})..."
ingest_failed = "Przenoszenie modów nie powiodło się: {reason}"
ingest_line = " {summary}"
ingest_complete = "Przenoszenie modów zakończone: {path}"
[iris.modded.command]
"properties.none" = "Właściwości: (brak)"
"properties.list" = "Właściwości: {properties}"
@@ -361,6 +361,9 @@ operator_instruction = "Executar {command} a partir do console (ou habilitar fra
"entry.command.debug" = "Alternar Iris debug registrar e salvar iris.json"
"entry.command.reload" = "Recarregar iris.json (também carregado automaticamente a cada 3s)"
"entry.command.download" = "Baixar um projeto de pacote"
"entry.command.catalog" = "Listar o conteúdo de geração dos mods carregados, mostrar um namespace ou capturá-lo novamente"
"entry.group.ingest" = "Criar packs Iris a partir do conteúdo de geração dos mods carregados"
"entry.command.ingest_mods" = "Copiar um pack de origem para um novo pack de destino e adotar a geração dos mods carregados"
"entry.command.metrics" = "Imprimir métricas de geração para o seu atual Iris dimensão"
"entry.command.regen" = "Apagar e regenerar chunks próximos no lugar"
"entry.group.pregen" = "Pré- Gerar uma Iris dimensão"
@@ -455,6 +458,26 @@ operator_instruction = "Executar {command} a partir do console (ou habilitar fra
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "Mostrar o conteúdo que não pode ser gerado nesta versão do Minecraft"
[iris.modded.catalog]
missing = "Ainda não foi capturado nenhum catálogo de geração de mundo. Executa /iris catalog refresh."
header = "Catálogo de geração ({name} {version}): {count} namespaces, {value} biomas, {value2} features colocadas, {value3} estruturas, {value4} tipos de dimensão, {value5} level stems"
namespace = "{name} {version}: {value} biomas, {value2} features colocadas ({detail}), {value3} estruturas, {value4} tipos de dimensão, {value5} level stems"
quiet = "Mais {count} mods carregados não têm conteúdo de geração de mundo."
unknown_namespace = "O catálogo de geração não tem conteúdo do namespace {name}."
detail_biomes = "Biomas ({count}): {value}"
detail_features = "Features colocadas por tipo ({count}): {value}"
detail_structures = "Estruturas ({count}): {value}"
detail_dimensions = "Tipos de dimensão: {value}; level stems: {value2}"
refreshing = "A capturar o catálogo de geração de mundo..."
refreshed = "Catálogo de geração capturado em {duration}: {path}"
refresh_failed = "Falha ao capturar o catálogo de geração: {reason}"
ingest_invalid = "Argumentos inválidos: {reason}. Utilização: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "O pack '{pack}' não foi encontrado em {path}."
ingest_started = "A importar a geração de mods de '{source}' para '{target}' (dimensão {dimension})..."
ingest_failed = "A importação de mods falhou: {reason}"
ingest_line = " {summary}"
ingest_complete = "Importação de mods concluída: {path}"
[iris.modded.command]
"properties.none" = "Propriedades: (nenhum)"
"properties.list" = "Propriedades: {properties}"
@@ -366,6 +366,9 @@ operator_instruction = "Беги. {command} от консоли (или вклю
"entry.command.debug" = "переключаться Iris Отладка и сохранение iris.json"
"entry.command.reload" = "Перезагрузить iris.json (также автоматически загружается каждые 3 секунды)"
"entry.command.download" = "Скачать пакетный проект"
"entry.command.catalog" = "Показать генерацию мира загруженных модов, одно пространство имён или собрать каталог заново"
"entry.group.ingest" = "Создать паки Iris из генерации мира загруженных модов"
"entry.command.ingest_mods" = "Скопировать исходный пак в новый целевой пак и перенести в него генерацию мира загруженных модов"
"entry.command.metrics" = "Метрики генерации печати для вашего текущего Iris измерение"
"entry.command.regen" = "Удалить и регенерировать близлежащие чанки на месте"
"entry.group.pregen" = "Прегенерировать Iris измерение"
@@ -460,6 +463,26 @@ operator_instruction = "Беги. {command} от консоли (или вклю
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "Показать содержимое, которое нельзя сгенерировать в этой версии Minecraft"
[iris.modded.catalog]
missing = "Каталог генерации мира ещё не собран. Выполните /iris catalog refresh."
header = "Каталог генерации мира ({name} {version}): пространств имён {count}, биомов {value}, размещённых объектов {value2}, структур {value3}, типов измерений {value4}, level stem {value5}"
namespace = "{name} {version}: биомов {value}, размещённых объектов {value2} ({detail}), структур {value3}, типов измерений {value4}, level stem {value5}"
quiet = "Ещё {count} загруженных модов не содержат генерации мира."
unknown_namespace = "В каталоге генерации мира нет содержимого из пространства имён {name}."
detail_biomes = "Биомы ({count}): {value}"
detail_features = "Размещённые объекты по типам ({count}): {value}"
detail_structures = "Структуры ({count}): {value}"
detail_dimensions = "Типы измерений: {value}; level stem: {value2}"
refreshing = "Сбор каталога генерации мира..."
refreshed = "Каталог генерации мира собран за {duration}: {path}"
refresh_failed = "Не удалось собрать каталог генерации мира: {reason}"
ingest_invalid = "Неверные аргументы: {reason}. Использование: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "Пак '{pack}' не найден в {path}."
ingest_started = "Перенос генерации мира модов из '{source}' в '{target}' (измерение {dimension})..."
ingest_failed = "Не удалось перенести моды: {reason}"
ingest_line = " {summary}"
ingest_complete = "Перенос модов завершён: {path}"
[iris.modded.command]
"properties.none" = "Свойства: (нет)"
"properties.list" = "Свойства: {properties}"
@@ -366,6 +366,9 @@ operator_instruction = "{command} komutunu konsoldan çalıştırın (veya tek o
"entry.command.debug" = "değiştir Iris Debug login ve kaydet iris.json"
"entry.command.reload" = "Yeniden yükleme iris.json (Ayrıca her 3s otomatik olarak ısındı)"
"entry.command.download" = "Bir paket projesi indirin"
"entry.command.catalog" = "Yüklü modların dünya oluşturma içeriğini listele, tek bir ad alanını göster veya yeniden topla"
"entry.group.ingest" = "Yüklü modların dünya oluşturma içeriğinden Iris paketleri oluştur"
"entry.command.ingest_mods" = "Bir kaynak paketi yeni bir hedef pakete kopyala ve yüklü modların dünya oluşturmasını uygula"
"entry.command.metrics" = "Mevcut nesil ölçümler için Iris boyut boyutu"
"entry.command.regen" = "Yakınlarda silme ve yenidenjenere"
"entry.group.pregen" = "Pregenerate a an Iris boyut boyutu"
@@ -460,6 +463,26 @@ operator_instruction = "{command} komutunu konsoldan çalıştırın (veya tek o
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "Bu Minecraft sürümünde üretilemeyen içeriği göster"
[iris.modded.catalog]
missing = "Henüz bir dünya oluşturma kataloğu toplanmadı. /iris catalog refresh komutunu çalıştırın."
header = "Dünya oluşturma kataloğu ({name} {version}): {count} ad alanı, {value} biyom, {value2} yerleştirilmiş özellik, {value3} yapı, {value4} boyut türü, {value5} level stem"
namespace = "{name} {version}: {value} biyom, {value2} yerleştirilmiş özellik ({detail}), {value3} yapı, {value4} boyut türü, {value5} level stem"
quiet = "Yüklü {count} mod daha dünya oluşturma içeriğine sahip değil."
unknown_namespace = "Dünya oluşturma kataloğunda {name} ad alanından içerik yok."
detail_biomes = "Biyomlar ({count}): {value}"
detail_features = "Türe göre yerleştirilmiş özellikler ({count}): {value}"
detail_structures = "Yapılar ({count}): {value}"
detail_dimensions = "Boyut türleri: {value}; level stem'ler: {value2}"
refreshing = "Dünya oluşturma kataloğu toplanıyor..."
refreshed = "Dünya oluşturma kataloğu {duration} içinde toplandı: {path}"
refresh_failed = "Dünya oluşturma kataloğu toplanamadı: {reason}"
ingest_invalid = "Geçersiz argümanlar: {reason}. Kullanım: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "'{pack}' paketi {path} altında bulunamadı."
ingest_started = "Mod dünya oluşturması '{source}' paketinden '{target}' paketine aktarılıyor (boyut {dimension})..."
ingest_failed = "Mod aktarımı başarısız oldu: {reason}"
ingest_line = " {summary}"
ingest_complete = "Mod aktarımı tamamlandı: {path}"
[iris.modded.command]
"properties.none" = "Özellikler: (hiçbiri)"
"properties.list" = "Özellikler: {properties}"
@@ -364,6 +364,9 @@ operator_instruction = "Chạy {command} từ bàn giao tiếp (hoặc kích ho
"entry.command.debug" = "Bật/ tắt Iris @ info/ rich iris.json"
"entry.command.reload" = "Nạp lại iris.json (đã nạp quá nóng tự động mỗi 3)"
"entry.command.download" = "Tải về dự án gói"
"entry.command.catalog" = "Liệt kê nội dung tạo thế giới của các mod đã tải, hiển thị một không gian tên hoặc thu thập lại"
"entry.group.ingest" = "Tạo gói Iris từ nội dung tạo thế giới của các mod đã tải"
"entry.command.ingest_mods" = "Sao chép gói nguồn sang gói đích mới và áp dụng phần tạo thế giới của các mod đã tải"
"entry.command.metrics" = "Số đo cỡ ảnh hiện thời Iris Chiều rộng"
"entry.command.regen" = "Xóa và tái tạo các mẫu gần đó"
"entry.group.pregen" = "Tiền tố a Iris Chiều rộng"
@@ -458,6 +461,26 @@ operator_instruction = "Chạy {command} từ bàn giao tiếp (hoặc kích ho
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "Hiển thị nội dung không thể tạo trên phiên bản Minecraft này"
[iris.modded.catalog]
missing = "Chưa thu thập danh mục tạo thế giới nào. Hãy chạy /iris catalog refresh."
header = "Danh mục tạo thế giới ({name} {version}): {count} không gian tên, {value} quần xã, {value2} feature đã đặt, {value3} công trình, {value4} loại chiều, {value5} level stem"
namespace = "{name} {version}: {value} quần xã, {value2} feature đã đặt ({detail}), {value3} công trình, {value4} loại chiều, {value5} level stem"
quiet = "{count} mod đã tải khác không có nội dung tạo thế giới."
unknown_namespace = "Danh mục tạo thế giới không có nội dung từ không gian tên {name}."
detail_biomes = "Quần xã ({count}): {value}"
detail_features = "Feature đã đặt theo loại ({count}): {value}"
detail_structures = "Công trình ({count}): {value}"
detail_dimensions = "Loại chiều: {value}; level stem: {value2}"
refreshing = "Đang thu thập danh mục tạo thế giới..."
refreshed = "Đã thu thập danh mục tạo thế giới trong {duration}: {path}"
refresh_failed = "Thu thập danh mục tạo thế giới thất bại: {reason}"
ingest_invalid = "Đối số không hợp lệ: {reason}. Cách dùng: /iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "Không tìm thấy gói '{pack}' trong {path}."
ingest_started = "Đang đưa phần tạo thế giới của mod từ '{source}' vào '{target}' (chiều {dimension})..."
ingest_failed = "Đưa mod vào thất bại: {reason}"
ingest_line = " {summary}"
ingest_complete = "Đã đưa mod vào xong: {path}"
[iris.modded.command]
"properties.none" = "Thuộc tính: (không có)"
"properties.list" = "Thuộc tính {properties}"
@@ -364,6 +364,9 @@ operator_instruction = "请从控制台执行 {command}(或在单人游戏中
"entry.command.debug" = "切换 Iris 调试日志并保存 iris.json"
"entry.command.reload" = "重新加载 iris.json(也会每 3 秒自动热加载)"
"entry.command.download" = "下载包项目"
"entry.command.catalog" = "列出已加载模组的世界生成内容、显示单个命名空间或重新采集"
"entry.group.ingest" = "根据已加载模组的世界生成内容创建 Iris 包"
"entry.command.ingest_mods" = "将源包复制为新的目标包,并采用已加载模组的世界生成"
"entry.command.metrics" = "显示当前 Iris 维度的生成指标"
"entry.command.regen" = "原地删除并重新生成附近区块"
"entry.group.pregen" = "预生成 Iris 维度"
@@ -458,6 +461,26 @@ operator_instruction = "请从控制台执行 {command}(或在单人游戏中
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "显示在当前 Minecraft 版本中无法生成的内容"
[iris.modded.catalog]
missing = "尚未采集世界生成目录。请运行 /iris catalog refresh。"
header = "世界生成目录({name} {version}):{count} 个命名空间,{value} 个生物群系,{value2} 个已放置地物,{value3} 个结构,{value4} 个维度类型,{value5} 个 level stem"
namespace = "{name} {version}:{value} 个生物群系,{value2} 个已放置地物({detail}),{value3} 个结构,{value4} 个维度类型,{value5} 个 level stem"
quiet = "另有 {count} 个已加载的模组没有世界生成内容。"
unknown_namespace = "世界生成目录中没有来自命名空间 {name} 的内容。"
detail_biomes = "生物群系({count}):{value}"
detail_features = "按类型的已放置地物({count}):{value}"
detail_structures = "结构({count}):{value}"
detail_dimensions = "维度类型:{value};level stem:{value2}"
refreshing = "正在采集世界生成目录..."
refreshed = "世界生成目录已在 {duration} 内采集完成:{path}"
refresh_failed = "采集世界生成目录失败:{reason}"
ingest_invalid = "参数无效:{reason}。用法:/iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "在 {path} 下未找到包 '{pack}'。"
ingest_started = "正在将模组世界生成从 '{source}' 导入 '{target}'(维度 {dimension})..."
ingest_failed = "模组导入失败:{reason}"
ingest_line = " {summary}"
ingest_complete = "模组导入完成:{path}"
[iris.modded.command]
"properties.none" = "属性:(无)"
"properties.list" = "属性 : {properties}"
@@ -364,6 +364,9 @@ operator_instruction = "請從主控台執行 {command}(或在單人遊戲中
"entry.command.debug" = "切換 Iris 偵錯記錄並儲存 iris.json"
"entry.command.reload" = "重新載入 iris.json(也會每 3 秒自動熱載入)"
"entry.command.download" = "下載包專案"
"entry.command.catalog" = "列出已載入模組的世界生成內容、顯示單一命名空間或重新擷取"
"entry.group.ingest" = "根據已載入模組的世界生成內容建立 Iris 包"
"entry.command.ingest_mods" = "將來源包複製為新的目標包,並採用已載入模組的世界生成"
"entry.command.metrics" = "顯示目前 Iris 維度的生成指標"
"entry.command.regen" = "原地刪除並重新生成附近區塊"
"entry.group.pregen" = "預先生成 Iris 維度"
@@ -458,6 +461,26 @@ operator_instruction = "請從主控台執行 {command}(或在單人遊戲中
"entry.command.studio.objects" = "Explain why the Bukkit chunk object report is unavailable"
"entry.command.compat_content" = "顯示在目前 Minecraft 版本中無法生成的內容"
[iris.modded.catalog]
missing = "尚未擷取世界生成目錄。請執行 /iris catalog refresh。"
header = "世界生成目錄({name} {version}):{count} 個命名空間,{value} 個生態域,{value2} 個已放置地物,{value3} 個結構,{value4} 個維度類型,{value5} 個 level stem"
namespace = "{name} {version}:{value} 個生態域,{value2} 個已放置地物({detail}),{value3} 個結構,{value4} 個維度類型,{value5} 個 level stem"
quiet = "另有 {count} 個已載入的模組沒有世界生成內容。"
unknown_namespace = "世界生成目錄中沒有來自命名空間 {name} 的內容。"
detail_biomes = "生態域({count}):{value}"
detail_features = "依類型的已放置地物({count}):{value}"
detail_structures = "結構({count}):{value}"
detail_dimensions = "維度類型:{value};level stem:{value2}"
refreshing = "正在擷取世界生成目錄..."
refreshed = "世界生成目錄已在 {duration} 內擷取完成:{path}"
refresh_failed = "擷取世界生成目錄失敗:{reason}"
ingest_invalid = "參數無效:{reason}。用法:/iris ingest mods <source> <target> [dimension=<key>] [namespaces=<a,b>] [replace=true]"
ingest_pack_missing = "在 {path} 下找不到包 '{pack}'。"
ingest_started = "正在將模組世界生成從 '{source}' 匯入 '{target}'(維度 {dimension})..."
ingest_failed = "模組匯入失敗:{reason}"
ingest_line = " {summary}"
ingest_complete = "模組匯入完成:{path}"
[iris.modded.command]
"properties.none" = "屬性:(無)"
"properties.list" = "屬性 : {properties}"
@@ -0,0 +1,77 @@
/*
* Iris is a World Generator for Minecraft Servers
* Copyright (c) 2026 Arcane Arts (Volmit Software)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package art.arcane.iris.pack.ingest.catalog;
import org.junit.Test;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
public class WorldgenCatalogFingerprintTest {
private static final List<CatalogNamespace> NAMESPACES = List.of(
new CatalogNamespace("minecraft", "Minecraft", "26.3"),
new CatalogNamespace("examplemod", "Example Mod", "1.0.0"));
@Test
public void fingerprintIsLowercaseSha256Hex() {
String fingerprint = WorldgenCatalogFingerprint.of(NAMESPACES, Map.of("biome", List.of("minecraft:plains")));
assertEquals(64, fingerprint.length());
assertTrue(fingerprint.matches("[0-9a-f]{64}"));
}
@Test
public void fingerprintIgnoresNamespaceAndKeyOrder() {
String ordered = WorldgenCatalogFingerprint.of(NAMESPACES, Map.of(
"biome", List.of("examplemod:glade", "minecraft:plains"),
"placed_feature", List.of("examplemod:ore_glimmer", "minecraft:ore_iron")));
String shuffled = WorldgenCatalogFingerprint.of(List.of(NAMESPACES.get(1), NAMESPACES.get(0)), Map.of(
"placed_feature", List.of("minecraft:ore_iron", "examplemod:ore_glimmer"),
"biome", List.of("minecraft:plains", "examplemod:glade")));
assertEquals(ordered, shuffled);
}
@Test
public void fingerprintChangesWithModVersion() {
Map<String, List<String>> keys = Map.of("biome", List.of("examplemod:glade"));
String original = WorldgenCatalogFingerprint.of(NAMESPACES, keys);
String updated = WorldgenCatalogFingerprint.of(List.of(NAMESPACES.get(0),
new CatalogNamespace("examplemod", "Example Mod", "1.0.1")), keys);
assertNotEquals(original, updated);
}
@Test
public void fingerprintChangesWhenAKeyIsAddedOrMovesRegistry() {
String original = WorldgenCatalogFingerprint.of(NAMESPACES, Map.of(
"biome", List.of("examplemod:glade"), "structure", List.of()));
String added = WorldgenCatalogFingerprint.of(NAMESPACES, Map.of(
"biome", List.of("examplemod:glade", "examplemod:marsh"), "structure", List.of()));
String moved = WorldgenCatalogFingerprint.of(NAMESPACES, Map.of(
"biome", List.of(), "structure", List.of("examplemod:glade")));
assertNotEquals(original, added);
assertNotEquals(original, moved);
}
}