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.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 !<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.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.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": "<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.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.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.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!<br>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",
+19
View File
@@ -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": "<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.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.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
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")])
+2 -2
View File
@@ -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")])
+3 -2
View File
@@ -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: `<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
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') ?
+2 -2
View File
@@ -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;
}
+2 -2
View File
@@ -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);
+8 -8
View File
@@ -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 }))
}
}