From 40ab19aee2ae2a26dee37184f79596017e48edf7 Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 19 Aug 2025 16:46:19 +0100 Subject: Add I18n service --- enigma/src/main/java/cuchaz/enigma/Enigma.java | 4 +++ .../java/cuchaz/enigma/analysis/BuiltinPlugin.java | 3 ++ enigma/src/main/java/cuchaz/enigma/api/I18n.java | 14 ++++++++ .../cuchaz/enigma/api/service/I18nService.java | 12 +++++++ enigma/src/main/java/cuchaz/enigma/utils/I18n.java | 42 +++++++++++++--------- 5 files changed, 59 insertions(+), 16 deletions(-) create mode 100644 enigma/src/main/java/cuchaz/enigma/api/I18n.java create mode 100644 enigma/src/main/java/cuchaz/enigma/api/service/I18nService.java (limited to 'enigma') diff --git a/enigma/src/main/java/cuchaz/enigma/Enigma.java b/enigma/src/main/java/cuchaz/enigma/Enigma.java index b98d71f..729a114 100644 --- a/enigma/src/main/java/cuchaz/enigma/Enigma.java +++ b/enigma/src/main/java/cuchaz/enigma/Enigma.java @@ -40,6 +40,7 @@ import cuchaz.enigma.classprovider.CachingClassProvider; import cuchaz.enigma.classprovider.ClassProvider; import cuchaz.enigma.classprovider.CombiningClassProvider; import cuchaz.enigma.classprovider.JarClassProvider; +import cuchaz.enigma.utils.I18n; import cuchaz.enigma.utils.OrderingImpl; import cuchaz.enigma.utils.Utils; @@ -122,6 +123,9 @@ public class Enigma { .forEach(plugin -> plugin.get().init(pluginContext)); EnigmaServices services = pluginContext.buildServices(); + + I18n.initialize(services); + return new Enigma(profile, services); } } diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java b/enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java index aed949a..2e68478 100644 --- a/enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java +++ b/enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java @@ -2,6 +2,7 @@ package cuchaz.enigma.analysis; import cuchaz.enigma.api.EnigmaPlugin; import cuchaz.enigma.api.EnigmaPluginContext; +import cuchaz.enigma.api.service.I18nService; import cuchaz.enigma.source.DecompilerService; import cuchaz.enigma.source.Decompilers; @@ -9,6 +10,8 @@ public final class BuiltinPlugin implements EnigmaPlugin { @Override public void init(EnigmaPluginContext ctx) { registerDecompilerServices(ctx); + + ctx.registerService("enigma:i18n", I18nService.TYPE, () -> language -> BuiltinPlugin.class.getResourceAsStream("/lang/" + language + ".json")); } private void registerDecompilerServices(EnigmaPluginContext ctx) { diff --git a/enigma/src/main/java/cuchaz/enigma/api/I18n.java b/enigma/src/main/java/cuchaz/enigma/api/I18n.java new file mode 100644 index 0000000..f8252da --- /dev/null +++ b/enigma/src/main/java/cuchaz/enigma/api/I18n.java @@ -0,0 +1,14 @@ +package cuchaz.enigma.api; + +public final class I18n { + private I18n() { + } + + public static String translate(String key) { + return cuchaz.enigma.utils.I18n.translate(key); + } + + public static String translate(String key, Object... args) { + return cuchaz.enigma.utils.I18n.translateFormatted(key, args); + } +} diff --git a/enigma/src/main/java/cuchaz/enigma/api/service/I18nService.java b/enigma/src/main/java/cuchaz/enigma/api/service/I18nService.java new file mode 100644 index 0000000..aa59bb2 --- /dev/null +++ b/enigma/src/main/java/cuchaz/enigma/api/service/I18nService.java @@ -0,0 +1,12 @@ +package cuchaz.enigma.api.service; + +import java.io.InputStream; + +import org.jetbrains.annotations.Nullable; + +public interface I18nService extends EnigmaService { + EnigmaServiceType TYPE = EnigmaServiceType.create("translation"); + + @Nullable + InputStream getTranslationResource(String language); +} diff --git a/enigma/src/main/java/cuchaz/enigma/utils/I18n.java b/enigma/src/main/java/cuchaz/enigma/utils/I18n.java index fff7352..4648dec 100644 --- a/enigma/src/main/java/cuchaz/enigma/utils/I18n.java +++ b/enigma/src/main/java/cuchaz/enigma/utils/I18n.java @@ -7,7 +7,6 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -16,26 +15,37 @@ import java.util.stream.Collectors; import com.google.gson.Gson; +import cuchaz.enigma.EnigmaServices; +import cuchaz.enigma.api.service.I18nService; + public class I18n { public static final String DEFAULT_LANGUAGE = "en_us"; private static final Gson GSON = new Gson(); - private static Map defaultTranslations = load(DEFAULT_LANGUAGE); - private static Map translations = defaultTranslations; - private static Map languageNames = new HashMap<>(); + private static Map defaultTranslations = Map.of(); + private static Map translations = Map.of(); + private static final Map LANGUAGE_NAMES = new HashMap<>(); + + public static void initialize(EnigmaServices services) { + translations = defaultTranslations = load(DEFAULT_LANGUAGE, services); + } @SuppressWarnings("unchecked") - public static Map load(String language) { - try (InputStream inputStream = I18n.class.getResourceAsStream("/lang/" + language + ".json")) { - if (inputStream != null) { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { - return GSON.fromJson(reader, Map.class); + private static Map load(String language, EnigmaServices services) { + Map translations = new HashMap<>(); + + for (I18nService i18nService : services.get(I18nService.TYPE)) { + try (InputStream inputStream = i18nService.getTranslationResource(language)) { + if (inputStream != null) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { + translations.putAll(GSON.fromJson(reader, Map.class)); + } } + } catch (IOException e) { + e.printStackTrace(); } - } catch (IOException e) { - e.printStackTrace(); } - return Collections.emptyMap(); + return translations; } public static String translateOrNull(String key) { @@ -76,11 +86,11 @@ public class I18n { } public static String getLanguageName(String language) { - return languageNames.get(language); + return LANGUAGE_NAMES.get(language); } - public static void setLanguage(String language) { - translations = load(language); + public static void setLanguage(String language, EnigmaServices services) { + translations = load(language, services); } public static ArrayList getAvailableLanguages() { @@ -112,7 +122,7 @@ public class I18n { try (InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("lang/" + fileName + ".json")) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { Map map = GSON.fromJson(reader, Map.class); - languageNames.put(fileName, map.get("language").toString()); + LANGUAGE_NAMES.put(fileName, map.get("language").toString()); } } catch (IOException e) { e.printStackTrace(); -- cgit v1.2.3