Compare commits

...

8 Commits

Author SHA1 Message Date
3753d87dba
chore: update to 1.21
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
ci/woodpecker/tag/jfmod Pipeline was successful
2024-06-14 14:49:37 +02:00
e3370a9ff5
chore: update to 1.20.5
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
ci/woodpecker/tag/jfmod Pipeline was successful
2024-04-25 13:51:09 +02:00
53f6d95ef7
chore: update to 1.20.4
Some checks failed
ci/woodpecker/push/jfmod Pipeline failed
2023-12-07 21:04:21 +01:00
f77f98d19d
chore: update to 1.20.2
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
2023-09-22 21:52:38 +02:00
7e7702b7df
Bump to 1.20
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
ci/woodpecker/tag/jfmod Pipeline was successful
2023-06-09 17:23:34 +02:00
ead065acab
Configure CF publish
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
2023-03-18 11:43:01 +01:00
56872f1309
Update 1.19.4
Some checks failed
ci/woodpecker/push/jfmod Pipeline failed
ci/woodpecker/tag/jfmod Pipeline was successful
2023-03-14 22:45:24 +01:00
ff8756dc1a
Tweak README wording
All checks were successful
ci/woodpecker/push/jfmod Pipeline was successful
2023-02-18 16:34:36 +01:00
7 changed files with 48 additions and 37 deletions

View File

@ -1,6 +1,6 @@
Have you ever wanted to play a mod pack in a language that is not english but some mods don't have a translation? 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?
Globalization allows you to avoid that by automatically generating missing translations using libjf-translate. Globalization allows you to avoid that problem 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,15 +1,40 @@
import io.gitlab.jfronny.scripts.*
plugins { plugins {
id("jfmod") version "1.3-SNAPSHOT" id("jfmod") version "1.6-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-v1:${prop("libjf_version")}") modImplementation("io.gitlab.jfronny.libjf:libjf-config-core-v2")
modImplementation("io.gitlab.jfronny.libjf:libjf-translate-v1:${prop("libjf_version")}") modImplementation("io.gitlab.jfronny.libjf:libjf-translate-v1")
// Dev env // Dev env
modLocalRuntime("io.gitlab.jfronny.libjf:libjf-config-ui-tiny-v1:${prop("libjf_version")}") modLocalRuntime("io.gitlab.jfronny.libjf:libjf-config-ui-tiny")
modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil:${prop("libjf_version")}") modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil")
modLocalRuntime("com.terraformersmc:modmenu:5.0.2") modLocalRuntime("com.terraformersmc:modmenu:11.0.0-beta.1")
// 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")
} }

View File

@ -1,14 +0,0 @@
# 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.List; import java.util.*;
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;)Lnet/minecraft/client/resource/language/TranslationStorage;", at = @At(value = "INVOKE_ASSIGN", target = "Lcom/google/common/collect/Maps;newHashMap()Ljava/util/HashMap;"), index = 2) @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)
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;)Lnet/minecraft/client/resource/language/TranslationStorage;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resource/language/LanguageDefinition;isRightToLeft()Z"), locals = LocalCapture.CAPTURE_FAILHARD) @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)
private static void globalization$forkCustomMap(ResourceManager resourceManager, List<LanguageDefinition> definitions, CallbackInfoReturnable<TranslationStorage> cir, Map<String, String> map) { private static void globalization$forkCustomMap(ResourceManager manager, List<String> definitions, boolean leftToRight, CallbackInfoReturnable<String> cir, Map<String, String> map) {
globalization$getMap(map).fork(); globalization$getMap(map).fork();
} }
@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;")) @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))
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.log.Logger; import io.gitlab.jfronny.commons.logger.SystemLoggerPlus;
public class Globalization { public class Globalization {
public static final Logger LOG = Logger.forName("globalization"); public static final SystemLoggerPlus LOG = SystemLoggerPlus.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.v1.Entry; import io.gitlab.jfronny.libjf.config.api.v2.Entry;
import io.gitlab.jfronny.libjf.config.api.v1.JfConfig; import io.gitlab.jfronny.libjf.config.api.v2.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 List<Map<String, String>> pools = new LinkedList<>(); private final 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.get(0).isEmpty()); return pools.isEmpty() || (pools.size() == 1 && pools.getFirst().isEmpty());
} }
@Override @Override