summaryrefslogtreecommitdiff
path: root/enigma/src
diff options
context:
space:
mode:
authorGravatar Joe2025-08-19 16:46:19 +0100
committerGravatar modmuss2025-09-13 09:14:23 +0100
commit40ab19aee2ae2a26dee37184f79596017e48edf7 (patch)
tree18af87109c167a92a9579908403be0bf56b39f84 /enigma/src
parentFix guava again (#562) (diff)
downloadenigma-fork-40ab19aee2ae2a26dee37184f79596017e48edf7.tar.gz
enigma-fork-40ab19aee2ae2a26dee37184f79596017e48edf7.tar.xz
enigma-fork-40ab19aee2ae2a26dee37184f79596017e48edf7.zip
Add I18n service
Diffstat (limited to 'enigma/src')
-rw-r--r--enigma/src/main/java/cuchaz/enigma/Enigma.java4
-rw-r--r--enigma/src/main/java/cuchaz/enigma/analysis/BuiltinPlugin.java3
-rw-r--r--enigma/src/main/java/cuchaz/enigma/api/I18n.java14
-rw-r--r--enigma/src/main/java/cuchaz/enigma/api/service/I18nService.java12
-rw-r--r--enigma/src/main/java/cuchaz/enigma/utils/I18n.java42
5 files changed, 59 insertions, 16 deletions
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;
40import cuchaz.enigma.classprovider.ClassProvider; 40import cuchaz.enigma.classprovider.ClassProvider;
41import cuchaz.enigma.classprovider.CombiningClassProvider; 41import cuchaz.enigma.classprovider.CombiningClassProvider;
42import cuchaz.enigma.classprovider.JarClassProvider; 42import cuchaz.enigma.classprovider.JarClassProvider;
43import cuchaz.enigma.utils.I18n;
43import cuchaz.enigma.utils.OrderingImpl; 44import cuchaz.enigma.utils.OrderingImpl;
44import cuchaz.enigma.utils.Utils; 45import cuchaz.enigma.utils.Utils;
45 46
@@ -122,6 +123,9 @@ public class Enigma {
122 .forEach(plugin -> plugin.get().init(pluginContext)); 123 .forEach(plugin -> plugin.get().init(pluginContext));
123 124
124 EnigmaServices services = pluginContext.buildServices(); 125 EnigmaServices services = pluginContext.buildServices();
126
127 I18n.initialize(services);
128
125 return new Enigma(profile, services); 129 return new Enigma(profile, services);
126 } 130 }
127 } 131 }
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;
2 2
3import cuchaz.enigma.api.EnigmaPlugin; 3import cuchaz.enigma.api.EnigmaPlugin;
4import cuchaz.enigma.api.EnigmaPluginContext; 4import cuchaz.enigma.api.EnigmaPluginContext;
5import cuchaz.enigma.api.service.I18nService;
5import cuchaz.enigma.source.DecompilerService; 6import cuchaz.enigma.source.DecompilerService;
6import cuchaz.enigma.source.Decompilers; 7import cuchaz.enigma.source.Decompilers;
7 8
@@ -9,6 +10,8 @@ public final class BuiltinPlugin implements EnigmaPlugin {
9 @Override 10 @Override
10 public void init(EnigmaPluginContext ctx) { 11 public void init(EnigmaPluginContext ctx) {
11 registerDecompilerServices(ctx); 12 registerDecompilerServices(ctx);
13
14 ctx.registerService("enigma:i18n", I18nService.TYPE, () -> language -> BuiltinPlugin.class.getResourceAsStream("/lang/" + language + ".json"));
12 } 15 }
13 16
14 private void registerDecompilerServices(EnigmaPluginContext ctx) { 17 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 @@
1package cuchaz.enigma.api;
2
3public final class I18n {
4 private I18n() {
5 }
6
7 public static String translate(String key) {
8 return cuchaz.enigma.utils.I18n.translate(key);
9 }
10
11 public static String translate(String key, Object... args) {
12 return cuchaz.enigma.utils.I18n.translateFormatted(key, args);
13 }
14}
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 @@
1package cuchaz.enigma.api.service;
2
3import java.io.InputStream;
4
5import org.jetbrains.annotations.Nullable;
6
7public interface I18nService extends EnigmaService {
8 EnigmaServiceType<I18nService> TYPE = EnigmaServiceType.create("translation");
9
10 @Nullable
11 InputStream getTranslationResource(String language);
12}
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;
7import java.nio.charset.StandardCharsets; 7import java.nio.charset.StandardCharsets;
8import java.util.ArrayList; 8import java.util.ArrayList;
9import java.util.Arrays; 9import java.util.Arrays;
10import java.util.Collections;
11import java.util.HashMap; 10import java.util.HashMap;
12import java.util.List; 11import java.util.List;
13import java.util.Map; 12import java.util.Map;
@@ -16,26 +15,37 @@ import java.util.stream.Collectors;
16 15
17import com.google.gson.Gson; 16import com.google.gson.Gson;
18 17
18import cuchaz.enigma.EnigmaServices;
19import cuchaz.enigma.api.service.I18nService;
20
19public class I18n { 21public class I18n {
20 public static final String DEFAULT_LANGUAGE = "en_us"; 22 public static final String DEFAULT_LANGUAGE = "en_us";
21 private static final Gson GSON = new Gson(); 23 private static final Gson GSON = new Gson();
22 private static Map<String, String> defaultTranslations = load(DEFAULT_LANGUAGE); 24 private static Map<String, String> defaultTranslations = Map.of();
23 private static Map<String, String> translations = defaultTranslations; 25 private static Map<String, String> translations = Map.of();
24 private static Map<String, String> languageNames = new HashMap<>(); 26 private static final Map<String, String> LANGUAGE_NAMES = new HashMap<>();
27
28 public static void initialize(EnigmaServices services) {
29 translations = defaultTranslations = load(DEFAULT_LANGUAGE, services);
30 }
25 31
26 @SuppressWarnings("unchecked") 32 @SuppressWarnings("unchecked")
27 public static Map<String, String> load(String language) { 33 private static Map<String, String> load(String language, EnigmaServices services) {
28 try (InputStream inputStream = I18n.class.getResourceAsStream("/lang/" + language + ".json")) { 34 Map<String, String> translations = new HashMap<>();
29 if (inputStream != null) { 35
30 try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { 36 for (I18nService i18nService : services.get(I18nService.TYPE)) {
31 return GSON.fromJson(reader, Map.class); 37 try (InputStream inputStream = i18nService.getTranslationResource(language)) {
38 if (inputStream != null) {
39 try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
40 translations.putAll(GSON.fromJson(reader, Map.class));
41 }
32 } 42 }
43 } catch (IOException e) {
44 e.printStackTrace();
33 } 45 }
34 } catch (IOException e) {
35 e.printStackTrace();
36 } 46 }
37 47
38 return Collections.emptyMap(); 48 return translations;
39 } 49 }
40 50
41 public static String translateOrNull(String key) { 51 public static String translateOrNull(String key) {
@@ -76,11 +86,11 @@ public class I18n {
76 } 86 }
77 87
78 public static String getLanguageName(String language) { 88 public static String getLanguageName(String language) {
79 return languageNames.get(language); 89 return LANGUAGE_NAMES.get(language);
80 } 90 }
81 91
82 public static void setLanguage(String language) { 92 public static void setLanguage(String language, EnigmaServices services) {
83 translations = load(language); 93 translations = load(language, services);
84 } 94 }
85 95
86 public static ArrayList<String> getAvailableLanguages() { 96 public static ArrayList<String> getAvailableLanguages() {
@@ -112,7 +122,7 @@ public class I18n {
112 try (InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("lang/" + fileName + ".json")) { 122 try (InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("lang/" + fileName + ".json")) {
113 try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { 123 try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) {
114 Map<?, ?> map = GSON.fromJson(reader, Map.class); 124 Map<?, ?> map = GSON.fromJson(reader, Map.class);
115 languageNames.put(fileName, map.get("language").toString()); 125 LANGUAGE_NAMES.put(fileName, map.get("language").toString());
116 } 126 }
117 } catch (IOException e) { 127 } catch (IOException e) {
118 e.printStackTrace(); 128 e.printStackTrace();