Compare commits

..

No commits in common. "master" and "v1.0.0" have entirely different histories.

7 changed files with 37 additions and 48 deletions

View File

@ -1,6 +1,6 @@
Have you ever tried playing a mod pack in a language other than English, only to find out half of your mods had no translations? Have you ever wanted to play a mod pack in a language that is not english but some mods don't have a translation?
Globalization allows you to avoid that problem by automatically generating missing translations using libjf-translate. Globalization allows you to avoid that by automatically generating missing translations using libjf-translate.
To set the mod up, simply install it, configure it to target the correct language, then restart the game. To set the mod up, simply install it, configure it to target the correct language, then restart the game.

View File

@ -1,40 +1,15 @@
import io.gitlab.jfronny.scripts.*
plugins { plugins {
id("jfmod") version "1.6-SNAPSHOT" id("jfmod") version "1.3-SNAPSHOT"
}
allprojects { group = "io.gitlab.jfronny" }
base.archivesName = "globalization"
jfMod {
minecraftVersion = "1.21"
yarn("build.1")
loaderVersion = "0.15.11"
libJfVersion = "3.16.0"
fabricApiVersion = "0.100.1+1.21"
modrinth {
projectId = "globalization"
requiredDependencies.add("libjf")
optionalDependencies.add("modmenu")
}
curseforge {
projectId = "839010"
requiredDependencies.add("libjf")
optionalDependencies.add("modmenu")
}
} }
dependencies { dependencies {
modImplementation("io.gitlab.jfronny.libjf:libjf-config-core-v2") modImplementation("io.gitlab.jfronny.libjf:libjf-config-core-v1:${prop("libjf_version")}")
modImplementation("io.gitlab.jfronny.libjf:libjf-translate-v1") modImplementation("io.gitlab.jfronny.libjf:libjf-translate-v1:${prop("libjf_version")}")
// Dev env // Dev env
modLocalRuntime("io.gitlab.jfronny.libjf:libjf-config-ui-tiny") modLocalRuntime("io.gitlab.jfronny.libjf:libjf-config-ui-tiny-v1:${prop("libjf_version")}")
modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil") modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil:${prop("libjf_version")}")
modLocalRuntime("com.terraformersmc:modmenu:11.0.0-beta.1") modLocalRuntime("com.terraformersmc:modmenu:5.0.2")
// for modmenu
modLocalRuntime("net.fabricmc.fabric-api:fabric-resource-loader-v0")
modLocalRuntime("net.fabricmc.fabric-api:fabric-screen-api-v1")
modLocalRuntime("net.fabricmc.fabric-api:fabric-key-binding-api-v1")
} }

14
gradle.properties Normal file
View File

@ -0,0 +1,14 @@
# https://fabricmc.net/develop/
minecraft_version=1.19.3
yarn_mappings=build.5
loader_version=0.14.12
maven_group=io.gitlab.jfronny
archives_base_name=globalization
modrinth_id=globalization
modrinth_required_dependencies=libjf
modrinth_optional_dependencies=modmenu
libjf_version=3.5.0
fabric_version=0.70.0+1.19.3

View File

@ -2,35 +2,35 @@ package io.gitlab.jfronny.globalization.mixin;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import io.gitlab.jfronny.globalization.GlobalizationMap; import io.gitlab.jfronny.globalization.GlobalizationMap;
import net.minecraft.client.resource.language.LanguageDefinition;
import net.minecraft.client.resource.language.TranslationStorage; import net.minecraft.client.resource.language.TranslationStorage;
import net.minecraft.resource.ResourceManager; import net.minecraft.resource.ResourceManager;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.*;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import java.util.*; import java.util.List;
import java.util.Map;
@Mixin(TranslationStorage.class) @Mixin(TranslationStorage.class)
public class TranslationStorageMixin { public class TranslationStorageMixin {
@ModifyVariable(method = "load(Lnet/minecraft/resource/ResourceManager;Ljava/util/List;Z)Lnet/minecraft/client/resource/language/TranslationStorage;", at = @At(value = "INVOKE_ASSIGN", target = "Lcom/google/common/collect/Maps;newHashMap()Ljava/util/HashMap;", remap = false), index = 3) @ModifyVariable(method = "load(Lnet/minecraft/resource/ResourceManager;Ljava/util/List;)Lnet/minecraft/client/resource/language/TranslationStorage;", at = @At(value = "INVOKE_ASSIGN", target = "Lcom/google/common/collect/Maps;newHashMap()Ljava/util/HashMap;"), index = 2)
private static Map<String, String> globalization$createCustomMap(Map<String, String> original) { private static Map<String, String> globalization$createCustomMap(Map<String, String> original) {
if (!original.isEmpty()) throw new IllegalStateException("Non-empty original"); if (!original.isEmpty()) throw new IllegalStateException("Non-empty original");
return new GlobalizationMap(); return new GlobalizationMap();
} }
@Inject(method = "load(Lnet/minecraft/resource/ResourceManager;Ljava/util/List;Z)Lnet/minecraft/client/resource/language/TranslationStorage;", at = @At(value = "INVOKE", target = "Ljava/lang/String;format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"), locals = LocalCapture.CAPTURE_FAILHARD) @Inject(method = "load(Lnet/minecraft/resource/ResourceManager;Ljava/util/List;)Lnet/minecraft/client/resource/language/TranslationStorage;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resource/language/LanguageDefinition;isRightToLeft()Z"), locals = LocalCapture.CAPTURE_FAILHARD)
private static void globalization$forkCustomMap(ResourceManager manager, List<String> definitions, boolean leftToRight, CallbackInfoReturnable<String> cir, Map<String, String> map) { private static void globalization$forkCustomMap(ResourceManager resourceManager, List<LanguageDefinition> definitions, CallbackInfoReturnable<TranslationStorage> cir, Map<String, String> map) {
globalization$getMap(map).fork(); globalization$getMap(map).fork();
} }
@Redirect(method = "load(Lnet/minecraft/resource/ResourceManager;Ljava/util/List;Z)Lnet/minecraft/client/resource/language/TranslationStorage;", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/ImmutableMap;copyOf(Ljava/util/Map;)Lcom/google/common/collect/ImmutableMap;", remap = false)) @Redirect(method = "load(Lnet/minecraft/resource/ResourceManager;Ljava/util/List;)Lnet/minecraft/client/resource/language/TranslationStorage;", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/ImmutableMap;copyOf(Ljava/util/Map;)Lcom/google/common/collect/ImmutableMap;"))
private static ImmutableMap<String, String> globalization$generateMissing(Map<String, String> source) { private static ImmutableMap<String, String> globalization$generateMissing(Map<String, String> source) {
return ImmutableMap.copyOf(globalization$getMap(source).generateMissing()); return ImmutableMap.copyOf(globalization$getMap(source).generateMissing());
} }
@Unique
private static GlobalizationMap globalization$getMap(Map<String, String> map) { private static GlobalizationMap globalization$getMap(Map<String, String> map) {
return (GlobalizationMap) map; return (GlobalizationMap) map;
} }

View File

@ -1,7 +1,7 @@
package io.gitlab.jfronny.globalization; package io.gitlab.jfronny.globalization;
import io.gitlab.jfronny.commons.logger.SystemLoggerPlus; import io.gitlab.jfronny.commons.log.Logger;
public class Globalization { public class Globalization {
public static final SystemLoggerPlus LOG = SystemLoggerPlus.forName("globalization"); public static final Logger LOG = Logger.forName("globalization");
} }

View File

@ -1,7 +1,7 @@
package io.gitlab.jfronny.globalization; package io.gitlab.jfronny.globalization;
import io.gitlab.jfronny.libjf.config.api.v2.Entry; import io.gitlab.jfronny.libjf.config.api.v1.Entry;
import io.gitlab.jfronny.libjf.config.api.v2.JfConfig; import io.gitlab.jfronny.libjf.config.api.v1.JfConfig;
@JfConfig(referencedConfigs = "libjf-translate-v1") @JfConfig(referencedConfigs = "libjf-translate-v1")
public class GlobalizationConfig { public class GlobalizationConfig {

View File

@ -13,7 +13,7 @@ import java.util.stream.Collectors;
public class GlobalizationMap extends AbstractMap<String, String> { public class GlobalizationMap extends AbstractMap<String, String> {
private static final Path targetPath = FabricLoader.getInstance().getConfigDir().resolve("globalization"); private static final Path targetPath = FabricLoader.getInstance().getConfigDir().resolve("globalization");
private final List<Map<String, String>> pools = new LinkedList<>(); private List<Map<String, String>> pools = new LinkedList<>();
public void fork() { public void fork() {
if (pools.isEmpty() || !getCurrentPool().isEmpty()) pools.add(new LinkedHashMap<>()); if (pools.isEmpty() || !getCurrentPool().isEmpty()) pools.add(new LinkedHashMap<>());
@ -125,7 +125,7 @@ public class GlobalizationMap extends AbstractMap<String, String> {
@Override @Override
public boolean isEmpty() { public boolean isEmpty() {
return pools.isEmpty() || (pools.size() == 1 && pools.getFirst().isEmpty()); return pools.isEmpty() || (pools.size() == 1 && pools.get(0).isEmpty());
} }
@Override @Override