Add support for resource reloading event to refresh translations

This commit is contained in:
Xujiayao 2026-01-31 23:16:56 +08:00
parent 24f559feab
commit c964552da1
5 changed files with 70 additions and 14 deletions

View file

@ -24,9 +24,6 @@ public class MinecraftEventHandler {
* Initializes the Minecraft event handlers.
*/
public static void init() {
// Initialize Minecraft translations
TranslationManager.init();
EventManager.register(MinecraftEvents.ServerStarted.class, event -> {
Map<String, String> placeholders = Map.of();
NetworkManager.sendPacketToServer(new MinecraftEventPacket(MinecraftEventPacket.MessageType.SERVER_STARTED, placeholders));
@ -96,6 +93,11 @@ public class MinecraftEventHandler {
// Register Minecraft /dmcc commands
MinecraftCommands.register(event.dispatcher());
});
EventManager.register(MinecraftEvents.ReloadResources.class, event -> {
// Refresh Minecraft translations
TranslationManager.init();
});
}
/**

View file

@ -114,4 +114,11 @@ public class MinecraftEvents {
CommandDispatcher<CommandSourceStack> dispatcher
) {
}
/**
* Posted when Minecraft is reloading resources.
*/
public record ReloadResources(
) {
}
}

View file

@ -0,0 +1,40 @@
package com.xujiayao.discord_mc_chat.minecraft.mixins;
import com.xujiayao.discord_mc_chat.minecraft.events.MinecraftEvents;
import com.xujiayao.discord_mc_chat.utils.events.EventManager;
import net.minecraft.commands.Commands;
import net.minecraft.core.LayeredRegistryAccess;
import net.minecraft.core.Registry;
import net.minecraft.server.RegistryLayer;
import net.minecraft.server.ReloadableServerResources;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.world.flag.FeatureFlagSet;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
/**
* @author Xujiayao
*/
@Mixin(ReloadableServerResources.class)
public class MixinReloadableServerResources {
@Inject(method = "loadResources", at = @At("RETURN"))
private static void loadResources(ResourceManager p_248588_,
LayeredRegistryAccess<RegistryLayer> p_335667_,
List<Registry.PendingTags<?>> p_363739_,
FeatureFlagSet p_250212_,
Commands.CommandSelection p_249301_,
int p_251126_,
Executor p_249136_,
Executor p_249601_,
CallbackInfoReturnable<CompletableFuture<ReloadableServerResources>> cir) {
// ReloadResources Event
EventManager.post(new MinecraftEvents.ReloadResources());
}
}

View file

@ -15,6 +15,8 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Stream;
import static com.xujiayao.discord_mc_chat.Constants.LOGGER;
@ -37,21 +39,25 @@ public class TranslationManager {
* Loads translations for the current target language first, then falls back to en_us.
*/
public static void init() {
TRANSLATIONS.clear();
try (ExecutorService executor = Executors.newSingleThreadExecutor(r -> new Thread(r, "DMCC-Translations"))) {
executor.submit(() -> {
TRANSLATIONS.clear();
String language = I18nManager.getLanguage();
String language = I18nManager.getLanguage();
// Load the target language translations
loadTranslations(language);
int loadedCount = TRANSLATIONS.size();
// Load the target language translations
loadTranslations(language);
int loadedCount = TRANSLATIONS.size();
// Load en_us translations to fill in missing keys (fallback)
if (!"en_us".equals(language)) {
loadTranslations("en_us");
LOGGER.info("Loaded {}/{} Minecraft \"{}\" translations", loadedCount, TRANSLATIONS.size(), language);
// Load en_us translations to fill in missing keys (fallback)
if (!"en_us".equals(language)) {
loadTranslations("en_us");
LOGGER.info("Loaded {}/{} Minecraft \"{}\" translations", loadedCount, TRANSLATIONS.size(), language);
}
currentLoadedLanguage = language;
});
}
currentLoadedLanguage = language;
}
/**

View file

@ -7,6 +7,7 @@
"MixinMinecraftServer",
"MixinPlayerAdvancements",
"MixinPlayerList",
"MixinReloadableServerResources",
"MixinSayCommand",
"MixinServerGamePacketListenerImpl",
"MixinServerPlayer",