From e1085270b842b0a482c36f65356bd8c0e95af741 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Tue, 5 Oct 2021 18:55:32 -0400 Subject: [PATCH] Don't use Locale class in MessageTranslator The Minecraft Java client doesn't appear to use any specific locale function in its translating. Just passing a string saves computational time in parsing a locale that will be the same result every time. Should this be invalid behavior, we should instead cache the Locale class for a player so it doesn't have to be repeatedly calculated. --- .../translators/chat/MessageTranslator.java | 10 ++++------ .../chat/MinecraftTranslationRegistry.java | 17 ++++++----------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/chat/MessageTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/chat/MessageTranslator.java index 73d4d7dfc..7fa74d4cd 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/chat/MessageTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/chat/MessageTranslator.java @@ -37,14 +37,13 @@ import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.utils.LanguageUtils; import java.util.EnumMap; -import java.util.Locale; import java.util.Map; import java.util.regex.Pattern; public class MessageTranslator { - // These are used for handling the translations of the messages - private static final TranslatableComponentRenderer RENDERER = TranslatableComponentRenderer.usingTranslationSource(new MinecraftTranslationRegistry()); + // Custom instead of TranslatableComponentRenderer#usingTranslationSource so we don't need to worry about finding a Locale class + private static final TranslatableComponentRenderer RENDERER = new MinecraftTranslationRegistry(); // Construct our own {@link GsonComponentSerializer} since we need to change a setting private static final GsonComponentSerializer GSON_SERIALIZER = GsonComponentSerializer.builder() @@ -105,9 +104,8 @@ public class MessageTranslator { */ public static String convertMessage(Component message, String locale) { try { - // Get a Locale from the given locale string - Locale localeCode = Locale.forLanguageTag(locale.replace('_', '-')); - message = RENDERER.render(message, localeCode); + // Translate any components that require it + message = RENDERER.render(message, locale); String legacy = LegacyComponentSerializer.legacySection().serialize(message); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/chat/MinecraftTranslationRegistry.java b/connector/src/main/java/org/geysermc/connector/network/translators/chat/MinecraftTranslationRegistry.java index 3f8edc657..3bae14abf 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/chat/MinecraftTranslationRegistry.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/chat/MinecraftTranslationRegistry.java @@ -25,8 +25,7 @@ package org.geysermc.connector.network.translators.chat; -import net.kyori.adventure.key.Key; -import net.kyori.adventure.translation.Translator; +import net.kyori.adventure.text.renderer.TranslatableComponentRenderer; import org.geysermc.connector.utils.LocaleUtils; import javax.annotation.Nonnull; @@ -40,19 +39,14 @@ import java.util.regex.Pattern; * This class is used for mapping a translation key with the already loaded Java locale data * Used in MessageTranslator.java as part of the KyoriPowered/Adventure library */ -public class MinecraftTranslationRegistry implements Translator { +public class MinecraftTranslationRegistry extends TranslatableComponentRenderer { private final Pattern stringReplacement = Pattern.compile("%s"); private final Pattern positionalStringReplacement = Pattern.compile("%([0-9]+)\\$s"); @Override - public @Nonnull Key name() { - return Key.key("geyser", "minecraft_translations"); - } - - @Override - public @Nullable MessageFormat translate(@Nonnull String key, @Nonnull Locale locale) { + public @Nullable MessageFormat translate(@Nonnull String key, @Nonnull String locale) { // Get the locale string - String localeString = LocaleUtils.getLocaleString(key, locale.toString()); + String localeString = LocaleUtils.getLocaleString(key, locale); // Replace the `%s` with numbered inserts `{0}` Pattern p = stringReplacement; @@ -75,6 +69,7 @@ public class MinecraftTranslationRegistry implements Translator { m.appendTail(sb); // replace single quote instances which get lost in MessageFormat otherwise - return new MessageFormat(sb.toString().replace("'", "''"), locale); + // Locale shouldn't need to be specific - dates for example will not be handled + return new MessageFormat(sb.toString().replace("'", "''"), Locale.ROOT); } }