Skip to content

Commit 2208e41

Browse files
committed
Fix GCAPI translations
1 parent 039cee9 commit 2208e41

8 files changed

Lines changed: 63 additions & 11 deletions

File tree

glass-config-api-v3/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ addModuleDependencies(project,
99
"station-registry-api-v0",
1010
"station-lifecycle-events-v0",
1111
"station-vanilla-checker-v0",
12+
"station-localization-api-v0",
1213
)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package net.modificationstation.stationapi.impl.config.event;
2+
3+
import net.mine_diver.unsafeevents.listener.EventListener;
4+
import net.mine_diver.unsafeevents.listener.ListenerPriority;
5+
import net.modificationstation.stationapi.api.event.resource.language.TranslationInvalidationEvent;
6+
import net.modificationstation.stationapi.impl.config.GCCore;
7+
8+
import java.util.concurrent.atomic.*;
9+
10+
public class TranslationHandler {
11+
12+
@SuppressWarnings("deprecation")
13+
@EventListener(priority = ListenerPriority.LOWEST)
14+
private static void handleTranslations(TranslationInvalidationEvent event) {
15+
AtomicInteger count = new AtomicInteger();
16+
GCCore.log("Loading config translations.");
17+
GCCore.MOD_CONFIGS.forEach((identifier, configRootEntry) -> configRootEntry.configCategoryHandler().applyTranslations(count));
18+
GCCore.log("Loaded " + count.get() + " translations.");
19+
}
20+
}

glass-config-api-v3/src/main/java/net/modificationstation/stationapi/impl/config/factory/DefaultFactoryProvider.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import net.modificationstation.stationapi.impl.config.object.entry.IntegerListConfigEntryHandler;
1212
import net.modificationstation.stationapi.impl.config.object.entry.StringConfigEntryHandler;
1313
import net.modificationstation.stationapi.impl.config.object.entry.StringListConfigEntryHandler;
14+
import net.modificationstation.stationapi.impl.config.screen.StringListScreenBuilder;
1415
import uk.co.benjiweber.expressions.function.SeptFunction;
1516

1617
import java.lang.reflect.*;
@@ -26,9 +27,9 @@ public void provideLoadFactories(ImmutableMap.Builder<Type, SeptFunction<String,
2627
immutableBuilder.put(Integer.class, ((id, configEntry, parentField, parentObject, isMultiplayerSynced, value, defaultValue) -> new IntegerConfigEntryHandler(id, configEntry, parentField, parentObject, isMultiplayerSynced, Integer.valueOf(String.valueOf(value)), Integer.valueOf(String.valueOf(defaultValue)))));
2728
immutableBuilder.put(Float.class, ((id, configEntry, parentField, parentObject, isMultiplayerSynced, value, defaultValue) -> new FloatConfigEntryHandler(id, configEntry, parentField, parentObject, isMultiplayerSynced, Float.valueOf(String.valueOf(value)), Float.valueOf(String.valueOf(defaultValue)))));
2829
immutableBuilder.put(Boolean.class, ((id, configEntry, parentField, parentObject, isMultiplayerSynced, value, defaultValue) -> new BooleanConfigEntryHandler(id, configEntry, parentField, parentObject, isMultiplayerSynced, (boolean) value, (boolean) defaultValue)));
29-
immutableBuilder.put(String[].class, ((id, configEntry, parentField, parentObject, isMultiplayerSynced, value, defaultValue) -> new StringListConfigEntryHandler(id, configEntry, parentField, parentObject, isMultiplayerSynced, listOrArrayToArray(value, new String[0]), (String[]) defaultValue)));
30-
immutableBuilder.put(Integer[].class, ((id, configEntry, parentField, parentObject, isMultiplayerSynced, value, defaultValue) -> new IntegerListConfigEntryHandler(id, configEntry, parentField, parentObject, isMultiplayerSynced, listOrArrayToArray(value, new Integer[0]), (Integer[]) defaultValue)));
31-
immutableBuilder.put(Float[].class, ((id, configEntry, parentField, parentObject, isMultiplayerSynced, value, defaultValue) -> new FloatListConfigEntryHandler(id, configEntry, parentField, parentObject, isMultiplayerSynced, listOrArrayToArray(value, new Float[0]), (Float[]) defaultValue)));
30+
immutableBuilder.put(String[].class, ((id, configEntry, parentField, parentObject, isMultiplayerSynced, value, defaultValue) -> new StringListConfigEntryHandler(id, configEntry, parentField, parentObject, isMultiplayerSynced, listOrArrayToArray(value, String[]::new, val -> val), (String[]) defaultValue)));
31+
immutableBuilder.put(Integer[].class, ((id, configEntry, parentField, parentObject, isMultiplayerSynced, value, defaultValue) -> new IntegerListConfigEntryHandler(id, configEntry, parentField, parentObject, isMultiplayerSynced, listOrArrayToArray(value, Integer[]::new, Integer::parseInt), (Integer[]) defaultValue)));
32+
immutableBuilder.put(Float[].class, ((id, configEntry, parentField, parentObject, isMultiplayerSynced, value, defaultValue) -> new FloatListConfigEntryHandler(id, configEntry, parentField, parentObject, isMultiplayerSynced, listOrArrayToArray(value, Float[]::new, Float::parseFloat), (Float[]) defaultValue)));
3233
}
3334

3435
@Override
@@ -46,9 +47,12 @@ public static <T> T justPass(T object) {
4647
return object;
4748
}
4849

49-
public static <T> T[] listOrArrayToArray(Object object, T[] type) {
50+
/**
51+
* This is a fucking mess. Why does simpleyaml not read to arraylists sanely?
52+
*/
53+
public static <T> T[] listOrArrayToArray(Object object, IntFunction<T[]> type, Function<String, T> elementFixer) {
5054
if (object instanceof List<?> list) {
51-
return list.toArray(type);
55+
return list.stream().map(val -> elementFixer.apply(val.toString())).toArray(type);
5256
}
5357
//noinspection unchecked // If this isn't right, we're fucked anyways
5458
return (T[]) object;

glass-config-api-v3/src/main/java/net/modificationstation/stationapi/impl/config/object/ConfigCategoryHandler.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import net.fabricmc.api.Environment;
66
import net.fabricmc.loader.api.ModContainer;
77
import net.minecraft.client.gui.screen.Screen;
8+
import net.minecraft.client.resource.language.TranslationStorage;
89
import net.modificationstation.stationapi.api.config.HasDrawable;
910
import net.modificationstation.stationapi.impl.config.screen.RootScreenBuilder;
1011
import net.modificationstation.stationapi.impl.config.screen.ScreenBuilder;
@@ -13,6 +14,7 @@
1314

1415
import java.lang.reflect.*;
1516
import java.util.*;
17+
import java.util.concurrent.atomic.*;
1618

1719
public class ConfigCategoryHandler extends ConfigHandlerBase {
1820

@@ -43,4 +45,10 @@ public ConfigCategoryHandler(String id, String name, String description, Field p
4345
}
4446
return button;
4547
}
48+
49+
@Override
50+
public void applyTranslations(AtomicInteger count) {
51+
super.applyTranslations(count);
52+
values.forEach((aClass, configHandlerBase) -> configHandlerBase.applyTranslations(count));
53+
}
4654
}

glass-config-api-v3/src/main/java/net/modificationstation/stationapi/impl/config/object/ConfigEntryHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public abstract class ConfigEntryHandler<T> extends ConfigHandlerBase {
3131
protected Function<String, List<String>> textValidator;
3232

3333
public ConfigEntryHandler(String id, ConfigEntry configEntry, Field parentField, Object parentObject, boolean multiplayerSynced, T value, T defaultValue) {
34-
super(id, TranslationStorage.getInstance().get(configEntry.name()), TranslationStorage.getInstance().get(configEntry.description()), parentField, parentObject, multiplayerSynced);
34+
super(id, configEntry.name(), configEntry.description(), parentField, parentObject, multiplayerSynced);
3535
this.configEntry = configEntry;
3636
this.value = value;
3737
this.defaultValue = defaultValue;

glass-config-api-v3/src/main/java/net/modificationstation/stationapi/impl/config/object/ConfigHandlerBase.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package net.modificationstation.stationapi.impl.config.object;
22

33

4+
import net.minecraft.client.resource.language.TranslationStorage;
45
import net.modificationstation.stationapi.api.config.HasDrawable;
56
import org.jetbrains.annotations.NotNull;
67

78
import java.lang.reflect.*;
89
import java.util.*;
10+
import java.util.concurrent.atomic.*;
911

1012
public abstract class ConfigHandlerBase {
1113

@@ -15,13 +17,13 @@ public abstract class ConfigHandlerBase {
1517
* The name of the category. Supports colour codes. White by default.
1618
* Maximum length of 50.
1719
*/
18-
public final String name;
20+
public String name;
1921

2022
/**
2123
* Description of the category. Do not use colour codes. This is greyed out for legibility.
2224
* Maximum length of 100.
2325
*/
24-
public final String description;
26+
public String description;
2527

2628
public final Field parentField;
2729

@@ -32,12 +34,26 @@ public abstract class ConfigHandlerBase {
3234
public ConfigHandlerBase(String id, String name, String description, Field parentField, Object parentObject, boolean multiplayerSynced) {
3335
this.id = id;
3436
this.name = name;
35-
this.description = description;
37+
this.description = description == null ? "" : description;
3638
this.parentField = parentField;
3739
this.parentObject = parentObject;
3840
this.multiplayerSynced = multiplayerSynced;
3941
}
4042

43+
// Required because GCAPI triggers before translations are loaded. Annoying.
44+
public void applyTranslations(AtomicInteger count) {
45+
String oldName = name;
46+
name = TranslationStorage.getInstance().get(name);
47+
if(!oldName.equals(name)) {
48+
count.addAndGet(1);
49+
}
50+
String oldDescription = description;
51+
description = TranslationStorage.getInstance().get(description);
52+
if(!oldDescription.equals(description)) {
53+
count.addAndGet(1);
54+
}
55+
}
56+
4157
@NotNull
4258
public abstract List<HasDrawable> getDrawables();
4359
}

glass-config-api-v3/src/main/java/net/modificationstation/stationapi/impl/config/screen/StringListScreenBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public StringListScreenBuilder(Screen parent, ConfigEntry configAnnotation, Conf
1414
}
1515

1616
@Override
17-
String convertStringToValue(String value) {
17+
public String convertStringToValue(String value) {
1818
return value;
1919
}
2020
}

glass-config-api-v3/src/main/resources/fabric.mod.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
"gcapi:factory_provider": [
2626
"net.modificationstation.stationapi.impl.config.factory.DefaultFactoryProvider"
2727
],
28+
"stationapi:event_bus": [
29+
"net.modificationstation.stationapi.impl.config.event.TranslationHandler"
30+
],
2831
"stationapi:event_bus_server": [
2932
"net.modificationstation.stationapi.impl.config.event.InitServerNetworking"
3033
],
@@ -33,7 +36,7 @@
3336
]
3437
},
3538
"custom": {
36-
"modmenu:api": true
39+
"modmenu:showIfContained": true
3740
},
3841
"mixins": [
3942
"gcapi.mixins.json"

0 commit comments

Comments
 (0)