From 60f8c4cf21ea5fd2a3085ed3cdcba7801e6e46d5 Mon Sep 17 00:00:00 2001 From: LinaVT Date: Mon, 6 Apr 2026 21:52:13 +0200 Subject: [PATCH] Add useLegacyFormat flag for message parsing Introduce a performance.useLegacyFormat config option (default false) to control whether messages are colorized with hex codes or parsed with MiniMessage handling. LangManager now stores and reloads the flag, exposes isUseLegacyFormat(), and passes it when retrieving/colorizing translations. MessageUtil gains overloaded getMessage and colorize methods that respect the flag (skipping MiniMessage/hex parsing when legacy mode is enabled). LangCommand is updated to forward the flag to MessageUtil for all user-facing messages. Also adds the new config entry to config.yml and fixes hex replacement flow in MessageUtil. --- .../iglanguages/command/LangCommand.java | 30 +++++++------ .../iglanguages/manager/LangManager.java | 15 +++++-- .../iglanguages/util/MessageUtil.java | 42 ++++++++++++------- src/main/resources/config.yml | 4 ++ 4 files changed, 55 insertions(+), 36 deletions(-) diff --git a/src/main/java/me/icegames/iglanguages/command/LangCommand.java b/src/main/java/me/icegames/iglanguages/command/LangCommand.java index 92efe2e..fe0774e 100644 --- a/src/main/java/me/icegames/iglanguages/command/LangCommand.java +++ b/src/main/java/me/icegames/iglanguages/command/LangCommand.java @@ -55,16 +55,14 @@ public boolean onCommand(CommandSender sender, Command command, String label, St } if (args[0].equalsIgnoreCase("reload")) { - plugin.reloadConfig(); - langManager.loadAll(); - langManager.clearCache(); + langManager.reload(); if (plugin.getProtocolLibHook() != null) { plugin.getProtocolLibHook().clearCache(); } String consolePrefix = "\u001B[1;30m[\u001B[0m\u001B[36mI\u001B[1;36mG\u001B[0m\u001B[1;37m" + "Languages" + "\u001B[1;30m]\u001B[0m "; System.out.println(consolePrefix + "Reloaded " + langManager.getAvailableLangs().size() + " languages! " + langManager.getAvailableLangs()); System.out.println(consolePrefix + "Reloaded " + langManager.getTotalTranslationsCount() + " total translations!"); - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(), "reload_success")); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(), "reload_success", langManager.isUseLegacyFormat())); return true; } @@ -72,21 +70,21 @@ public boolean onCommand(CommandSender sender, Command command, String label, St if (args.length == 3) { Player target = Bukkit.getPlayer(args[1]); if (target == null) { - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"player_not_found")); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"player_not_found", langManager.isUseLegacyFormat())); return true; } String lang = args[2]; List availableLangs = langManager.getAvailableLangs(); if (!availableLangs.contains(lang)) { - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"invalid_lang", "{lang}", lang, "{langs}", String.join(", ", availableLangs))); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"invalid_lang", langManager.isUseLegacyFormat(), "{lang}", lang, "{langs}", String.join(", ", availableLangs))); return true; } langManager.setPlayerLang(target.getUniqueId(), lang); langManager.savePlayerLang(target.getUniqueId()); - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"set_success", "{player}", target.getName(), "{lang}", lang)); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"set_success", langManager.isUseLegacyFormat(), "{player}", target.getName(), "{lang}", lang)); actionsManager.executeActionsOnSet(target, lang); } else { - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"set_usage")); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"set_usage", langManager.isUseLegacyFormat())); } return true; } @@ -95,20 +93,20 @@ public boolean onCommand(CommandSender sender, Command command, String label, St if (args.length == 2) { Player target = Bukkit.getPlayer(args[1]); if (target == null) { - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"player_not_found")); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"player_not_found", langManager.isUseLegacyFormat())); return true; } String lang = langManager.getPlayerLang(target.getUniqueId()); - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"get_success", "{player}", target.getName(), "{lang}", lang)); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"get_success", langManager.isUseLegacyFormat(), "{player}", target.getName(), "{lang}", lang)); } else { - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"get_usage")); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"get_usage", langManager.isUseLegacyFormat())); } return true; } if (args[0].equalsIgnoreCase("list")) { List langs = langManager.getAvailableLangs(); - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"list_languages", "{langs}", String.join(", ", langs))); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"list_languages", langManager.isUseLegacyFormat(), "{langs}", String.join(", ", langs))); return true; } @@ -116,23 +114,23 @@ public boolean onCommand(CommandSender sender, Command command, String label, St if (args.length == 2) { Player target = Bukkit.getPlayer(args[1]); if (target == null) { - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"player_not_found")); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"player_not_found", langManager.isUseLegacyFormat())); return true; } String selectedLang = langManager.detectClientLanguage(target); langManager.setPlayerLang(target.getUniqueId(), selectedLang); langManager.savePlayerLang(target.getUniqueId()); - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(), "set_success", "{player}", target.getName(), "{lang}", selectedLang)); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(), "set_success", langManager.isUseLegacyFormat(), "{player}", target.getName(), "{lang}", selectedLang)); actionsManager.executeActionsOnSet(target, selectedLang); return true; } else { - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"get_usage")); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"get_usage", langManager.isUseLegacyFormat())); } return true; } - sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"unknown_subcommand")); + sender.sendMessage(MessageUtil.getMessage(plugin.getMessagesConfig(),"unknown_subcommand", langManager.isUseLegacyFormat())); return true; } } diff --git a/src/main/java/me/icegames/iglanguages/manager/LangManager.java b/src/main/java/me/icegames/iglanguages/manager/LangManager.java index efacc40..f38e67c 100644 --- a/src/main/java/me/icegames/iglanguages/manager/LangManager.java +++ b/src/main/java/me/icegames/iglanguages/manager/LangManager.java @@ -29,6 +29,7 @@ public class LangManager { private final Cache translationCache; private final Cache parsedMessageCache; private final String defaultLang; + private boolean useLegacyFormat; // Patterns for placeholder detection and parsing private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("%[^%]+%"); @@ -121,6 +122,7 @@ public LangManager(IGLanguages plugin, PlayerLangStorage storage) { this.plugin = plugin; this.playerLangStorage = storage; this.defaultLang = plugin.getConfig().getString("defaultLang"); + this.useLegacyFormat = plugin.getConfig().getBoolean("performance.useLegacyFormat", false); int cacheSize = plugin.getConfig().getInt("performance.translationCacheSize", 500); this.translationCache = Caffeine.newBuilder() @@ -250,6 +252,7 @@ private void loadLangFilesRecursively(File rootDir, File currentDir, Map|)"); public static String getMessage(FileConfiguration messageConfig, String path, String... placeholders) { + return getMessage(messageConfig, path, false, placeholders); + } + + public static String getMessage(FileConfiguration messageConfig, String path, boolean useLegacyFormat, String... placeholders) { Object messageObj = messageConfig.get(path); String message; String prefix = messageConfig.getString("prefix", ""); @@ -34,7 +38,7 @@ public static String getMessage(FileConfiguration messageConfig, String path, St message = String.join("\n", messageList); } else { message = "&cMessage '" + path + "' not found in messages.yml."; - return colorize(message); + return colorize(message, useLegacyFormat); } for (int i = 0; i < placeholders.length; i += 2) { @@ -44,31 +48,37 @@ public static String getMessage(FileConfiguration messageConfig, String path, St } String finalMessage = prefix + message; - return colorize(finalMessage); + return colorize(finalMessage, useLegacyFormat); } public static String colorize(String message) { + return colorize(message, false); + } + + public static String colorize(String message, boolean useLegacyFormat) { if (message == null || message.isEmpty()) return message; - String miniMessageParsed = MiniMessageWrapper.tryParse(message); - if (miniMessageParsed != null) { - message = miniMessageParsed; - } + if (!useLegacyFormat) { + String miniMessageParsed = MiniMessageWrapper.tryParse(message); + if (miniMessageParsed != null) { + message = miniMessageParsed; + } - Matcher matcher = HEX_PATTERN.matcher(message); - StringBuffer buffer = new StringBuffer(); + Matcher matcher = HEX_PATTERN.matcher(message); + StringBuffer buffer = new StringBuffer(); - while (matcher.find()) { - String hexCode = matcher.group(1); - StringBuilder replacement = new StringBuilder("§x"); - for (char c : hexCode.toCharArray()) { - replacement.append('§').append(c); + while (matcher.find()) { + String hexCode = matcher.group(1); + StringBuilder replacement = new StringBuilder("§x"); + for (char c : hexCode.toCharArray()) { + replacement.append('§').append(c); + } + matcher.appendReplacement(buffer, replacement.toString()); } - matcher.appendReplacement(buffer, replacement.toString()); + matcher.appendTail(buffer); + message = buffer.toString(); } - matcher.appendTail(buffer); - message = buffer.toString(); return ChatColor.translateAlternateColorCodes('&', message); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index b80f155..9843991 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -47,6 +47,10 @@ performance: # This is the L1 cache for translation lookups translationCacheSize: 500 + # If true, color commands like gradients or hex codes are passed 1 to 1 (Legacy Format). + # If false, MiniMessage and Hex codes will be parsed immediately. + useLegacyFormat: false + # ProtocolLib packet interception # Translates %lang_*% placeholders in outgoing packets (chat, titles, scoreboard, etc.) # Requires ProtocolLib to be installed