diff --git a/bungee/src/main/java/org/geysermc/floodgate/module/BungeePlatformModule.java b/bungee/src/main/java/org/geysermc/floodgate/module/BungeePlatformModule.java index 5ceb1f8d..a54b4b44 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/module/BungeePlatformModule.java +++ b/bungee/src/main/java/org/geysermc/floodgate/module/BungeePlatformModule.java @@ -48,6 +48,7 @@ import org.geysermc.floodgate.platform.command.CommandRegistration; import org.geysermc.floodgate.platform.command.util.CommandUtil; import org.geysermc.floodgate.platform.listener.ListenerRegistration; import org.geysermc.floodgate.util.BungeeCommandUtil; +import org.geysermc.floodgate.util.LanguageManager; @RequiredArgsConstructor public final class BungeePlatformModule extends AbstractModule { @@ -95,8 +96,8 @@ public final class BungeePlatformModule extends AbstractModule { @Provides @Singleton - public CommandUtil commandUtil(FloodgateLogger logger) { - return new BungeeCommandUtil(logger); + public CommandUtil commandUtil(FloodgateLogger logger, LanguageManager languageManager) { + return new BungeeCommandUtil(logger, languageManager); } @Provides diff --git a/bungee/src/main/java/org/geysermc/floodgate/util/BungeeCommandUtil.java b/bungee/src/main/java/org/geysermc/floodgate/util/BungeeCommandUtil.java index be271b5c..7fc4f905 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/util/BungeeCommandUtil.java +++ b/bungee/src/main/java/org/geysermc/floodgate/util/BungeeCommandUtil.java @@ -30,7 +30,9 @@ import lombok.RequiredArgsConstructor; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; +import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.logger.FloodgateLogger; +import org.geysermc.floodgate.api.player.FloodgatePlayer; import org.geysermc.floodgate.platform.command.CommandMessage; import org.geysermc.floodgate.platform.command.util.CommandResponseCache; import org.geysermc.floodgate.platform.command.util.CommandUtil; @@ -38,10 +40,21 @@ import org.geysermc.floodgate.platform.command.util.CommandUtil; @RequiredArgsConstructor public final class BungeeCommandUtil extends CommandResponseCache implements CommandUtil { private final FloodgateLogger logger; + private final LanguageManager manager; @Override public void sendMessage(Object player, CommandMessage message, Object... args) { - cast(player).sendMessage(getOrAddCachedMessage(message, args)); + ProxiedPlayer proxiedPlayer = cast(player); + FloodgatePlayer floodgatePlayer = + FloodgateApi.getInstance().getPlayer(proxiedPlayer.getUniqueId()); + if (floodgatePlayer != null) { + proxiedPlayer.sendMessage(transformMessage( + manager.getPlayerLocaleString(message.getMessage(), + floodgatePlayer.getLanguageCode(), args))); + } else { + proxiedPlayer.sendMessage(transformMessage( + manager.getLocaleStringLog(message.getMessage(), args))); + } } @Override diff --git a/common/src/main/java/org/geysermc/floodgate/command/CommonCommandMessage.java b/common/src/main/java/org/geysermc/floodgate/command/CommonCommandMessage.java index 2d86caec..b539d886 100644 --- a/common/src/main/java/org/geysermc/floodgate/command/CommonCommandMessage.java +++ b/common/src/main/java/org/geysermc/floodgate/command/CommonCommandMessage.java @@ -33,14 +33,15 @@ import org.geysermc.floodgate.platform.command.CommandMessage; * Messages (or part of messages) that are used in two or more commands and thus are 'commonly used' */ public enum CommonCommandMessage implements CommandMessage { - NOT_A_PLAYER("Please head over to your Minecraft Account and link from there."), - CHECK_CONSOLE("Please check the console for more info!"), - IS_LINKED_ERROR("&cError while checking if the given player is linked. " + CHECK_CONSOLE); + NOT_A_PLAYER("floodgate.commands.not_a_player"), + CHECK_CONSOLE("floodgate.commands.check_console"), + // TODO used to also have console check + IS_LINKED_ERROR("floodgate.commands.is_linked_error"); @Getter private final String message; CommonCommandMessage(String message) { - this.message = message.replace('&', COLOR_CHAR); + this.message = message; } @Override diff --git a/common/src/main/java/org/geysermc/floodgate/command/LinkAccountCommand.java b/common/src/main/java/org/geysermc/floodgate/command/LinkAccountCommand.java index 6a7d57dd..0d47affd 100644 --- a/common/src/main/java/org/geysermc/floodgate/command/LinkAccountCommand.java +++ b/common/src/main/java/org/geysermc/floodgate/command/LinkAccountCommand.java @@ -146,26 +146,22 @@ public final class LinkAccountCommand implements Command { } public enum Message implements CommandMessage { - ALREADY_LINKED("&cYour account is already linked!\n" + - "&cIf you want to link to a different account, run &6/unlinkaccount&c and try it again." - ), - JAVA_USAGE("&cUsage: /linkaccount "), - LINK_REQUEST_CREATED("&aLog in as {} on Bedrock and run &6/linkaccount {} {}\n" + - "&cWarning: Any progress on your Bedrock account will not be carried over! Save any items in your inventory first.\n" + - "&cIf you change your mind you can run &6/unlinkaccount&c to get your progess back." - ), - BEDROCK_USAGE("&cStart the process from Java! Usage: /linkaccount "), - LINK_REQUEST_EXPIRED("&cThe code you entered is expired! Run &6/linkaccount&c again on your Java account"), - LINK_REQUEST_COMPLETED("You are successfully linked to {}!\nIf you want to undo this run /unlinkaccount"), - LINK_REQUEST_ERROR("&cAn error occurred while linking. " + CommonCommandMessage.CHECK_CONSOLE), - INVALID_CODE("&cInvalid code! Please check your code or run the &6/linkaccount&c command again on your Java account."), - NO_LINK_REQUESTED("&cThis player has not requested an account link! Please log in on Java and request one with &6/linkaccount"), - LINK_REQUEST_DISABLED("&cLinking is not enabled on this server."); + ALREADY_LINKED("floodgate.command.link_account.already_linked"), + JAVA_USAGE("floodgate.command.link_account.java_usage"), + LINK_REQUEST_CREATED("floodgate.command.link_account.link_request_created"), + BEDROCK_USAGE("floodgate.command.link_account.bedrock_usage"), + LINK_REQUEST_EXPIRED("floodgate.command.link_account.link_request_expired"), + LINK_REQUEST_COMPLETED("floodgate.command.link_account.link_request_completed"), + // TODO this also used to have another message + LINK_REQUEST_ERROR("floodgate.command.link_request.error"), + INVALID_CODE("floodgate.command.link_account.invalid_code"), + NO_LINK_REQUESTED("floodgate.command.link_account.no_link_requested"), + LINK_REQUEST_DISABLED("floodgate.command.link_request.disabled"); @Getter private final String message; Message(String message) { - this.message = message.replace('&', COLOR_CHAR); + this.message = message; } } } diff --git a/common/src/main/java/org/geysermc/floodgate/command/UnlinkAccountCommand.java b/common/src/main/java/org/geysermc/floodgate/command/UnlinkAccountCommand.java index 9699edef..f6b42e31 100644 --- a/common/src/main/java/org/geysermc/floodgate/command/UnlinkAccountCommand.java +++ b/common/src/main/java/org/geysermc/floodgate/command/UnlinkAccountCommand.java @@ -90,15 +90,16 @@ public final class UnlinkAccountCommand implements Command { } public enum Message implements CommandMessage { - NOT_LINKED("&cYour account isn't linked"), - UNLINK_SUCCESS("&cUnlink successful! Rejoin to return to your Bedrock account"), - UNLINK_ERROR("&cAn error occurred while unlinking player! " + CommonCommandMessage.CHECK_CONSOLE), - LINKING_NOT_ENABLED("&cLinking is not enabled on this server"); + NOT_LINKED("floodgate.command.unlink_account.not_linked"), + UNLINK_SUCCESS("floodgate.command.unlink_account.unlink_success"), + // TODO also used to have CHECK_CONSOLE + UNLINK_ERROR("floodgate.command.unlink_account.error"), + LINKING_NOT_ENABLED("floodgate.command.unlink_account.disabled"); @Getter private final String message; Message(String message) { - this.message = message.replace('&', COLOR_CHAR); + this.message = message; } } } diff --git a/common/src/main/java/org/geysermc/floodgate/util/LanguageManager.java b/common/src/main/java/org/geysermc/floodgate/util/LanguageManager.java index 13da6ab0..31be1dbf 100644 --- a/common/src/main/java/org/geysermc/floodgate/util/LanguageManager.java +++ b/common/src/main/java/org/geysermc/floodgate/util/LanguageManager.java @@ -38,18 +38,19 @@ import java.util.Locale; import java.util.Map; import java.util.Properties; - +/** + * Manages translations for strings in Floodgate + */ public class LanguageManager { + private final Map LOCALE_MAPPINGS = new HashMap<>(); + + private final FloodgateLogger logger; /** * 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; } @@ -62,14 +63,16 @@ public class LanguageManager { public void initialize(FloodgateConfig config) { loadFloodgateLocale("en_US"); // Fallback - if (config.getDefaultLocale() != null && isValidLanguage(formatLocale(config.getDefaultLocale()))) { + 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()); + String systemLocale = formatLocale(Locale.getDefault().getLanguage() + "_" + + Locale.getDefault().getCountry()); if (isValidLanguage(systemLocale)) { loadFloodgateLocale(systemLocale); - defaultLocale = formatLocale(systemLocale); + defaultLocale = systemLocale; } else { defaultLocale = "en_US"; } @@ -77,7 +80,7 @@ public class LanguageManager { } /** - * Loads a Geyser locale from resources, if the file doesn't exist it just logs a warning + * Loads a Floodgate locale from resources; if the file doesn't exist it just logs a warning * * @param locale Locale to load */ diff --git a/common/src/main/resources/languages b/common/src/main/resources/languages index ec6e12a0..168a46c9 160000 --- a/common/src/main/resources/languages +++ b/common/src/main/resources/languages @@ -1 +1 @@ -Subproject commit ec6e12a0464e159530bad27ebeecb2226513a4af +Subproject commit 168a46c94efcc986a666e875bf09f582345a2eb9 diff --git a/spigot/src/main/java/org/geysermc/floodgate/module/SpigotPlatformModule.java b/spigot/src/main/java/org/geysermc/floodgate/module/SpigotPlatformModule.java index 60218087..fd6f6ff6 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/module/SpigotPlatformModule.java +++ b/spigot/src/main/java/org/geysermc/floodgate/module/SpigotPlatformModule.java @@ -45,6 +45,7 @@ import org.geysermc.floodgate.logger.JavaDefaultFloodgateLogger; import org.geysermc.floodgate.platform.command.CommandRegistration; import org.geysermc.floodgate.platform.listener.ListenerRegistration; import org.geysermc.floodgate.platform.command.util.CommandUtil; +import org.geysermc.floodgate.util.LanguageManager; import org.geysermc.floodgate.util.SpigotCommandUtil; @RequiredArgsConstructor @@ -88,8 +89,8 @@ public final class SpigotPlatformModule extends AbstractModule { @Provides @Singleton - public CommandUtil commandUtil(FloodgateLogger logger) { - return new SpigotCommandUtil(plugin, logger); + public CommandUtil commandUtil(FloodgateLogger logger, LanguageManager languageManager) { + return new SpigotCommandUtil(plugin, logger, languageManager); } @Provides diff --git a/spigot/src/main/java/org/geysermc/floodgate/util/SpigotCommandUtil.java b/spigot/src/main/java/org/geysermc/floodgate/util/SpigotCommandUtil.java index f8833805..4a399210 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/util/SpigotCommandUtil.java +++ b/spigot/src/main/java/org/geysermc/floodgate/util/SpigotCommandUtil.java @@ -30,7 +30,9 @@ import lombok.RequiredArgsConstructor; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.logger.FloodgateLogger; +import org.geysermc.floodgate.api.player.FloodgatePlayer; import org.geysermc.floodgate.platform.command.CommandMessage; import org.geysermc.floodgate.platform.command.util.CommandResponseCache; import org.geysermc.floodgate.platform.command.util.CommandUtil; @@ -39,10 +41,19 @@ import org.geysermc.floodgate.platform.command.util.CommandUtil; public final class SpigotCommandUtil extends CommandResponseCache implements CommandUtil { private final JavaPlugin plugin; private final FloodgateLogger logger; + private final LanguageManager manager; @Override public void sendMessage(Object player, CommandMessage message, Object... args) { - cast(player).sendMessage(format(message, args)); + Player bukkitPlayer = cast(player); + FloodgatePlayer floodgatePlayer = + FloodgateApi.getInstance().getPlayer(bukkitPlayer.getUniqueId()); + if (floodgatePlayer != null) { + bukkitPlayer.sendMessage(manager.getPlayerLocaleString(message.getMessage(), + floodgatePlayer.getLanguageCode(), args)); + } else { + bukkitPlayer.sendMessage(manager.getLocaleStringLog(message.getMessage(), args)); + } } @Override diff --git a/velocity/src/main/java/org/geysermc/floodgate/module/VelocityPlatformModule.java b/velocity/src/main/java/org/geysermc/floodgate/module/VelocityPlatformModule.java index 264a17b8..10873744 100644 --- a/velocity/src/main/java/org/geysermc/floodgate/module/VelocityPlatformModule.java +++ b/velocity/src/main/java/org/geysermc/floodgate/module/VelocityPlatformModule.java @@ -48,6 +48,7 @@ import org.geysermc.floodgate.logger.Slf4jLogger; import org.geysermc.floodgate.platform.command.CommandRegistration; import org.geysermc.floodgate.platform.command.util.CommandUtil; import org.geysermc.floodgate.platform.listener.ListenerRegistration; +import org.geysermc.floodgate.util.LanguageManager; import org.geysermc.floodgate.util.VelocityCommandUtil; import org.slf4j.Logger; @@ -90,8 +91,9 @@ public final class VelocityPlatformModule extends AbstractModule { @Provides @Singleton - public VelocityCommandUtil commandUtil(FloodgateLogger logger) { - return new VelocityCommandUtil(logger); + public VelocityCommandUtil commandUtil(FloodgateLogger logger, + LanguageManager languageManager) { + return new VelocityCommandUtil(logger, languageManager); } @Provides diff --git a/velocity/src/main/java/org/geysermc/floodgate/util/VelocityCommandUtil.java b/velocity/src/main/java/org/geysermc/floodgate/util/VelocityCommandUtil.java index b396a91a..2e801363 100644 --- a/velocity/src/main/java/org/geysermc/floodgate/util/VelocityCommandUtil.java +++ b/velocity/src/main/java/org/geysermc/floodgate/util/VelocityCommandUtil.java @@ -30,7 +30,9 @@ import com.velocitypowered.api.proxy.Player; import lombok.RequiredArgsConstructor; import net.kyori.text.TextComponent; import net.kyori.text.serializer.legacy.LegacyComponentSerializer; +import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.logger.FloodgateLogger; +import org.geysermc.floodgate.api.player.FloodgatePlayer; import org.geysermc.floodgate.platform.command.CommandMessage; import org.geysermc.floodgate.platform.command.util.CommandResponseCache; import org.geysermc.floodgate.platform.command.util.CommandUtil; @@ -38,10 +40,21 @@ import org.geysermc.floodgate.platform.command.util.CommandUtil; @RequiredArgsConstructor public final class VelocityCommandUtil extends CommandResponseCache implements CommandUtil { private final FloodgateLogger logger; + private final LanguageManager manager; @Override public void sendMessage(Object player, CommandMessage message, Object... args) { - cast(player).sendMessage(getOrAddCachedMessage(message, args)); + Player velocityPlayer = cast(player); + FloodgatePlayer floodgatePlayer = + FloodgateApi.getInstance().getPlayer(velocityPlayer.getUniqueId()); + if (floodgatePlayer != null) { + velocityPlayer.sendMessage( + transformMessage(manager.getPlayerLocaleString(message.getMessage(), + floodgatePlayer.getLanguageCode(), args))); + } else { + velocityPlayer.sendMessage( + transformMessage(manager.getLocaleStringLog(message.getMessage(), args))); + } } @Override