diff --git a/src/main/java/fr/openmc/core/features/credits/Credits.java b/src/main/java/fr/openmc/core/features/credits/Credits.java index 0fc5a29fd..13db4fa93 100644 --- a/src/main/java/fr/openmc/core/features/credits/Credits.java +++ b/src/main/java/fr/openmc/core/features/credits/Credits.java @@ -33,47 +33,47 @@ @Getter public enum Credits { - ADMINSHOP(Material.GOLD_INGOT, "Adminshop", AdminShopManager.class), - ANIMATIONS(Material.AMETHYST_BLOCK, "Les Animations", AnimationsManager.class), - CUBE(Material.LAPIS_BLOCK, "Le Cube", Set.of("iambibi_")), - CITY(CustomItemRegistry.getByName("omc_homes:omc_homes_icon_chateau").getBest(), "Les Villes", CityManager.class), - DREAM(Material.SCULK, "La Dimension des Rêves", DreamManager.class), - DREAM_MILESTONE(CustomItemRegistry.getByName("omc_dream:singularity").getBest(), "Le Milestone des Rêves", Set.of("gab400", "Rylo42 (histoire et dialogues)")), - MASCOTS(Material.ZOMBIE_SPAWN_EGG, "Les Mascottes", MascotsManager.class), - MAYOR(CustomItemRegistry.getByName("omc_homes:omc_homes_icon_bank").getBest(), "Les Maires", Set.of("iambibi_"), Set.of("Gexary")), - CITY_MILESTONE(Material.NETHER_STAR, "Le Milestone des Villes", Set.of("iambibi_")), - WAR(Material.IRON_SWORD, "Les Guerres", Set.of("iambibi_")), - NOTATION(Material.PAPER, "Les Notations", Set.of("iambibi_")), - RANK(Material.VAULT, "Les Grades", Set.of("gab400")), - CONTEST(CustomItemRegistry.getByName("omc_contest:contest_shell").getBest(), "Les Contests", ContestManager.class), - WEEKLY_EVENTS(Material.FIREWORK_ROCKET, "Les Evenements Hebdomadaires", WeeklyEventsManager.class), - HOLOGRAMS(Material.OAK_HANGING_SIGN, "Les Hologrammes", HologramLoader.class), - ECONOMY(Material.GOLD_BLOCK, "L'Economie", EconomyManager.class), - FRIENDS(Material.EMERALD_BLOCK, "Le systeme d'ami", FriendManager.class), - HOMES(CustomItemRegistry.getByName("omc_homes:omc_homes_icon_maison").getBest(), "Le Systeme d'Home", HomesManager.class), - LEADERBOARD(Material.ANCIENT_DEBRIS, "Les Classements", LeaderboardManager.class), - MAILBOX(Material.PAPER, "La Boite aux Lettres", MailboxManager.class), - MAINMENU(CustomItemRegistry.getByName("omc_homes:omc_homes_icon_information").getBest(), "Le Menu Principal", MainMenu.class), - MILESTONES(Material.SEA_LANTERN, "Les Milestones", MilestonesManager.class), - PRIVATEMESSAGE(Material.ZOMBIE_HEAD, "Les messages privés", PrivateMessageManager.class), - QUEST(CustomItemRegistry.getByName("omc_homes:omc_homes_icon_chateau").getBest(), "Les Quêtes", QuestsManager.class), - SETTINGS(Material.REDSTONE_TORCH, "Les Paramêtres", PlayerSettingsManager.class), - TICKETS(Material.BOOK, "Les Tickets V1", TicketManager.class), - TPA(Material.ENDER_PEARL, "Le Tpa", TPAManager.class), - RTP(Material.ENDER_PEARL, "Le RTP", Set.of("miseur")), - VERSIONNING(Material.COMMAND_BLOCK_MINECART, "Le Versionning", Set.of("Piquel Chips")), - CUSTOMITEMS(Material.COMMAND_BLOCK, "Les Custom Items", Set.of("Axeno")), - CHRONOMETER(Material.COMMAND_BLOCK, "Chronomêtre", Set.of("Nocolm")), - COOLDOWN(Material.COMMAND_BLOCK, "Cooldown", Set.of("Gyro", "iambibi_")), - MENU_LIB(Material.COMMAND_BLOCK, "Systeme de Menu", Set.of("Xernas78", "PuppyTransGirl", "iambibi_", "gab400")), - PACKET_MENU_LIB(Material.COMMAND_BLOCK, "Systeme de Menu en Packet", Set.of("miseur")), - ERRORHANDLER(Material.COMMAND_BLOCK, "Le systeme de gestion d'erreur", Set.of("iambibi_")), - UNITTEST(Material.COMMAND_BLOCK, "Les tests unitaires", Set.of("Nirbose", "Gyro")), - ORM(Material.COMMAND_BLOCK, "Systeme de base de données", Set.of("Piquel Chips")), + ADMINSHOP(Material.GOLD_INGOT, "feature.credits.feature.adminshop", AdminShopManager.class), + ANIMATIONS(Material.AMETHYST_BLOCK, "feature.credits.feature.animations", AnimationsManager.class), + CUBE(Material.LAPIS_BLOCK, "feature.credits.feature.cube", Set.of("iambibi_")), + CITY(CustomItemRegistry.getByName("omc_homes:omc_homes_icon_chateau").getBest(), "feature.credits.feature.city", CityManager.class), + DREAM(Material.SCULK, "feature.credits.feature.dream", DreamManager.class), + DREAM_MILESTONE(CustomItemRegistry.getByName("omc_dream:singularity").getBest(), "feature.credits.feature.dream_milestone", Set.of("gab400", "Rylo42 (histoire et dialogues)")), + MASCOTS(Material.ZOMBIE_SPAWN_EGG, "feature.credits.feature.mascots", MascotsManager.class), + MAYOR(CustomItemRegistry.getByName("omc_homes:omc_homes_icon_bank").getBest(), "feature.credits.feature.mayor", Set.of("iambibi_"), Set.of("Gexary")), + CITY_MILESTONE(Material.NETHER_STAR, "feature.credits.feature.city_milestone", Set.of("iambibi_")), + WAR(Material.IRON_SWORD, "feature.credits.feature.war", Set.of("iambibi_")), + NOTATION(Material.PAPER, "feature.credits.feature.notation", Set.of("iambibi_")), + RANK(Material.VAULT, "feature.credits.feature.rank", Set.of("gab400")), + CONTEST(CustomItemRegistry.getByName("omc_contest:contest_shell").getBest(), "feature.credits.feature.contest", ContestManager.class), + WEEKLY_EVENTS(Material.FIREWORK_ROCKET, "feature.credits.feature.weekly_events", WeeklyEventsManager.class), + HOLOGRAMS(Material.OAK_HANGING_SIGN, "feature.credits.feature.holograms", HologramLoader.class), + ECONOMY(Material.GOLD_BLOCK, "feature.credits.feature.economy", EconomyManager.class), + FRIENDS(Material.EMERALD_BLOCK, "feature.credits.feature.friends", FriendManager.class), + HOMES(CustomItemRegistry.getByName("omc_homes:omc_homes_icon_maison").getBest(), "feature.credits.feature.homes", HomesManager.class), + LEADERBOARD(Material.ANCIENT_DEBRIS, "feature.credits.feature.leaderboard", LeaderboardManager.class), + MAILBOX(Material.PAPER, "feature.credits.feature.mailbox", MailboxManager.class), + MAINMENU(CustomItemRegistry.getByName("omc_homes:omc_homes_icon_information").getBest(), "feature.credits.feature.mainmenu", MainMenu.class), + MILESTONES(Material.SEA_LANTERN, "feature.credits.feature.milestones", MilestonesManager.class), + PRIVATEMESSAGE(Material.ZOMBIE_HEAD, "feature.credits.feature.privatemessage", PrivateMessageManager.class), + QUEST(CustomItemRegistry.getByName("omc_homes:omc_homes_icon_chateau").getBest(), "feature.credits.feature.quest", QuestsManager.class), + SETTINGS(Material.REDSTONE_TORCH, "feature.credits.feature.settings", PlayerSettingsManager.class), + TICKETS(Material.BOOK, "feature.credits.feature.tickets", TicketManager.class), + TPA(Material.ENDER_PEARL, "feature.credits.feature.tpa", TPAManager.class), + RTP(Material.ENDER_PEARL, "feature.credits.feature.rtp", Set.of("miseur")), + VERSIONNING(Material.COMMAND_BLOCK_MINECART, "feature.credits.feature.versionning", Set.of("Piquel Chips")), + CUSTOMITEMS(Material.COMMAND_BLOCK, "feature.credits.feature.customitems", Set.of("Axeno")), + CHRONOMETER(Material.COMMAND_BLOCK, "feature.credits.feature.chronometer", Set.of("Nocolm")), + COOLDOWN(Material.COMMAND_BLOCK, "feature.credits.feature.cooldown", Set.of("Gyro", "iambibi_")), + MENU_LIB(Material.COMMAND_BLOCK, "feature.credits.feature.menu_lib", Set.of("Xernas78", "PuppyTransGirl", "iambibi_", "gab400")), + PACKET_MENU_LIB(Material.COMMAND_BLOCK, "feature.credits.feature.packet_menu_lib", Set.of("miseur")), + ERRORHANDLER(Material.COMMAND_BLOCK, "feature.credits.feature.errorhandler", Set.of("iambibi_")), + UNITTEST(Material.COMMAND_BLOCK, "feature.credits.feature.unittest", Set.of("Nirbose", "Gyro")), + ORM(Material.COMMAND_BLOCK, "feature.credits.feature.orm", Set.of("Piquel Chips")), ; private final ItemStack icon; - private final String featureName; + private final String featureKey; private final Set developpers; private final Set graphists; private final Set builders; @@ -81,12 +81,12 @@ public enum Credits { /** * Constructeur qui récupère automatiquement les contributeurs de la classe Feature via annotation. * @param icon Icône du crédit - * @param featureName Nom de la feature + * @param featureKey Translation key de la feature * @param featureClass Classe Feature (ex: AdminShopManager.class) */ - Credits(Material icon, String featureName, Class featureClass) { + Credits(Material icon, String featureKey, Class featureClass) { this.icon = ItemStack.of(icon); - this.featureName = featureName; + this.featureKey = featureKey; var contributors = getContributorsFromClass(featureClass); this.developpers = contributors[0]; this.graphists = contributors[1]; @@ -96,61 +96,61 @@ public enum Credits { /** * Constructeur qui récupère automatiquement les contributeurs de la classe Feature via annotation. * @param icon Icône du crédit (ItemStack) - * @param featureName Nom de la feature + * @param featureKey La translation key de la feature * @param featureClass Classe Feature (ex: AdminShopManager.class) */ - Credits(ItemStack icon, String featureName, Class featureClass) { + Credits(ItemStack icon, String featureKey, Class featureClass) { this.icon = icon; - this.featureName = featureName; + this.featureKey = featureKey; var contributors = getContributorsFromClass(featureClass); this.developpers = contributors[0]; this.graphists = contributors[1]; this.builders = contributors[2]; } - Credits(Material icon, String featureName, Set developpers) { + Credits(Material icon, String featureKey, Set developpers) { this.icon = ItemStack.of(icon); this.developpers = developpers; - this.featureName = featureName; + this.featureKey = featureKey; this.graphists = Set.of(); this.builders = Set.of(); } - Credits(ItemStack icon, String featureName, Set developpers) { + Credits(ItemStack icon, String featureKey, Set developpers) { this.icon = icon; this.developpers = developpers; - this.featureName = featureName; + this.featureKey = featureKey; this.graphists = Set.of(); this.builders = Set.of(); } - Credits(ItemStack icon, String featureName, Set developpers, Set graphists) { + Credits(ItemStack icon, String featureKey, Set developpers, Set graphists) { this.icon = icon; - this.featureName = featureName; + this.featureKey = featureKey; this.developpers = developpers; this.graphists = graphists; this.builders = Set.of(); } - Credits(Material icon, String featureName, Set developpers, Set graphists) { + Credits(Material icon, String featureKey, Set developpers, Set graphists) { this.icon = ItemStack.of(icon); - this.featureName = featureName; + this.featureKey = featureKey; this.developpers = developpers; this.graphists = graphists; this.builders = Set.of(); } - Credits(ItemStack icon, String featureName, Set developpers, Set graphists, Set builders) { + Credits(ItemStack icon, String featureKey, Set developpers, Set graphists, Set builders) { this.icon = icon; - this.featureName = featureName; + this.featureKey = featureKey; this.developpers = developpers; this.graphists = graphists; this.builders = builders; } - Credits(Material icon, String featureName, Set developpers, Set graphists, Set builders) { + Credits(Material icon, String featureKey, Set developpers, Set graphists, Set builders) { this.icon = ItemStack.of(icon); - this.featureName = featureName; + this.featureKey = featureKey; this.developpers = developpers; this.graphists = graphists; this.builders = builders; diff --git a/src/main/java/fr/openmc/core/features/credits/CreditsMenu.java b/src/main/java/fr/openmc/core/features/credits/CreditsMenu.java index 75eda7f19..3e272587f 100644 --- a/src/main/java/fr/openmc/core/features/credits/CreditsMenu.java +++ b/src/main/java/fr/openmc/core/features/credits/CreditsMenu.java @@ -6,7 +6,9 @@ import fr.openmc.api.menulib.utils.ItemUtils; import fr.openmc.api.menulib.utils.StaticSlots; import fr.openmc.core.registry.items.CustomItemRegistry; +import fr.openmc.core.utils.text.messages.TranslationManager; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -51,16 +53,26 @@ public int getSizeOfItems() { for (Credits credit : Credits.values()) { List lore = new ArrayList<>(); - lore.add(Component.text("§7Développeur(s) : §9" + String.join(", ", credit.getDeveloppers()))); + lore.addAll(TranslationManager.translationLore( + "feature.credits.menu.lore.developers", + Component.text(String.join(", ", credit.getDeveloppers())).color(NamedTextColor.BLUE) + )); if (!credit.getGraphists().isEmpty()) { - lore.add(Component.text("§7Graphiste(s) : §6" + String.join(", ", credit.getGraphists()))); + lore.addAll(TranslationManager.translationLore( + "feature.credits.menu.lore.graphists", + Component.text(String.join(", ", credit.getGraphists())).color(NamedTextColor.GOLD) + )); } if (!credit.getBuilders().isEmpty()) { - lore.add(Component.text("§7Builder(s) : §a" + String.join(", ", credit.getBuilders()))); + lore.addAll(TranslationManager.translationLore( + "feature.credits.menu.lore.builders", + Component.text(String.join(", ", credit.getBuilders())).color(NamedTextColor.GREEN) + )); } ItemBuilder item = new ItemBuilder(this, credit.getIcon(), itemMeta -> { - itemMeta.displayName(Component.text("§e" + credit.getFeatureName()) + itemMeta.displayName(TranslationManager.translation(credit.getFeatureKey()) + .color(NamedTextColor.YELLOW) .decoration(TextDecoration.ITALIC, false)); itemMeta.lore(lore); }).hide(ItemUtils.getDataComponentType()); @@ -75,10 +87,10 @@ public int getSizeOfItems() { public Map getButtons() { Map map = new HashMap<>(); - map.put(48, new ItemBuilder(this, Objects.requireNonNull(CustomItemRegistry.getByName("_iainternal:icon_back_orange")).getBest(), itemMeta -> itemMeta.displayName(Component.text("§cPage précédente"))).setPreviousPageButton()); - map.put(50, new ItemBuilder(this, Objects.requireNonNull(CustomItemRegistry.getByName("_iainternal:icon_next_orange")).getBest(), itemMeta -> itemMeta.displayName(Component.text("§aPage suivante"))).setNextPageButton()); + map.put(48, new ItemBuilder(this, Objects.requireNonNull(CustomItemRegistry.getByName("_iainternal:icon_back_orange")).getBest(), itemMeta -> itemMeta.displayName(TranslationManager.translation("messages.menus.previous_page"))).setPreviousPageButton()); + map.put(50, new ItemBuilder(this, Objects.requireNonNull(CustomItemRegistry.getByName("_iainternal:icon_next_orange")).getBest(), itemMeta -> itemMeta.displayName(TranslationManager.translation("messages.menus.next_page"))).setNextPageButton()); map.put(49, new ItemBuilder(this, Material.BARRIER, meta -> { - meta.displayName(Component.text("§cFermer le menu")); + meta.displayName(TranslationManager.translation("feature.credits.menu.close")); }).setOnClick(e -> getOwner().closeInventory())); return map; @@ -86,7 +98,7 @@ public Map getButtons() { @Override public @NotNull Component getName() { - return Component.text("Crédits du serveur"); + return TranslationManager.translation("feature.credits.menu.title"); } @Override diff --git a/src/main/java/fr/openmc/core/features/cube/Cube.java b/src/main/java/fr/openmc/core/features/cube/Cube.java index d15d4ac9d..e43d65a9d 100644 --- a/src/main/java/fr/openmc/core/features/cube/Cube.java +++ b/src/main/java/fr/openmc/core/features/cube/Cube.java @@ -4,6 +4,7 @@ import fr.openmc.core.features.cube.listeners.RepulseEffectListener; import fr.openmc.core.features.cube.multiblocks.MultiBlock; import fr.openmc.core.features.dream.DreamUtils; +import fr.openmc.core.utils.text.messages.TranslationManager; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; @@ -36,7 +37,7 @@ public Cube(Location origin, int size, Material material, boolean showBossBar) { // ## BOSS BAR ## if (showBossBar) { - cubeBossBar = Bukkit.createBossBar("Le Cube", BarColor.BLUE, BarStyle.SEGMENTED_6, BarFlag.CREATE_FOG, BarFlag.DARKEN_SKY); + cubeBossBar = Bukkit.createBossBar(TranslationManager.translationString("feature.cube.bossbar.title"), BarColor.BLUE, BarStyle.SEGMENTED_6, BarFlag.CREATE_FOG, BarFlag.DARKEN_SKY); cubeBossBar.setVisible(true); startBossBarUpdater(); diff --git a/src/main/java/fr/openmc/core/features/cube/CubeCommands.java b/src/main/java/fr/openmc/core/features/cube/CubeCommands.java index cd769f227..378057880 100644 --- a/src/main/java/fr/openmc/core/features/cube/CubeCommands.java +++ b/src/main/java/fr/openmc/core/features/cube/CubeCommands.java @@ -5,7 +5,9 @@ import fr.openmc.core.utils.text.messages.MessageType; import fr.openmc.core.utils.text.messages.MessagesManager; import fr.openmc.core.utils.text.messages.Prefix; +import fr.openmc.core.utils.text.messages.TranslationManager; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.Player; @@ -30,7 +32,7 @@ public void startShock( if (cube == null) return; cube.startMagneticShock(); - MessagesManager.sendMessage(player, Component.text("Choc éléctro-magnétique lancé"), Prefix.STAFF, MessageType.SUCCESS, false); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.cube.command.start_shock"), Prefix.STAFF, MessageType.SUCCESS, false); } @Subcommand("startBubble") @@ -44,7 +46,7 @@ public void startCorruptedBubble( if (cube == null) return; cube.startCorruptedBubble(); - MessagesManager.sendMessage(player, Component.text("Bulle corrompue lancé"), Prefix.STAFF, MessageType.SUCCESS, false); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.cube.command.start_bubble"), Prefix.STAFF, MessageType.SUCCESS, false); } @Subcommand("stopShock") @@ -57,7 +59,7 @@ public void stopShock( if (cube == null) return; - MessagesManager.sendMessage(player, Component.text("Choc éléctro-magnétique arreté"), Prefix.STAFF, MessageType.SUCCESS, false); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.cube.command.stop_shock"), Prefix.STAFF, MessageType.SUCCESS, false); } @Subcommand("stopBubble") @@ -79,7 +81,7 @@ public void stopCorruptedBubble( cube.corruptedBubbleTask.cancel(); cube.corruptedBubbleTask = null; } - MessagesManager.sendMessage(player, Component.text("Bulle corrompue arreté"), Prefix.STAFF, MessageType.SUCCESS, false); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.cube.command.stop_bubble"), Prefix.STAFF, MessageType.SUCCESS, false); } @Subcommand("reproduce") @@ -92,7 +94,7 @@ public void reproduceCube( if (cube == null) return; cube.startReproduction(); - MessagesManager.sendMessage(player, Component.text("Reproduction du cube lancée !"), Prefix.STAFF, MessageType.SUCCESS, false); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.cube.command.reproduce"), Prefix.STAFF, MessageType.SUCCESS, false); } @Subcommand("reproduceForce") @@ -106,32 +108,35 @@ public void reproduceForceCube( if (cube == null) return; if (cube.reproductionTask == null) { - MessagesManager.sendMessage(player, Component.text("La reproduction n'est pas en cours, utilisez §6/cube reproduce"), Prefix.STAFF, MessageType.ERROR, false); + MessagesManager.sendMessage(player, TranslationManager.translation( + "feature.cube.command.reproduce_force.unavailable", + Component.text("/cube reproduce").color(NamedTextColor.GOLD) + ), Prefix.STAFF, MessageType.ERROR, false); return; } cube.reproductionTask.forceReproduction(); - MessagesManager.sendMessage(player, Component.text("Reproduction forcée du cube!"), Prefix.STAFF, MessageType.SUCCESS, false); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.cube.command.reproduce_force.success"), Prefix.STAFF, MessageType.SUCCESS, false); } private Cube getInputCubes(Player player, String cubeLoc) { String[] split = cubeLoc.split(":"); if (split.length != 2) { - MessagesManager.sendMessage(player, Component.text("Format invalide !"), Prefix.STAFF, MessageType.ERROR, false); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.cube.command.invalid_format"), Prefix.STAFF, MessageType.ERROR, false); return null; } World world = Bukkit.getWorld(split[0]); if (world == null) { - MessagesManager.sendMessage(player, Component.text("Monde introuvable"), Prefix.STAFF, MessageType.ERROR, false); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.cube.command.world_not_found"), Prefix.STAFF, MessageType.ERROR, false); return null; } String[] coords = split[1].split(","); if (coords.length != 3) { - MessagesManager.sendMessage(player, Component.text("Coordonnées invalides"), Prefix.STAFF, MessageType.ERROR, false); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.cube.command.invalid_coords"), Prefix.STAFF, MessageType.ERROR, false); return null; } @@ -149,14 +154,14 @@ private Cube getInputCubes(Player player, String cubeLoc) { .orElse(null); if (mb == null) { - MessagesManager.sendMessage(player, Component.text("Aucun cube trouvé"), Prefix.STAFF, MessageType.ERROR, false); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.cube.command.not_found"), Prefix.STAFF, MessageType.ERROR, false); return null; } if (mb instanceof Cube cube) { return cube; } else { - MessagesManager.sendMessage(player, Component.text("Ce n'est pas un cube"), Prefix.STAFF, MessageType.ERROR, false); + MessagesManager.sendMessage(player, TranslationManager.translation("feature.cube.command.not_cube"), Prefix.STAFF, MessageType.ERROR, false); return null; } } diff --git a/src/main/java/fr/openmc/core/features/displays/TabList.java b/src/main/java/fr/openmc/core/features/displays/TabList.java index bba296fd3..057fbb475 100644 --- a/src/main/java/fr/openmc/core/features/displays/TabList.java +++ b/src/main/java/fr/openmc/core/features/displays/TabList.java @@ -16,6 +16,9 @@ import fr.openmc.core.features.dream.DreamUtils; import fr.openmc.core.hooks.ProtocolLibHook; import fr.openmc.core.hooks.itemsadder.ItemsAdderHook; +import fr.openmc.core.utils.text.messages.TranslationManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -97,8 +100,20 @@ public static void updateTabList(Player player) { logo = "OPEN MC"; } - String header = !isInDream ? "\n\n\n\n\n\n\n" + logo + "\n\n §eJoueurs en ligne §7: §6" + visibleOnlinePlayers + "§7/§e" + Bukkit.getMaxPlayers() + " \n" : "\n\n\n\n\n\n\n" + logo + "\n\n"; - String footer = isInDream ? "\n§1play.openmc.fr\n" : "\n§dplay.openmc.fr\n"; + String header = !isInDream + ? TranslationManager.translationString( + "feature.displays.tablist.header.default", + Component.text(logo), + Component.text(visibleOnlinePlayers).color(NamedTextColor.GOLD), + Component.text(Bukkit.getMaxPlayers()).color(NamedTextColor.YELLOW) + ) + : TranslationManager.translationString( + "feature.displays.tablist.header.dream", + Component.text(logo) + ); + String footer = isInDream + ? TranslationManager.translationString("feature.displays.tablist.footer.dream") + : TranslationManager.translationString("feature.displays.tablist.footer.default"); updateHeaderFooter(player, header, footer); } diff --git a/src/main/java/fr/openmc/core/features/displays/holograms/commands/HologramCommand.java b/src/main/java/fr/openmc/core/features/displays/holograms/commands/HologramCommand.java index 2192e75e7..dbbe96d7b 100644 --- a/src/main/java/fr/openmc/core/features/displays/holograms/commands/HologramCommand.java +++ b/src/main/java/fr/openmc/core/features/displays/holograms/commands/HologramCommand.java @@ -5,6 +5,7 @@ import fr.openmc.core.utils.text.messages.MessageType; import fr.openmc.core.utils.text.messages.MessagesManager; import fr.openmc.core.utils.text.messages.Prefix; +import fr.openmc.core.utils.text.messages.TranslationManager; import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -31,7 +32,7 @@ void setPosCommand( HologramLoader.setHologramLocation(hologramName, player.getLocation()); MessagesManager.sendMessage( player, - Component.text("§aPosition de l'hologramme " + hologramName + " mise à jour."), + TranslationManager.translation("feature.displays.holograms.command.setpos.success", Component.text(hologramName)), Prefix.STAFF, MessageType.SUCCESS, true @@ -39,7 +40,11 @@ void setPosCommand( } catch (IOException e) { MessagesManager.sendMessage( player, - Component.text("§cErreur lors de la mise à jour de la position de l'hologramme " + hologramName + ": " + e.getMessage()), + TranslationManager.translation( + "feature.displays.holograms.command.setpos.error", + Component.text(hologramName), + Component.text(e.getMessage()) + ), Prefix.STAFF, MessageType.ERROR, true @@ -50,7 +55,7 @@ void setPosCommand( String list = String.join(", ", HologramLoader.displays.keySet()); MessagesManager.sendMessage( player, - Component.text("§cVeuillez spécifier un hologramme valide : " + list), + TranslationManager.translation("feature.displays.holograms.command.setpos.invalid", Component.text(list)), Prefix.STAFF, MessageType.WARNING, true @@ -65,7 +70,7 @@ void disableCommand(CommandSender sender) { HologramLoader.unloadAll(); MessagesManager.sendMessage( sender, - Component.text("§cHologrammes désactivés avec succès."), + TranslationManager.translation("feature.displays.holograms.command.disable"), Prefix.STAFF, MessageType.SUCCESS, true @@ -80,7 +85,7 @@ void enableCommand(CommandSender sender) { HologramLoader.loadAllFromFolder(hologramFolder); MessagesManager.sendMessage( sender, - Component.text("§aHologrammes activés avec succès."), + TranslationManager.translation("feature.displays.holograms.command.enable"), Prefix.STAFF, MessageType.SUCCESS, true diff --git a/src/main/java/fr/openmc/core/features/displays/scoreboards/BaseScoreboard.java b/src/main/java/fr/openmc/core/features/displays/scoreboards/BaseScoreboard.java index e4f8cfbba..57369cf70 100644 --- a/src/main/java/fr/openmc/core/features/displays/scoreboards/BaseScoreboard.java +++ b/src/main/java/fr/openmc/core/features/displays/scoreboards/BaseScoreboard.java @@ -3,6 +3,7 @@ import dev.lone.itemsadder.api.FontImages.FontImageWrapper; import fr.openmc.api.scoreboard.SternalBoard; import fr.openmc.core.hooks.itemsadder.ItemsAdderHook; +import fr.openmc.core.utils.text.messages.TranslationManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.MiniMessage; @@ -66,13 +67,14 @@ protected int updateInterval() { public Component getTitle() { return canShowLogo ? Component.text(FontImageWrapper.replaceFontImages(":openmc:")) - : Component.text("OPENMC", NamedTextColor.LIGHT_PURPLE); + : TranslationManager.translation("feature.displays.scoreboard.title.text").color(NamedTextColor.LIGHT_PURPLE); } /** * @return Un {@link Component} pour le footer */ public static Component getFooter() { - return MiniMessage.miniMessage().deserialize(" %s".formatted(textToSmall("play.openmc.fr"))); + String footerText = textToSmall(TranslationManager.translationString("feature.displays.scoreboard.footer.text")); + return MiniMessage.miniMessage().deserialize(" %s".formatted(footerText)); } } \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/CityWarScoreboard.java b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/CityWarScoreboard.java index c146b6e52..4ed86dfed 100644 --- a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/CityWarScoreboard.java +++ b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/CityWarScoreboard.java @@ -10,6 +10,7 @@ import fr.openmc.core.utils.MathUtils; import fr.openmc.core.utils.text.DateUtils; import fr.openmc.core.utils.text.DirectionUtils; +import fr.openmc.core.utils.text.messages.TranslationManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; @@ -25,6 +26,7 @@ import java.util.ArrayList; import java.util.List; +import static fr.openmc.core.utils.text.messages.MessagesManager.keyToSmall; import static fr.openmc.core.utils.text.messages.MessagesManager.textToSmall; import static net.kyori.adventure.text.Component.empty; import static net.kyori.adventure.text.Component.text; @@ -47,11 +49,11 @@ public void update(Player player, SternalBoard board) { List lines = new ArrayList<>(MainScoreboard.getDefaultLines(player)); lines.add(MiniMessage.miniMessage() - .deserialize("%s".formatted(textToSmall("GUERRE EN COURS"))) + .deserialize("%s".formatted(keyToSmall("feature.displays.scoreboard.citywar.title"))) .decoration(TextDecoration.BOLD, true)); lines.add(text(" • ", net.kyori.adventure.text.format.NamedTextColor.DARK_GRAY) - .append(text(textToSmall("ennemi:"), TextColor.color(0xAAAAAA))) + .append(text(keyToSmall("feature.displays.scoreboard.citywar.enemy.label"), TextColor.color(0xAAAAAA))) .appendSpace() .append(text(textToSmall(enemyCity.getName()), TextColor.color(0xFF0634))) ); @@ -66,7 +68,7 @@ public void update(Player player, SternalBoard board) { } lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("phase:"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.citywar.phase.label"), NamedTextColor.GRAY)) .appendSpace() .append(phaseComponent) ); @@ -86,7 +88,7 @@ public void update(Player player, SternalBoard board) { int rounded = (int) Math.round(distance); lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("distance:"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.citywar.distance.label"), NamedTextColor.GRAY)) .appendSpace() .append(text(direction, TextColor.color(0xFFE206))) .appendSpace() @@ -96,7 +98,7 @@ public void update(Player player, SternalBoard board) { switch (war.getPhase()) { case PREPARATION -> lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("début dans:"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.citywar.starts_in.label"), NamedTextColor.GRAY)) .appendSpace() .append(text(DateUtils.convertSecondToTime(war.getPreparationTimeRemaining()), TextColor.color(0xF52727))) ); @@ -104,29 +106,29 @@ public void update(Player player, SternalBoard board) { case COMBAT -> { if (mascot != null) lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("mascotte:"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.citywar.mascot.label"), NamedTextColor.GRAY)) .appendSpace() .append(getColoredHealth(mascot)) ); if (enemyMascot != null) lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("ennemi:"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.citywar.enemy.label"), NamedTextColor.GRAY)) .appendSpace() .append(getColoredHealth(enemyMascot)) ); lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("fin dans:"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.citywar.ends_in.label"), NamedTextColor.GRAY)) .appendSpace() .append(text(DateUtils.convertSecondToTime(war.getCombatTimeRemaining()), TextColor.color(0xF52727))) ); } case ENDED -> lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("état:"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.citywar.state.label"), NamedTextColor.GRAY)) .appendSpace() - .append(text(textToSmall("terminée"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.citywar.state.ended"), NamedTextColor.GRAY)) ); } @@ -155,7 +157,10 @@ protected int updateInterval() { private Component getColoredHealth(LivingEntity entity) { if (entity.isDead()) - return text(textToSmall("%s MORTE".formatted(FontImageWrapper.replaceFontImages(":dead1:"))), TextColor.color(0xFF3246)); + return text(textToSmall(TranslationManager.translationString( + "feature.displays.scoreboard.citywar.mascot.dead", + Component.text(FontImageWrapper.replaceFontImages(":dead1:")) + )), TextColor.color(0xFF3246)); double health = entity.getHealth(); double maxHealth = entity.getAttribute(Attribute.MAX_HEALTH).getValue(); 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 d7d08e674..31bae3ec8 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 @@ -18,6 +18,7 @@ import fr.openmc.core.hooks.LuckPermsHook; import fr.openmc.core.hooks.WorldGuardHook; import fr.openmc.core.utils.text.DateUtils; +import fr.openmc.core.utils.text.messages.TranslationManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; @@ -29,6 +30,7 @@ import java.util.ArrayList; import java.util.List; +import static fr.openmc.core.utils.text.messages.MessagesManager.keyToSmall; import static fr.openmc.core.utils.text.messages.MessagesManager.textToSmall; import static net.kyori.adventure.text.Component.*; @@ -46,14 +48,16 @@ public void update(Player player, SternalBoard board) { if (WeeklyEventsManager.getCurrentEvent() instanceof Contest) { ContestData data = ContestManager.data; if (WeeklyEventsManager.getCurrentPhase() != ContestPhase.VOTE_CAMP.getPhase()) { - lines.add(MiniMessage.miniMessage().deserialize("%s".formatted(textToSmall("contest"))).decoration(TextDecoration.BOLD, true)); + lines.add(MiniMessage.miniMessage().deserialize("%s".formatted( + keyToSmall("feature.displays.scoreboard.contest.title"))).decoration(TextDecoration.BOLD, true)); lines.add(text(" • ", NamedTextColor.DARK_GRAY) .append(text(textToSmall(data.getCamp1()), data.getColor1AsNamedTextColor())) - .append(text(textToSmall(" VS "), NamedTextColor.GRAY)) + .appendSpace() + .append(text(keyToSmall("feature.displays.scoreboard.contest.vs"), NamedTextColor.GRAY)) .append(text(textToSmall(data.getCamp2()), data.getColor2AsNamedTextColor())) ); lines.add(Component.text(" • ", NamedTextColor.DARK_GRAY) - .append(Component.text(textToSmall("fin:"), NamedTextColor.GRAY)) + .append(Component.text(keyToSmall("feature.displays.scoreboard.contest.ends"), NamedTextColor.GRAY)) .appendSpace() .append(text(DateUtils.getTimeUntilNextDay(DayOfWeek.MONDAY), TextColor.color(0xFF8F06))) ); @@ -69,13 +73,15 @@ public void update(Player player, SternalBoard board) { public static List getDefaultLines(Player player) { Component rank = LuckPermsHook.isEnable() ? Component.text(LuckPermsHook.getFormattedPAPIPrefix(player)) - : Component.text(textToSmall("aucun")).color(TextColor.color(0xFF1FCC)); + : Component.text(keyToSmall("feature.displays.scoreboard.rank.none")).color(TextColor.color(0xFF1FCC)); City city = CityManager.getPlayerCity(player.getUniqueId()); City chunkCity = CityManager.getCityFromChunk(player.getChunk().getX(), player.getChunk().getZ()); boolean isInRegion = WorldGuardHook.isRegionConflict(player.getLocation()); - String location = isInRegion ? "§6Région Protégée" : "Nature"; + String location = isInRegion + ? TranslationManager.translationString("feature.displays.scoreboard.location.protected") + : TranslationManager.translationString("feature.displays.scoreboard.location.wilderness"); location = (chunkCity != null) ? chunkCity.getName() : location; String balance = EconomyManager.getMiniBalance(player.getUniqueId()); @@ -85,24 +91,24 @@ public static List getDefaultLines(Player player) { lines.add(empty()); lines.add(MiniMessage.miniMessage().deserialize("%s".formatted(textToSmall(player.getName()))).decoration(TextDecoration.BOLD, true)); lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("rang:"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.rank.label"), NamedTextColor.GRAY)) .appendSpace() .append(rank) ); lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("ville:"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.city.label"), NamedTextColor.GRAY)) .appendSpace() - .append(text(textToSmall(city != null ? city.getName() : "Aucune")).color(TextColor.color(0xFF06DC))) + .append(text(textToSmall(city != null ? city.getName() : TranslationManager.translationString("feature.displays.scoreboard.city.none"))).color(TextColor.color(0xFF06DC))) ); lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("argent:"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.balance.label"), NamedTextColor.GRAY)) .appendSpace() .append(text(textToSmall(balance)).color(TextColor.color(0xFF06DC))) .appendSpace() .append(text(EconomyManager.getEconomyIcon())) ); lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("location:"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.location.label"), NamedTextColor.GRAY)) .appendSpace() .append(text(textToSmall(location)).color(TextColor.color(0xFF06DC))) ); @@ -113,7 +119,7 @@ public static List getDefaultLines(Player player) { if (halloweenNPC != null) { String pumpkinCount = EconomyManager.getFormattedSimplifiedNumber(HalloweenManager.getPumpkinCount(player.getUniqueId())); lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(text(textToSmall("citrouilles:"), NamedTextColor.GRAY)) + .append(text(keyToSmall("feature.displays.scoreboard.pumpkins.label"), NamedTextColor.GRAY)) .appendSpace() .append(text(textToSmall(pumpkinCount)).color(TextColor.color(0xFF7518))) ); diff --git a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/RestartScoreboard.java b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/RestartScoreboard.java index 2835c419a..519a2bf2a 100644 --- a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/RestartScoreboard.java +++ b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/RestartScoreboard.java @@ -4,6 +4,7 @@ import fr.openmc.core.commands.utils.Restart; import fr.openmc.core.features.displays.scoreboards.BaseScoreboard; import fr.openmc.core.utils.text.DateUtils; +import fr.openmc.core.utils.text.messages.TranslationManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.entity.Player; @@ -26,7 +27,11 @@ public void update(Player player, SternalBoard board) { List lines = new ArrayList<>(); lines.add(empty()); - lines.add(text("%s %s".formatted(textToSmall("Redémarrage dans"), DateUtils.convertSecondToTime(Restart.remainingTime)), NamedTextColor.RED)); + lines.add(text( + "%s %s".formatted(textToSmall( + TranslationManager.translationString("feature.displays.scoreboard.restart.in")), + DateUtils.convertSecondToTime(Restart.remainingTime) + ), NamedTextColor.RED)); lines.add(empty()); lines.add(getFooter()); diff --git a/src/main/java/fr/openmc/core/utils/text/messages/MessagesManager.java b/src/main/java/fr/openmc/core/utils/text/messages/MessagesManager.java index 5f90aa56d..ff855016a 100644 --- a/src/main/java/fr/openmc/core/utils/text/messages/MessagesManager.java +++ b/src/main/java/fr/openmc/core/utils/text/messages/MessagesManager.java @@ -165,4 +165,8 @@ public static String textToSmall(String text) { return result.toString(); } + + public static String keyToSmall(String key) { + return textToSmall(TranslationManager.translationString(key)); + } } diff --git a/src/main/resources/translations/default/credits.properties b/src/main/resources/translations/default/credits.properties new file mode 100644 index 000000000..385de50fb --- /dev/null +++ b/src/main/resources/translations/default/credits.properties @@ -0,0 +1,44 @@ +feature.credits.menu.title=Crédits du serveur +feature.credits.menu.lore.developers=Développeur(s) : %1$s +feature.credits.menu.lore.graphists=Graphiste(s) : %1$s +feature.credits.menu.lore.builders=Builder(s) : %1$s +feature.credits.menu.close=Fermer le menu +feature.credits.feature.adminshop=Adminshop +feature.credits.feature.animations=Les Animations +feature.credits.feature.cube=Le Cube +feature.credits.feature.city=Les Villes +feature.credits.feature.dream=La Dimension des Rêves +feature.credits.feature.dream_milestone=Le Milestone des Rêves +feature.credits.feature.mascots=Les Mascottes +feature.credits.feature.mayor=Les Maires +feature.credits.feature.city_milestone=Le Milestone des Villes +feature.credits.feature.war=Les Guerres +feature.credits.feature.notation=Les Notations +feature.credits.feature.rank=Les Grades +feature.credits.feature.contest=Les Contests +feature.credits.feature.weekly_events=Les Evenements Hebdomadaires +feature.credits.feature.holograms=Les Hologrammes +feature.credits.feature.economy=L'Economie +feature.credits.feature.friends=Le systeme d'ami +feature.credits.feature.homes=Le Systeme d'Home +feature.credits.feature.leaderboard=Les Classements +feature.credits.feature.mailbox=La Boite aux Lettres +feature.credits.feature.mainmenu=Le Menu Principal +feature.credits.feature.milestones=Les Milestones +feature.credits.feature.privatemessage=Les messages privés +feature.credits.feature.quest=Les Quêtes +feature.credits.feature.settings=Les Paramêtres +feature.credits.feature.tickets=Les Tickets V1 +feature.credits.feature.tpa=Le Tpa +feature.credits.feature.rtp=Le RTP +feature.credits.feature.versionning=Le Versionning +feature.credits.feature.customitems=Les Custom Items +feature.credits.feature.chronometer=Chronomêtre +feature.credits.feature.cooldown=Cooldown +feature.credits.feature.menu_lib=Systeme de Menu +feature.credits.feature.packet_menu_lib=Systeme de Menu en Packet +feature.credits.feature.errorhandler=Le systeme de gestion d'erreur +feature.credits.feature.unittest=Les tests unitaires +feature.credits.feature.orm=Systeme de base de données + + diff --git a/src/main/resources/translations/default/cube.properties b/src/main/resources/translations/default/cube.properties new file mode 100644 index 000000000..75a1588d6 --- /dev/null +++ b/src/main/resources/translations/default/cube.properties @@ -0,0 +1,14 @@ +feature.cube.bossbar.title=Le Cube +feature.cube.command.start_shock=Choc éléctro-magnétique lancé +feature.cube.command.start_bubble=Bulle corrompue lancé +feature.cube.command.stop_shock=Choc éléctro-magnétique arreté +feature.cube.command.stop_bubble=Bulle corrompue arreté +feature.cube.command.reproduce=Reproduction du cube lancée ! +feature.cube.command.reproduce_force.unavailable=La reproduction n'est pas en cours, utilisez %1$s +feature.cube.command.reproduce_force.success=Reproduction forcée du cube! +feature.cube.command.invalid_format=Format invalide ! +feature.cube.command.world_not_found=Monde introuvable +feature.cube.command.invalid_coords=Coordonnées invalides +feature.cube.command.not_found=Aucun cube trouvé +feature.cube.command.not_cube=Ce n'est pas un cube + diff --git a/src/main/resources/translations/default/displays.properties b/src/main/resources/translations/default/displays.properties new file mode 100644 index 000000000..b15ef0fea --- /dev/null +++ b/src/main/resources/translations/default/displays.properties @@ -0,0 +1,35 @@ +feature.displays.tablist.header.default=\n\n\n\n\n\n\n%1$s\n\n Joueurs en ligne : %2$s/%3$s \n +feature.displays.tablist.header.dream=\n\n\n\n\n\n\n%1$s\n\n +feature.displays.tablist.footer.default=\nplay.openmc.fr\n +feature.displays.tablist.footer.dream=\nplay.openmc.fr\n +feature.displays.scoreboard.title.text=OPENMC +feature.displays.scoreboard.footer.text=play.openmc.fr +feature.displays.scoreboard.contest.title=contest +feature.displays.scoreboard.contest.vs= VS +feature.displays.scoreboard.contest.ends=fin: +feature.displays.scoreboard.rank.label=rang: +feature.displays.scoreboard.rank.none=aucun +feature.displays.scoreboard.city.label=ville: +feature.displays.scoreboard.city.none=Aucune +feature.displays.scoreboard.balance.label=argent: +feature.displays.scoreboard.location.label=location: +feature.displays.scoreboard.location.wilderness=Nature +feature.displays.scoreboard.location.protected=Région Protégée +feature.displays.scoreboard.pumpkins.label=citrouilles: +feature.displays.scoreboard.citywar.title=GUERRE EN COURS +feature.displays.scoreboard.citywar.enemy.label=ennemi: +feature.displays.scoreboard.citywar.phase.label=phase: +feature.displays.scoreboard.citywar.distance.label=distance: +feature.displays.scoreboard.citywar.starts_in.label=début dans: +feature.displays.scoreboard.citywar.mascot.label=mascotte: +feature.displays.scoreboard.citywar.ends_in.label=fin dans: +feature.displays.scoreboard.citywar.state.label=état: +feature.displays.scoreboard.citywar.state.ended=terminée +feature.displays.scoreboard.citywar.mascot.dead=%1$s MORTE +feature.displays.scoreboard.restart.in=Redémarrage dans +feature.displays.holograms.command.setpos.success=Position de l'hologramme %1$s mise à jour. +feature.displays.holograms.command.setpos.error=Erreur lors de la mise à jour de la position de l'hologramme %1$s : %2$s +feature.displays.holograms.command.setpos.invalid=Veuillez spécifier un hologramme valide : %1$s +feature.displays.holograms.command.disable=Hologrammes désactivés avec succès. +feature.displays.holograms.command.enable=Hologrammes activés avec succès. +