diff --git a/src/main/java/fr/openmc/api/chronometer/Chronometer.java b/src/main/java/fr/openmc/api/chronometer/Chronometer.java index 608cbbd8e..c5870c1f3 100644 --- a/src/main/java/fr/openmc/api/chronometer/Chronometer.java +++ b/src/main/java/fr/openmc/api/chronometer/Chronometer.java @@ -64,7 +64,15 @@ public static HandlerList getHandlerList() { * @param finishMessageType display type * @param finishMessage message display when the chronometer ends normally */ - public static void startChronometer(Entity entity, String group, int time, ChronometerType messageType, String message, ChronometerType finishMessageType, String finishMessage) { + public static void startChronometer( + Entity entity, + String group, + int time, + ChronometerType messageType, + Component message, + ChronometerType finishMessageType, + Component finishMessage + ) { UUID entityUUID = entity.getUniqueId(); chronometer.computeIfAbsent(entityUUID, k -> new HashMap<>()).put(group, time); @@ -81,33 +89,26 @@ public void run() { } int remainingTime = chronometer.get(entityUUID).get(group); - String timerMessage = "Il reste : " + remainingTime + "s"; - if (message!=null){ - if (!message.contains("%null%")){ - if (message.contains("%sec%")) { - timerMessage = message.replace("%sec%", String.valueOf(remainingTime)); - } - if (entity instanceof Player player){ - sendMessage(player, messageType, Component.text(timerMessage)); - } - } - } else { - if (entity instanceof Player player){ - sendMessage(player, messageType, Component.text(timerMessage)); - } - } + if (message != null && entity instanceof Player player) { + Component timerMessage = message.replaceText(builder -> + builder.matchLiteral("%sec%") + .replacement(Component.text(remainingTime)) + ); + sendMessage(player, messageType, timerMessage); + } if (timerEnd(entityUUID, group)) { - if (entity instanceof Player player){ - sendMessage(player, finishMessageType, Component.text(finishMessage != null ? finishMessage : "Le chronomètre est terminé !")); + + if (entity instanceof Player player && finishMessage != null) { + sendMessage(player, finishMessageType, finishMessage); } Bukkit.getPluginManager().callEvent(new ChronometerEndEvent(entity, group)); if (chronometer.containsKey(entityUUID)) { chronometer.get(entityUUID).remove(group); - if (chronometer.get(entityUUID).isEmpty()){ + if (chronometer.get(entityUUID).isEmpty()) { chronometer.remove(entityUUID); } } @@ -119,7 +120,6 @@ public void run() { } }; task.runTaskTimer(OMCPlugin.getInstance(), 0, 20); - activeTasks.computeIfAbsent(entityUUID, k -> new HashMap<>()).put(group, task); } @@ -128,26 +128,20 @@ public void run() { * @param messageType display type * @param message message display when the chronometer is stopped */ - public static void stopAllChronometer(Entity entity, ChronometerType messageType, String message) { + public static void stopAllChronometer(Entity entity, ChronometerType messageType, Component message) { UUID entityUUID = entity.getUniqueId(); + if (chronometer.containsKey(entityUUID)) { chronometer.remove(entityUUID); - if (message!=null){ - if (!message.contains("%null%")){ - if (entity instanceof Player player){ - sendMessage(player, messageType, Component.text(message)); - } - } - } else { - if (entity instanceof Player player){ - sendMessage(player, messageType, Component.text("Chronomètre arrêté")); - } + + if (entity instanceof Player player && message != null) { + sendMessage(player, messageType, message); } } if (activeTasks.containsKey(entityUUID)) { - for (Map.Entry entry : activeTasks.get(entityUUID).entrySet()) { - entry.getValue().cancel(); + for (BukkitRunnable runnable : activeTasks.get(entityUUID).values()) { + runnable.cancel(); } activeTasks.remove(entityUUID); } @@ -159,7 +153,7 @@ public static void stopAllChronometer(Entity entity, ChronometerType messageType * @param messageType display type * @param message message display when the chronometer is stopped */ - public static void stopChronometer(Entity entity, String group, ChronometerType messageType, String message) { + public static void stopChronometer(Entity entity, String group, ChronometerType messageType, Component message) { UUID entityUUID = entity.getUniqueId(); if (chronometer.containsKey(entityUUID) && chronometer.get(entityUUID).containsKey(group)) { @@ -170,24 +164,17 @@ public static void stopChronometer(Entity entity, String group, ChronometerType activeTasks.get(entityUUID).remove(group); } - if (message!=null){ - if (!message.contains("%null%")){ - if (entity instanceof Player player){ - sendMessage(player, messageType, Component.text(message)); - } - } - } else { - if (entity instanceof Player player){ - sendMessage(player, messageType, Component.text("Chronomètre du " + group + " arrêté")); - } + if (entity instanceof Player player && message != null) { + sendMessage(player, messageType, message); } if (chronometer.get(entityUUID).isEmpty()) { chronometer.remove(entityUUID); } } else { - if (entity instanceof Player player){ - player.sendMessage("§cAucun chronomètre trouvé pour le groupe §e" + group + "."); + if (entity instanceof Player player) { + MessagesManager.sendMessage(player, + Component.translatable("api.chronometer.chronometer_not_found", Component.text(group)), Prefix.OPENMC, MessageType.INFO, false); } } } @@ -196,12 +183,14 @@ public static void listChronometers(Entity entity, Player owner) { UUID entitytUUID = entity.getUniqueId(); if (chronometer.containsKey(entitytUUID)) { - owner.sendMessage("§aChronomètres actifs :"); + owner.sendMessage(Component.translatable("api.chronometer.chronometer_on")); chronometer.get(entitytUUID).forEach((group, time) -> - owner.sendMessage(" §e- " + group + ": §6" + time + "s") + owner.sendMessage( + Component.translatable("api.chronometer.chronometer_on_list", + Component.text(group), Component.text(time))) ); } else { - owner.sendMessage("§cCe joueur n'a aucun chronomètre actif."); + owner.sendMessage(Component.translatable("api.chronometer.none_chronometer_player")); } } diff --git a/src/main/java/fr/openmc/api/cooldown/CooldownInterceptor.java b/src/main/java/fr/openmc/api/cooldown/CooldownInterceptor.java index 4589ad551..8f53a4758 100644 --- a/src/main/java/fr/openmc/api/cooldown/CooldownInterceptor.java +++ b/src/main/java/fr/openmc/api/cooldown/CooldownInterceptor.java @@ -1,6 +1,7 @@ package fr.openmc.api.cooldown; import fr.openmc.core.utils.DateUtils; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import revxrsal.commands.bukkit.actor.BukkitCommandActor; @@ -8,8 +9,10 @@ import revxrsal.commands.process.CommandCondition; public class CooldownInterceptor implements CommandCondition { + @Override public void test(@NotNull ExecutionContext context) { + DynamicCooldown cooldown = context.command().annotations().get(DynamicCooldown.class); if (cooldown == null) { return; @@ -18,11 +21,16 @@ public void test(@NotNull ExecutionContext context) { Player player = context.actor().requirePlayer(); if (!DynamicCooldownManager.isReady(player.getUniqueId(), cooldown.group())) { + long remaining = DynamicCooldownManager.getRemaining(player.getUniqueId(), cooldown.group()); - String message = cooldown.message(); - message = message.replace("%formatTime%", DateUtils.convertSecondToTime(remaining / 1000)); - message = message.replace("%sec%", String.valueOf(remaining / 1000)); - message = message.replace("%ms%", String.valueOf(remaining)); + + Component message = Component.translatable( + cooldown.messageKey(), + Component.text(remaining / 1000), + Component.text(remaining), + Component.text(DateUtils.convertSecondToTime(remaining / 1000)) + ); + player.sendMessage(message); } } diff --git a/src/main/java/fr/openmc/api/cooldown/DynamicCooldown.java b/src/main/java/fr/openmc/api/cooldown/DynamicCooldown.java index cfef7602a..aebc94ac2 100644 --- a/src/main/java/fr/openmc/api/cooldown/DynamicCooldown.java +++ b/src/main/java/fr/openmc/api/cooldown/DynamicCooldown.java @@ -20,9 +20,10 @@ * * @return message */ - String message() default "§cVous devez attendre %sec%s"; + String messageKey() default "api.cooldown.must_wait"; /* - * %sec% | Le temps restant en secondes - * %ms% | Le temps restant en millisecondes + * | Le temps restant en secondes + * | Le temps restant en millisecondes + * | Le temps restant formaté (ex: 1m30s) */ } diff --git a/src/main/java/fr/openmc/api/input/ChatInput.java b/src/main/java/fr/openmc/api/input/ChatInput.java index 7eeefdb93..1a5044eec 100644 --- a/src/main/java/fr/openmc/api/input/ChatInput.java +++ b/src/main/java/fr/openmc/api/input/ChatInput.java @@ -1,6 +1,10 @@ package fr.openmc.api.input; +import fr.openmc.core.utils.messages.MessageType; +import fr.openmc.core.utils.messages.MessagesManager; +import fr.openmc.core.utils.messages.Prefix; import io.papermc.paper.event.player.AsyncChatEvent; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -32,7 +36,7 @@ public void onPlayerChat(AsyncChatEvent event) { if (event.message() instanceof TextComponent textComponent) { String string = textComponent.content(); if (string.contains("cancel")) { - player.sendMessage("§eVous avez annulé l'action !"); + MessagesManager.sendMessage(player, Component.translatable("api.chatinput.cancel"), Prefix.OPENMC, MessageType.INFO, false); callback.accept(null); } callback.accept(string); diff --git a/src/main/java/fr/openmc/api/input/DialogInput.java b/src/main/java/fr/openmc/api/input/DialogInput.java index d40b7d0bf..dbccd4826 100644 --- a/src/main/java/fr/openmc/api/input/DialogInput.java +++ b/src/main/java/fr/openmc/api/input/DialogInput.java @@ -25,12 +25,12 @@ public static void send(Player player, Component lore, int maxLength, Consumer builder.empty() - .base(DialogBase.builder(Component.text("Rentrer du Texte")) + .base(DialogBase.builder(Component.translatable("api.dialoginput.type_string")) .body(body) .inputs(List.of( io.papermc.paper.registry.data.dialog.input.DialogInput .text("inputtextomc", - Component.text("Rentrer du texte ici") + Component.translatable("api.dialoginput.type_string.here") ) .maxLength(maxLength) .build() @@ -41,14 +41,12 @@ public static void send(Player player, Component lore, int maxLength, Consumer { - callback.accept(response.getText("inputtextomc")); - }, ClickCallback.Options.builder().build())) + .action(DialogAction.customClick((response, audience) -> + callback.accept(response.getText("inputtextomc")), ClickCallback.Options.builder().build())) .build(), ActionButton.builder(Component.text(ButtonType.CANCEL.getLabel())) - .action(DialogAction.customClick((response, audience) -> { - callback.accept(null); - }, ClickCallback.Options.builder().build())) + .action(DialogAction.customClick((response, audience) -> + callback.accept(null), ClickCallback.Options.builder().build())) .build() ) ) @@ -63,12 +61,12 @@ public static void sendFloat(Player player, Component lore, float minSize, float body.add(DialogBody.plainMessage(lore)); Dialog inputDialog = Dialog.create(builder -> builder.empty() - .base(DialogBase.builder(Component.text("Rentrer un nombre")) + .base(DialogBase.builder(Component.translatable("api.dialoginput.type_float")) .body(body) .inputs(List.of( io.papermc.paper.registry.data.dialog.input.DialogInput .numberRange("inputfloatomc", - Component.text("Rentrer un nombre ici"), + Component.translatable("api.dialoginput.type_float.here"), minSize, maxSize ) @@ -82,14 +80,12 @@ public static void sendFloat(Player player, Component lore, float minSize, float ) .type(DialogType.confirmation( ActionButton.builder(Component.text(ButtonType.CONFIRM.getLabel())) - .action(DialogAction.customClick((response, audience) -> { - callback.accept(response.getFloat("inputfloatomc")); - }, ClickCallback.Options.builder().build())) + .action(DialogAction.customClick((response, audience) -> + callback.accept(response.getFloat("inputfloatomc")), ClickCallback.Options.builder().build())) .build(), ActionButton.builder(Component.text(ButtonType.CANCEL.getLabel())) - .action(DialogAction.customClick((response, audience) -> { - callback.accept(null); - }, ClickCallback.Options.builder().build())) + .action(DialogAction.customClick((response, audience) -> + callback.accept(null), ClickCallback.Options.builder().build())) .build() ) ) diff --git a/src/main/java/fr/openmc/api/input/location/ItemInteraction.java b/src/main/java/fr/openmc/api/input/location/ItemInteraction.java index 64ed42da0..cdd0d29cc 100644 --- a/src/main/java/fr/openmc/api/input/location/ItemInteraction.java +++ b/src/main/java/fr/openmc/api/input/location/ItemInteraction.java @@ -51,14 +51,14 @@ public class ItemInteraction implements Listener { /* * Méthode qui permet de donner un objet à une personne et de quand elle clique avec l'Item, la méthode renverra la positon ou il a cliqué */ - public static void runLocationInteraction(Player player, ItemStack item, String chronometerGroup, int chronometerTime, String startMessage, String endMessage, Function result, Runnable onFail) { + public static void runLocationInteraction(Player player, ItemStack item, String chronometerGroup, int chronometerTime, Component startMessage, Component endMessage, Function result, Runnable onFail) { if (!ItemUtils.hasAvailableSlot(player)) { - MessagesManager.sendMessage(player, Component.text("Vous n'avez pas assez de place dans votre inventaire ! L'action a été annulée"), Prefix.OPENMC, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.translatable("api.iteminteraction.not_egnough_space"), Prefix.OPENMC, MessageType.ERROR, false); return; } if (Chronometer.containsChronometer(player.getUniqueId(), chronometerGroup)) { - MessagesManager.sendMessage(player, Component.text("Vous avez déjà l'Item !"), Prefix.OPENMC, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.translatable("api.iteminteraction.have_already_item"), Prefix.OPENMC, MessageType.ERROR, false); return; } @@ -128,7 +128,7 @@ public void onPlayerInteract(PlayerInteractEvent event) { ChronometerInfo chronoInfo = interactionInfo.chronometerInfo(); if (chronoInfo != null) { - Chronometer.stopChronometer(player, chronoInfo.chronometerGroup(), null, "%null%"); + Chronometer.stopChronometer(player, chronoInfo.chronometerGroup(), null, null); } ItemStack oldItem = playerOldItemHand.getOrDefault(player.getUniqueId(), new HashMap<>()).remove(interactionId); @@ -192,12 +192,12 @@ public void onBundling(InventoryClickEvent event) { if (clickedItem != null && MaterialUtils.isBundle(clickedItem)) { if (isItemInteraction(cursorItem)) { event.setCancelled(true); - MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas déplacer cet objet dans un bundle"), Prefix.OPENMC, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.translatable("api.iteminteraction.cant_move_item"), Prefix.OPENMC, MessageType.ERROR, false); } } else if (MaterialUtils.isBundle(cursorItem)) { if (isItemInteraction(clickedItem)) { event.setCancelled(true); - MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas déplacer cet objet dans un bundle"), Prefix.OPENMC, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.translatable("api.iteminteraction.cant_move_item"), Prefix.OPENMC, MessageType.ERROR, false); } } } @@ -226,26 +226,26 @@ public void onInventoryClick(InventoryClickEvent event) { if (invType != InventoryType.PLAYER && invType != InventoryType.CREATIVE && invType != InventoryType.CRAFTING) { - MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas déplacer cet objet ici"), Prefix.OPENMC, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.translatable("api.iteminteraction.cant_move_item"), Prefix.OPENMC, MessageType.ERROR, false); event.setCancelled(true); return; } } if (event.getSlotType() == InventoryType.SlotType.CRAFTING) { - MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas déplacer cet objet ici"), Prefix.OPENMC, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.translatable("api.iteminteraction.cant_move_item"), Prefix.OPENMC, MessageType.ERROR, false); event.setCancelled(true); return; } if (event.getClick() == ClickType.DROP || event.getClick() == ClickType.CONTROL_DROP) { - MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas jeter cet objet"), Prefix.OPENMC, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.translatable("api.iteminteraction.cant_throw_item"), Prefix.OPENMC, MessageType.ERROR, false); event.setCancelled(true); return; } if (event.isShiftClick()) { - MessagesManager.sendMessage(player, Component.text("§cVous ne pouvez pas déplacer cet objet par shift-click"), Prefix.OPENMC, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.translatable("api.iteminteraction.cant_move_item_by_shiftclick"), Prefix.OPENMC, MessageType.ERROR, false); event.setCancelled(true); } } @@ -259,7 +259,7 @@ void onItemDrop(PlayerDropItemEvent event) { if (isItemInteraction(item)) { event.setCancelled(true); - MessagesManager.sendMessage(event.getPlayer(), Component.text("§cVous ne pouvez pas jeter cet item"), Prefix.OPENMC, MessageType.ERROR, false); + MessagesManager.sendMessage(event.getPlayer(), Component.translatable("api.iteminteraction.cant_throw_item"), Prefix.OPENMC, MessageType.ERROR, false); } } @@ -278,7 +278,7 @@ public void onItemFrameInteract(PlayerInteractEntityEvent event) { return; event.setCancelled(true); - MessagesManager.sendMessage(event.getPlayer(), Component.text("§cVous ne pouvez pas mettre cet item dans un cadre"), Prefix.OPENMC, MessageType.ERROR, false); + MessagesManager.sendMessage(event.getPlayer(), Component.translatable("api.iteminteraction.cant_move_item"), Prefix.OPENMC, MessageType.ERROR, false); } /* @@ -333,7 +333,7 @@ public static void stopInteraction(Player player, String chronometerGroup) { ItemStack oldItem = playerOldItemHand.getOrDefault(player.getUniqueId(), new HashMap<>()).remove(chronometerGroup); if (chronoInfo != null) { - Chronometer.stopChronometer(player, chronoInfo.chronometerGroup(), null, "%null%"); + Chronometer.stopChronometer(player, chronoInfo.chronometerGroup(), null, null); } int slotOfItem = ItemUtils.getSlotOfItem(player, item); diff --git a/src/main/java/fr/openmc/core/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java index 851264b9f..7f7a53084 100644 --- a/src/main/java/fr/openmc/core/OMCPlugin.java +++ b/src/main/java/fr/openmc/core/OMCPlugin.java @@ -45,7 +45,7 @@ import fr.openmc.core.utils.ShutUpOrmLite; import fr.openmc.core.utils.database.DatabaseManager; import fr.openmc.core.utils.errors.ErrorReporter; -import fr.openmc.core.utils.translation.TranslationManager; +import fr.openmc.core.utils.messages.TranslationLoader; import io.papermc.paper.datapack.Datapack; import lombok.Getter; import org.bukkit.Bukkit; @@ -58,6 +58,7 @@ import org.slf4j.Logger; import java.io.File; +import java.util.Locale; public class OMCPlugin extends JavaPlugin { @Getter @@ -114,6 +115,11 @@ public void onEnable() { } new ErrorReporter(); + TranslationLoader.init( + Locale.FRANCE, + Locale.ENGLISH + ); + /* MANAGERS */ TicketManager.loadPlayerStats(new File(this.getDataFolder(), "data/stats")); DatabaseManager.init(); @@ -138,7 +144,6 @@ public void onEnable() { HalloweenManager.init(); MotdUtils.init(); - TranslationManager.init(new File(this.getDataFolder(), "translations"), "fr"); DynamicCooldownManager.init(); MascotsManager.init(); diff --git a/src/main/java/fr/openmc/core/commands/admin/freeze/FreezeListener.java b/src/main/java/fr/openmc/core/commands/admin/freeze/FreezeListener.java index 9ef1c4ed1..76baddaab 100644 --- a/src/main/java/fr/openmc/core/commands/admin/freeze/FreezeListener.java +++ b/src/main/java/fr/openmc/core/commands/admin/freeze/FreezeListener.java @@ -4,6 +4,7 @@ import fr.openmc.core.utils.messages.MessagesManager; import fr.openmc.core.utils.messages.Prefix; import net.kyori.adventure.text.Component; +import net.kyori.adventure.title.TitlePart; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -41,8 +42,9 @@ public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); if (FreezeManager.FROZEN_PLAYERS.contains(player)) { player.setInvulnerable(true); - player.sendTitle("§4Vous êtes freeze", "§5Si vous vous déconnectez, vous serez banni"); - MessagesManager.sendMessage(player, Component.text("§4Vous avez été freeze"), Prefix.OPENMC, MessageType.WARNING, true); + player.sendTitlePart(TitlePart.TITLE, Component.translatable("command.admin.freeze.title.1")); + player.sendTitlePart(TitlePart.SUBTITLE, Component.translatable("command.admin.freeze.title.2")); + MessagesManager.sendMessage(player, Component.translatable("command.admin.freeze.player_freezed"), Prefix.OPENMC, MessageType.WARNING, true); } } diff --git a/src/main/java/fr/openmc/core/commands/admin/freeze/FreezeManager.java b/src/main/java/fr/openmc/core/commands/admin/freeze/FreezeManager.java index 559e41851..8a9589d7a 100644 --- a/src/main/java/fr/openmc/core/commands/admin/freeze/FreezeManager.java +++ b/src/main/java/fr/openmc/core/commands/admin/freeze/FreezeManager.java @@ -5,6 +5,7 @@ import fr.openmc.core.utils.messages.MessagesManager; import fr.openmc.core.utils.messages.Prefix; import net.kyori.adventure.text.Component; +import net.kyori.adventure.title.TitlePart; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -31,22 +32,27 @@ public static void init() { public static void switchFreeze(Player player, Player target) { FreezeManager.player = player; if (target == null) { - MessagesManager.sendMessage(player, Component.text("§4Joueur introuvable"), Prefix.OPENMC, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.translatable("command.admin.freeze.player_not_found"), Prefix.OPENMC, MessageType.ERROR, false); } else { if (FROZEN_PLAYERS.contains(target)) { target.setInvulnerable(false); FROZEN_PLAYERS.remove(target); - MessagesManager.sendMessage(player, Component.text("§2Vous avez unfreeze §6 " + target.getName()), Prefix.OPENMC, MessageType.SUCCESS, false); - MessagesManager.sendMessage(target, Component.text("§4Vous avez été unfreeze"), Prefix.OPENMC, MessageType.INFO, true); + MessagesManager.sendMessage(player, + Component.translatable("command.admin.freeze.player_unfreeze", + Component.text(target.getName())), Prefix.OPENMC, MessageType.SUCCESS, false); + MessagesManager.sendMessage(target, Component.translatable("command.admin.freeze.target_unfreeze"), Prefix.OPENMC, MessageType.INFO, true); } else { target.setInvulnerable(true); Location location = target.getLocation(); location.setY(location.getWorld().getHighestBlockYAt(location) + 1); target.teleport(location); FROZEN_PLAYERS.add(target); - target.sendTitle("§4Vous êtes freeze", "§5Si vous vous déconnectez, vous serez banni"); - MessagesManager.sendMessage(player, Component.text("§2Vous avez freeze §6" + target.getName()), Prefix.OPENMC, MessageType.SUCCESS, false); - MessagesManager.sendMessage(target, Component.text("§4Vous avez été freeze"), Prefix.OPENMC, MessageType.WARNING, true); + target.sendTitlePart(TitlePart.TITLE, Component.translatable("command.admin.freeze.title.1")); + target.sendTitlePart(TitlePart.SUBTITLE, Component.translatable("command.admin.freeze.title.2")); + MessagesManager.sendMessage(player, + Component.translatable("command.admin.freeze.player_freeze", + Component.text(target.getName())), Prefix.OPENMC, MessageType.SUCCESS, false); + MessagesManager.sendMessage(target, Component.translatable("command.admin.freeze.target_freeze"), Prefix.OPENMC, MessageType.WARNING, true); } } } @@ -59,10 +65,10 @@ public static void switchFreeze(Player player, Player target) { public static void contactFreezer(PlayerQuitEvent.QuitReason reason) { if (player == null) return; switch (reason) { - case KICKED -> MessagesManager.sendMessage(player, Component.text("§4Le joueur a été kick"), Prefix.OPENMC, MessageType.INFO, true); - case TIMED_OUT -> MessagesManager.sendMessage(player, Component.text("§4Le joueur a été time out"), Prefix.OPENMC, MessageType.INFO, true); - case ERRONEOUS_STATE -> MessagesManager.sendMessage(player, Component.text("§4Le joueur a eu une erreur de connexion"), Prefix.OPENMC, MessageType.INFO, true); - default -> MessagesManager.sendMessage(player, Component.text("§4Le joueur a été déconnecté"), Prefix.OPENMC, MessageType.INFO, true); + case KICKED -> MessagesManager.sendMessage(player, Component.translatable("command.admin.freeze.quit_reason.kicked"), Prefix.OPENMC, MessageType.INFO, true); + case TIMED_OUT -> MessagesManager.sendMessage(player, Component.translatable("command.admin.freeze.quit_reason.timeout"), Prefix.OPENMC, MessageType.INFO, true); + case ERRONEOUS_STATE -> MessagesManager.sendMessage(player, Component.translatable("command.admin.freeze.quit_reason.error"), Prefix.OPENMC, MessageType.INFO, true); + default -> MessagesManager.sendMessage(player, Component.translatable("command.admin.freeze.quit_reason.default"), Prefix.OPENMC, MessageType.INFO, true); } } } diff --git a/src/main/java/fr/openmc/core/commands/debug/CooldownCommand.java b/src/main/java/fr/openmc/core/commands/debug/CooldownCommand.java index 751a73934..273734854 100644 --- a/src/main/java/fr/openmc/core/commands/debug/CooldownCommand.java +++ b/src/main/java/fr/openmc/core/commands/debug/CooldownCommand.java @@ -15,7 +15,7 @@ public class CooldownCommand { @Command("debug cooldown") @CommandPermission("omc.debug.cooldown") @Description("Test de cooldown") - @DynamicCooldown(group="test", message = "§c%ms% (%sec%s)") + @DynamicCooldown(group="test", messageKey = "command.api.cooldown.debug.must_wait") public void cooldown(Player player, @Named("isSuccess") @Suggest({"success", "error"}) String isSuccess) { if (isSuccess.equals("success")) { player.sendMessage(Component.text("Succès, le cooldown est activé").color(NamedTextColor.GREEN)); diff --git a/src/main/java/fr/openmc/core/commands/fun/Diceroll.java b/src/main/java/fr/openmc/core/commands/fun/Diceroll.java index 8474864a6..31e5d6f9b 100644 --- a/src/main/java/fr/openmc/core/commands/fun/Diceroll.java +++ b/src/main/java/fr/openmc/core/commands/fun/Diceroll.java @@ -18,6 +18,7 @@ public class Diceroll { private void diceroll(Player player) { int result = ThreadLocalRandom.current().nextInt(10) + 1; - MessagesManager.sendMessage(player, Component.text("🎲 Le résultat est: §6" + result + "§r 🎲"), Prefix.OPENMC, MessageType.INFO, true); + MessagesManager.sendMessage(player, Component.translatable("command.fun.diceroll.success", + Component.text(result)), Prefix.OPENMC, MessageType.INFO, true); } } diff --git a/src/main/java/fr/openmc/core/commands/fun/Playtime.java b/src/main/java/fr/openmc/core/commands/fun/Playtime.java index a0dba9c08..a6c47d442 100644 --- a/src/main/java/fr/openmc/core/commands/fun/Playtime.java +++ b/src/main/java/fr/openmc/core/commands/fun/Playtime.java @@ -4,7 +4,6 @@ import fr.openmc.core.utils.messages.MessageType; import fr.openmc.core.utils.messages.MessagesManager; import fr.openmc.core.utils.messages.Prefix; -import fr.openmc.core.utils.translation.TranslationManager; import net.kyori.adventure.text.Component; import org.bukkit.Statistic; import org.bukkit.entity.Player; @@ -18,8 +17,7 @@ public class Playtime { @Description("Donne votre temps de jeu") private void playtime(Player player) { long timePlayed = player.getStatistic(Statistic.PLAY_ONE_MINUTE); - - MessagesManager.sendMessage(player, Component.text(TranslationManager.getTranslation("messages.general.playtime", - "fr", "playTime", DateUtils.convertTime(timePlayed))), Prefix.OPENMC, MessageType.INFO, true); + MessagesManager.sendMessage(player, Component.translatable("command.fun.playtime.success", + Component.text(DateUtils.convertTime(timePlayed))), Prefix.OPENMC, MessageType.INFO, true); } } diff --git a/src/main/java/fr/openmc/core/commands/utils/RTPCommands.java b/src/main/java/fr/openmc/core/commands/utils/RTPCommands.java index acaa9990f..74a820383 100644 --- a/src/main/java/fr/openmc/core/commands/utils/RTPCommands.java +++ b/src/main/java/fr/openmc/core/commands/utils/RTPCommands.java @@ -53,7 +53,7 @@ private void loadRTPConfig() { @CommandPermission("omc.commands.rtp") @DynamicCooldown( group="player:rtp", - message = "§cTu dois attendre avant de pouvoir te rtp (%formatTime%)") + messageKey = "command.utils.rtp.must_wait") @Cooldown(15) public void rtp(Player player) { if (DynamicCooldownManager.isReady(player.getUniqueId(), "player:rtp")) { diff --git a/src/main/java/fr/openmc/core/features/city/CityManager.java b/src/main/java/fr/openmc/core/features/city/CityManager.java index 43c898660..9737b00ec 100644 --- a/src/main/java/fr/openmc/core/features/city/CityManager.java +++ b/src/main/java/fr/openmc/core/features/city/CityManager.java @@ -477,7 +477,7 @@ public static void deleteCity(City city) { if (Chronometer.containsChronometer(memberId, "mascot:stick")) if (Bukkit.getEntity(memberId) != null) - Chronometer.stopChronometer(member, "mascot:stick", null, "%null%"); + Chronometer.stopChronometer(member, "mascot:stick", null, null); Mascot mascot = city.getMascot(); if (mascot == null) diff --git a/src/main/java/fr/openmc/core/features/city/actions/CityCreateAction.java b/src/main/java/fr/openmc/core/features/city/actions/CityCreateAction.java index 1fccfbad0..1e274c142 100644 --- a/src/main/java/fr/openmc/core/features/city/actions/CityCreateAction.java +++ b/src/main/java/fr/openmc/core/features/city/actions/CityCreateAction.java @@ -51,8 +51,8 @@ public static void beginCreateCity(Player player, String cityName) { getMascotStick(), "mascot:stick", 300, - "Vous avez reçu un bâton pour poser votre mascotte", - "§cCréation annulée", + Component.text("Vous avez reçu un bâton pour poser votre mascotte"), + Component.text("§cCréation annulée"), location -> { if (!isValidLocation(player, location)) return false; diff --git a/src/main/java/fr/openmc/core/features/city/actions/CityUnclaimAction.java b/src/main/java/fr/openmc/core/features/city/actions/CityUnclaimAction.java index 2bdacdb99..10b6cbbf3 100644 --- a/src/main/java/fr/openmc/core/features/city/actions/CityUnclaimAction.java +++ b/src/main/java/fr/openmc/core/features/city/actions/CityUnclaimAction.java @@ -9,6 +9,7 @@ import fr.openmc.core.utils.messages.MessagesManager; import fr.openmc.core.utils.messages.Prefix; import net.kyori.adventure.text.Component; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -26,7 +27,7 @@ public static int calculateAywenite(int chunkCount) { public static void startUnclaim(Player sender, int chunkX, int chunkZ) { City city = CityManager.getPlayerCity(sender.getUniqueId()); - org.bukkit.World bWorld = sender.getWorld(); + World bWorld = sender.getWorld(); if (!bWorld.getName().equals("world")) { MessagesManager.sendMessage(sender, Component.text("Tu ne peux pas étendre ta ville ici"), Prefix.CITY, MessageType.ERROR, false); return; @@ -42,14 +43,17 @@ public static void startUnclaim(Player sender, int chunkX, int chunkZ) { return; } - int price = calculatePrice(city.getChunks().size()); - int ayweniteNb = calculateAywenite(city.getChunks().size()); - - EconomyManager.addBalance(sender.getUniqueId(), price, "Unclaim de chunk de ville"); - ItemStack aywenite = ayweniteItemStack.clone(); - aywenite.setAmount(ayweniteNb); - for (ItemStack item : ItemUtils.splitAmountIntoStack(aywenite)) { - sender.dropItem(item); + // si on unclaim des claims gratuits on ne rend rien, sinon on rend une partie de l'argent et d'aywenite + if (city.getChunks().size() > CityCreateAction.FREE_CLAIMS+1) { + int price = calculatePrice(city.getChunks().size()); + int ayweniteNb = calculateAywenite(city.getChunks().size()); + + EconomyManager.addBalance(sender.getUniqueId(), price, "Unclaim de chunk de ville"); + ItemStack aywenite = ayweniteItemStack.clone(); + aywenite.setAmount(ayweniteNb); + for (ItemStack item : ItemUtils.splitAmountIntoStack(aywenite)) { + sender.dropItem(item); + } } city.removeChunk(chunkX, chunkZ); diff --git a/src/main/java/fr/openmc/core/features/city/menu/CityChunkMenu.java b/src/main/java/fr/openmc/core/features/city/menu/CityChunkMenu.java index 553bf95fa..b444fdaa2 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/CityChunkMenu.java +++ b/src/main/java/fr/openmc/core/features/city/menu/CityChunkMenu.java @@ -11,6 +11,7 @@ import fr.openmc.core.features.city.CityManager; import fr.openmc.core.features.city.CityPermission; import fr.openmc.core.features.city.actions.CityClaimAction; +import fr.openmc.core.features.city.actions.CityCreateAction; import fr.openmc.core.features.city.actions.CityUnclaimAction; import fr.openmc.core.features.economy.EconomyManager; import fr.openmc.core.utils.ChunkInfo; @@ -264,9 +265,9 @@ private ItemBuilder createProtectedChunkItem(Material material, int chunkX, int } private ItemBuilder createPlayerCityChunkItem(Material material, City city, int chunkX, int chunkZ) { - return new ItemBuilder(this, material, itemMeta -> { - itemMeta.displayName(Component.text("§9Claim de votre ville")); - itemMeta.lore(List.of( + List lore; + if (city.getChunks().size() > CityCreateAction.FREE_CLAIMS+1) { + lore = List.of( Component.text("§7Ville : §d" + city.getName()), Component.text("§7Position : §f" + chunkX + ", " + chunkZ), Component.empty(), @@ -275,7 +276,19 @@ private ItemBuilder createPlayerCityChunkItem(Material material, City city, int Component.text("§8- §d" + CityUnclaimAction.calculateAywenite(playerCity.getChunks().size()) + " d'Aywenite"), Component.empty(), Component.text("§e§lCLIQUEZ POUR UNCLAIM") - )); + ); + } else { + lore = List.of( + Component.text("§7Ville : §d" + city.getName()), + Component.text("§7Position : §f" + chunkX + ", " + chunkZ), + Component.empty(), + Component.text("§e§lCLIQUEZ POUR UNCLAIM") + ); + } + + return new ItemBuilder(this, material, itemMeta -> { + itemMeta.displayName(Component.text("§9Claim de votre ville")); + itemMeta.lore(lore); }).setOnClick(event -> handleChunkUnclaimClick(player, chunkX, chunkZ, hasPermissionClaim)); } diff --git a/src/main/java/fr/openmc/core/features/city/sub/mascots/menu/MascotMenu.java b/src/main/java/fr/openmc/core/features/city/sub/mascots/menu/MascotMenu.java index 2c02a4e36..f89ae4899 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/mascots/menu/MascotMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/mascots/menu/MascotMenu.java @@ -173,8 +173,8 @@ public void onInventoryClick(InventoryClickEvent inventoryClickEvent) { mascotsMoveItem, "mascots:moveInteraction", 120, - "Temps restant : %sec%s", - "§cDéplacement de la mascotte annulée", + Component.text("Temps restant : %sec%s"), + Component.text("§cDéplacement de la mascotte annulée"), mascotMove -> { if (mascotMove == null) return true; if (!movingMascots.contains(cityUUID)) return false; diff --git a/src/main/java/fr/openmc/core/features/city/sub/mayor/actions/MayorSetWarpAction.java b/src/main/java/fr/openmc/core/features/city/sub/mayor/actions/MayorSetWarpAction.java index b638d2539..f03d0f457 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/mayor/actions/MayorSetWarpAction.java +++ b/src/main/java/fr/openmc/core/features/city/sub/mayor/actions/MayorSetWarpAction.java @@ -44,8 +44,8 @@ public static void setWarp(Player player) { getWarpWand(), "mayor:wait-set-warp", 300, - "§7Vous avez 300s pour sélectionner votre point de spawn", - "§7Vous n'avez pas eu le temps de poser votre warp", + Component.text("§7Vous avez 300s pour sélectionner votre point de spawn"), + Component.text("§7Vous n'avez pas eu le temps de poser votre warp"), locationClick -> { if (locationClick == null) return true; Chunk chunk = locationClick.getChunk(); diff --git a/src/main/java/fr/openmc/core/features/city/sub/mayor/managers/NPCManager.java b/src/main/java/fr/openmc/core/features/city/sub/mayor/managers/NPCManager.java index b0b6cbf30..b596da6a0 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/mayor/managers/NPCManager.java +++ b/src/main/java/fr/openmc/core/features/city/sub/mayor/managers/NPCManager.java @@ -236,8 +236,8 @@ public void onInteractWithMayorNPC(NpcInteractEvent event) { itemToGive, "mayor:mayor-npc-move", 300, - "§7Vous avez 300s pour sélectionner votre emplacement", - "§7Vous n'avez pas eu le temps de déplacer votre NPC", + Component.text("§7Vous avez 300s pour sélectionner votre emplacement"), + Component.text("§7Vous n'avez pas eu le temps de déplacer votre NPC"), locationClick -> { if (locationClick == null) return true; @@ -322,8 +322,8 @@ public void onInteractWithMayorNPC(NpcInteractEvent event) { itemToGive, "mayor:owner-npc-move", 300, - "§7Vous avez 300s pour sélectionner votre emplacement", - "§7Vous n'avez pas eu le temps de déplacer votre NPC", + Component.text("§7Vous avez 300s pour sélectionner votre emplacement"), + Component.text("§7Vous n'avez pas eu le temps de déplacer votre NPC"), locationClick -> { if (locationClick == null) return true; diff --git a/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/MayorNpcMenu.java b/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/MayorNpcMenu.java index 5bca11743..25bbc6c48 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/MayorNpcMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/MayorNpcMenu.java @@ -128,8 +128,8 @@ public void onClose(InventoryCloseEvent event) { itemToGive, "mayor:owner-npc-move", 300, - "§7Vous avez 300s pour sélectionner votre emplacement", - "§7Vous n'avez pas eu le temps de déplacer votre NPC", + Component.text("§7Vous avez 300s pour sélectionner votre emplacement"), + Component.text("§7Vous n'avez pas eu le temps de déplacer votre NPC"), locationClick -> { if (locationClick == null) return true; diff --git a/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/OwnerNpcMenu.java b/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/OwnerNpcMenu.java index a319895a6..e21ffa4c9 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/OwnerNpcMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/OwnerNpcMenu.java @@ -167,8 +167,8 @@ public void onClose(InventoryCloseEvent event) { itemToGive, "mayor:owner-npc-move", 300, - "§7Vous avez 300s pour sélectionner votre emplacement", - "§7Vous n'avez pas eu le temps de déplacer votre NPC", + Component.text("§7Vous avez 300s pour sélectionner votre emplacement"), + Component.text("§7Vous n'avez pas eu le temps de déplacer votre NPC"), locationClick -> { if (locationClick == null) return true; diff --git a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java index 89e7b63db..33ba1ebc2 100644 --- a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java +++ b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java @@ -3,6 +3,7 @@ import de.oliver.fancynpcs.api.FancyNpcsPlugin; import de.oliver.fancynpcs.api.Npc; import de.oliver.fancynpcs.api.NpcManager; +import fr.openmc.api.hooks.FancyNpcsHook; import fr.openmc.api.hooks.LuckPermsHook; import fr.openmc.api.hooks.WorldGuardHook; import fr.openmc.api.scoreboard.SternalBoard; @@ -61,9 +62,6 @@ public void update(Player player, SternalBoard board) { } public static List getDefaultLines(Player player) { - NpcManager npcManager = FancyNpcsPlugin.get().getNpcManager(); - Npc halloweenNPC = npcManager.getNpc("halloween_pumpkin_deposit_npc"); - Component rank = LuckPermsHook.isHasLuckPerms() ? Component.text(LuckPermsHook.getFormattedPAPIPrefix(player)) : Component.text(textToSmall("aucun")).color(TextColor.color(0xFF1FCC)); @@ -102,13 +100,18 @@ public static List getDefaultLines(Player player) { .appendSpace() .append(text(textToSmall(location)).color(TextColor.color(0xFF06DC))) ); - if (halloweenNPC != null) { - String pumpkinCount = EconomyManager.getFormattedSimplifiedNumber(HalloweenManager.getPumpkinCount(player.getUniqueId())); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("citrouilles:"), NamedTextColor.GRAY)) - .appendSpace() - .append(text(textToSmall(pumpkinCount)).color(TextColor.color(0xFF7518))) - ); + + if (FancyNpcsHook.isHasFancyNpc()) { + NpcManager npcManager = FancyNpcsPlugin.get().getNpcManager(); + Npc halloweenNPC = npcManager.getNpc("halloween_pumpkin_deposit_npc"); + if (halloweenNPC != null) { + String pumpkinCount = EconomyManager.getFormattedSimplifiedNumber(HalloweenManager.getPumpkinCount(player.getUniqueId())); + lines.add(text(" • ", NamedTextColor.DARK_GRAY) + .append(text(textToSmall("citrouilles:"), NamedTextColor.GRAY)) + .appendSpace() + .append(text(textToSmall(pumpkinCount)).color(TextColor.color(0xFF7518))) + ); + } } lines.add(newline()); diff --git a/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarRecipes.java b/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarRecipes.java index 3904d08de..b053c56e2 100644 --- a/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarRecipes.java +++ b/src/main/java/fr/openmc/core/features/dream/mecanism/altar/AltarRecipes.java @@ -19,7 +19,7 @@ public enum AltarRecipes { 10 ), SOUL_CHESTPLATE( - DreamItemRegistry.getByName("omc_dream:old_creaking_chesplate"), + DreamItemRegistry.getByName("omc_dream:old_creaking_chestplate"), DreamItemRegistry.getByName("omc_dream:soul_chestplate"), 10 ), diff --git a/src/main/java/fr/openmc/core/features/dream/registries/items/tools/SoulAxe.java b/src/main/java/fr/openmc/core/features/dream/registries/items/tools/SoulAxe.java index aae13e003..16f619070 100644 --- a/src/main/java/fr/openmc/core/features/dream/registries/items/tools/SoulAxe.java +++ b/src/main/java/fr/openmc/core/features/dream/registries/items/tools/SoulAxe.java @@ -13,7 +13,7 @@ public SoulAxe(String name) { @Override public DreamRarity getRarity() { - return DreamRarity.COMMON; + return DreamRarity.RARE; } @Override diff --git a/src/main/java/fr/openmc/core/features/leaderboards/LeaderboardManager.java b/src/main/java/fr/openmc/core/features/leaderboards/LeaderboardManager.java index fd7da9e8d..fa688a272 100644 --- a/src/main/java/fr/openmc/core/features/leaderboards/LeaderboardManager.java +++ b/src/main/java/fr/openmc/core/features/leaderboards/LeaderboardManager.java @@ -91,6 +91,9 @@ public static Component createContributorsTextLeaderboard() { int rank = entry.getKey(); String contributorName = entry.getValue().getKey(); ContributorStats stats = entry.getValue().getValue(); + + if (contributorName == null || stats == null) continue; + int addLines = stats.added(); int removeLines = stats.removed(); Component line = Component.text("\n#") @@ -126,6 +129,9 @@ public static Component createMoneyTextLeaderboard() { int rank = entry.getKey(); String playerName = entry.getValue().getKey(); String money = entry.getValue().getValue(); + + if (playerName == null || money == null) continue; + Component line = Component.text("\n#") .color(getRankColor(rank)) .append(Component.text(rank).color(getRankColor(rank))) @@ -157,6 +163,9 @@ public static Component createCityMoneyTextLeaderboard() { int rank = entry.getKey(); String cityName = entry.getValue().getKey(); String money = entry.getValue().getValue(); + + if (cityName == null || money == null) continue; + Component line = Component.text("\n#") .color(getRankColor(rank)) .append(Component.text(rank).color(getRankColor(rank))) @@ -188,6 +197,9 @@ public static Component createPlayTimeTextLeaderboard() { int rank = entry.getKey(); String playerName = entry.getValue().getKey(); String time = entry.getValue().getValue(); + + if (playerName == null || time == null) continue; + Component line = Component.text("\n#") .color(getRankColor(rank)) .append(Component.text(rank).color(getRankColor(rank))) @@ -214,6 +226,9 @@ public static Component createPumpkinCountTextLeaderboard() { int rank = entry.getKey(); String playerName = entry.getValue().getKey(); String pumpkinCount = entry.getValue().getValue(); + + if (playerName == null || pumpkinCount == null) continue; + Component line = Component.text("\n#") .color(getRankColor(rank)) .append(Component.text(rank).color(getRankColor(rank))) diff --git a/src/main/java/fr/openmc/core/listeners/ChronometerListener.java b/src/main/java/fr/openmc/core/listeners/ChronometerListener.java index 8eb6b8143..e8d7b3f34 100644 --- a/src/main/java/fr/openmc/core/listeners/ChronometerListener.java +++ b/src/main/java/fr/openmc/core/listeners/ChronometerListener.java @@ -8,6 +8,6 @@ public class ChronometerListener implements Listener { @EventHandler public void onDisconnection(PlayerQuitEvent e){ - Chronometer.stopAllChronometer(e.getPlayer(), null, "%null%"); + Chronometer.stopAllChronometer(e.getPlayer(), null, null); } } diff --git a/src/main/java/fr/openmc/core/utils/messages/TranslationLoader.java b/src/main/java/fr/openmc/core/utils/messages/TranslationLoader.java new file mode 100644 index 000000000..eae54ce6f --- /dev/null +++ b/src/main/java/fr/openmc/core/utils/messages/TranslationLoader.java @@ -0,0 +1,32 @@ +package fr.openmc.core.utils.messages; + +import fr.openmc.core.OMCPlugin; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.minimessage.translation.MiniMessageTranslationStore; +import net.kyori.adventure.translation.GlobalTranslator; +import net.kyori.adventure.translation.TranslationStore; +import net.kyori.adventure.util.UTF8ResourceBundleControl; + +import java.text.MessageFormat; +import java.util.Locale; +import java.util.ResourceBundle; + +public class TranslationLoader { + + /** + * Initialize the translation system with the given supported languages. + * The translations should be in the "resources.translations" package, in a file named "lang_xx_XX.properties" where xx is the language code (ex. "fr_FR" for French). + * @param langsSuppoorted the supported languages (ex. Locale.FRANCE, Locale.ENGLISH, etc.) + */ + public static void init(Locale... langsSuppoorted) { + MiniMessageTranslationStore store = MiniMessageTranslationStore.create(Key.key("openmc:translations")); + + for (Locale locale : langsSuppoorted) { + ResourceBundle bundle = ResourceBundle.getBundle("translations.lang", locale, UTF8ResourceBundleControl.utf8ResourceBundleControl()); + store.registerAll(locale, bundle, true); + OMCPlugin.getInstance().getSLF4JLogger().info("\u001B[32m✔ Chargement de la langue {} !\u001B[0m", locale.getDisplayName()); + } + + GlobalTranslator.translator().addSource(store); + } +} diff --git a/src/main/java/fr/openmc/core/utils/translation/TranslationManager.java b/src/main/java/fr/openmc/core/utils/translation/TranslationManager.java deleted file mode 100644 index 3bd84e8bd..000000000 --- a/src/main/java/fr/openmc/core/utils/translation/TranslationManager.java +++ /dev/null @@ -1,132 +0,0 @@ -package fr.openmc.core.utils.translation; - -import fr.openmc.core.OMCPlugin; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - - -public class TranslationManager { - - private static String defaultLanguage; - private static File translationFolder; - private static final Map loadedLanguages = new HashMap<>(); - - public static void init(File inTranslationFolder, String inDefaultLanguage) { - defaultLanguage = inDefaultLanguage; - translationFolder = inTranslationFolder; - - loadAllLanguages(); - } - - /** - * Returns a string corresponding to the specified path and the language. - * - * @param path The path to the translation, "default" for default language - * @param language The language of the translation - */ - public static String getTranslation(String path, String language) { - FileConfiguration languageConfig = loadedLanguages.get(language); - loadedLanguages.get(defaultLanguage); - if (languageConfig != null || Objects.equals(language, defaultLanguage)) { - return languageConfig.getString(path, "Missing translation for path: " + path); - } else { - return getTranslation(path); - } - } - - /** - * Returns a string corresponding to the specified path and the language and replaces the given placeholders with the values. - * - * @param path The path to the translation - * @param language The language of the translation, "default" for default language - * @param placeholders The placeholders you want to replace in a pair with values ("player", player.getName()) - */ - public static String getTranslation(String path, String language, String... placeholders) { - return replacePlaceholders(getTranslation(path, language), placeholders); - } - - /** - * Returns a string corresponding to the specified path and the default language. - * - * @param path The path to the translation - */ - public static String getTranslation(String path) { - return getTranslation(path, defaultLanguage); - } - - - /** - * Loads the specified language if it is present in the translations' folder. - * - * @param language The language to load - */ - public static void loadLanguage(String language) { - - File languageFile = new File(translationFolder, language + ".yml"); - - if (!languageFile.exists()) { - try { - OMCPlugin.getInstance().saveResource(translationFolder.getPath() + language + ".yml", false); - OMCPlugin.getInstance().getSLF4JLogger().info("Language {} not found, creating a new one from default template.", language); - } - catch (Exception ignored) { - OMCPlugin.getInstance().getSLF4JLogger().error("Failed to load the default language file: {}.yml. Please ensure it exists in the translations folder in the jar file.", language); - return; - } - } - - if (languageFile.exists()) { - loadedLanguages.put(language, YamlConfiguration.loadConfiguration(languageFile)); - OMCPlugin.getInstance().getSLF4JLogger().info("Language {} loaded successfully.", language); - } - } - - /** - * Replaces the keys (between {}) in a String with the value Strings. - * - * @param text The string to modify - * @param placeholders The placeholders you want to replace in a pair with values ("player", player.getName()) - */ - public static String replacePlaceholders(String text, String... placeholders) { - for (int i = 0; i < placeholders.length; i += 2) { - String key = placeholders[i]; - String value = placeholders[i + 1]; - text = text.replace("{" + key + "}", value); - } - return text; - } - - /** - * Loads all the languages present in the translations folder. - */ - public static void loadAllLanguages() { - if (!translationFolder.exists()) { - translationFolder.mkdirs(); - - // List of default languages - String[] defaultLanguages = {"fr"}; - - for (String lang : defaultLanguages) { - String resourcePath = "translations/" + lang + ".yml"; - File targetFile = new File(translationFolder, lang + ".yml"); - - if (!targetFile.exists()) { - OMCPlugin.getInstance().saveResource(resourcePath, false); - } - } - } - - File[] files = translationFolder.listFiles((dir, name) -> name.endsWith(".yml")); - if (files!=null) { - for (File file: files) { - loadLanguage(file.getName().replace(".yml", "")); - } - } - - } -} diff --git a/src/main/resources/translations/fr.yml b/src/main/resources/translations/fr.yml deleted file mode 100644 index 55402d851..000000000 --- a/src/main/resources/translations/fr.yml +++ /dev/null @@ -1,3 +0,0 @@ -messages: - general: - playtime: "Vous avez {playTime} §7de temps de jeu." diff --git a/src/main/resources/translations/lang.properties b/src/main/resources/translations/lang.properties new file mode 100644 index 000000000..2872a276a --- /dev/null +++ b/src/main/resources/translations/lang.properties @@ -0,0 +1,47 @@ +# Language file for the plugin +# Native language: French + +# ** API ** +api.chronometer.chronometer_not_found=Aucun chronomètre trouvé pour le groupe +api.chronometer.chronometer_on=Chronomètres actifs : +api.chronometer.chronometer_on_list= - : s +api.chronometer.none_chronometer_player=Ce joueur n'a aucun chronomètre actif. + +# | Le temps restant en secondes +# | Le temps restant en millisecondes +api.cooldown.must_wait=Vous devez attendre s + +api.iteminteraction.not_egnough_space=Vous n'avez pas assez de place dans votre inventaire ! L'action a été annulée +api.iteminteraction.have_already_item=Vous avez déjà cet objet dans votre inventaire ! L'action a été annulée +api.iteminteraction.cant_move_item=Vous ne pouvez pas déplacer cet objet ici +api.iteminteraction.cant_move_item_by_shiftclick=Vous ne pouvez pas déplacer cet objet par shift-click +api.iteminteraction.cant_throw_item=Vous ne pouvez pas jeter cet objet + +api.chatinput.cancel=Vous avez annulé l'action + +api.dialoginput.type_string=Rentrer du texte +api.dialoginput.type_string.here=Rentrer du texte ici + +api.dialoginput.type_float=Rentrer un nombre +api.dialoginput.type_float.here=Rentrer un nombre ici + +# ** COMMANDS ** +command.api.cooldown.debug.must_wait= (s) + +command.fun.playtime.success=Vous avez de temps de jeu. +command.fun.diceroll.success=Le résultat est: + +command.admin.freeze.title.1=Vous êtes freeze +command.admin.freeze.title.2=Si vous vous déconnectez, vous serez banni +command.admin.freeze.player_freezed=Vous avez été freeze +command.admin.freeze.player_not_found=Joueur introuvable +command.admin.freeze.player_unfreeze=Vous avez unfreeze +command.admin.freeze.target_unfreeze=Vous avez été unfreeze +command.admin.freeze.player_freeze=Vous avez freeze +command.admin.freeze.target_freeze=Vous avez été freeze +command.admin.freeze.quit_reason.kicked=Le joueur a été kick +command.admin.freeze.quit_reason.timeout=Le joueur a été time out +command.admin.freeze.quit_reason.error=Le joueur a eu une erreur de connexion +command.admin.freeze.quit_reason.default=Le joueur a été déconnecter + +command.utils.rtp.must_wait=Tu dois attendre avant de pouvoir te rtp () \ No newline at end of file diff --git a/src/main/resources/translations/lang_en.properties b/src/main/resources/translations/lang_en.properties new file mode 100644 index 000000000..87d7c49cf --- /dev/null +++ b/src/main/resources/translations/lang_en.properties @@ -0,0 +1 @@ +command.fun.playtime.success=You have of playtime.