diff --git a/bukkit/src/main/java/co/aikar/commands/BukkitLocales.java b/bukkit/src/main/java/co/aikar/commands/BukkitLocales.java index da0ee649..92ef6863 100644 --- a/bukkit/src/main/java/co/aikar/commands/BukkitLocales.java +++ b/bukkit/src/main/java/co/aikar/commands/BukkitLocales.java @@ -39,6 +39,7 @@ public class BukkitLocales extends Locales { public BukkitLocales(BukkitCommandManager manager) { super(manager); this.manager = manager; + this.addBundleClassLoader(this.manager.getPlugin().getClass().getClassLoader()); } @Override diff --git a/bungee/src/main/java/co/aikar/commands/BungeeLocales.java b/bungee/src/main/java/co/aikar/commands/BungeeLocales.java index e77a7d17..12bd6d5e 100644 --- a/bungee/src/main/java/co/aikar/commands/BungeeLocales.java +++ b/bungee/src/main/java/co/aikar/commands/BungeeLocales.java @@ -7,6 +7,7 @@ public class BungeeLocales extends Locales { super(manager); this.manager = manager; + this.addBundleClassLoader(this.manager.getPlugin().getClass().getClassLoader()); } @Override diff --git a/core/src/main/java/co/aikar/commands/Locales.java b/core/src/main/java/co/aikar/commands/Locales.java index d0651e33..ce3fabbb 100644 --- a/core/src/main/java/co/aikar/commands/Locales.java +++ b/core/src/main/java/co/aikar/commands/Locales.java @@ -31,7 +31,9 @@ import com.google.common.collect.SetMultimap; import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; @@ -75,11 +77,13 @@ public class Locales { private final CommandManager manager; private final LocaleManager localeManager; - private final SetMultimap loadedBundles = HashMultimap.create(); + private final Map> loadedBundles = new HashMap<>(); + private final List registeredClassLoaders = new ArrayList<>(); public Locales(CommandManager manager) { this.manager = manager; this.localeManager = LocaleManager.create(manager::getIssuerLocale); + this.addBundleClassLoader(this.getClass().getClassLoader()); } public void loadLanguages() { @@ -101,9 +105,12 @@ public class Locales { //noinspection unchecked Set supportedLanguages = manager.getSupportedLanguages(); for (Locale locale : supportedLanguages) { - for (String bundleName : Sets.newHashSet(loadedBundles.keys())) { - addMessageBundle(bundleName, locale); + for(SetMultimap localeData: this.loadedBundles.values()) { + for (String bundleName : Sets.newHashSet(localeData.keys())) { + addMessageBundle(bundleName, locale); + } } + } } @@ -117,11 +124,28 @@ public class Locales { } } - public void addMessageBundle(String bundleName, Locale locale) { - if (!loadedBundles.containsEntry(bundleName, locale)) { - loadedBundles.put(bundleName, locale); - this.localeManager.addMessageBundle(bundleName, locale); + public boolean addMessageBundle(String bundleName, Locale locale) { + boolean found = false; + for(ClassLoader classLoader: this.registeredClassLoaders) { + if(this.addMessageBundle(classLoader, bundleName, locale)) { + found = true; + } } + + return found; + } + + public boolean addMessageBundle(ClassLoader classLoader, String bundleName, Locale locale) { + SetMultimap classLoadersLocales = this.loadedBundles.getOrDefault(classLoader, HashMultimap.create()); + if(!classLoadersLocales.containsEntry(bundleName, locale)) { + if(this.localeManager.addMessageBundle(classLoader, bundleName, locale)) { + classLoadersLocales.put(bundleName, locale); + this.loadedBundles.put(classLoader, classLoadersLocales); + return true; + } + } + + return false; } public void addMessageStrings(Locale locale, @NotNull Map messages) { @@ -129,6 +153,7 @@ public class Locales { messages.forEach((key, value) -> map.put(MessageKey.of(key), value)); addMessages(locale, map); } + public void addMessages(Locale locale, @NotNull Map messages) { this.localeManager.addMessages(locale, messages); } @@ -167,4 +192,9 @@ public class Locales { matcher.appendTail(sb); return sb.toString(); } + + public boolean addBundleClassLoader(ClassLoader classLoader) { + return !this.registeredClassLoaders.contains(classLoader) && this.registeredClassLoaders.add(classLoader); + + } } diff --git a/sponge/src/main/java/co/aikar/commands/SpongeLocales.java b/sponge/src/main/java/co/aikar/commands/SpongeLocales.java index a0889998..f0d5b9c2 100644 --- a/sponge/src/main/java/co/aikar/commands/SpongeLocales.java +++ b/sponge/src/main/java/co/aikar/commands/SpongeLocales.java @@ -6,6 +6,7 @@ public class SpongeLocales extends Locales{ public SpongeLocales(SpongeCommandManager manager) { super(manager); this.manager = manager; + this.addBundleClassLoader(this.manager.getPlugin().getClass().getClassLoader()); } @Override