88 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			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);
 | |
| 	}
 | |
| }
 |