NRF SDK 0.9

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.

Dans signalMod ou toolMod
metadata(
    author = "Your name",
    name = tr("mod.name"),
    description = tr("mod.description")
)
assets/translations.json
{
  "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 jeumetadata(name = tr("mod.name"), ...)
Groupe dans Options → NRF Hubtitle de toolMod ou signalMod. Avec toolMod(modInfo), modInfo.title reprend name dans mod.json.
Titre de fenêtre et ligne dans Raccourciswindow("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.

Dans nimby.mod, avec import nimby.*
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())
    }
}
assets/translations.json
{
  "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

EmplacementComportement
mod.txtNom et description dans la langue de repli. Ces textes générés restent lisibles lorsque la localisation du SDK est indisponible.
nrf-metadata.jsonTextes 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 partieLe nom et la fiche suivent la langue active du jeu : langue exacte, langue principale, puis fallback.
Gestionnaire de mods pendant une partieLe 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 modconstruction(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 SteamIls 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

Dans la déclaration de votre signalModel
construction(
    states = listOf("imgs/closed.png", "imgs/open.png"),
    name = tr("signal.construction"),
    catalogueName = tr("signal.catalogue")
)
Clés à ajouter au même assets/translations.json
{
  "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.