Créer un mod
Traduire le nom et la description du mod
Nommer le mod, ses fenêtres et ses signaux dans la langue du jeu, avec des identifiants stables.
Déclarer les textes une seule fois
Prérequis : un mod déclaré avec signalMod ou toolMod et un fichier assets/translations.json. Cette page traduit le nom et la description affichés du mod, puis les noms de construction. Elle complète la traduction des boutons et des messages.
metadata(
author = "Your name",
name = tr("mod.name"),
description = tr("mod.description")
){
"fallback": "fr",
"languages": {
"fr": {
"mod.name": "Mes signaux",
"mod.description": "Des signaux pour mon réseau."
},
"en": {
"mod.name": "My signals",
"mod.description": "Signals for my network."
}
}
}Vous pouvez mélanger du texte direct et tr. author reste la signature de l’auteur. Le nom affiché est facultatif ; son absence reprend le nom du mod.json. Les références acceptent aussi les paramètres nommés de tr, résolus à la compilation. Chaque clé doit exister dans la langue fallback.
Distinguer le mod, le groupe et la fenêtre
Un outil possède plusieurs textes visibles. Choisissez le nom du produit pour le mod et un titre court décrivant la fonction de chaque fenêtre. Par exemple, le groupe BB Timechange contient une ligne Date et heure ; répéter BB Timechange dans cette ligne n’ajoute aucune information.
| Texte affiché | Déclaration à utiliser |
|---|---|
| Nom dans les listes et fiches de mods du jeu | metadata(name = tr("mod.name"), ...) |
| Groupe dans Options → NRF Hub | title de toolMod ou signalMod. Avec toolMod(modInfo), modInfo.title reprend name dans mod.json. |
| Titre de fenêtre et ligne dans Raccourcis | window("clock", tr("window.clock"), ...) |
metadata.name ne remplace pas le titre du groupe. Dans cet exemple, le projet fournit name: "BB Timechange" dans mod.json ; le catalogue donne le même nom à la fiche du mod et traduit séparément le titre de sa fenêtre.
fun createMod() = toolMod(modInfo) {
metadata(
author = "Your name",
name = tr("mod.name"),
description = tr("mod.description")
)
window("clock", tr("window.clock"), shortcut = "F9") { event ->
showWindow(event, clock().dateTime().toString(), emptyList())
}
}{
"fallback": "en",
"languages": {
"fr": {
"mod.name": "BB Timechange",
"mod.description": "Consulter la date et l’heure du jeu.",
"window.clock": "Date et heure"
},
"en": {
"mod.name": "BB Timechange",
"mod.description": "View the game date and time.",
"window.clock": "Date and time"
}
}
}Les clés mod.name et window.clock sont libres : vous pouvez les nommer autrement en adaptant les appels tr correspondants. C’est l’emplacement de l’appel Kotlin qui détermine où le texte apparaît. En revanche, "clock" est l’identifiant de fenêtre : gardez-le stable, sans tr, pour conserver le raccourci du joueur.
F9 est seulement le raccourci par défaut de cet exemple. Le joueur peut le modifier ou le désactiver dans Options → NRF Hub, rubrique Raccourcis. Une préférence compatible déjà enregistrée est conservée, même si vous changez le titre traduit ou la valeur par défaut dans une mise à jour.
Où les traductions apparaissent
| Emplacement | Comportement |
|---|---|
| mod.txt | Nom et description dans la langue de repli. Ces textes générés restent lisibles lorsque la localisation du SDK est indisponible. |
| nrf-metadata.json | Textes résolus pour chaque langue, générés à côté de mod.txt. Aucun second fichier à maintenir manuellement. |
| Liste des mods d’une nouvelle partie | Le nom et la fiche suivent la langue active du jeu : langue exacte, langue principale, puis fallback. |
| Gestionnaire de mods pendant une partie | Le nom de liste, le titre et la description de la fiche sont adaptés au moment de leur affichage. Les métadonnées enregistrées dans la sauvegarde restent intactes. |
| Construction et contenu du mod | construction(name = tr(...), catalogueName = tr(...)) génère les noms traduits des signaux et catalogues de textures. Le détail des ressources du gestionnaire utilise aussi ces textes. |
| Hub et publication Steam | Ils conservent les métadonnées de leur propre manifeste. Cette fonctionnalité ne traduit pas la page Steam ni l’interface du Hub. |
Une description peut contenir des retours à la ligne ; le nom reste sur une seule ligne. Chaque catalogue appartient à son mod : deux paquets peuvent employer les mêmes clés sans partager leurs textes. Vérifiez les noms longs et les descriptions dans les deux langues.
Traduire chaque modèle de signal
construction(
states = listOf("imgs/closed.png", "imgs/open.png"),
name = tr("signal.construction"),
catalogueName = tr("signal.catalogue")
){
"fallback": "fr",
"languages": {
"fr": {
"signal.construction": "Mon signal",
"signal.catalogue": "Mes feux"
},
"en": {
"signal.construction": "My signal",
"signal.catalogue": "My lights"
}
}
}name apparaît dans le menu de construction ; catalogueName nomme le jeu de textures. Omettez catalogueName pour reprendre name. Une chaîne directe reste possible. Avec tr, laissez nameKey et catalogueNameKey absents : la génération relie les textes au bon mod et au bon modèle.
Le nom de catalogue de repli est en anglais lorsque cette traduction existe, sinon dans la langue fallback. Reconstruisez le paquet après une modification du JSON et vérifiez les deux langues dans le jeu. Une traduction change le texte affiché, jamais les identifiants, les chemins ou l’ordre des textures.