From daccd362549b1f6a25b22a55217f622724a79235 Mon Sep 17 00:00:00 2001 From: Antidino35 Date: Thu, 22 Oct 2026 18:12:18 +0200 Subject: [PATCH 1/2] feat: externalize plugin messages into language files via MessageManager Replace hardcoded (mixed French/English) strings with a new MessageManager that loads translatable messages, with support for placeholders (e.g. {count}, {page}, {max}). - Add MessageManager and initialize it in CorePlugin#onEnable - Add `lang` option to config.yml (default: fr_FR) - AdminCommands: use message keys for usage, reload, give and slot messages; add a send(Component) overload - PerksCommand / CodexListener: use message keys for feedback messages - CodexMenu: route all menu titles, buttons and lore through a new msg() helper (italic disabled by default); descriptions from the perk config still use MiniMessage directly - CodexListener: add missing `break` statements in BACK_SLOT and GIVE_SLOT cases to prevent fall-through - Remove default perks section from config.yml and an unused import in PDCBuilder --- src/main/java/fr/antidino/smp/CorePlugin.java | 3 + .../smp/core/commands/AdminCommands.java | 57 ++++++++----- .../smp/core/commands/PerksCommand.java | 4 +- .../smp/core/manager/MessageManager.java | 67 +++++++++++++++ .../smp/core/manager/codex/CodexListener.java | 4 +- .../smp/core/manager/codex/CodexMenu.java | 85 ++++++++++++------- .../fr/antidino/smp/librairie/PDCBuilder.java | 1 - src/main/resources/config.yml | 5 +- src/main/resources/lang/de_DE.yml | 36 ++++++++ src/main/resources/lang/en_US.yml | 36 ++++++++ src/main/resources/lang/es_ES.yml | 36 ++++++++ src/main/resources/lang/fr_FR.yml | 37 ++++++++ 12 files changed, 310 insertions(+), 61 deletions(-) create mode 100644 src/main/java/fr/antidino/smp/core/manager/MessageManager.java create mode 100644 src/main/resources/lang/de_DE.yml create mode 100644 src/main/resources/lang/en_US.yml create mode 100644 src/main/resources/lang/es_ES.yml create mode 100644 src/main/resources/lang/fr_FR.yml diff --git a/src/main/java/fr/antidino/smp/CorePlugin.java b/src/main/java/fr/antidino/smp/CorePlugin.java index f74469e..4fa8730 100644 --- a/src/main/java/fr/antidino/smp/CorePlugin.java +++ b/src/main/java/fr/antidino/smp/CorePlugin.java @@ -1,6 +1,7 @@ package fr.antidino.smp; import fr.antidino.smp.core.listeners.*; +import fr.antidino.smp.core.manager.MessageManager; import fr.antidino.smp.core.manager.SlotExpander; import fr.antidino.smp.core.manager.SlotManager; import fr.antidino.smp.core.manager.codex.CodexListener; @@ -32,6 +33,7 @@ public final class CorePlugin extends JavaPlugin { public PerkManager perkManager; public SlotManager slotManager; public ConfigPerkManager configPerkManager; + public MessageManager messageManager; public CodexMenu codexMenu; public PerkTasks perkTasks; public SlotExpander slotExpander; @@ -42,6 +44,7 @@ public final class CorePlugin extends JavaPlugin { public void onEnable() { configPerkManager = new ConfigPerkManager(this); initConfig(); + messageManager = new MessageManager(this); getServer().getPluginManager().registerEvents(new CraftingListener(this), this); getServer().getPluginManager().registerEvents(new SmithingListener(this), this); diff --git a/src/main/java/fr/antidino/smp/core/commands/AdminCommands.java b/src/main/java/fr/antidino/smp/core/commands/AdminCommands.java index 3a0cad6..db4e73c 100644 --- a/src/main/java/fr/antidino/smp/core/commands/AdminCommands.java +++ b/src/main/java/fr/antidino/smp/core/commands/AdminCommands.java @@ -2,6 +2,7 @@ import fr.antidino.smp.CorePlugin; import fr.antidino.smp.core.SmithingRegisterAllItem; +import fr.antidino.smp.core.manager.MessageManager; import fr.antidino.smp.core.manager.perk.AbstractPerk; import fr.antidino.smp.librairie.ChatUtil; import fr.antidino.smp.librairie.PDCBuilder; @@ -19,9 +20,7 @@ import org.jetbrains.annotations.NotNull; import org.jspecify.annotations.NonNull; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; +import java.util.*; /** * /perk reload : recharge config, perks et crafts @@ -29,15 +28,18 @@ */ public class AdminCommands implements CommandExecutor, TabCompleter { private static final String EXPANDER_ID = "slot_expander"; + MessageManager messageManager; private final CorePlugin plugin; public AdminCommands(CorePlugin plugin) { + this.plugin = plugin; + messageManager = plugin.messageManager; } @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String @NotNull [] args) { if (args.length == 0) { - send(sender, "Usage : /perk reload | /perk give [nombre] [niveau]"); + send(sender, messageManager.get("admin_command_usage")); return true; } switch (args[0].toLowerCase(Locale.ROOT)) { @@ -45,27 +47,29 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command case "reload" -> { int count = plugin.fullReload(); - send(sender, "Config rechargée : " + count + " perks, crafts et item de slots mis à jour."); + Map vars = new HashMap<>(); + vars.put("count", String.valueOf(count)); + send(sender, messageManager.get("config_reloaded",vars)); } case "give" -> give(sender, args); - default -> send(sender, "Sous-commande inconnue. Essaie /perk reload ou /perk give"); + default -> send(sender, messageManager.get("admin_command_usage")); } return true; } private void slot(CommandSender sender, String[] args) { if (args.length < 2) { - send(sender, "Usage : /perk slot [argument]"); + send(sender, messageManager.get("slot_command_usage")); return; } switch (args[1].toLowerCase(Locale.ROOT)) { case "init" -> { if (!(sender instanceof Player player)) { - send(sender, "Only players can execute this command."); + send(sender, messageManager.get("player_only")); break; } ItemStack item = player.getInventory().getItemInMainHand(); if (item.getType() == Material.AIR) { - send(sender, "You must have an item in your hand!"); + send(sender, messageManager.get("slot_item_in_hand")); break; } if (!SmithingRegisterAllItem.getAllMaterials().contains(item.getType())) { @@ -75,11 +79,11 @@ private void slot(CommandSender sender, String[] args) { } ItemStack updatedItem = plugin.pdcBuilder.initializeSlots(item); player.getInventory().setItemInMainHand(updatedItem); - send(sender, "Item successfully initialized!"); + send(sender,messageManager.get("init_slot") ); } case "apply" -> { if (!(sender instanceof Player player)) { - send(sender, "Only players can execute this command."); + send(sender, messageManager.get("player_only")); break; } @@ -88,7 +92,7 @@ private void slot(CommandSender sender, String[] args) { if (appliedItem.getType() == Material.AIR || perk.getType() == Material.AIR) { - send(sender, "You must hold a perk in your main hand and an item in your off-hand!"); + send(sender, messageManager.get("apply_perk_no_item")); break; } @@ -102,7 +106,7 @@ private void slot(CommandSender sender, String[] args) { ItemMeta perkMeta = perk.getItemMeta(); if (perkMeta == null || !perkMeta.getPersistentDataContainer().has(PDCBuilder.PERK_ID, PersistentDataType.STRING)) { - send(sender, "The item in your main hand is not a valid perk!"); + send(sender, messageManager.get("applied_perk_no_valid")); break; } @@ -118,18 +122,17 @@ private void slot(CommandSender sender, String[] args) { } else { player.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); } - - send(sender, "Perk successfully applied!"); + send(sender, messageManager.get("applied_perk_success")); } } } private void give(CommandSender sender, String[] args) { if (!(sender instanceof Player player)) { - send(sender, "Commande réservée aux joueurs."); + send(sender, messageManager.get("player_only")); return; } if (args.length < 2) { - send(sender, "Usage : /perk give [nombre] [niveau]"); + send(sender, messageManager.get("give_usage")); return; } @@ -138,7 +141,9 @@ private void give(CommandSender sender, String[] args) { try { count = Math.clamp(Integer.parseInt(args[2]), 1, 64); } catch (NumberFormatException e) { - send(sender, "Nombre invalide : " + args[2]); + Map vars = new HashMap<>(); + vars.put("count", String.valueOf(args[2])); + send(sender,messageManager.get("give_invalid_number",vars)); return; } } @@ -151,7 +156,9 @@ private void give(CommandSender sender, String[] args) { AbstractPerk perk = plugin.perkManager.getPerk(args[1]); if (perk == null) { - send(sender, "Perk inconnu : " + args[1]); + Map vars = new HashMap<>(); + vars.put("count", String.valueOf(args[1])); + send(sender, messageManager.get("give_unknow_perk",vars)); return; } int level = 1; @@ -159,11 +166,15 @@ private void give(CommandSender sender, String[] args) { try { level = Integer.parseInt(args[3]); } catch (NumberFormatException e) { - send(sender, "Niveau invalide : " + args[3]); + Map vars = new HashMap<>(); + vars.put("count", String.valueOf(args[3])); + send(sender, messageManager.get("give_invalid_number",vars)); return; } if (level < 1 || level > perk.getMaxLevel()) { - send(sender, "Niveau entre 1 et " + perk.getMaxLevel() + " pour ce perk."); + Map vars = new HashMap<>(); + vars.put("count", perk.getMaxLevel() + ""); + send(sender,messageManager.get("give_invalid_level_amount",vars)); return; } } @@ -172,7 +183,9 @@ private void give(CommandSender sender, String[] args) { player.getInventory().addItem(item); } } - + private void send(CommandSender sender,Component message) { + sender.sendMessage(message); + } private void send(CommandSender sender, String message) { sender.sendMessage(MiniMessage.miniMessage().deserialize(message)); } diff --git a/src/main/java/fr/antidino/smp/core/commands/PerksCommand.java b/src/main/java/fr/antidino/smp/core/commands/PerksCommand.java index f4a2a98..5c2819a 100644 --- a/src/main/java/fr/antidino/smp/core/commands/PerksCommand.java +++ b/src/main/java/fr/antidino/smp/core/commands/PerksCommand.java @@ -23,14 +23,14 @@ public PerksCommand(CorePlugin plugin) { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (!(sender instanceof Player player)) { - sender.sendMessage("Commande réservée aux joueurs."); + sender.sendMessage(plugin.messageManager.get("player_only")); return true; } if (args.length >= 1 && args[0].equalsIgnoreCase("codex")) { plugin.codexMenu.openList(player, 0); return true; } - player.sendMessage(MiniMessage.miniMessage().deserialize("Usage : /perks codex")); + player.sendMessage(plugin.messageManager.get("codex_usage")); return true; } diff --git a/src/main/java/fr/antidino/smp/core/manager/MessageManager.java b/src/main/java/fr/antidino/smp/core/manager/MessageManager.java new file mode 100644 index 0000000..69aebc5 --- /dev/null +++ b/src/main/java/fr/antidino/smp/core/manager/MessageManager.java @@ -0,0 +1,67 @@ +package fr.antidino.smp.core.manager; + +import fr.antidino.smp.CorePlugin; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; + +import java.util.HashMap; +import java.util.Map; + +public class MessageManager { + + private static final Logger log = LoggerFactory.getLogger(MessageManager.class); + private final CorePlugin plugin; + private final Map cache = new HashMap<>(); + + public MessageManager(CorePlugin plugin) { + this.plugin = plugin; + reloadConfig(); + } + public void reloadConfig() { + loadMessages(plugin.getConfig().getString("lang","fr_FR")); + } + public void loadMessages(String langCode) { + cache.clear(); + File langFile = new File(plugin.getDataFolder(), "lang/" + langCode + ".yml"); + + + if (!langFile.exists()) { + plugin.saveResource("lang/" + langCode + ".yml", false); + } + + FileConfiguration config = YamlConfiguration.loadConfiguration(langFile); + + + for (String key : config.getKeys(true)) { + if (!config.isConfigurationSection(key)) { + String value = config.getString(key, ""); + cache.put(key, value); + } + } + log.info("Loaded " + cache.size() + " messages."); + } + + + public Component get(String key, Map replacements) { + String message = cache.getOrDefault(key, "Message introuvable: " + key); + + if (replacements != null) { + for (Map.Entry entry : replacements.entrySet()) { + message = message.replace("%" + entry.getKey() + "%", entry.getValue()); + } + } + + return MiniMessage.miniMessage().deserialize(message); + } + + + public Component get(String key) { + return get(key, null); + } +} \ No newline at end of file diff --git a/src/main/java/fr/antidino/smp/core/manager/codex/CodexListener.java b/src/main/java/fr/antidino/smp/core/manager/codex/CodexListener.java index 19d0e70..e04f36d 100644 --- a/src/main/java/fr/antidino/smp/core/manager/codex/CodexListener.java +++ b/src/main/java/fr/antidino/smp/core/manager/codex/CodexListener.java @@ -40,6 +40,7 @@ public void onClick(InventoryClickEvent event) { case CodexMenu.BACK_SLOT: { click(player); plugin.codexMenu.openList(player, holder.page); + break; } case CodexMenu.GIVE_SLOT: { click(player); @@ -47,7 +48,8 @@ public void onClick(InventoryClickEvent event) { if (result == null || result.getType() == Material.AIR) return; if (result.getItemMeta() == null) return; player.getInventory().addItem(result); - player.sendMessage(MiniMessage.miniMessage().deserialize("You Received 1 perk")); + player.sendMessage(plugin.messageManager.get("codex_give_success")); + break; } } } diff --git a/src/main/java/fr/antidino/smp/core/manager/codex/CodexMenu.java b/src/main/java/fr/antidino/smp/core/manager/codex/CodexMenu.java index b10e0d2..adc70e1 100644 --- a/src/main/java/fr/antidino/smp/core/manager/codex/CodexMenu.java +++ b/src/main/java/fr/antidino/smp/core/manager/codex/CodexMenu.java @@ -4,6 +4,7 @@ import fr.antidino.smp.core.manager.perk.AbstractPerk; import fr.antidino.smp.librairie.ItemBuilder; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -16,13 +17,16 @@ import java.util.ArrayList; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Map; /** * Menus du /perks codex : - * - LIST : tous les perks actifs du serveur (paginé) + item d'extension de slots + * - LIST : tous les perks actifs du serveur (paginé) + item d'extension de slots * - DETAIL : craft + description (+ niveaux) d'un perk ou de l'item de slots + * + * Tous les textes affichés passent par le MessageManager (fichiers de langue). */ public class CodexMenu { @@ -43,8 +47,6 @@ public class CodexMenu { public static final String EXPANDER_ID = "__slot_expander__"; - - public enum Type { LIST, DETAIL } public static class CodexHolder implements InventoryHolder { @@ -91,11 +93,12 @@ public void openList(Player player, int page) { int maxPage = Math.max(0, (perks.size() - 1) / PERKS_PER_PAGE); page = Math.clamp(page, 0, maxPage); - String title = "Codex des perks"; - if (maxPage > 0) title += " (" + (page + 1) + "/" + (maxPage + 1) + ")"; + Component title = maxPage > 0 + ? msg("codex_title_paged", "page", String.valueOf(page + 1), "max", String.valueOf(maxPage + 1)) + : msg("codex_title"); CodexHolder holder = new CodexHolder(Type.LIST, page, null); - Inventory inv = Bukkit.createInventory(holder, 54, mm(title)); + Inventory inv = Bukkit.createInventory(holder, 54, title); holder.setInventory(inv); int start = page * PERKS_PER_PAGE; @@ -105,10 +108,10 @@ public void openList(Player player, int page) { ItemStack filler = filler(); for (int s = 45; s < 54; s++) inv.setItem(s, filler); - if (page > 0) inv.setItem(PREV_SLOT, button(Material.ARROW, "← Page précédente")); - if (page < maxPage) inv.setItem(NEXT_SLOT, button(Material.ARROW, "Page suivante →")); + if (page > 0) inv.setItem(PREV_SLOT, button(Material.ARROW, msg("codex_prev_page"))); + if (page < maxPage) inv.setItem(NEXT_SLOT, button(Material.ARROW, msg("codex_next_page"))); if (plugin.slotExpander != null) inv.setItem(EXPANDER_SLOT, expanderListItem()); - inv.setItem(CLOSE_SLOT, button(Material.BARRIER, "Fermer")); + inv.setItem(CLOSE_SLOT, button(Material.BARRIER, msg("codex_close"))); player.openInventory(inv); } @@ -123,10 +126,10 @@ private ItemStack listItem(AbstractPerk perk) { lore.addAll(descriptionLines(perk.getDescription())); if (perk.getMaxLevel() > 1) { lore.add(Component.empty()); - lore.add(mm("Niveau max : " + AbstractPerk.roman(perk.getMaxLevel()))); + lore.add(msg("codex_max_level", "level", AbstractPerk.roman(perk.getMaxLevel()))); } lore.add(Component.empty()); - lore.add(mm("▶ Clic pour voir le craft")); + lore.add(msg("codex_click_craft")); meta.lore(lore); item.setItemMeta(meta); return item; @@ -141,7 +144,7 @@ private ItemStack expanderListItem() { lore.add(Component.empty()); lore.addAll(descriptionLines(plugin.slotExpander.getDescription())); lore.add(Component.empty()); - lore.add(mm("▶ Clic pour voir le craft")); + lore.add(msg("codex_click_craft")); meta.lore(lore); item.setItemMeta(meta); return item; @@ -153,12 +156,12 @@ public void openDetail(Player player, AbstractPerk perk, int fromPage) { List description = new ArrayList<>(descriptionLines(perk.getDescription())); if (perk.getMaxLevel() > 1) { description.add(Component.empty()); - description.add(mm("Niveaux : I → " + AbstractPerk.roman(perk.getMaxLevel()))); - description.add(mm("Amélioration : " + perk.getUpgradeCost() + " perks de même niveau")); - description.add(mm("en table de craft = niveau suivant")); + description.add(msg("codex_levels", "max", AbstractPerk.roman(perk.getMaxLevel()))); + description.add(msg("codex_upgrade_cost", "cost", String.valueOf(perk.getUpgradeCost()))); + description.add(msg("codex_upgrade_hint")); } openRecipeView(player, perk.getId(), fromPage, - mm("Craft : ").append(mm(perk.getDisplayName())), + msg("codex_craft_title").append(mm(perk.getDisplayName())), perk.getItem().clone(), perk.getCraftShape(), perk.getCraftIngredients(), description); } @@ -166,11 +169,11 @@ public void openExpanderDetail(Player player, int fromPage) { if (plugin.slotExpander == null) return; List description = new ArrayList<>(descriptionLines(plugin.slotExpander.getDescription())); description.add(Component.empty()); - description.add(mm("Utilisation : table de forge")); - description.add(mm("Ajoute +" + plugin.slotExpander.getAdded() + " emplacement(s)")); - description.add(mm("Maximum : " + plugin.slotExpander.getMax() + " par équipement")); + description.add(msg("codex_expander_usage")); + description.add(msg("codex_expander_added", "added", String.valueOf(plugin.slotExpander.getAdded()))); + description.add(msg("codex_expander_max", "max", String.valueOf(plugin.slotExpander.getMax()))); openRecipeView(player, EXPANDER_ID, fromPage, - mm("Craft : ").append(mm(plugin.slotExpander.getDisplayName())), + msg("codex_craft_title").append(mm(plugin.slotExpander.getDisplayName())), plugin.slotExpander.getItem(), plugin.slotExpander.getCraftShape(), plugin.slotExpander.getCraftIngredients(), description); } @@ -198,21 +201,22 @@ private void openRecipeView(Player player, String id, int fromPage, Component ti } } - inv.setItem(ARROW_SLOT, button(Material.ARROW, "→")); + inv.setItem(ARROW_SLOT, button(Material.ARROW, mm("→"))); inv.setItem(RESULT_SLOT, result); - if (player.hasPermission("smp.perks.codex.give")){ - ItemStack give_button = new ItemBuilder(Material.BARRIER,plugin).setName(mm("GIVE ITEM")).build(); + if (player.hasPermission("smp.perks.codex.give")) { + ItemStack give_button = new ItemBuilder(Material.BARRIER, plugin) + .setName(msg("codex_give_button")) + .build(); inv.setItem(GIVE_SLOT, give_button); } - ItemStack book = - new ItemBuilder(Material.BOOK,plugin) + ItemStack book = new ItemBuilder(Material.BOOK, plugin) .setLore(description) - .setName(mm("Description")) + .setName(msg("codex_description_title")) .build(); inv.setItem(DESCRIPTION_SLOT, book); - inv.setItem(BACK_SLOT, button(Material.ARROW, "← Retour")); + inv.setItem(BACK_SLOT, button(Material.ARROW, msg("codex_back"))); player.openInventory(inv); } @@ -221,17 +225,18 @@ private void openRecipeView(Player player, String id, int fromPage, Component ti private List descriptionLines(List lines) { List out = new ArrayList<>(); if (lines.isEmpty()) { - out.add(mm("Aucune description configurée.")); + out.add(msg("codex_no_description")); } else { + // Descriptions définies dans la config des perks (pas dans les fichiers de langue) for (String line : lines) out.add(mm(line)); } return out; } - private ItemStack button(Material material, String name) { + private ItemStack button(Material material, Component name) { ItemStack item = new ItemStack(material); ItemMeta meta = item.getItemMeta(); - meta.displayName(mm(name)); + meta.displayName(name); item.setItemMeta(meta); return item; } @@ -244,8 +249,24 @@ private ItemStack filler() { return item; } - /** MiniMessage sans italique par défaut (comme le reste du plugin). */ + /** + * Récupère un message traduit, sans italique par défaut. + * Les variables sont passées par paires clé/valeur : msg("key", "count", "5", "max", "10") + */ + private Component msg(String key, String... vars) { + Component component; + if (vars.length == 0) { + component = plugin.messageManager.get(key); + } else { + Map map = new HashMap<>(); + for (int i = 0; i + 1 < vars.length; i += 2) map.put(vars[i], vars[i + 1]); + component = plugin.messageManager.get(key, map); + } + return component.decorationIfAbsent(TextDecoration.ITALIC, TextDecoration.State.FALSE); + } + + /** MiniMessage sans italique par défaut (pour les textes venant de la config des perks). */ private static Component mm(String text) { return MiniMessage.miniMessage().deserialize("" + text); } -} +} \ No newline at end of file diff --git a/src/main/java/fr/antidino/smp/librairie/PDCBuilder.java b/src/main/java/fr/antidino/smp/librairie/PDCBuilder.java index 1a43a9c..d188630 100644 --- a/src/main/java/fr/antidino/smp/librairie/PDCBuilder.java +++ b/src/main/java/fr/antidino/smp/librairie/PDCBuilder.java @@ -5,7 +5,6 @@ import fr.antidino.smp.core.manager.perk.PerkEntry; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 355ce6e..0a08865 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,7 +1,6 @@ +lang : "fr_FR" + slot: max : 3 min : 1 -perks: - health_perk : - material : REDSTONE diff --git a/src/main/resources/lang/de_DE.yml b/src/main/resources/lang/de_DE.yml new file mode 100644 index 0000000..62ada53 --- /dev/null +++ b/src/main/resources/lang/de_DE.yml @@ -0,0 +1,36 @@ +admin_command_usage : "Verwendung : /perk reload | /perk give [Anzahl] [Stufe]" + +config_reloaded : "Konfiguration neu geladen : %count% Perks, Crafting-Rezepte und Slot-Items aktualisiert." + +slot_command_usage : "Verwendung : /perk slot [Argument]" +player_only : "Nur Spieler können diesen Befehl ausführen." +slot_item_in_hand : "Du musst ein Item in der Hand halten!" +applied_perk_no_item : "Du musst einen Perk in der Haupthand und ein Item in der Nebenhand halten!" +init_slot : "Item erfolgreich initialisiert!" +applied_perk_no_valid : "Das Item in deiner Haupthand ist kein gültiger Perk!" +applied_perk_success : "Perk erfolgreich angewendet!" +give_usage : "Verwendung : /perk give [Anzahl] [Stufe]" +give_invalid_number : "Ungültige Zahl : %count%" +give_unknow_perk : "Unbekannter Perk : %count%" +give_invalid_level : "Ungültige Stufe : %count%" +give_invalid_level_amount : "Die Stufe muss für diesen Perk zwischen 1 und %count% liegen." + +# --- Codex --- +codex_title : "Perk-Kodex" +codex_title_paged : "Perk-Kodex (%page%/%max%)" +codex_prev_page : "← Vorherige Seite" +codex_next_page : "Nächste Seite →" +codex_close : "Schließen" +codex_back : "← Zurück" +codex_max_level : "Max. Stufe : %level%" +codex_click_craft : "▶ Klicken, um das Rezept zu sehen" +codex_levels : "Stufen : I → %max%" +codex_upgrade_cost : "Verbesserung : %cost% Perks der gleichen Stufe" +codex_upgrade_hint : "in der Werkbank = nächste Stufe" +codex_expander_usage : "Verwendung : Schmiedetisch" +codex_expander_added : "Fügt +%added% Slot(s) hinzu" +codex_expander_max : "Maximum : %max% pro Ausrüstung" +codex_craft_title : "Rezept : " +codex_give_button : "GIVE ITEM" +codex_description_title : "Beschreibung" +codex_no_description : "Keine Beschreibung" diff --git a/src/main/resources/lang/en_US.yml b/src/main/resources/lang/en_US.yml new file mode 100644 index 0000000..b4d371b --- /dev/null +++ b/src/main/resources/lang/en_US.yml @@ -0,0 +1,36 @@ +admin_command_usage : "Usage : /perk reload | /perk give [amount] [level]" + +config_reloaded : "Config reloaded : %count% perks, crafts and slot items updated." + +slot_command_usage : "Usage : /perk slot [argument]" +player_only : "Only players can execute this command." +slot_item_in_hand : "You must have an item in your hand!" +applied_perk_no_item : "You must hold a perk in your main hand and an item in your off-hand!" +init_slot : "Item successfully initialized!" +applied_perk_no_valid : "The item in your main hand is not a valid perk!" +applied_perk_success : "Perk successfully applied!" +give_usage : "Usage : /perk give [amount] [level]" +give_invalid_number : "Invalid number : %count%" +give_unknow_perk : "Unknown perk : %count%" +give_invalid_level : "Invalid level : %count%" +give_invalid_level_amount : "Level must be between 1 and %count% for this perk." + +# --- Codex --- +codex_title : "Perk Codex" +codex_title_paged : "Perk Codex (%page%/%max%)" +codex_prev_page : "← Previous page" +codex_next_page : "Next page →" +codex_close : "Close" +codex_back : "← Back" +codex_max_level : "Max level : %level%" +codex_click_craft : "▶ Click to view the recipe" +codex_levels : "Levels : I → %max%" +codex_upgrade_cost : "Upgrade : %cost% perks of the same level" +codex_upgrade_hint : "in a crafting table = next level" +codex_expander_usage : "Usage : smithing table" +codex_expander_added : "Adds +%added% slot(s)" +codex_expander_max : "Maximum : %max% per equipment" +codex_craft_title : "Recipe : " +codex_give_button : "GIVE ITEM" +codex_description_title : "Description" +codex_no_description : "No description" diff --git a/src/main/resources/lang/es_ES.yml b/src/main/resources/lang/es_ES.yml new file mode 100644 index 0000000..31a31e6 --- /dev/null +++ b/src/main/resources/lang/es_ES.yml @@ -0,0 +1,36 @@ +admin_command_usage : "Uso : /perk reload | /perk give [cantidad] [nivel]" + +config_reloaded : "Configuración recargada : %count% perks, crafteos e ítems de slots actualizados." + +slot_command_usage : "Uso : /perk slot [argumento]" +player_only : "Solo los jugadores pueden ejecutar este comando." +slot_item_in_hand : "¡Debes tener un ítem en la mano!" +applied_perk_no_item : "¡Debes sostener un perk en la mano principal y un ítem en la mano secundaria!" +init_slot : "¡Ítem inicializado con éxito!" +applied_perk_no_valid : "¡El ítem de tu mano principal no es un perk válido!" +applied_perk_success : "¡Perk aplicado con éxito!" +give_usage : "Uso : /perk give [cantidad] [nivel]" +give_invalid_number : "Número inválido : %count%" +give_unknow_perk : "Perk desconocido : %count%" +give_invalid_level : "Nivel inválido : %count%" +give_invalid_level_amount : "El nivel debe estar entre 1 y %count% para este perk." + +# --- Codex --- +codex_title : "Códice de perks" +codex_title_paged : "Códice de perks (%page%/%max%)" +codex_prev_page : "← Página anterior" +codex_next_page : "Página siguiente →" +codex_close : "Cerrar" +codex_back : "← Volver" +codex_max_level : "Nivel máx. : %level%" +codex_click_craft : "▶ Clic para ver la receta" +codex_levels : "Niveles : I → %max%" +codex_upgrade_cost : "Mejora : %cost% perks del mismo nivel" +codex_upgrade_hint : "en una mesa de crafteo = siguiente nivel" +codex_expander_usage : "Uso : mesa de herrería" +codex_expander_added : "Añade +%added% ranura(s)" +codex_expander_max : "Máximo : %max% por equipamiento" +codex_craft_title : "Receta : " +codex_give_button : "GIVE ITEM" +codex_description_title : "Descripción" +codex_no_description : "Sin descripción" diff --git a/src/main/resources/lang/fr_FR.yml b/src/main/resources/lang/fr_FR.yml new file mode 100644 index 0000000..f9b2a1a --- /dev/null +++ b/src/main/resources/lang/fr_FR.yml @@ -0,0 +1,37 @@ +admin_command_usage : "Usage : /perk reload | /perk give [nombre] [niveau]" + +config_reloaded : "Config rechargée : %count% perks, crafts et items de slots mis à jour." + +slot_command_usage : "Usage : /perk slot [argument]" +player_only : "Seuls les joueurs peuvent exécuter cette commande." +slot_item_in_hand : "Vous devez avoir un item dans la main !" +applied_perk_no_item : "Vous devez tenir un perk dans votre main principale et un item dans votre main secondaire !" +init_slot : "Item initialisé avec succès !" +applied_perk_no_valid : "L'item dans votre main principale n'est pas un perk valide !" +applied_perk_success : "Perk appliqué avec succès !" +give_usage : "Usage : /perk give [nombre] [niveau]" +give_invalid_number : "Nombre invalide : %count%" +give_unknow_perk : "Perk inconnu : %count%" +give_invalid_level : "Niveau invalide : %count%" +give_invalid_level_amount : "Niveau entre 1 et %count% pour ce perk." + +# --- Codex --- +codex_title : "Codex des perks" +codex_title_paged : "Codex des perks (%page%/%max%)" +codex_prev_page : "← Page précédente" +codex_next_page : "Page suivante →" +codex_close : "Fermer" +codex_back : "← Retour" +codex_max_level : "Niveau max : %level%" +codex_click_craft : "▶ Clic pour voir le craft" +codex_levels : "Niveaux : I → %max%" +codex_upgrade_cost : "Amélioration : %cost% perks de même niveau" +codex_upgrade_hint : "en table de craft = niveau suivant" +codex_expander_usage : "Utilisation : table de forge" +codex_expander_added : "Ajoute +%added% emplacement(s)" +codex_expander_max : "Maximum : %max% par équipement" +codex_craft_title : "Craft : " +codex_give_button : "GIVE ITEM" +codex_description_title : "Description" +codex_no_description : "Aucune description" +codex_give_success : "Perk Give avec succès" From 0469b516981b29308ec91467db026749ffec5f79 Mon Sep 17 00:00:00 2001 From: Antidino35 Date: Thu, 22 Oct 2026 18:13:29 +0200 Subject: [PATCH 2/2] fix(warning) : Remove unsed import and unsed function --- src/main/java/fr/antidino/smp/CorePlugin.java | 8 +------- .../java/fr/antidino/smp/core/commands/AdminCommands.java | 3 --- .../java/fr/antidino/smp/core/commands/PerksCommand.java | 1 - .../fr/antidino/smp/core/manager/codex/CodexListener.java | 1 - .../fr/antidino/smp/core/manager/codex/CodexMenu.java | 2 +- 5 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/main/java/fr/antidino/smp/CorePlugin.java b/src/main/java/fr/antidino/smp/CorePlugin.java index 4fa8730..7243137 100644 --- a/src/main/java/fr/antidino/smp/CorePlugin.java +++ b/src/main/java/fr/antidino/smp/CorePlugin.java @@ -21,9 +21,6 @@ import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.sql.Connection; import java.sql.SQLException; import java.util.List; @@ -103,10 +100,7 @@ public int fullReload() { } return perkManager.getPerks().size(); } - public void reloadAllConfig() { - this.reloadConfig(); - configPerkManager.ReloadConfig(); - } + @Override public void onDisable() { if (perkTasks != null) { diff --git a/src/main/java/fr/antidino/smp/core/commands/AdminCommands.java b/src/main/java/fr/antidino/smp/core/commands/AdminCommands.java index db4e73c..3bd8ab1 100644 --- a/src/main/java/fr/antidino/smp/core/commands/AdminCommands.java +++ b/src/main/java/fr/antidino/smp/core/commands/AdminCommands.java @@ -186,9 +186,6 @@ private void give(CommandSender sender, String[] args) { private void send(CommandSender sender,Component message) { sender.sendMessage(message); } - private void send(CommandSender sender, String message) { - sender.sendMessage(MiniMessage.miniMessage().deserialize(message)); - } @Override public ArrayList onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String @NonNull [] args) { diff --git a/src/main/java/fr/antidino/smp/core/commands/PerksCommand.java b/src/main/java/fr/antidino/smp/core/commands/PerksCommand.java index 5c2819a..cbea779 100644 --- a/src/main/java/fr/antidino/smp/core/commands/PerksCommand.java +++ b/src/main/java/fr/antidino/smp/core/commands/PerksCommand.java @@ -1,7 +1,6 @@ package fr.antidino.smp.core.commands; import fr.antidino.smp.CorePlugin; -import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/fr/antidino/smp/core/manager/codex/CodexListener.java b/src/main/java/fr/antidino/smp/core/manager/codex/CodexListener.java index e04f36d..65b404c 100644 --- a/src/main/java/fr/antidino/smp/core/manager/codex/CodexListener.java +++ b/src/main/java/fr/antidino/smp/core/manager/codex/CodexListener.java @@ -2,7 +2,6 @@ import fr.antidino.smp.CorePlugin; import fr.antidino.smp.core.manager.perk.AbstractPerk; -import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; diff --git a/src/main/java/fr/antidino/smp/core/manager/codex/CodexMenu.java b/src/main/java/fr/antidino/smp/core/manager/codex/CodexMenu.java index adc70e1..512f15f 100644 --- a/src/main/java/fr/antidino/smp/core/manager/codex/CodexMenu.java +++ b/src/main/java/fr/antidino/smp/core/manager/codex/CodexMenu.java @@ -25,7 +25,7 @@ * Menus du /perks codex : * - LIST : tous les perks actifs du serveur (paginé) + item d'extension de slots * - DETAIL : craft + description (+ niveaux) d'un perk ou de l'item de slots - * + * Tous les textes affichés passent par le MessageManager (fichiers de langue). */ public class CodexMenu {