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