fix(i18n): localisation des notifications et messages d'erreur du système

This commit is contained in:
2026-08-04 09:14:29 +02:00
parent de1fa8ba72
commit 6719deb8fc
11 changed files with 102 additions and 25 deletions
+19
View File
@@ -379,6 +379,23 @@
"BOL.notification.MacroMultipleTokensSelected": "Du hast mehrere Token ausgewählt", "BOL.notification.MacroMultipleTokensSelected": "Du hast mehrere Token ausgewählt",
"BOL.notification.MacroNoActorAvailable": "Es konnte kein Akteur gefunden werden", "BOL.notification.MacroNoActorAvailable": "Es konnte kein Akteur gefunden werden",
"BOL.notification.MacroNoTokenSelected": "Du musst einen Token auswählen", "BOL.notification.MacroNoTokenSelected": "Du musst einen Token auswählen",
"BOL.notification.MacroNoItemFound": "{actor} : kein(e) {type} gefunden.",
"BOL.notification.MacroSpecifyNameOrIndex": "Geben Sie einen Namen oder einen Index an : {names}",
"BOL.notification.MacroBadIndex": "{actor} : Index {index} für {type} ungültig.",
"BOL.notification.MacroItemNotFound": "{actor} : {type} \"{name}\" nicht gefunden.",
"BOL.notification.MacroUnknownAttribute": "Unbekanntes Attribut : \"{key}\". Werte : vigor, agility, mind, appeal",
"BOL.notification.MacroUnknownAptitude": "Unbekannte Fertigkeit : \"{key}\". Werte : init, melee, ranged, def",
"BOL.notification.MacroUnknownRollType": "Unbekannter Wurftyp : \"{type}\". Gültige Typen : attribute, aptitude, weapon, spell, alchemy, horoscope",
"BOL.notification.MacroNoPower": "Nicht genug Kraftpunkte !",
"BOL.notification.FullDefense": "{actor} ist in voller Verteidigung ! Er kann in dieser Runde nicht angreifen.",
"BOL.notification.WeaponNotFound": "Waffe nicht gefunden !",
"BOL.notification.AlchemyNotFound": "Alchemie nicht gefunden !",
"BOL.notification.SpellNotFound": "Diesen Zauber nicht gefunden !",
"BOL.notification.NotEnoughCreationPrep": "Nicht genug Schöpfungspunkte in die Vorbereitung investiert !",
"BOL.notification.NoPower": "Nicht genug Kraftpunkte !",
"BOL.notification.AttackNotFound": "Der entsprechende Angriff wurde nicht gefunden, Fehler bei der Kampfverfolgung.",
"BOL.notification.NoBirthHour": "{actor} hat keine Geburtsstunde, oder sie ist falsch : {hour}",
"BOL.notification.BadBirthHour": "{hour} entspricht keiner Geburtsstunde",
"BOL.size.tiny": "Winzig", "BOL.size.tiny": "Winzig",
"BOL.size.verysmall": "Sehr klein", "BOL.size.verysmall": "Sehr klein",
@@ -469,6 +486,8 @@
"BOL.chat.welcome4": "Im Discord findet ihr Support für die FoundryVTT-Implementierung dieses Systems: https://discord.gg/pPSDNJk", "BOL.chat.welcome4": "Im Discord findet ihr Support für die FoundryVTT-Implementierung dieses Systems: https://discord.gg/pPSDNJk",
"BOL.chat.welcome5": "Auf ein gutes Spiel in Lemuria!", "BOL.chat.welcome5": "Auf ein gutes Spiel in Lemuria!",
"BOL.chat.welcome6": "", "BOL.chat.welcome6": "",
"BOL.chat.msgonlygm": "Nachricht nur für den GM",
"BOL.chat.babelewarning": "⚠ WARNUNG ! Englisch ist ausgewählt, aber das Babele-Modul ist nicht installiert !<br>Bitte installieren Sie babele über den Modul-Reiter in der Foundry-Oberfläche.",
"BOL.chat.bolRulebookMessage": "Don't miss the premium Rulebook module (including Sagas), available on the Foundry website : <a href='https://foundryvtt.com/packages/bol-rulebook' target='_blank'>https://foundryvtt.com/packages/bol-rulebook</a>", "BOL.chat.bolRulebookMessage": "Don't miss the premium Rulebook module (including Sagas), available on the Foundry website : <a href='https://foundryvtt.com/packages/bol-rulebook' target='_blank'>https://foundryvtt.com/packages/bol-rulebook</a>",
"BOL.chat.bolChroniclesMessage": "Discover the premium Chronicles of Lemuria module (vol. 1), available on the Foundry website : <a href='https://foundryvtt.com/packages/bol-chronicles-1' target='_blank'>https://foundryvtt.com/packages/bol-chronicles-1</a>", "BOL.chat.bolChroniclesMessage": "Discover the premium Chronicles of Lemuria module (vol. 1), available on the Foundry website : <a href='https://foundryvtt.com/packages/bol-chronicles-1' target='_blank'>https://foundryvtt.com/packages/bol-chronicles-1</a>",
+19
View File
@@ -445,6 +445,23 @@
"BOL.notification.MacroMultipleTokensSelected": "You have selected several tokens!", "BOL.notification.MacroMultipleTokensSelected": "You have selected several tokens!",
"BOL.notification.MacroNoActorAvailable": "No actor could be targeted!", "BOL.notification.MacroNoActorAvailable": "No actor could be targeted!",
"BOL.notification.MacroNoTokenSelected": "You must select a token!", "BOL.notification.MacroNoTokenSelected": "You must select a token!",
"BOL.notification.MacroNoItemFound": "{actor} : no {type} found.",
"BOL.notification.MacroSpecifyNameOrIndex": "Specify a name or an index : {names}",
"BOL.notification.MacroBadIndex": "{actor} : index {index} invalid for {type}.",
"BOL.notification.MacroItemNotFound": "{actor} : {type} \"{name}\" not found.",
"BOL.notification.MacroUnknownAttribute": "Unknown attribute : \"{key}\". Values : vigor, agility, mind, appeal",
"BOL.notification.MacroUnknownAptitude": "Unknown aptitude : \"{key}\". Values : init, melee, ranged, def",
"BOL.notification.MacroUnknownRollType": "Unknown roll type : \"{type}\". Valid types : attribute, aptitude, weapon, spell, alchemy, horoscope",
"BOL.notification.MacroNoPower": "Not enough Power points !",
"BOL.notification.FullDefense": "{actor} is in Full Defense ! He cannot attack this round.",
"BOL.notification.WeaponNotFound": "Unable to find weapon !",
"BOL.notification.AlchemyNotFound": "Unable to find Alchemy !",
"BOL.notification.SpellNotFound": "Unable to find this spell !",
"BOL.notification.NotEnoughCreationPrep": "Not enough Creation Points invested in the Preparation !",
"BOL.notification.NoPower": "Not enough Power points !",
"BOL.notification.AttackNotFound": "Unable to find the corresponding attack, combat tracking error.",
"BOL.notification.NoBirthHour": "{actor} has no birth hour, or it is incorrect : {hour}",
"BOL.notification.BadBirthHour": "{hour} does not correspond to a birth hour",
"BOL.size.tiny": "Tiny", "BOL.size.tiny": "Tiny",
"BOL.size.verysmall": "Very Small", "BOL.size.verysmall": "Very Small",
@@ -594,6 +611,8 @@
"BOL.chat.welcome4": "All support for this system is available on this Discord server : https://discord.gg/pPSDNJk", "BOL.chat.welcome4": "All support for this system is available on this Discord server : https://discord.gg/pPSDNJk",
"BOL.chat.welcome5": "<strong>In order to see compendiums in English, you must install and enable the Babele module.</strong>", "BOL.chat.welcome5": "<strong>In order to see compendiums in English, you must install and enable the Babele module.</strong>",
"BOL.chat.welcome6": "Good game in Lemuria !", "BOL.chat.welcome6": "Good game in Lemuria !",
"BOL.chat.msgonlygm": "Message only to the GM",
"BOL.chat.babelewarning": "⚠ WARNING ! English language selected, but Babele module is not installed !<br>Please install babele from the module tab in Foundry interface.",
"BOL.settings.rollArmor": "Roll for armor", "BOL.settings.rollArmor": "Roll for armor",
"BOL.settings.rollArmorTooltip": "Roll for armor value, fixed value if unchecked", "BOL.settings.rollArmorTooltip": "Roll for armor value, fixed value if unchecked",
+19
View File
@@ -439,6 +439,23 @@
"BOL.notification.MacroMultipleTokensSelected": "¡Has seleccionado varios tokens!", "BOL.notification.MacroMultipleTokensSelected": "¡Has seleccionado varios tokens!",
"BOL.notification.MacroNoActorAvailable": "¡No se pudo marcar el actor como objetivo!", "BOL.notification.MacroNoActorAvailable": "¡No se pudo marcar el actor como objetivo!",
"BOL.notification.MacroNoTokenSelected": "¡Debes seleccionar un token!", "BOL.notification.MacroNoTokenSelected": "¡Debes seleccionar un token!",
"BOL.notification.MacroNoItemFound": "{actor} : no se encontró ningún {type}.",
"BOL.notification.MacroSpecifyNameOrIndex": "Especifica un nombre o un índice : {names}",
"BOL.notification.MacroBadIndex": "{actor} : índice {index} no válido para {type}.",
"BOL.notification.MacroItemNotFound": "{actor} : {type} \"{name}\" no encontrado.",
"BOL.notification.MacroUnknownAttribute": "Atributo desconocido : \"{key}\". Valores : vigor, agility, mind, appeal",
"BOL.notification.MacroUnknownAptitude": "Aptitud desconocida : \"{key}\". Valores : init, melee, ranged, def",
"BOL.notification.MacroUnknownRollType": "Tipo de tirada desconocido : \"{type}\". Tipos válidos : attribute, aptitude, weapon, spell, alchemy, horoscope",
"BOL.notification.MacroNoPower": "¡No quedan suficientes puntos de Poder!",
"BOL.notification.FullDefense": "{actor} está en Defensa Total ! ¡No puede atacar este asalto!",
"BOL.notification.WeaponNotFound": "¡No se pudo encontrar el arma!",
"BOL.notification.AlchemyNotFound": "¡No se pudo encontrar la alquimia!",
"BOL.notification.SpellNotFound": "¡No se pudo encontrar este hechizo!",
"BOL.notification.NotEnoughCreationPrep": "¡No hay suficientes puntos de Creación invertidos en la Preparación!",
"BOL.notification.NoPower": "¡No quedan suficientes puntos de Poder!",
"BOL.notification.AttackNotFound": "No se pudo encontrar el ataque correspondiente, error de seguimiento de combate.",
"BOL.notification.NoBirthHour": "{actor} no tiene hora de nacimiento, o es incorrecta : {hour}",
"BOL.notification.BadBirthHour": "{hour} no corresponde a una hora de nacimiento",
"BOL.size.tiny": "Minúsculo", "BOL.size.tiny": "Minúsculo",
"BOL.size.verysmall": "Muy pequeño", "BOL.size.verysmall": "Muy pequeño",
@@ -578,6 +595,8 @@
"BOL.chat.welcome4": "Todo el soporte para el sistema es a través del servidor Discord: https://discord.gg/pPSDNJk", "BOL.chat.welcome4": "Todo el soporte para el sistema es a través del servidor Discord: https://discord.gg/pPSDNJk",
"BOL.chat.welcome5": "¡Buena partida en Lemuria!", "BOL.chat.welcome5": "¡Buena partida en Lemuria!",
"BOL.chat.welcome6": "", "BOL.chat.welcome6": "",
"BOL.chat.msgonlygm": "Mensaje solo para el GM",
"BOL.chat.babelewarning": "⚠ ¡ADVERTENCIA! ¡El idioma inglés está seleccionado, pero el módulo Babele no está instalado!<br>Instale babele desde la pestaña de módulos en la interfaz de Foundry.",
"BOL.settings.rollArmor": "Tiradas de armadura", "BOL.settings.rollArmor": "Tiradas de armadura",
"BOL.settings.rollArmorTooltip": "Tiradas de armadura, si no esta activo usará el valor fijo", "BOL.settings.rollArmorTooltip": "Tiradas de armadura, si no esta activo usará el valor fijo",
+19
View File
@@ -473,6 +473,23 @@
"BOL.notification.MacroMultipleTokensSelected": "Vous avez sélectionné plusieurs tokens", "BOL.notification.MacroMultipleTokensSelected": "Vous avez sélectionné plusieurs tokens",
"BOL.notification.MacroNoActorAvailable": "Aucun acteur n'a pu être ciblé", "BOL.notification.MacroNoActorAvailable": "Aucun acteur n'a pu être ciblé",
"BOL.notification.MacroNoTokenSelected": "Vous devez sélectionner un token", "BOL.notification.MacroNoTokenSelected": "Vous devez sélectionner un token",
"BOL.notification.MacroNoItemFound": "{actor} : aucun(e) {type} trouvé(e).",
"BOL.notification.MacroSpecifyNameOrIndex": "Précisez le nom ou l'index : {names}",
"BOL.notification.MacroBadIndex": "{actor} : index {index} invalide pour {type}.",
"BOL.notification.MacroItemNotFound": "{actor} : {type} \"{name}\" introuvable.",
"BOL.notification.MacroUnknownAttribute": "Attribut inconnu : \"{key}\". Valeurs : vigor, agility, mind, appeal",
"BOL.notification.MacroUnknownAptitude": "Aptitude inconnue : \"{key}\". Valeurs : init, melee, ranged, def",
"BOL.notification.MacroUnknownRollType": "Type de jet inconnu : \"{type}\". Types valides : attribute, aptitude, weapon, spell, alchemy, horoscope",
"BOL.notification.MacroNoPower": "Plus assez de points de Pouvoir !",
"BOL.notification.FullDefense": "{actor} est en Défense Totale ! Il ne peut pas attaquer ce round.",
"BOL.notification.WeaponNotFound": "Impossible de trouver l'arme !",
"BOL.notification.AlchemyNotFound": "Impossible de trouver l'alchimie !",
"BOL.notification.SpellNotFound": "Impossible de trouver ce sort !",
"BOL.notification.NotEnoughCreationPrep": "Pas assez de Points de Création investis dans la Préparation !",
"BOL.notification.NoPower": "Plus assez de points de Pouvoir !",
"BOL.notification.AttackNotFound": "Impossible de trouver l'attaque correspondante, erreur de suivi de combat.",
"BOL.notification.NoBirthHour": "{actor} n'a pas d'heure de naissance, ou elle est incorrecte : {hour}",
"BOL.notification.BadBirthHour": "{hour} ne correspond pas à une heure de naissance",
"BOL.size.tiny": "Minuscule", "BOL.size.tiny": "Minuscule",
"BOL.size.verysmall": "Très petite", "BOL.size.verysmall": "Très petite",
@@ -632,6 +649,8 @@
"BOL.chat.pcwarningmsg": "<b>ATTENTION</b> Le joueur n'est relié à aucun personnage !", "BOL.chat.pcwarningmsg": "<b>ATTENTION</b> Le joueur n'est relié à aucun personnage !",
"BOL.chat.pcnotlinked": "Le token du personnage joueur n'est pas relié à l'acteur", "BOL.chat.pcnotlinked": "Le token du personnage joueur n'est pas relié à l'acteur",
"BOL.chat.pcnotlinkedmsg": "<b>ATTENTION</b> Le token du personnage joueur n'est pas relié à l'acteur !", "BOL.chat.pcnotlinkedmsg": "<b>ATTENTION</b> Le token du personnage joueur n'est pas relié à l'acteur !",
"BOL.chat.msgonlygm": "Message réservé au MJ uniquement",
"BOL.chat.babelewarning": "⚠ ATTENTION ! La langue anglaise est sélectionnée, mais le module Babele n'est pas installé !<br>Veuillez installer babele depuis l'onglet des modules dans l'interface de Foundry.",
"BOL.settings.rollArmor": "Effectuer des jets pour les armures", "BOL.settings.rollArmor": "Effectuer des jets pour les armures",
"BOL.settings.rollArmorTooltip": "Effectue un jet de dés pour les armures (valeur fixe si désactivé)", "BOL.settings.rollArmorTooltip": "Effectue un jet de dés pour les armures (valeur fixe si désactivé)",
+2 -2
View File
@@ -84,8 +84,8 @@ export class BoLHordeSheet extends foundry.appv1.sheets.ActorSheet {
// Delete Inventory Item // Delete Inventory Item
html.find('.item-delete').click(ev => { html.find('.item-delete').click(ev => {
Dialog.confirm({ Dialog.confirm({
title: "Suppression", title: game.i18n.localize("BOL.ui.deletetitle"),
content: `Vous êtes sûr de vouloir supprimer cet item ?`, content: game.i18n.localize("BOL.ui.confirmdelete"),
yes: () => { yes: () => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item");
this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")]) this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")])
+2 -2
View File
@@ -94,8 +94,8 @@ export class BoLVehicleSheet extends foundry.appv1.sheets.ActorSheet {
// Delete Inventory Item // Delete Inventory Item
html.find('.item-delete').click(ev => { html.find('.item-delete').click(ev => {
Dialog.confirm({ Dialog.confirm({
title: "Suppression", title: game.i18n.localize("BOL.ui.deletetitle"),
content: `Vous êtes sûr de vouloir supprimer cet item ?`, content: game.i18n.localize("BOL.ui.confirmdelete"),
yes: () => { yes: () => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item");
this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")]) this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")])
+3 -2
View File
@@ -121,12 +121,13 @@ async function welcomeMessage() {
ChatMessage.create({ user: game.user.id, whisper: [game.user.id], content }) ChatMessage.create({ user: game.user.id, whisper: [game.user.id], content })
if (game.user.isGM && game.i18n.lang == 'en' && !game.modules.get("babele")?.active) { if (game.user.isGM && game.i18n.lang == 'en' && !game.modules.get("babele")?.active) {
const babeleWarning = game.i18n.localize("BOL.chat.babelewarning")
ChatMessage.create({ ChatMessage.create({
user: game.user.id, user: game.user.id,
whisper: [game.user.id], whisper: [game.user.id],
content: `<div class="bol-welcome-card"><div class="welcome-body"><p class="welcome-warning">⚠ WARNING ! English language selected, but Babele module is not installed !<br>Please install babele from the module tab in Foundry interface.</p></div></div>` content: `<div class="bol-welcome-card"><div class="welcome-body"><p class="welcome-warning">${babeleWarning}</p></div></div>`
}) })
ui.notifications.warn("WARNING ! English language selected, but babele module is not installed !<br>Please install babele from the module tab in Foundry interface.") ui.notifications.warn(babeleWarning)
} }
} }
+7 -7
View File
@@ -154,7 +154,7 @@ export class BoLRoll {
// Manage specific case // Manage specific case
let fightOption = actor.getActiveFightOption() let fightOption = actor.getActiveFightOption()
if (fightOption && fightOption.system.properties.fightoptiontype == "fulldefense") { if (fightOption && fightOption.system.properties.fightoptiontype == "fulldefense") {
ui.notifications.warn(`{{actor.name}} est en Défense Totale ! Il ne peut pas attaquer ce round.`) ui.notifications.warn(game.i18n.format("BOL.notification.FullDefense", { actor: actor.name }))
return return
} }
@@ -175,7 +175,7 @@ export class BoLRoll {
const li = $(event.currentTarget).parents(".item") const li = $(event.currentTarget).parents(".item")
let weapon = actor.items.get(li.data("item-id")) let weapon = actor.items.get(li.data("item-id"))
if (!weapon) { if (!weapon) {
ui.notifications.warn("Unable to find weapon !") ui.notifications.warn(game.i18n.localize("BOL.notification.WeaponNotFound"))
return return
} }
weapon = foundry.utils.duplicate(weapon) weapon = foundry.utils.duplicate(weapon)
@@ -187,7 +187,7 @@ export class BoLRoll {
const li = $(event.currentTarget).parents(".item"); const li = $(event.currentTarget).parents(".item");
let alchemy = actor.items.get(li.data("item-id")); let alchemy = actor.items.get(li.data("item-id"));
if (!alchemy) { if (!alchemy) {
ui.notifications.warn("Unable to find Alchemy !"); ui.notifications.warn(game.i18n.localize("BOL.notification.AlchemyNotFound"));
return; return;
} }
alchemy = foundry.utils.duplicate(alchemy) alchemy = foundry.utils.duplicate(alchemy)
@@ -198,7 +198,7 @@ export class BoLRoll {
static alchemyCheckWithItem(actor, alchemy) { static alchemyCheckWithItem(actor, alchemy) {
let alchemyData = alchemy.system let alchemyData = alchemy.system
if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) { if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) {
ui.notifications.warn("Pas assez de Points de Création investis dans la Préparation !") ui.notifications.warn(game.i18n.localize("BOL.notification.NotEnoughCreationPrep"))
return return
} }
@@ -260,13 +260,13 @@ export class BoLRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
static spellCheck(actor, event) { static spellCheck(actor, event) {
if (actor.system.resources.power.value <= 0) { if (actor.system.resources.power.value <= 0) {
ui.notifications.warn("Plus assez de points de Pouvoir !") ui.notifications.warn(game.i18n.localize("BOL.notification.NoPower"))
return return
} }
const li = $(event.currentTarget).parents(".item") const li = $(event.currentTarget).parents(".item")
let spell = actor.items.get(li.data("item-id")) let spell = actor.items.get(li.data("item-id"))
if (!spell) { if (!spell) {
ui.notifications.warn("Impossible de trouver ce sort !") ui.notifications.warn(game.i18n.localize("BOL.notification.SpellNotFound"))
return return
} }
spell = foundry.utils.duplicate(spell) spell = foundry.utils.duplicate(spell)
@@ -583,7 +583,7 @@ export class BoLRoll {
callback: (event, button, dialog) => { callback: (event, button, dialog) => {
console.log("Submit Roll!!!!"); console.log("Submit Roll!!!!");
if (rollData.mode == 'spell' && rollData.ppCurrent < rollData.ppCost) { if (rollData.mode == 'spell' && rollData.ppCurrent < rollData.ppCost) {
ui.notifications.warn("Pas assez de Points de Pouvoir !") ui.notifications.warn(game.i18n.localize("BOL.notification.NoPower"))
return false return false
} }
rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ?
+2 -2
View File
@@ -246,10 +246,10 @@ export class BoLCalendar extends Application {
} }
} }
else if (name) { else if (name) {
ui.notifications.warn(name + " n'a pas d'heure de naissance, ou elle est incorrecte : " + heureNaissance); ui.notifications.warn(game.i18n.format("BOL.notification.NoBirthHour", { actor: name, hour: heureNaissance }));
} }
else { else {
ui.notifications.warn(heureNaissance + " ne correspond pas à une heure de naissance"); ui.notifications.warn(game.i18n.format("BOL.notification.BadBirthHour", { hour: heureNaissance }));
} }
return 0; return 0;
} }
+2 -2
View File
@@ -445,7 +445,7 @@ export class BoLUtility {
event.preventDefault() event.preventDefault()
let attr = event.currentTarget.attributes['data-attack-id'] let attr = event.currentTarget.attributes['data-attack-id']
if (!attr) { if (!attr) {
ui.notifications.warn("Impossible de trouver l'attaque correspondante, erreur de suivi de combat.") ui.notifications.warn(game.i18n.localize("BOL.notification.AttackNotFound"))
return return
} }
let attackId = event.currentTarget.attributes['data-attack-id'].value let attackId = event.currentTarget.attributes['data-attack-id'].value
@@ -583,7 +583,7 @@ export class BoLUtility {
this.blindMessageToGM(chatOptions); this.blindMessageToGM(chatOptions);
chatOptions.whisper = [game.user.id]; chatOptions.whisper = [game.user.id];
chatOptions.content = "Message only to the GM"; chatOptions.content = game.i18n.localize("BOL.chat.msgonlygm");
} }
else { else {
chatOptions.whisper = this.getUsers(user => user.isGM); chatOptions.whisper = this.getUsers(user => user.isGM);
+8 -8
View File
@@ -82,19 +82,19 @@ export class Macros {
static _findItem(actor, type, nameOrIndex) { static _findItem(actor, type, nameOrIndex) {
const items = actor.items.filter(i => i.type === type) const items = actor.items.filter(i => i.type === type)
if (items.length === 0) { if (items.length === 0) {
ui.notifications.warn(`${actor.name} : aucun(e) ${type} trouvé(e).`) ui.notifications.warn(game.i18n.format("BOL.notification.MacroNoItemFound", { actor: actor.name, type }))
return undefined return undefined
} }
if (nameOrIndex === undefined || nameOrIndex === null) { if (nameOrIndex === undefined || nameOrIndex === null) {
if (items.length === 1) return foundry.utils.duplicate(items[0]) if (items.length === 1) return foundry.utils.duplicate(items[0])
const names = items.map((it, i) => `[${i}] ${it.name}`).join(', ') const names = items.map((it, i) => `[${i}] ${it.name}`).join(', ')
ui.notifications.warn(`Précisez le nom ou l'index : ${names}`) ui.notifications.warn(game.i18n.format("BOL.notification.MacroSpecifyNameOrIndex", { names }))
return undefined return undefined
} }
if (typeof nameOrIndex === "number") { if (typeof nameOrIndex === "number") {
const item = items[nameOrIndex] const item = items[nameOrIndex]
if (!item) { if (!item) {
ui.notifications.warn(`${actor.name} : index ${nameOrIndex} invalide pour ${type}.`) ui.notifications.warn(game.i18n.format("BOL.notification.MacroBadIndex", { actor: actor.name, index: nameOrIndex, type }))
return undefined return undefined
} }
return foundry.utils.duplicate(item) return foundry.utils.duplicate(item)
@@ -102,7 +102,7 @@ export class Macros {
const lower = String(nameOrIndex).toLowerCase() const lower = String(nameOrIndex).toLowerCase()
const found = items.find(i => i.name.toLowerCase().includes(lower)) const found = items.find(i => i.name.toLowerCase().includes(lower))
if (!found) { if (!found) {
ui.notifications.warn(`${actor.name} : ${type} "${nameOrIndex}" introuvable.`) ui.notifications.warn(game.i18n.format("BOL.notification.MacroItemNotFound", { actor: actor.name, type, name: nameOrIndex }))
return undefined return undefined
} }
return foundry.utils.duplicate(found) return foundry.utils.duplicate(found)
@@ -118,7 +118,7 @@ export class Macros {
actor = actor ?? this.getSpeakersActor() actor = actor ?? this.getSpeakersActor()
if (!actor) return if (!actor) return
if (!actor.system.attributes[key]) { if (!actor.system.attributes[key]) {
ui.notifications.warn(`Attribut inconnu : "${key}". Valeurs : vigor, agility, mind, appeal`) ui.notifications.warn(game.i18n.format("BOL.notification.MacroUnknownAttribute", { key }))
return return
} }
return BoLRoll.attributeCheck(actor, key) return BoLRoll.attributeCheck(actor, key)
@@ -134,7 +134,7 @@ export class Macros {
actor = actor ?? this.getSpeakersActor() actor = actor ?? this.getSpeakersActor()
if (!actor) return if (!actor) return
if (!actor.system.aptitudes[key]) { if (!actor.system.aptitudes[key]) {
ui.notifications.warn(`Aptitude inconnue : "${key}". Valeurs : init, melee, ranged, def`) ui.notifications.warn(game.i18n.format("BOL.notification.MacroUnknownAptitude", { key }))
return return
} }
return BoLRoll.aptitudeCheck(actor, key) return BoLRoll.aptitudeCheck(actor, key)
@@ -164,7 +164,7 @@ export class Macros {
actor = actor ?? this.getSpeakersActor() actor = actor ?? this.getSpeakersActor()
if (!actor) return if (!actor) return
if ((actor.system.resources.power?.value ?? 1) <= 0) { if ((actor.system.resources.power?.value ?? 1) <= 0) {
ui.notifications.warn("Plus assez de points de Pouvoir !") ui.notifications.warn(game.i18n.localize("BOL.notification.MacroNoPower"))
return return
} }
const spell = this._findItem(actor, "spell", nameOrIndex) const spell = this._findItem(actor, "spell", nameOrIndex)
@@ -214,7 +214,7 @@ export class Macros {
case "alchemy": return this.rollAlchemy(key, actor) case "alchemy": return this.rollAlchemy(key, actor)
case "horoscope": return this.rollHoroscope(key ?? "minor", actor) case "horoscope": return this.rollHoroscope(key ?? "minor", actor)
default: default:
ui.notifications.warn(`Type de jet inconnu : "${type}". Types valides : attribute, aptitude, weapon, spell, alchemy, horoscope`) ui.notifications.warn(game.i18n.format("BOL.notification.MacroUnknownRollType", { type }))
} }
} }