diff --git a/lang/de.json b/lang/de.json index d9e879e..ba113c8 100644 --- a/lang/de.json +++ b/lang/de.json @@ -379,6 +379,23 @@ "BOL.notification.MacroMultipleTokensSelected": "Du hast mehrere Token ausgewählt", "BOL.notification.MacroNoActorAvailable": "Es konnte kein Akteur gefunden werden", "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.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.welcome5": "Auf ein gutes Spiel in Lemuria!", "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 !
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 : https://foundryvtt.com/packages/bol-rulebook", "BOL.chat.bolChroniclesMessage": "Discover the premium Chronicles of Lemuria module (vol. 1), available on the Foundry website : https://foundryvtt.com/packages/bol-chronicles-1", diff --git a/lang/en.json b/lang/en.json index 5c6cde3..bf1050d 100644 --- a/lang/en.json +++ b/lang/en.json @@ -445,6 +445,23 @@ "BOL.notification.MacroMultipleTokensSelected": "You have selected several tokens!", "BOL.notification.MacroNoActorAvailable": "No actor could be targeted!", "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.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.welcome5": "In order to see compendiums in English, you must install and enable the Babele module.", "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 !
Please install babele from the module tab in Foundry interface.", "BOL.settings.rollArmor": "Roll for armor", "BOL.settings.rollArmorTooltip": "Roll for armor value, fixed value if unchecked", diff --git a/lang/es.json b/lang/es.json index 43e846b..230de21 100644 --- a/lang/es.json +++ b/lang/es.json @@ -439,6 +439,23 @@ "BOL.notification.MacroMultipleTokensSelected": "¡Has seleccionado varios tokens!", "BOL.notification.MacroNoActorAvailable": "¡No se pudo marcar el actor como objetivo!", "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.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.welcome5": "¡Buena partida en Lemuria!", "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!
Instale babele desde la pestaña de módulos en la interfaz de Foundry.", "BOL.settings.rollArmor": "Tiradas de armadura", "BOL.settings.rollArmorTooltip": "Tiradas de armadura, si no esta activo usará el valor fijo", diff --git a/lang/fr.json b/lang/fr.json index 5b5a1f7..3fa46cd 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -473,6 +473,23 @@ "BOL.notification.MacroMultipleTokensSelected": "Vous avez sélectionné plusieurs tokens", "BOL.notification.MacroNoActorAvailable": "Aucun acteur n'a pu être ciblé", "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.verysmall": "Très petite", @@ -632,6 +649,8 @@ "BOL.chat.pcwarningmsg": "ATTENTION Le joueur n'est relié à aucun personnage !", "BOL.chat.pcnotlinked": "Le token du personnage joueur n'est pas relié à l'acteur", "BOL.chat.pcnotlinkedmsg": "ATTENTION 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é !
Veuillez installer babele depuis l'onglet des modules dans l'interface de Foundry.", "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é)", diff --git a/module/actor/horde-sheet.js b/module/actor/horde-sheet.js index 598dffd..a82fe85 100644 --- a/module/actor/horde-sheet.js +++ b/module/actor/horde-sheet.js @@ -84,8 +84,8 @@ export class BoLHordeSheet extends foundry.appv1.sheets.ActorSheet { // Delete Inventory Item html.find('.item-delete').click(ev => { Dialog.confirm({ - title: "Suppression", - content: `Vous êtes sûr de vouloir supprimer cet item ?`, + title: game.i18n.localize("BOL.ui.deletetitle"), + content: game.i18n.localize("BOL.ui.confirmdelete"), yes: () => { const li = $(ev.currentTarget).parents(".item"); this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")]) diff --git a/module/actor/vehicle-sheet.js b/module/actor/vehicle-sheet.js index afa4882..a8be6a5 100644 --- a/module/actor/vehicle-sheet.js +++ b/module/actor/vehicle-sheet.js @@ -94,8 +94,8 @@ export class BoLVehicleSheet extends foundry.appv1.sheets.ActorSheet { // Delete Inventory Item html.find('.item-delete').click(ev => { Dialog.confirm({ - title: "Suppression", - content: `Vous êtes sûr de vouloir supprimer cet item ?`, + title: game.i18n.localize("BOL.ui.deletetitle"), + content: game.i18n.localize("BOL.ui.confirmdelete"), yes: () => { const li = $(ev.currentTarget).parents(".item"); this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")]) diff --git a/module/bol.js b/module/bol.js index c035d8c..42ac319 100644 --- a/module/bol.js +++ b/module/bol.js @@ -121,12 +121,13 @@ async function welcomeMessage() { ChatMessage.create({ user: game.user.id, whisper: [game.user.id], content }) if (game.user.isGM && game.i18n.lang == 'en' && !game.modules.get("babele")?.active) { + const babeleWarning = game.i18n.localize("BOL.chat.babelewarning") ChatMessage.create({ user: game.user.id, whisper: [game.user.id], - content: `

⚠ WARNING ! English language selected, but Babele module is not installed !
Please install babele from the module tab in Foundry interface.

` + content: `

${babeleWarning}

` }) - ui.notifications.warn("WARNING ! English language selected, but babele module is not installed !
Please install babele from the module tab in Foundry interface.") + ui.notifications.warn(babeleWarning) } } diff --git a/module/controllers/bol-rolls.js b/module/controllers/bol-rolls.js index f0138b3..13a1303 100644 --- a/module/controllers/bol-rolls.js +++ b/module/controllers/bol-rolls.js @@ -154,7 +154,7 @@ export class BoLRoll { // Manage specific case let fightOption = actor.getActiveFightOption() 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 } @@ -175,7 +175,7 @@ export class BoLRoll { const li = $(event.currentTarget).parents(".item") let weapon = actor.items.get(li.data("item-id")) if (!weapon) { - ui.notifications.warn("Unable to find weapon !") + ui.notifications.warn(game.i18n.localize("BOL.notification.WeaponNotFound")) return } weapon = foundry.utils.duplicate(weapon) @@ -187,7 +187,7 @@ export class BoLRoll { const li = $(event.currentTarget).parents(".item"); let alchemy = actor.items.get(li.data("item-id")); if (!alchemy) { - ui.notifications.warn("Unable to find Alchemy !"); + ui.notifications.warn(game.i18n.localize("BOL.notification.AlchemyNotFound")); return; } alchemy = foundry.utils.duplicate(alchemy) @@ -198,7 +198,7 @@ export class BoLRoll { static alchemyCheckWithItem(actor, alchemy) { let alchemyData = alchemy.system 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 } @@ -260,13 +260,13 @@ export class BoLRoll { /* -------------------------------------------- */ static spellCheck(actor, event) { 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 } const li = $(event.currentTarget).parents(".item") let spell = actor.items.get(li.data("item-id")) if (!spell) { - ui.notifications.warn("Impossible de trouver ce sort !") + ui.notifications.warn(game.i18n.localize("BOL.notification.SpellNotFound")) return } spell = foundry.utils.duplicate(spell) @@ -583,7 +583,7 @@ export class BoLRoll { callback: (event, button, dialog) => { console.log("Submit Roll!!!!"); 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 } rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? diff --git a/module/system/bol-calendar.js b/module/system/bol-calendar.js index 49c3e01..6d0d473 100644 --- a/module/system/bol-calendar.js +++ b/module/system/bol-calendar.js @@ -246,10 +246,10 @@ export class BoLCalendar extends Application { } } 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 { - ui.notifications.warn(heureNaissance + " ne correspond pas à une heure de naissance"); + ui.notifications.warn(game.i18n.format("BOL.notification.BadBirthHour", { hour: heureNaissance })); } return 0; } diff --git a/module/system/bol-utility.js b/module/system/bol-utility.js index b3e3fc8..1827dd0 100644 --- a/module/system/bol-utility.js +++ b/module/system/bol-utility.js @@ -445,7 +445,7 @@ export class BoLUtility { event.preventDefault() let attr = event.currentTarget.attributes['data-attack-id'] 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 } let attackId = event.currentTarget.attributes['data-attack-id'].value @@ -583,7 +583,7 @@ export class BoLUtility { this.blindMessageToGM(chatOptions); chatOptions.whisper = [game.user.id]; - chatOptions.content = "Message only to the GM"; + chatOptions.content = game.i18n.localize("BOL.chat.msgonlygm"); } else { chatOptions.whisper = this.getUsers(user => user.isGM); diff --git a/module/system/macros.js b/module/system/macros.js index 9c28033..0f2c16d 100644 --- a/module/system/macros.js +++ b/module/system/macros.js @@ -82,19 +82,19 @@ export class Macros { static _findItem(actor, type, nameOrIndex) { const items = actor.items.filter(i => i.type === type) 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 } if (nameOrIndex === undefined || nameOrIndex === null) { if (items.length === 1) return foundry.utils.duplicate(items[0]) 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 } if (typeof nameOrIndex === "number") { const item = items[nameOrIndex] 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 foundry.utils.duplicate(item) @@ -102,7 +102,7 @@ export class Macros { const lower = String(nameOrIndex).toLowerCase() const found = items.find(i => i.name.toLowerCase().includes(lower)) 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 foundry.utils.duplicate(found) @@ -118,7 +118,7 @@ export class Macros { actor = actor ?? this.getSpeakersActor() if (!actor) return 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 BoLRoll.attributeCheck(actor, key) @@ -134,7 +134,7 @@ export class Macros { actor = actor ?? this.getSpeakersActor() if (!actor) return 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 BoLRoll.aptitudeCheck(actor, key) @@ -164,7 +164,7 @@ export class Macros { actor = actor ?? this.getSpeakersActor() if (!actor) return 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 } const spell = this._findItem(actor, "spell", nameOrIndex) @@ -214,7 +214,7 @@ export class Macros { case "alchemy": return this.rollAlchemy(key, actor) case "horoscope": return this.rollHoroscope(key ?? "minor", actor) 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 })) } }