I18nModule class

Пакет: com.hypixel.hytale.server.core.modules.i18n

Файл: com/hypixel/hytale/server/core/modules/i18n/I18nModule.java

extends: JavaPlugin

Поля (96)

МодификаторыТипИмя
final PluginManifest MANIFEST
break
break
instance
private final Path languagesPath
return
return
return
ClassLoader var1
String var10
String var10
int var11
Path var11
String var12
String var13
Map var14
Map var15
Path var16
Iterator var16
Properties var17
String var17
Map var2
Bench var2
Map var2
Enumeration var2
Path var2
String var2
Map var2
Collection var23
Map var26
Map var27
Map var28
String var3
URL var3
URI var3
AssetMonitor var3
Map var3
Map var3
String var3
var3
I18nModule.CachedMessages var3
long var3
Map var3
String var3
var3
Map var3
IEventDispatcher var30
Map var31
Iterator var33
PacketHandler var34
String var35
String var36
Properties var37
var37
String var38
UpdateTranslations[] var39
var39
FileSystem var4
var4
Map var4
String var4
Map var4
var4
Path var4
String var4
HytaleServerConfig var4
Iterator var4
Map var41
Path var5
var5
var5
Map var5
Path var5
Map var5
Entry var5
FileSystem var6
var6
var6
int var6
Object2ObjectOpenHashMap var6
String var6
Object2ObjectOpenHashMap var6
Path var6
String var7
UpdateTranslations[] var7
UpdateTranslations var7
String var7
EventKind var7
int var8
int var8
IEventDispatcher var8
String var8
Path var8
String var9
String var9
Path var9

Методы (35)

МодификаторыВозвратСигнатура
private record CachedMessagesrecord CachedMessages(long version, @Nonnull Map<String, String> messages)
public I18nAssetMonitorHandlerpublic I18nAssetMonitorHandler(Path nullx)
public void acceptpublic void accept(Map<Path, EventKind> var1)
private void addDefaultMessagesvoid addDefaultMessages(@Nonnull Map<String, String> var1, boolean var2)
for for(Path var8 : var23)
for for(Path var6 : var4)
for for(PlayerRef var32 : var23)
static I18nModule getI18nModule get()
public Object getKeypublic Object getKey()
public Map<String, String> getMessagesMap<String, String> getMessages(@Nonnull Map<String, Map<String, String>> var1, @Nullable String var2)
if if(var2 != null)
if if(var2 instanceof CraftingBench var4)
if if(var4 != null)
if if(!var2)
if if(var9 != null)
if if(var2 == null)
if if(var5 == null)
if if(var3 == null)
if if(var3 == null)
if if(var3 == null)
if if(var38 != null)
if if(var39 == null)
if if(var39.length != 0)
if if(var7 == EventKind.ENTRY_DELETE)
private void loadBundledDefaultsFromClasspathvoid loadBundledDefaultsFromClasspath()
private void loadBundledDefaultsFromUrlvoid loadBundledDefaultsFromUrl(@Nonnull Map<String, String> var1, @Nonnull URL var2)
private int loadMessagesint loadMessages(String var1, @Nonnull Path var2)
private int loadMessagesFromint loadMessagesFrom(@Nonnull Map<String, String> var1, String var2, @Nonnull Path var3)
private void loadMessagesFromPackvoid loadMessagesFromPack(AssetPack var1)
public void sendTranslationsvoid sendTranslations(@Nonnull PacketHandler var1, String var2)
abstract super super(var1)
switch switch(var7)
public boolean testpublic boolean test(Path var1, EventKind var2)
while while(true)
while while(true)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.i18n;

class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.assetstore.event.LoadedAssetsEvent;
class="kw">import com.hypixel.hytale.common.plugin.PluginManifest;
class="kw">import com.hypixel.hytale.event.IEventDispatcher;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.logger.sentry.SkipSentryException;
class="kw">import com.hypixel.hytale.protocol.UpdateType;
class="kw">import com.hypixel.hytale.protocol.packets.assets.UpdateTranslations;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.HytaleServerConfig;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.asset.AssetPackRegisterEvent;
class="kw">import com.hypixel.hytale.server.core.asset.AssetPackUnregisterEvent;
class="kw">import com.hypixel.hytale.server.core.asset.LoadAssetEvent;
class="kw">import com.hypixel.hytale.server.core.asset.monitor.AssetMonitor;
class="kw">import com.hypixel.hytale.server.core.asset.monitor.AssetMonitorHandler;
class="kw">import com.hypixel.hytale.server.core.asset.monitor.EventKind;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.bench.Bench;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.bench.CraftingBench;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.FieldcraftCategory;
class="kw">import com.hypixel.hytale.server.core.io.PacketHandler;
class="kw">import com.hypixel.hytale.server.core.modules.i18n.commands.EnableTmpTagsCommand;
class="kw">import com.hypixel.hytale.server.core.modules.i18n.commands.InternationalizationCommands;
class="kw">import com.hypixel.hytale.server.core.modules.i18n.event.MessagesUpdated;
class="kw">import com.hypixel.hytale.server.core.modules.i18n.parser.LangFileParser;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPlugin;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.util.io.FileUtil;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
class="kw">import java.io.BufferedReader;
class="kw">import java.io.File;
class="kw">import java.io.IOException;
class="kw">import java.io.InputStream;
class="kw">import java.net.URI;
class="kw">import java.net.URL;
class="kw">import java.nio.file.DirectoryStream;
class="kw">import java.nio.file.FileSystem;
class="kw">import java.nio.file.FileSystemNotFoundException;
class="kw">import java.nio.file.FileSystems;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.nio.file.Paths;
class="kw">import java.util.Collection;
class="kw">import java.util.Collections;
class="kw">import java.util.Enumeration;
class="kw">import java.util.Iterator;
class="kw">import java.util.Map;
class="kw">import java.util.Properties;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.atomic.AtomicLong;
class="kw">import java.util.logging.Level;
class="kw">import java.util.stream.Stream;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class I18nModule class="kw">extends JavaPlugin {
   class="kw">public class="kw">static class="kw">final PluginManifest MANIFEST = PluginManifest.corePlugin(I18nModule.class).optDepends(AssetModule.class).build();
   class="kw">private class="kw">static class="kw">final String BUNDLED_DEFAULTS_RESOURCE_ROOT = "bundledDefaults/";
   class="kw">public class="kw">static class="kw">final String DEFAULT_LANGUAGE = "en-US";
   class="kw">public class="kw">static class="kw">final Path FALLBACK_LANG_PATH = Paths.get("fallback.lang");
   class="kw">public class="kw">static class="kw">final String FILE_EXTENSION = ".lang";
   class="kw">public class="kw">static class="kw">final String SERVER_ASSETS = "Server";
   class="kw">public class="kw">static class="kw">final String LANGUAGE_ASSETS = "Languages";
   class="kw">public class="kw">static class="kw">final Path DEFAULT_GENERATED_PATH = Path.of("Server", "Languages", "en-US");
   class="kw">private class="kw">static I18nModule instance;
   class="kw">private class="kw">final Map<String, String> fallbacks = new ConcurrentHashMap<>();
   class="kw">private class="kw">final Map<String, String> bundledDefaults = new ConcurrentHashMap<>();
   class="kw">private class="kw">final Map<String, Map<String, String>> languages = new ConcurrentHashMap<>();
   class="kw">private class="kw">final Map<String, I18nModule.CachedMessages> cachedLanguages = new ConcurrentHashMap<>();
   class="kw">private class="kw">final AtomicLong messagesVersion = new AtomicLong();

   class="kw">public class="kw">static I18nModule get() {
      class="kw">return instance;
   }

   class="kw">public I18nModule(@Nonnull JavaPluginInit var1) {
      super(var1);
      instance = this;
   }

   @Override
   class="kw">protected void setup() {
      this.loadBundledDefaultsFromClasspath();
      if (AssetModule.get() != null) {
         this.getEventRegistry().register((short)-32, LoadAssetEvent.class, var1 -> {
            for (AssetPack var3 : AssetModule.get().getAssetPacks()) {
               this.loadMessagesFromPack(var3);
            }
         });
         this.getEventRegistry().register((short)-32, AssetPackRegisterEvent.class, var1 -> this.loadMessagesFromPack(var1.getAssetPack()));
         this.getEventRegistry().register(AssetPackUnregisterEvent.class, var0 -> {});
         this.getEventRegistry()
            .register(
               LoadedAssetsEvent.class,
               BlockType.class,
               var1 -> {
                  Map var2 = new Object2ObjectOpenHashMap();
                  var1.getLoadedAssets()
                     .values()
                     .forEach(
                        var1x -> {
                           Bench var2 = var1x.getBench();
                           if (var2 != null) {
                              String var3 = var1x.getId();
                              if (var2 class="kw">instanceof CraftingBench var4) {
                                 for (CraftingBench.BenchCategory var8 : var4.getCategories()) {
                                    var2.put("server.items." + var3 + ".bench.categories." + var8.getId() + ".name", var8.getName());
                                    if (var8.getItemCategories() != null) {
                                       for (CraftingBench.BenchItemCategory var12 : var8.getItemCategories()) {
                                          var2.put(
                                             "server.items." + var3 + ".bench.categories." + var8.getId() + ".itemCategories." + var12.getId() + ".name",
                                             var12.getName()
                                          );
                                       }
                                    }
                                 }
                              }

                              if (var2.getDescriptiveLabel() != null) {
                                 var2.put("server.items." + var3 + ".bench.descriptiveLabel", var2.getDescriptiveLabel());
                              }
                           }
                        }
                     );
                  this.addDefaultMessages(var2, var1.isInitial());
               }
            );
         this.getEventRegistry().register(LoadedAssetsEvent.class, FieldcraftCategory.class, var1 -> {
            Map var2 = new Object2ObjectOpenHashMap();
            var1.getLoadedAssets().values().forEach(var1x -> {
               if (var1x.getName() != null) {
                  var2.put("fieldcraftCategories." + var1x.getId() + ".name", var1x.getName());
               }
            });
            this.addDefaultMessages(var2, var1.isInitial());
         });
      }
   }

   @Override
   class="kw">protected void start() {
      if (AssetModule.get() != null) {
         this.getCommandRegistry().registerCommand(new InternationalizationCommands());
         this.getCommandRegistry().registerCommand(new EnableTmpTagsCommand());
      }
   }

   class="kw">private void loadBundledDefaultsFromClasspath() {
      ClassLoader var1 = I18nModule.class.getClassLoader();

      try {
         Enumeration var2 = var1.getResources("bundledDefaults/");

         while (var2.hasMoreElements()) {
            URL var3 = var2.nextElement();
            this.loadBundledDefaultsFromUrl(this.bundledDefaults, var3);
         }
      } catch (IOException var4) {
         ((HytaleLogger.Api)this.getLogger().at(Level.SEVERE).withCause(var4)).log("Failed to enumerate %s resources", "bundledDefaults/");
      }
   }

   class="kw">private void loadBundledDefaultsFromUrl(@Nonnull Map<String, String> var1, @Nonnull URL var2) {
      try {
         label118: {
            URI var3 = var2.toURI();
            FileSystem var4 = null;

            try {
               Path var5;
               if ("jar".equals(var3.getScheme())) {
                  FileSystem var6;
                  try {
                     var6 = FileSystems.getFileSystem(var3);
                  } catch (FileSystemNotFoundException var19) {
                     var6 = FileSystems.newFileSystem(var3, Collections.emptyMap());
                     var4 = var6;
                  }

                  var5 = var6.getPath("/bundledDefaults/");
               } else {
                  var5 = Paths.get(var3);
               }

               if (Files.isDirectory(var5)) {
                  try (DirectoryStream var23 = Files.newDirectoryStream(var5, var0 -> var0.getFileName().toString().endsWith(".lang"))) {
                     for (Path var8 : var23) {
                        String var9 = var8.getFileName().toString();
                        String var10 = var9.substring(0, var9.length() - ".lang".length());
                        int var11 = var1.size();
                        this.loadMessagesFrom(var1, var10, var8);
                        this.getLogger().at(Level.INFO).log("Loaded %d bundled class="kw">default translations from %s", var1.size() - var11, var8);
                     }
                     break label118;
                  }
               }
            } class="kw">finally {
               if (var4 != null) {
                  var4.close();
               }
            }

            class="kw">return;
         }
      } catch (Exception var22) {
         ((HytaleLogger.Api)this.getLogger().at(Level.SEVERE).withCause(new SkipSentryException(var22))).log("Failed to load bundled defaults from %s", var2);
      }
   }

   class="kw">private void loadMessagesFromPack(AssetPack var1) {
      Path var2 = var1.getRoot().resolve("Server").resolve("Languages");
      if (Files.isDirectory(var2)) {
         AssetMonitor var3 = AssetModule.get().getAssetMonitor();
         if (var3 != null && !var1.isImmutable()) {
            var3.monitorDirectoryFiles(var2, new I18nModule.I18nAssetMonitorHandler(var2));
         }

         try (DirectoryStream var4 = Files.newDirectoryStream(var2, var0 -> Files.isDirectory(var0))) {
            for (Path var6 : var4) {
               try {
                  String var7 = var6.getFileName().toString();
                  int var8 = this.loadMessages(var7, var6);
                  this.getLogger().at(Level.INFO).log("Loaded %d entries for '%s' from %s", var8, var7, var2);
               } catch (IOException var11) {
                  ((HytaleLogger.Api)this.getLogger().at(Level.SEVERE).withCause(var11)).log("Failed to load messages from: %s", var6);
               }
            }
         } catch (IOException var15) {
            ((HytaleLogger.Api)this.getLogger().at(Level.SEVERE).withCause(var15)).log("Failed to load languages from: %s", var2);
         }
      }

      Path var16 = var2.resolve("fallback.lang");
      if (Files.exists(var16)) {
         Properties var17 = new Properties();

         try {
            try (InputStream var18 = Files.newInputStream(var16)) {
               var17.load(var18);
            }

            for (Entry var20 : var17.entrySet()) {
               this.fallbacks.put((String)var20.getKey(), (String)var20.getValue());
            }

            if (!var17.isEmpty()) {
               this.getLogger().at(Level.INFO).log("Loaded %d entries from %s", var17.size(), var16);
            }
         } catch (IOException var13) {
            ((HytaleLogger.Api)this.getLogger().at(Level.SEVERE).withCause(var13)).log("Failed to load fallback languages from: %s", var16);
         }
      }

      this.messagesVersion.incrementAndGet();
   }

   @Nonnull
   class="kw">public UpdateTranslations[] getUpdatePacketsForChanges(
      String var1, @Nonnull Map<String, Map<String, String>> var2, @Nonnull Map<String, Map<String, String>> var3
   ) {
      Map var4 = this.getMessages(var3, var1);
      Map var5 = this.getMessages(var2, var1);
      int var6 = (var4.isEmpty() ? 0 : 1) + (var5.isEmpty() ? 0 : 1);
      UpdateTranslations[] var7 = new UpdateTranslations[var6];
      int var8 = 0;
      if (!var4.isEmpty()) {
         var7[var8++] = new UpdateTranslations(UpdateType.Remove, var4);
      }

      if (!var5.isEmpty()) {
         var7[var8] = new UpdateTranslations(UpdateType.AddOrUpdate, var5);
      }

      class="kw">return var7;
   }

   class="kw">private void addDefaultMessages(@Nonnull Map<String, String> var1, boolean var2) {
      Map var3 = this.languages.computeIfAbsent("en-US", var0 -> new ConcurrentHashMap<>());

      for (Entry var5 : var1.entrySet()) {
         if (var5.getKey() != null && var5.getValue() != null) {
            var3.put(var5.getKey(), var5.getValue());
         } else {
            this.getLogger().at(Level.WARNING).log("Attempted to add invalid class="kw">default translation message: %s=%s", var5.getKey(), var5.getValue());
         }
      }

      this.messagesVersion.incrementAndGet();
      if (!var2) {
         UpdateTranslations var7 = new UpdateTranslations(UpdateType.AddOrUpdate, var1);
         Universe.get().broadcastPacketNoCache(var7);
         IEventDispatcher var8 = HytaleServer.get().getEventBus().dispatchFor(MessagesUpdated.class);
         if (var8.hasListener()) {
            Object2ObjectOpenHashMap var6 = new Object2ObjectOpenHashMap();
            var6.put("en-US", var1);
            var8.dispatch(new MessagesUpdated(var6, new Object2ObjectOpenHashMap()));
         }
      }
   }

   class="kw">private int loadMessages(String var1, @Nonnull Path var2) class="kw">throws IOException {
      Map var3 = this.languages.computeIfAbsent(var1, var0 -> new ConcurrentHashMap<>());

      try (Stream var4 = Files.find(
            var2, Integer.MAX_VALUE, (var0, var1x) -> var0.toString().endsWith(".lang") && var1x.isRegularFile(), FileUtil.DEFAULT_WALK_TREE_OPTIONS_ARRAY
         )) {
         class="kw">return var4.mapToInt(var3x -> {
            String var4 = this.getPrefix(var2, var3x);
            class="kw">return this.loadMessagesFrom(var3, var4, var3x);
         }).sum();
      }
   }

   class="kw">private int loadMessagesFrom(@Nonnull Map<String, String> var1, String var2, @Nonnull Path var3) {
      Map var4;
      try (BufferedReader var5 = Files.newBufferedReader(var3)) {
         var4 = LangFileParser.parse(var3.toString(), var5);
      } catch (Exception var12) {
         ((HytaleLogger.Api)this.getLogger().at(Level.SEVERE).withCause(new SkipSentryException(var12)))
            .log("Error parsing language file: %s", var3.toString());
         class="kw">return 0;
      }

      for (Entry var6 : var4.entrySet()) {
         String var7 = var2 + "." + var6.getKey();
         String var8 = var6.getValue();
         String var9 = var1.get(var7);
         if (var9 != null) {
            if (!var9.equals(var8)) {
               this.getLogger().at(Level.WARNING).log("'%s' has multiple definitions: `%s` and `%s`", var7, var9, var8);
            }
         } else {
            var1.put(var7, var8);
         }
      }

      class="kw">return var4.size();
   }

   @Nonnull
   class="kw">private String getPrefix(@Nonnull Path var1, @Nonnull Path var2) {
      String var3 = "";
      Path var4 = var2.getParent();
      if (!var1.equals(var4)) {
         Path var5 = var1.relativize(var4);
         var3 = var3 + var5.toString().replace(File.separatorChar, '.') + ".";
      }

      String var6 = var2.getFileName().toString();
      class="kw">return var3 + var6.substring(0, var6.length() - ".lang".length());
   }

   @Nonnull
   class="kw">public Map<String, String> getMessages(@Nullable String var1) {
      String var2 = var1 == null ? "en-US" : var1;
      I18nModule.CachedMessages var3 = this.cachedLanguages.get(var2);
      class="kw">return var3 != null && var3.version() == this.messagesVersion.get()
         ? var3.messages()
         : this.cachedLanguages
            .compute(
               var2,
               (var1x, var2x) -> {
                  long var3 = this.messagesVersion.get();
                  class="kw">return (I18nModule.CachedMessages)(var2x != null && var2x.version() == var3
                     ? var2x
                     : new I18nModule.CachedMessages(var3, Collections.unmodifiableMap(this.getMessages(this.languages, var1x))));
               }
            )
            .messages();
   }

   class="kw">public Map<String, String> getMessages(@Nonnull Map<String, Map<String, String>> var1, @Nullable String var2) {
      if (var2 == null) {
         class="kw">return this.getMessages(var1, "en-US");
      }

      Map var3 = var1.get(var2);
      if ("en-US".equals(var2)) {
         class="kw">return var3 != null ? var3 : Collections.emptyMap();
      }

      String var4 = this.fallbacks.getOrDefault(var2, "en-US");
      Map var5 = this.getMessages(var1, var4);
      if (var5 == null) {
         class="kw">return var3 != null ? var3 : Collections.emptyMap();
      }

      if (var3 == null) {
         class="kw">return var5;
      }

      Object2ObjectOpenHashMap var6 = new Object2ObjectOpenHashMap(var5);
      var6.putAll(var3);
      class="kw">return var6;
   }

   class="kw">public void sendTranslations(@Nonnull PacketHandler var1, String var2) {
      if (!this.isDisabled()) {
         var1.writeNoCache(new UpdateTranslations(UpdateType.Init, this.getMessages(var2)));
      }
   }

   @Nullable
   class="kw">public String getMessage(String var1, @Nonnull String var2) {
      String var3 = this.getMessages(var1).get(var2);
      if (var3 == null) {
         var3 = this.bundledDefaults.get(var2);
         if (var3 == null) {
            class="kw">return null;
         }
      }

      HytaleServerConfig var4 = HytaleServer.get().getConfig();
      class="kw">return var4 != null && var4.isDisplayTmpTagsInStrings() ? var3 : var3.replace("[TMP] ", "").replace("[TMP]", "");
   }

   class="kw">private record CachedMessages(long version, @Nonnull Map<String, String> messages) {
      class="kw">private CachedMessages {
      }
   }

   class="kw">private class I18nAssetMonitorHandler class="kw">implements AssetMonitorHandler {
      class="kw">private class="kw">final Path languagesPath;

      class="kw">public I18nAssetMonitorHandler(Path nullx) {
         this.languagesPath = nullx;
      }

      @Override
      class="kw">public Object getKey() {
         class="kw">return I18nModule.this;
      }

      class="kw">public boolean test(Path var1, EventKind var2) {
         class="kw">return !Files.isDirectory(var1) && var1.getFileName().toString().endsWith(".lang") && I18nModule.this.isEnabled();
      }

      class="kw">public void accept(Map<Path, EventKind> var1) {
         Map var2 = new Object2ObjectOpenHashMap();
         Map var3 = new Object2ObjectOpenHashMap();
         Iterator var4 = var1.entrySet().iterator();

         while (true) {
            Properties var37;
            while (true) {
               if (!var4.hasNext()) {
                  if (var2.isEmpty() && var3.isEmpty()) {
                     class="kw">return;
                  }

                  for (Entry var24 : var3.entrySet()) {
                     Map var27 = I18nModule.this.languages.computeIfAbsent(var24.getKey(), var0 -> new ConcurrentHashMap<>());
                     var27.putAll(var24.getValue());
                  }

                  I18nModule.this.messagesVersion.incrementAndGet();

                  for (Entry var25 : var2.entrySet()) {
                     Map var28 = I18nModule.this.getMessages(var25.getKey());
                     Map var31 = var3.computeIfAbsent(var25.getKey(), var0 -> new Object2ObjectOpenHashMap());
                     Iterator var33 = var25.getValue().keySet().iterator();

                     while (var33.hasNext()) {
                        String var35 = var33.next();
                        if (var31.containsKey(var35)) {
                           var33.remove();
                        } else {
                           String var38 = var28.get(var35);
                           if (var38 != null) {
                              var33.remove();
                              var31.put(var35, var38);
                           }
                        }
                     }
                  }

                  Collection var23 = Universe.get().getPlayers();
                  Map var26 = new Object2ObjectOpenHashMap();

                  for (PlayerRef var32 : var23) {
                     PacketHandler var34 = var32.getPacketHandler();
                     String var36 = var32.getLanguage();
                     UpdateTranslations[] var39 = var26.get(var36);
                     if (var39 == null) {
                        var39 = I18nModule.this.getUpdatePacketsForChanges(var36, var3, var2);
                        var26.put(var36, var39);
                     }

                     if (var39.length != 0) {
                        var34.write(var39);
                     }
                  }

                  IEventDispatcher var30 = HytaleServer.get().getEventBus().dispatchFor(MessagesUpdated.class);
                  if (var30.hasListener()) {
                     var30.dispatch(new MessagesUpdated(var3, var2));
                  }

                  I18nModule.this.getLogger().at(Level.INFO).log("Handled language changes for: %s", var3.keySet());
                  class="kw">return;
               }

               Entry var5 = (Entry<Path, EventKind>)var4.next();
               Path var6 = var5.getKey();
               EventKind var7 = var5.getValue();
               Path var8 = var6.toAbsolutePath().normalize();
               Path var9 = this.languagesPath.relativize(var8);
               if (I18nModule.FALLBACK_LANG_PATH.equals(var9)) {
                  var37 = new Properties();

                  try (InputStream var40 = Files.newInputStream(var6)) {
                     var37.load(var40);
                     break;
                  } catch (IOException var20) {
                     ((HytaleLogger.Api)I18nModule.this.getLogger().at(Level.SEVERE).withCause(var20)).log("Failed to load fallback languages from: %s", var6);
                  }
               } else {
                  String var10 = var9.getName(0).toString();
                  Path var11 = this.languagesPath.resolve(var10).toAbsolutePath().normalize();
                  String var12 = I18nModule.this.getPrefix(var11, var8);
                  class="kw">switch (var7) {
                     case ENTRY_MODIFY:
                     case ENTRY_DELETE:
                        String var13 = var12 + ".";
                        Map var14 = var2.computeIfAbsent(var10, var0 -> new Object2ObjectOpenHashMap());
                        Map var15 = I18nModule.this.languages.computeIfAbsent(var10, var0 -> new ConcurrentHashMap<>());
                        Iterator var16 = var15.keySet().iterator();

                        while (var16.hasNext()) {
                           String var17 = var16.next();
                           if (var17.startsWith(var13)) {
                              var14.put(var17, "");
                              var16.remove();
                           }
                        }

                        if (var7 == EventKind.ENTRY_DELETE) {
                           break;
                        }
                     case ENTRY_CREATE:
                        Map var41 = var3.computeIfAbsent(var10, var0 -> new Object2ObjectOpenHashMap());
                        I18nModule.this.loadMessagesFrom(var41, var12, var6);
                  }
               }
            }

            I18nModule.this.fallbacks.clear();
            var37.forEach((var1x, var2x) -> I18nModule.this.fallbacks.put(var1x, var2x));
            I18nModule.this.messagesVersion.incrementAndGet();
         }
      }
   }
}