diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..9bc57666 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "common/src/main/resources/languages"] + path = common/src/main/resources/languages + url = https://github.com/GeyserMC/languages diff --git a/bungee/src/main/java/org/geysermc/floodgate/BungeePlugin.java b/bungee/src/main/java/org/geysermc/floodgate/BungeePlugin.java index c022d4d1..2b974891 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/BungeePlugin.java +++ b/bungee/src/main/java/org/geysermc/floodgate/BungeePlugin.java @@ -45,12 +45,13 @@ public final class BungeePlugin extends Plugin { new BungeePlatformModule(this) ); - long endCtm = System.currentTimeMillis(); - getLogger().info("Took " + (endCtm - ctm) + "ms to boot Floodgate"); - // Bungeecord doesn't have a build-in function to disable plugins, // so there is no need to have a custom Platform class like Spigot platform = injector.getInstance(FloodgatePlatform.class); + + long endCtm = System.currentTimeMillis(); + getLogger().info(platform.getLanguageManager().getLocaleStringLog("floodgate.core.finish", + endCtm - ctm)); } @Override diff --git a/bungee/src/main/java/org/geysermc/floodgate/listener/BungeeListener.java b/bungee/src/main/java/org/geysermc/floodgate/listener/BungeeListener.java index 2af73209..2f9f0846 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/listener/BungeeListener.java +++ b/bungee/src/main/java/org/geysermc/floodgate/listener/BungeeListener.java @@ -16,6 +16,7 @@ import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.api.player.FloodgatePlayer; import org.geysermc.floodgate.config.ProxyFloodgateConfig; import org.geysermc.floodgate.handler.BungeeDataHandler; +import org.geysermc.floodgate.util.LanguageManager; import java.util.UUID; @@ -23,12 +24,15 @@ public final class BungeeListener implements Listener { private final BungeeDataHandler dataHandler; private final ProxyFloodgateApi api; private final FloodgateLogger logger; + private final LanguageManager languageManager; public BungeeListener(Plugin plugin, ProxyFloodgateConfig config, ProxyFloodgateApi api, - HandshakeHandler handshakeHandler, FloodgateLogger logger) { + HandshakeHandler handshakeHandler, FloodgateLogger logger, + LanguageManager languageManager) { this.dataHandler = new BungeeDataHandler(plugin, config, api, handshakeHandler, logger); this.api = api; this.logger = logger; + this.languageManager = languageManager; } @EventHandler(priority = EventPriority.LOW) @@ -57,8 +61,8 @@ public final class BungeeListener implements Listener { logger.info("Login" + (player != null) + " " + uniqueId); if (player != null) { player.as(FloodgatePlayerImpl.class).setLogin(false); - logger.info("Floodgate player who is logged in as {} {} joined", - player.getCorrectUsername(), player.getCorrectUniqueId()); + logger.info(languageManager.getLocaleStringLog("floodgate.ingame.login_name", + player.getCorrectUsername(), player.getCorrectUniqueId())); } } @@ -76,9 +80,8 @@ public final class BungeeListener implements Listener { FloodgatePlayer fPlayer; if ((fPlayer = api.removePlayer(player.getUniqueId())) != null) { api.removeEncryptedData(player.getUniqueId()); - logger.info( - "Floodgate player who was logged in as {} {} disconnected", - player.getName(), player.getUniqueId() + logger.info(languageManager.getLocaleStringLog( + "floodgate.ingame.disconnect_name", player.getName()) ); } logger.info("Disconnected " + fPlayer); diff --git a/bungee/src/main/java/org/geysermc/floodgate/module/BungeeListenerModule.java b/bungee/src/main/java/org/geysermc/floodgate/module/BungeeListenerModule.java index 2d58dd4e..244f70b3 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/module/BungeeListenerModule.java +++ b/bungee/src/main/java/org/geysermc/floodgate/module/BungeeListenerModule.java @@ -38,6 +38,7 @@ import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.config.ProxyFloodgateConfig; import org.geysermc.floodgate.listener.BungeeListener; import org.geysermc.floodgate.register.ListenerRegister; +import org.geysermc.floodgate.util.LanguageManager; public final class BungeeListenerModule extends AbstractModule { @Override @@ -49,7 +50,7 @@ public final class BungeeListenerModule extends AbstractModule { @ProvidesIntoSet public Listener bungeeListener(Plugin plugin, ProxyFloodgateConfig config, ProxyFloodgateApi api, HandshakeHandler handshakeHandler, - FloodgateLogger logger) { - return new BungeeListener(plugin, config, api, handshakeHandler, logger); + FloodgateLogger logger, LanguageManager languageManager) { + return new BungeeListener(plugin, config, api, handshakeHandler, logger, languageManager); } } diff --git a/common/src/main/java/org/geysermc/floodgate/FloodgatePlatform.java b/common/src/main/java/org/geysermc/floodgate/FloodgatePlatform.java index 569b8b2a..992523e7 100644 --- a/common/src/main/java/org/geysermc/floodgate/FloodgatePlatform.java +++ b/common/src/main/java/org/geysermc/floodgate/FloodgatePlatform.java @@ -42,6 +42,7 @@ import org.geysermc.floodgate.config.loader.ConfigLoader; import org.geysermc.floodgate.link.PlayerLinkLoader; import org.geysermc.floodgate.module.ConfigLoadedModule; import org.geysermc.floodgate.module.PostInitializeModule; +import org.geysermc.floodgate.util.LanguageManager; import java.nio.file.Files; import java.nio.file.Path; @@ -57,6 +58,9 @@ public class FloodgatePlatform { @Getter(AccessLevel.PROTECTED) private final FloodgateLogger logger; + @Getter(AccessLevel.PROTECTED) + private final LanguageManager languageManager; + private final Injector guice; @Inject private PlatformInjector injector; @@ -65,9 +69,10 @@ public class FloodgatePlatform { public FloodgatePlatform(@Named("dataDirectory") Path dataDirectory, FloodgateApi api, ConfigLoader configLoader, PlayerLinkLoader playerLinkLoader, HandshakeHandler handshakeHandler, FloodgateLogger logger, - Injector injector) { + LanguageManager languageManager, Injector injector) { this.api = api; this.logger = logger; + this.languageManager = languageManager; if (!Files.isDirectory(dataDirectory)) { try { @@ -79,12 +84,14 @@ public class FloodgatePlatform { } config = configLoader.load(); + this.languageManager.initialize(config); // make the config available for other classes guice = injector.createChildInjector(new ConfigLoadedModule(config, api)); guice.injectMembers(playerLinkLoader); guice.injectMembers(handshakeHandler); + guice.injectMembers(languageManager); PlayerLink link = playerLinkLoader.load(); diff --git a/common/src/main/java/org/geysermc/floodgate/config/FloodgateConfig.java b/common/src/main/java/org/geysermc/floodgate/config/FloodgateConfig.java index 006dbf0e..141e7f15 100644 --- a/common/src/main/java/org/geysermc/floodgate/config/FloodgateConfig.java +++ b/common/src/main/java/org/geysermc/floodgate/config/FloodgateConfig.java @@ -46,6 +46,9 @@ public class FloodgateConfig { @JsonProperty(value = "replace-spaces") private boolean replaceSpaces; + @JsonProperty(value = "default-locale") + private String defaultLocale; + @JsonProperty(value = "disconnect") private DisconnectMessages messages; diff --git a/common/src/main/java/org/geysermc/floodgate/config/loader/ConfigLoader.java b/common/src/main/java/org/geysermc/floodgate/config/loader/ConfigLoader.java index 38a7b1df..b5cba925 100644 --- a/common/src/main/java/org/geysermc/floodgate/config/loader/ConfigLoader.java +++ b/common/src/main/java/org/geysermc/floodgate/config/loader/ConfigLoader.java @@ -36,6 +36,8 @@ import org.geysermc.floodgate.config.updater.ConfigUpdater; import org.geysermc.floodgate.util.EncryptionUtil; import java.io.IOException; +import java.io.InputStream; +import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -74,7 +76,13 @@ public class ConfigLoader { boolean newConfig = !Files.exists(configPath); try { if (newConfig) { - Files.copy(defaultConfigPath, configPath); + InputStream newConfigFile = + ConfigLoader.class.getClassLoader().getResourceAsStream(defaultConfigName); + if (newConfigFile == null) { + throw new RuntimeException("Failed to get the default config file!"); + } + + Files.copy(newConfigFile, configPath); KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); generator.initialize(2048); diff --git a/common/src/main/java/org/geysermc/floodgate/config/updater/ConfigUpdater.java b/common/src/main/java/org/geysermc/floodgate/config/updater/ConfigUpdater.java index 4ffaef7b..a6de3dbd 100644 --- a/common/src/main/java/org/geysermc/floodgate/config/updater/ConfigUpdater.java +++ b/common/src/main/java/org/geysermc/floodgate/config/updater/ConfigUpdater.java @@ -45,6 +45,8 @@ public class ConfigUpdater { private final ConfigFileUpdater fileUpdater; private final FloodgateLogger logger; + private static final int CONFIG_VERSION = 1; + public void update(Path defaultConfigLocation) { Path configLocation = dataFolder.resolve("config.yml"); @@ -70,12 +72,12 @@ public class ConfigUpdater { int version = (int) versionElement; checkArgument( - version == 1, - "Config is newer then possible on this version! Expected 1, got " + version + version == CONFIG_VERSION, + "Config is newer then possible on this version! Expected " + CONFIG_VERSION + ", got " + version ); // config is already up-to-date - if (version == 1) { + if (version == CONFIG_VERSION) { return; } } diff --git a/common/src/main/java/org/geysermc/floodgate/module/CommonModule.java b/common/src/main/java/org/geysermc/floodgate/module/CommonModule.java index 31149502..5c4eb0ef 100644 --- a/common/src/main/java/org/geysermc/floodgate/module/CommonModule.java +++ b/common/src/main/java/org/geysermc/floodgate/module/CommonModule.java @@ -44,6 +44,7 @@ import org.geysermc.floodgate.config.updater.ConfigFileUpdater; import org.geysermc.floodgate.config.updater.ConfigUpdater; import org.geysermc.floodgate.inject.CommonPlatformInjector; import org.geysermc.floodgate.link.PlayerLinkLoader; +import org.geysermc.floodgate.util.LanguageManager; import java.nio.file.Path; @@ -85,6 +86,12 @@ public final class CommonModule extends AbstractModule { return new ConfigUpdater(dataDirectory, configFileUpdater, logger); } + @Provides + @Singleton + public LanguageManager languageLoader(FloodgateLogger logger) { + return new LanguageManager(logger); + } + @Provides @Singleton public PlayerLinkLoader playerLinkLoader() { diff --git a/common/src/main/java/org/geysermc/floodgate/util/LanguageManager.java b/common/src/main/java/org/geysermc/floodgate/util/LanguageManager.java new file mode 100644 index 00000000..13da6ab0 --- /dev/null +++ b/common/src/main/java/org/geysermc/floodgate/util/LanguageManager.java @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Floodgate + * + */ + +package org.geysermc.floodgate.util; + +import org.geysermc.floodgate.api.logger.FloodgateLogger; +import org.geysermc.floodgate.config.FloodgateConfig; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.text.MessageFormat; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; + + +public class LanguageManager { + + /** + * The locale used in console and as a fallback + */ + private String defaultLocale; + + private final Map LOCALE_MAPPINGS = new HashMap<>(); + + private final FloodgateLogger logger; + + public LanguageManager(FloodgateLogger logger) { + this.logger = logger; + } + + /** + * Loads the log's locale file once Floodgate loads the config + * + * @param config the Floodgate config + */ + public void initialize(FloodgateConfig config) { + loadFloodgateLocale("en_US"); // Fallback + + if (config.getDefaultLocale() != null && isValidLanguage(formatLocale(config.getDefaultLocale()))) { + loadFloodgateLocale(formatLocale(config.getDefaultLocale())); + defaultLocale = formatLocale(config.getDefaultLocale()); + } else { + String systemLocale = formatLocale(Locale.getDefault().getLanguage() + "_" + Locale.getDefault().getCountry()); + if (isValidLanguage(systemLocale)) { + loadFloodgateLocale(systemLocale); + defaultLocale = formatLocale(systemLocale); + } else { + defaultLocale = "en_US"; + } + } + } + + /** + * Loads a Geyser locale from resources, if the file doesn't exist it just logs a warning + * + * @param locale Locale to load + */ + public void loadFloodgateLocale(String locale) { + locale = formatLocale(locale); + + InputStream localeStream = LanguageManager.class.getClassLoader().getResourceAsStream( + "languages/texts/" + locale + ".properties"); + + // Load the locale + if (localeStream != null) { + Properties localeProp = new Properties(); + try { + localeProp.load(new InputStreamReader(localeStream, StandardCharsets.UTF_8)); + } catch (Exception e) { + throw new AssertionError("Failed to load Floodgate locale", e); + } + + // Insert the locale into the mappings + LOCALE_MAPPINGS.put(locale, localeProp); + } else { + logger.warn("Missing locale file: " + locale); + } + } + + /** + * Get a formatted language string with the default locale for Floodgate + * + * @param key Language string to translate + * @param values Values to put into the string + * @return Translated string or the original message if it was not found in the given locale + */ + public String getLocaleStringLog(String key, Object... values) { + return getPlayerLocaleString(key, defaultLocale, values); + } + + /** + * Get a formatted language string with the given locale for Floodgate + * + * @param key Language string to translate + * @param locale Locale to translate to + * @param values Values to put into the string + * @return Translated string or the original message if it was not found in the given locale + */ + public String getPlayerLocaleString(String key, String locale, Object... values) { + locale = formatLocale(locale); + + Properties properties = LOCALE_MAPPINGS.get(locale); + String formatString = properties.getProperty(key); + + // Try and get the key from the default locale + if (formatString == null) { + properties = LOCALE_MAPPINGS.get(defaultLocale); + formatString = properties.getProperty(key); + } + + // Try and get the key from en_US (this should only ever happen in development) + if (formatString == null) { + properties = LOCALE_MAPPINGS.get("en_US"); + formatString = properties.getProperty(key); + } + + // Final fallback + if (formatString == null) { + formatString = key; + } + + return MessageFormat.format(formatString.replace("'", "''").replace("&", "\u00a7"), values); + } + + /** + * Cleans up and formats a locale string + * + * @param locale The locale to format + * @return The formatted locale + */ + private static String formatLocale(String locale) { + try { + String[] parts = locale.toLowerCase().split("_"); + return parts[0] + "_" + parts[1].toUpperCase(); + } catch (Exception e) { + return locale; + } + } + + /** + * Ensures that the given locale is supported by Floodgate + * @param locale the locale to validate + * @return true if the given locale is supported by Floodgate + */ + private boolean isValidLanguage(String locale) { + boolean result = true; + if (LanguageManager.class.getResource("/languages/texts/" + locale + ".properties") == null) { + result = false; + logger.warn(locale + " is not a supported Floodgate language."); + } else { + if (!LOCALE_MAPPINGS.containsKey(locale)) { + loadFloodgateLocale(locale); + } + } + return result; + } +} diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index 9cb41687..d5ba317b 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -11,6 +11,9 @@ username-prefix: "*" # Should spaces be replaced with '_' in bedrock usernames? replace-spaces: true +# The default locale for Floodgate. By default, Floodgate uses the system locale +# default-locale: en_US + disconnect: # The disconnect message Geyser users should get when connecting # to the server with an invalid key diff --git a/common/src/main/resources/languages b/common/src/main/resources/languages new file mode 160000 index 00000000..ec6e12a0 --- /dev/null +++ b/common/src/main/resources/languages @@ -0,0 +1 @@ +Subproject commit ec6e12a0464e159530bad27ebeecb2226513a4af diff --git a/common/src/main/resources/proxy-config.yml b/common/src/main/resources/proxy-config.yml index 87d797af..c2b6a637 100644 --- a/common/src/main/resources/proxy-config.yml +++ b/common/src/main/resources/proxy-config.yml @@ -11,6 +11,9 @@ username-prefix: "*" # Should spaces be replaced with '_' in bedrock usernames? replace-spaces: true +# The default locale for Floodgate. By default, Floodgate uses the system locale +# default-locale: en_US + # todo impl args like {proxy} # Should {proxy} send the bedrock player data to the servers it is connecting to? # This requires Floodgate to be installed on the servers. diff --git a/pom.xml b/pom.xml index 2264049f..f5ff4e46 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ https://github.com/GeyserMC/Floodgate - 1.0-SNAPSHOT + 1.1.0 1.8.8-R0.1-SNAPSHOT 1.15-SNAPSHOT 1.1.0-SNAPSHOT diff --git a/spigot/src/main/java/org/geysermc/floodgate/SpigotPlatform.java b/spigot/src/main/java/org/geysermc/floodgate/SpigotPlatform.java index d1f2c9f5..9af9d01d 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/SpigotPlatform.java +++ b/spigot/src/main/java/org/geysermc/floodgate/SpigotPlatform.java @@ -36,6 +36,7 @@ import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.config.loader.ConfigLoader; import org.geysermc.floodgate.link.PlayerLinkLoader; +import org.geysermc.floodgate.util.LanguageManager; import java.nio.file.Path; @@ -46,9 +47,9 @@ public final class SpigotPlatform extends FloodgatePlatform { public SpigotPlatform(@Named("dataDirectory") Path dataDirectory, FloodgateApi api, ConfigLoader configLoader, PlayerLinkLoader playerLinkLoader, HandshakeHandler handshakeHandler, FloodgateLogger logger, - Injector injector) { + LanguageManager languageManager, Injector injector) { super(dataDirectory, api, configLoader, playerLinkLoader, - handshakeHandler, logger, injector); + handshakeHandler, logger, languageManager, injector); } @Override diff --git a/spigot/src/main/java/org/geysermc/floodgate/SpigotPlugin.java b/spigot/src/main/java/org/geysermc/floodgate/SpigotPlugin.java index 2df7cbd4..3f1944ea 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/SpigotPlugin.java +++ b/spigot/src/main/java/org/geysermc/floodgate/SpigotPlugin.java @@ -46,10 +46,11 @@ public final class SpigotPlugin extends JavaPlugin { new SpigotPlatformModule(this) ); - long endCtm = System.currentTimeMillis(); - getLogger().info("Took " + (endCtm - ctm) + "ms to boot Floodgate"); - platform = injector.getInstance(SpigotPlatform.class); + + long endCtm = System.currentTimeMillis(); + getLogger().info(platform.getLanguageManager().getLocaleStringLog("floodgate.core.finish", + endCtm - ctm)); } @Override diff --git a/spigot/src/main/java/org/geysermc/floodgate/listener/SpigotListener.java b/spigot/src/main/java/org/geysermc/floodgate/listener/SpigotListener.java index 6d1b1256..a7888a62 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/listener/SpigotListener.java +++ b/spigot/src/main/java/org/geysermc/floodgate/listener/SpigotListener.java @@ -38,6 +38,7 @@ import org.geysermc.floodgate.FloodgatePlayerImpl; import org.geysermc.floodgate.api.SimpleFloodgateApi; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.api.player.FloodgatePlayer; +import org.geysermc.floodgate.util.LanguageManager; import java.util.UUID; @@ -45,6 +46,7 @@ import java.util.UUID; public final class SpigotListener implements Listener { private final SimpleFloodgateApi api; private final FloodgateLogger logger; + private final LanguageManager languageManager; @EventHandler(priority = EventPriority.MONITOR) public void onAsyncPreLogin(AsyncPlayerPreLoginEvent event) { @@ -66,8 +68,8 @@ public final class SpigotListener implements Listener { FloodgatePlayer player = api.getPlayer(uniqueId); if (player != null) { player.as(FloodgatePlayerImpl.class).setLogin(false); - logger.info("Floodgate player who is logged in as {} {} joined", - player.getCorrectUsername(), player.getCorrectUniqueId()); + logger.info(languageManager.getLocaleStringLog("floodgate.ingame.login_name", + player.getCorrectUsername(), player.getCorrectUniqueId())); } } @@ -75,9 +77,8 @@ public final class SpigotListener implements Listener { public void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); if (api.removePlayer(player.getUniqueId()) != null) { - logger.info( - "Floodgate player who was logged in as {} {} disconnected", - player.getName(), player.getUniqueId() + logger.info(languageManager.getLocaleStringLog( + "floodgate.ingame.disconnect_name", player.getName()) ); } } diff --git a/spigot/src/main/java/org/geysermc/floodgate/module/SpigotListenerModule.java b/spigot/src/main/java/org/geysermc/floodgate/module/SpigotListenerModule.java index 7cd0b095..2c92d58c 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/module/SpigotListenerModule.java +++ b/spigot/src/main/java/org/geysermc/floodgate/module/SpigotListenerModule.java @@ -35,6 +35,7 @@ import org.geysermc.floodgate.api.SimpleFloodgateApi; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.listener.SpigotListener; import org.geysermc.floodgate.register.ListenerRegister; +import org.geysermc.floodgate.util.LanguageManager; public final class SpigotListenerModule extends AbstractModule { @Override @@ -44,7 +45,8 @@ public final class SpigotListenerModule extends AbstractModule { @Singleton @ProvidesIntoSet - public Listener spigotListener(SimpleFloodgateApi api, FloodgateLogger logger) { - return new SpigotListener(api, logger); + public Listener spigotListener(SimpleFloodgateApi api, FloodgateLogger logger, + LanguageManager languageManager) { + return new SpigotListener(api, logger, languageManager); } } diff --git a/velocity/src/main/java/org/geysermc/floodgate/VelocityPlugin.java b/velocity/src/main/java/org/geysermc/floodgate/VelocityPlugin.java index a9475f0e..2ae42762 100644 --- a/velocity/src/main/java/org/geysermc/floodgate/VelocityPlugin.java +++ b/velocity/src/main/java/org/geysermc/floodgate/VelocityPlugin.java @@ -50,10 +50,11 @@ public final class VelocityPlugin { new VelocityPlatformModule() ); - long endCtm = System.currentTimeMillis(); - logger.info("Took " + (endCtm - ctm) + "ms to boot Floodgate"); - platform = injector.getInstance(FloodgatePlatform.class); + + long endCtm = System.currentTimeMillis(); + logger.info(platform.getLanguageManager().getLocaleStringLog("floodgate.core.finish", + endCtm - ctm)); } @Subscribe diff --git a/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java b/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java index 7d0e51b5..fb01ea60 100644 --- a/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java +++ b/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java @@ -42,6 +42,7 @@ import net.kyori.adventure.text.TextComponent; import org.geysermc.floodgate.api.ProxyFloodgateApi; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.api.player.FloodgatePlayer; +import org.geysermc.floodgate.util.LanguageManager; import java.lang.reflect.Field; import java.util.ArrayList; @@ -58,17 +59,19 @@ public final class VelocityListener { private final AttributeKey playerAttribute; private final AttributeKey kickMessageAttribute; private final FloodgateLogger logger; + private final LanguageManager languageManager; private final Cache playerCache; public VelocityListener(ProxyFloodgateApi api, AttributeKey playerAttribute, AttributeKey kickMessageAttribute, - FloodgateLogger logger) { + FloodgateLogger logger, LanguageManager languageManager) { this.api = api; this.playerAttribute = playerAttribute; this.kickMessageAttribute = kickMessageAttribute; this.logger = logger; + this.languageManager = languageManager; this.playerCache = CacheBuilder.newBuilder() .maximumSize(500) @@ -125,8 +128,9 @@ public final class VelocityListener { if (fPlayer != null && api.removePlayer(fPlayer)) { api.removeEncryptedData(event.getPlayer().getUniqueId()); - logger.info("Removed Bedrock player who was logged in as {} {} ", - player.getUsername(), player.getUniqueId()); + logger.info(languageManager.getLocaleStringLog( + "floodgate.ingame.disconnect_name", player.getUsername()) + ); } } catch (Exception exception) { logger.error("Failed to remove the player", exception); diff --git a/velocity/src/main/java/org/geysermc/floodgate/module/VelocityListenerModule.java b/velocity/src/main/java/org/geysermc/floodgate/module/VelocityListenerModule.java index 6d3ca869..a35f2b19 100644 --- a/velocity/src/main/java/org/geysermc/floodgate/module/VelocityListenerModule.java +++ b/velocity/src/main/java/org/geysermc/floodgate/module/VelocityListenerModule.java @@ -35,6 +35,7 @@ import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.api.player.FloodgatePlayer; import org.geysermc.floodgate.listener.VelocityListener; import org.geysermc.floodgate.register.ListenerRegister; +import org.geysermc.floodgate.util.LanguageManager; public final class VelocityListenerModule extends AbstractModule { @Override @@ -45,8 +46,9 @@ public final class VelocityListenerModule extends AbstractModule { @Singleton @ProvidesIntoSet public Object velocityListener(ProxyFloodgateApi api, FloodgateLogger logger, + LanguageManager languageManager, @Named("playerAttribute") AttributeKey playerAttr, @Named("kickMessageAttribute") AttributeKey kickMessageAttr) { - return new VelocityListener(api, playerAttr, kickMessageAttr, logger); + return new VelocityListener(api, playerAttr, kickMessageAttr, logger, languageManager); } }