diff options
| author | 2025-08-19 16:46:19 +0100 | |
|---|---|---|
| committer | 2025-09-13 09:14:23 +0100 | |
| commit | 40ab19aee2ae2a26dee37184f79596017e48edf7 (patch) | |
| tree | 18af87109c167a92a9579908403be0bf56b39f84 /enigma/src | |
| parent | Fix guava again (#562) (diff) | |
| download | enigma-fork-40ab19aee2ae2a26dee37184f79596017e48edf7.tar.gz enigma-fork-40ab19aee2ae2a26dee37184f79596017e48edf7.tar.xz enigma-fork-40ab19aee2ae2a26dee37184f79596017e48edf7.zip | |
Add I18n service
Diffstat (limited to 'enigma/src')
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; | |||
| 40 | import cuchaz.enigma.classprovider.ClassProvider; | 40 | import cuchaz.enigma.classprovider.ClassProvider; |
| 41 | import cuchaz.enigma.classprovider.CombiningClassProvider; | 41 | import cuchaz.enigma.classprovider.CombiningClassProvider; |
| 42 | import cuchaz.enigma.classprovider.JarClassProvider; | 42 | import cuchaz.enigma.classprovider.JarClassProvider; |
| 43 | import cuchaz.enigma.utils.I18n; | ||
| 43 | import cuchaz.enigma.utils.OrderingImpl; | 44 | import cuchaz.enigma.utils.OrderingImpl; |
| 44 | import cuchaz.enigma.utils.Utils; | 45 | import 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 | ||
| 3 | import cuchaz.enigma.api.EnigmaPlugin; | 3 | import cuchaz.enigma.api.EnigmaPlugin; |
| 4 | import cuchaz.enigma.api.EnigmaPluginContext; | 4 | import cuchaz.enigma.api.EnigmaPluginContext; |
| 5 | import cuchaz.enigma.api.service.I18nService; | ||
| 5 | import cuchaz.enigma.source.DecompilerService; | 6 | import cuchaz.enigma.source.DecompilerService; |
| 6 | import cuchaz.enigma.source.Decompilers; | 7 | import 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 @@ | |||
| 1 | package cuchaz.enigma.api; | ||
| 2 | |||
| 3 | public 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 @@ | |||
| 1 | package cuchaz.enigma.api.service; | ||
| 2 | |||
| 3 | import java.io.InputStream; | ||
| 4 | |||
| 5 | import org.jetbrains.annotations.Nullable; | ||
| 6 | |||
| 7 | public 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; | |||
| 7 | import java.nio.charset.StandardCharsets; | 7 | import java.nio.charset.StandardCharsets; |
| 8 | import java.util.ArrayList; | 8 | import java.util.ArrayList; |
| 9 | import java.util.Arrays; | 9 | import java.util.Arrays; |
| 10 | import java.util.Collections; | ||
| 11 | import java.util.HashMap; | 10 | import java.util.HashMap; |
| 12 | import java.util.List; | 11 | import java.util.List; |
| 13 | import java.util.Map; | 12 | import java.util.Map; |
| @@ -16,26 +15,37 @@ import java.util.stream.Collectors; | |||
| 16 | 15 | ||
| 17 | import com.google.gson.Gson; | 16 | import com.google.gson.Gson; |
| 18 | 17 | ||
| 18 | import cuchaz.enigma.EnigmaServices; | ||
| 19 | import cuchaz.enigma.api.service.I18nService; | ||
| 20 | |||
| 19 | public class I18n { | 21 | public 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(); |