minecraft-src/net/minecraft/client/resources/language/LanguageManager.java
2025-07-04 01:41:11 +03:00

88 lines
3.1 KiB
Java

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<String, LanguageInfo> languages = ImmutableMap.of("en_us", DEFAULT_LANGUAGE);
private String currentCode;
private final Consumer<ClientLanguage> reloadCallback;
public LanguageManager(String currentCode, Consumer<ClientLanguage> reloadFallback) {
this.currentCode = currentCode;
this.reloadCallback = reloadFallback;
}
private static Map<String, LanguageInfo> extractLanguages(Stream<PackResources> packResources) {
Map<String, LanguageInfo> map = Maps.<String, LanguageInfo>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<String> 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<String, LanguageInfo> getLanguages() {
return new TreeMap(this.languages);
}
@Nullable
public LanguageInfo getLanguage(String code) {
return (LanguageInfo)this.languages.get(code);
}
}