package net.minecraft.client.resources.language; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.mojang.logging.LogUtils; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import java.util.function.Consumer; import java.util.stream.Stream; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.resources.metadata.language.LanguageMetadataSection; import net.minecraft.locale.Language; import net.minecraft.server.packs.PackResources; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @Environment(EnvType.CLIENT) public class LanguageManager implements ResourceManagerReloadListener { private static final Logger LOGGER = LogUtils.getLogger(); private static final LanguageInfo DEFAULT_LANGUAGE = new LanguageInfo("US", "English", false); private Map languages = ImmutableMap.of("en_us", DEFAULT_LANGUAGE); private String currentCode; private final Consumer reloadCallback; public LanguageManager(String currentCode, Consumer reloadFallback) { this.currentCode = currentCode; this.reloadCallback = reloadFallback; } private static Map extractLanguages(Stream packResources) { Map map = Maps.newHashMap(); packResources.forEach(packResourcesx -> { try { LanguageMetadataSection languageMetadataSection = packResourcesx.getMetadataSection(LanguageMetadataSection.TYPE); if (languageMetadataSection != null) { languageMetadataSection.languages().forEach(map::putIfAbsent); } } catch (IOException | RuntimeException var3) { LOGGER.warn("Unable to parse language metadata section of resourcepack: {}", packResourcesx.packId(), var3); } }); return ImmutableMap.copyOf(map); } @Override public void onResourceManagerReload(ResourceManager resourceManager) { this.languages = extractLanguages(resourceManager.listPacks()); List list = new ArrayList(2); boolean bl = DEFAULT_LANGUAGE.bidirectional(); list.add("en_us"); if (!this.currentCode.equals("en_us")) { LanguageInfo languageInfo = (LanguageInfo)this.languages.get(this.currentCode); if (languageInfo != null) { list.add(this.currentCode); bl = languageInfo.bidirectional(); } } ClientLanguage clientLanguage = ClientLanguage.loadFrom(resourceManager, list, bl); I18n.setLanguage(clientLanguage); Language.inject(clientLanguage); this.reloadCallback.accept(clientLanguage); } public void setSelected(String selected) { this.currentCode = selected; } public String getSelected() { return this.currentCode; } public SortedMap getLanguages() { return new TreeMap(this.languages); } @Nullable public LanguageInfo getLanguage(String code) { return (LanguageInfo)this.languages.get(code); } }