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.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.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.jspecify.annotations.Nullable; import org.slf4j.Logger; 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(final String languageCode, final Consumer reloadCallback) { this.currentCode = languageCode; this.reloadCallback = reloadCallback; } private static Map extractLanguages(final Stream resourcePacks) { Map result = Maps.newHashMap(); resourcePacks.forEach(resourcePack -> { try { LanguageMetadataSection languageMetadataSection = (LanguageMetadataSection)resourcePack.getMetadataSection(LanguageMetadataSection.TYPE); if (languageMetadataSection != null) { languageMetadataSection.languages().forEach(result::putIfAbsent); } } catch (Exception var3) { LOGGER.warn("Unable to parse language metadata section of resourcepack: {}", resourcePack.packId(), var3); } }); return ImmutableMap.copyOf(result); } public void onResourceManagerReload(final ResourceManager resourceManager) { this.languages = extractLanguages(resourceManager.listPacks()); List languageStack = new ArrayList(2); boolean defaultRightToLeft = DEFAULT_LANGUAGE.bidirectional(); languageStack.add("en_us"); if (!this.currentCode.equals("en_us")) { LanguageInfo currentLanguage = (LanguageInfo)this.languages.get(this.currentCode); if (currentLanguage != null) { languageStack.add(this.currentCode); defaultRightToLeft = currentLanguage.bidirectional(); } } ClientLanguage locale = ClientLanguage.loadFrom(resourceManager, languageStack, defaultRightToLeft); Language.inject(locale); this.reloadCallback.accept(locale); } public void setSelected(final String code) { this.currentCode = code; } public String getSelected() { return this.currentCode; } public SortedMap getLanguages() { return new TreeMap(this.languages); } @Nullable public LanguageInfo getLanguage(final String code) { return (LanguageInfo)this.languages.get(code); } }