diff --git a/src/main/java/org/auioc/mods/arnicalib/client/command/argument/LanguageInfoArgument.java b/src/main/java/org/auioc/mods/arnicalib/client/command/argument/LanguageInfoArgument.java new file mode 100644 index 00000000..b7679588 --- /dev/null +++ b/src/main/java/org/auioc/mods/arnicalib/client/command/argument/LanguageInfoArgument.java @@ -0,0 +1,50 @@ +package org.auioc.mods.arnicalib.client.command.argument; + +import java.util.SortedSet; +import java.util.concurrent.CompletableFuture; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import org.auioc.mods.arnicalib.ArnicaLib; +import org.auioc.mods.arnicalib.utils.game.TextUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.language.LanguageInfo; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class LanguageInfoArgument implements ArgumentType { + + private static final DynamicCommandExceptionType UNKNOWN_CREATIVE_MODE_TAB = new DynamicCommandExceptionType( + (langCode) -> TextUtils.I18nText(ArnicaLib.i18n("argument.language_info.unknown"), langCode) + ); + + public static LanguageInfoArgument languageInfo() { + return new LanguageInfoArgument(); + } + + @Override + public LanguageInfo parse(StringReader reader) throws CommandSyntaxException { + String langCode = reader.readString(); + return getLanguages() + .stream() + .filter((langInfo) -> langInfo.getCode().equals(langCode)) + .findAny() + .orElseThrow(() -> UNKNOWN_CREATIVE_MODE_TAB.create(langCode)); + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + return SharedSuggestionProvider.suggest(getLanguages().stream().map(LanguageInfo::getCode), builder); + } + + private static SortedSet getLanguages() { + return Minecraft.getInstance().getLanguageManager().getLanguages(); + } + +} diff --git a/src/main/java/org/auioc/mods/arnicalib/utils/game/LanguageUtils.java b/src/main/java/org/auioc/mods/arnicalib/utils/game/LanguageUtils.java index ecc1fc52..d762efee 100644 --- a/src/main/java/org/auioc/mods/arnicalib/utils/game/LanguageUtils.java +++ b/src/main/java/org/auioc/mods/arnicalib/utils/game/LanguageUtils.java @@ -1,12 +1,9 @@ package org.auioc.mods.arnicalib.utils.game; import java.util.List; -import com.mojang.brigadier.suggestion.SuggestionProvider; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.language.ClientLanguage; import net.minecraft.client.resources.language.LanguageInfo; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.SharedSuggestionProvider; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -15,10 +12,6 @@ public interface LanguageUtils { LanguageInfo DEFAULT_LANGUAGE = new LanguageInfo("en_us", "US", "English", false); - SuggestionProvider ALL_LANGUAGES_SUGGESTION = (ctx, builder) -> { - return SharedSuggestionProvider.suggest(Minecraft.getInstance().getLanguageManager().getLanguages().stream().map(LanguageInfo::getCode), builder); - }; - static ClientLanguage getLanguage(LanguageInfo langInfo) { return ClientLanguage.loadFrom( Minecraft.getInstance().getResourceManager(), diff --git a/src/main/resources/assets/arnicalib/lang/en_us.json b/src/main/resources/assets/arnicalib/lang/en_us.json index 2b3ce906..19333aa4 100644 --- a/src/main/resources/assets/arnicalib/lang/en_us.json +++ b/src/main/resources/assets/arnicalib/lang/en_us.json @@ -11,6 +11,7 @@ "arnicalib.argument.damage_source.invalid": "Invalid damage source \"%s\"", "arnicalib.argument.creative_mod_tab.unknown": "Unknown creative mod tab \"%s\"", + "arnicalib.argument.language_info.unknown": "Unknown language \"%s\"", "arnicalib.command.version.success": "Version: %s (%s)", "arnicalib.command.version.failure.zero": "§eCould not read the mod version. §7If this is a development environment you can ignore this message", diff --git a/src/main/resources/assets/arnicalib/lang/zh_cn.json b/src/main/resources/assets/arnicalib/lang/zh_cn.json index 632f45f1..79ca07b8 100644 --- a/src/main/resources/assets/arnicalib/lang/zh_cn.json +++ b/src/main/resources/assets/arnicalib/lang/zh_cn.json @@ -11,6 +11,7 @@ "arnicalib.argument.damage_source.invalid": "无效的伤害类型\"%s\"", "arnicalib.argument.creative_mod_tab.unknown": "未知的创造模式物品栏标签\"%s\"", + "arnicalib.argument.language_info.unknown": "未知的语言\"%s\"", "arnicalib.command.version.success": "版本: %s (%s)", "arnicalib.command.version.failure.zero": "§e无法读取模组版本。§7若处在开发环境中则您可以忽略此消息",