KyoriPowered / adventure

A user-interface library, formerly known as text, for Minecraft: Java Edition
https://docs.advntr.dev/
MIT License
706 stars 107 forks source link

Issue with Translator-rendering when not closing </lang> tag #974

Open Boy0000 opened 1 year ago

Boy0000 commented 1 year ago

This builds upon #972 but could replicate this with other similar implementations. In short, when using a Translator as a source to GlobalTranslator that formats a minimessage string from a given translation-key, it breaks when not fully closing lang-tag. It seems to just clear any sort of tags after a first one, like the gradient dissapearing below and the following text Ofc also means all following lang-keys are not formatted

image

Discord convo

Below is some code to more easily reproduce this then just run the /example command iguess with the config containing example.key.value and value2 with some form of MM message after:

import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.translation.GlobalTranslator;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;

import java.util.Objects;

public class Plugin extends JavaPlugin {

    private static Plugin instance;

    @Override
    public void onEnable() {
        saveDefaultConfig();
        instance = this;

        GlobalTranslator.translator().addSource(new Translator());
        getCommand("example").setExecutor(new Command());
    }

    private class Command implements CommandExecutor {
        @Override
        public boolean onCommand(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) {
            if (Objects.equals(label, "example")) {
                sender.sendMessage(GlobalTranslator.render(MiniMessage.miniMessage().deserialize("<lang:example.key.value><lang:example.key.value2>");
                sender.sendMessage(GlobalTranslator.render(MiniMessage.miniMessage().deserialize("<lang:example.key.value></lang><lang:example.key.value2>");
            }
            return true;
        }
    }

    public static Plugin getInstance() {
        return instance;
    }

}
public class Translator extends MiniMessageTranslator {
    @Nullable
    @Override
    protected String getMiniMessageString(@NotNull String key, @NotNull Locale locale) {
        return Plugin.getInstance().getConfig().getString(key);
    }

    @Override
    public @NotNull Key name() {
        return Key.key("example", "translator");
    }
}