diff --git a/@Allay-ExamplePlugin-JS/lang/en_US.json b/@Allay-ExamplePlugin-JS/lang/en_US.json new file mode 100644 index 000000000..98e6a2dc0 --- /dev/null +++ b/@Allay-ExamplePlugin-JS/lang/en_US.json @@ -0,0 +1,3 @@ +{ + "ejp:example_js_plugin_i18n_test": "JS plugin i18n test text" +} \ No newline at end of file diff --git a/@Allay-ExamplePlugin-JS/main.js b/@Allay-ExamplePlugin-JS/main.js index 8b6c375a2..778a3e30f 100644 --- a/@Allay-ExamplePlugin-JS/main.js +++ b/@Allay-ExamplePlugin-JS/main.js @@ -6,6 +6,7 @@ export function onLoad() { export function onEnable() { console.info("Example-Plugin-Js has been enabled!"); + console.info(plugin.getPluginI18n().tr("ejp:example_js_plugin_i18n_test")); a(); } diff --git a/Allay-API/src/main/java/org/allaymc/api/plugin/Plugin.java b/Allay-API/src/main/java/org/allaymc/api/plugin/Plugin.java index 033eaaf59..98aaa5747 100644 --- a/Allay-API/src/main/java/org/allaymc/api/plugin/Plugin.java +++ b/Allay-API/src/main/java/org/allaymc/api/plugin/Plugin.java @@ -3,6 +3,7 @@ import lombok.Getter; import lombok.Setter; import org.allaymc.api.command.CommandRegistry; +import org.allaymc.api.i18n.I18n; import org.allaymc.api.scheduler.Scheduler; import org.allaymc.api.scheduler.TaskCreator; import org.allaymc.api.server.Server; @@ -79,6 +80,10 @@ public CommandRegistry getCommandRegistry() { return this.getServer().getCommandRegistry(); } + public I18n getPluginI18n() { + return pluginContainer.i18n(); + } + @Override public boolean isValid() { return enabled; diff --git a/Allay-API/src/main/java/org/allaymc/api/plugin/PluginContainer.java b/Allay-API/src/main/java/org/allaymc/api/plugin/PluginContainer.java index 0c79948ed..165420752 100644 --- a/Allay-API/src/main/java/org/allaymc/api/plugin/PluginContainer.java +++ b/Allay-API/src/main/java/org/allaymc/api/plugin/PluginContainer.java @@ -1,5 +1,7 @@ package org.allaymc.api.plugin; +import org.allaymc.api.i18n.I18n; + import java.nio.file.Path; /** @@ -11,11 +13,17 @@ public record PluginContainer( Plugin plugin, PluginDescriptor descriptor, PluginLoader loader, - Path dataFolder + Path dataFolder, + I18n i18n ) { - public static PluginContainer createPluginContainer(Plugin plugin, PluginDescriptor descriptor, PluginLoader loader, Path dataFolder) { - var pluginContainer = new PluginContainer(plugin, descriptor, loader, dataFolder); + public static PluginContainer createPluginContainer( + Plugin plugin, + PluginDescriptor descriptor, + PluginLoader loader, + Path dataFolder, + I18n i18n) { + var pluginContainer = new PluginContainer(plugin, descriptor, loader, dataFolder, i18n); plugin.setPluginContainer(pluginContainer); return pluginContainer; } diff --git a/Allay-ExamplePlugin/src/main/java/org/allaymc/exampleplugin/ExamplePlugin.java b/Allay-ExamplePlugin/src/main/java/org/allaymc/exampleplugin/ExamplePlugin.java index 7fb2a4a44..ad3ca862a 100644 --- a/Allay-ExamplePlugin/src/main/java/org/allaymc/exampleplugin/ExamplePlugin.java +++ b/Allay-ExamplePlugin/src/main/java/org/allaymc/exampleplugin/ExamplePlugin.java @@ -33,6 +33,7 @@ public void onLoad() { @Override public void onEnable() { log.info("ExamplePlugin enabled!"); + log.info(getPluginI18n().tr("ep:example_plugin_i18n_test")); var server = Server.getInstance(); server.getEventBus().registerListener(serverEventListener); server.getEventBus().registerListener(worldEventListener); diff --git a/Allay-ExamplePlugin/src/main/resources/lang/en_US.json b/Allay-ExamplePlugin/src/main/resources/lang/en_US.json new file mode 100644 index 000000000..2a57cd91b --- /dev/null +++ b/Allay-ExamplePlugin/src/main/resources/lang/en_US.json @@ -0,0 +1,3 @@ +{ + "ep:example_plugin_i18n_test": "Plugin i18n test text" +} \ No newline at end of file diff --git a/Allay-Server/src/main/java/org/allaymc/server/Allay.java b/Allay-Server/src/main/java/org/allaymc/server/Allay.java index fb6a28837..47dad8bb9 100644 --- a/Allay-Server/src/main/java/org/allaymc/server/Allay.java +++ b/Allay-Server/src/main/java/org/allaymc/server/Allay.java @@ -50,7 +50,7 @@ import org.allaymc.server.entity.type.AllayEntityType; import org.allaymc.server.eventbus.AllayEventBus; import org.allaymc.server.gui.Dashboard; -import org.allaymc.server.i18n.AllayI18N; +import org.allaymc.server.i18n.AllayI18n; import org.allaymc.server.i18n.AllayI18nLoader; import org.allaymc.server.item.attribute.AllayVanillaItemAttributeRegistry; import org.allaymc.server.item.enchantment.AllayEnchantmentRegistry; @@ -194,7 +194,7 @@ public static void initAllayAPI() throws MissingImplementationException { @VisibleForTesting public static void initI18n() { if (I18n.get() == null) { - AllayAPI.getInstance().bindI18n(new AllayI18N(new AllayI18nLoader(), Server.SETTINGS.genericSettings().language())); + AllayAPI.getInstance().bindI18n(new AllayI18n(new AllayI18nLoader(), Server.SETTINGS.genericSettings().language())); } } } diff --git a/Allay-Server/src/main/java/org/allaymc/server/i18n/AllayI18N.java b/Allay-Server/src/main/java/org/allaymc/server/i18n/AllayI18n.java similarity index 98% rename from Allay-Server/src/main/java/org/allaymc/server/i18n/AllayI18N.java rename to Allay-Server/src/main/java/org/allaymc/server/i18n/AllayI18n.java index 5a38179b0..76061f05d 100644 --- a/Allay-Server/src/main/java/org/allaymc/server/i18n/AllayI18N.java +++ b/Allay-Server/src/main/java/org/allaymc/server/i18n/AllayI18n.java @@ -18,13 +18,13 @@ * @author daoge_cmd */ @Slf4j -public class AllayI18N implements I18n { +public class AllayI18n implements I18n { protected EnumMap> langMap = new EnumMap<>(LangCode.class); protected LangCode defaultLangCode; protected I18nLoader i18NLoader; - public AllayI18N(I18nLoader i18NLoader, LangCode defaultLangCode) { + public AllayI18n(I18nLoader i18NLoader, LangCode defaultLangCode) { this.i18NLoader = i18NLoader; this.defaultLangCode = defaultLangCode; setDefaultLangCode(defaultLangCode); diff --git a/Allay-Server/src/main/java/org/allaymc/server/i18n/AllayI18nLoader.java b/Allay-Server/src/main/java/org/allaymc/server/i18n/AllayI18nLoader.java index 652755b98..cacc2e3c8 100644 --- a/Allay-Server/src/main/java/org/allaymc/server/i18n/AllayI18nLoader.java +++ b/Allay-Server/src/main/java/org/allaymc/server/i18n/AllayI18nLoader.java @@ -26,9 +26,8 @@ public class AllayI18nLoader implements I18nLoader { @Override public Map getLangMap(LangCode langCode) { - try (var input = Objects.requireNonNull(AllayI18nLoader.class.getResourceAsStream("/lang/" + langCode.name() + ".json"));) { - TypeToken> typeToken = new TypeToken<>() { - }; + try (var input = Objects.requireNonNull(AllayI18nLoader.class.getResourceAsStream("/lang/" + langCode.name() + ".json"))) { + TypeToken> typeToken = new TypeToken<>() {}; byte[] bytes = input.readAllBytes(); return JSONUtils.fromLenient(new String(bytes, StandardCharsets.UTF_8),typeToken); } catch (IOException e) { diff --git a/Allay-Server/src/main/java/org/allaymc/server/plugin/jar/JarPluginLoader.java b/Allay-Server/src/main/java/org/allaymc/server/plugin/jar/JarPluginLoader.java index d3177d108..fc52fa2c8 100644 --- a/Allay-Server/src/main/java/org/allaymc/server/plugin/jar/JarPluginLoader.java +++ b/Allay-Server/src/main/java/org/allaymc/server/plugin/jar/JarPluginLoader.java @@ -1,25 +1,33 @@ package org.allaymc.server.plugin.jar; +import com.google.gson.reflect.TypeToken; import lombok.Getter; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.allaymc.api.i18n.I18n; +import org.allaymc.api.i18n.I18nLoader; +import org.allaymc.api.i18n.LangCode; import org.allaymc.api.i18n.TrKeys; import org.allaymc.api.plugin.Plugin; import org.allaymc.api.plugin.PluginContainer; import org.allaymc.api.plugin.PluginDescriptor; import org.allaymc.api.plugin.PluginException; import org.allaymc.api.plugin.PluginLoader; +import org.allaymc.api.server.Server; import org.allaymc.api.utils.JSONUtils; +import org.allaymc.server.i18n.AllayI18n; +import org.allaymc.server.i18n.AllayI18nLoader; import org.allaymc.server.plugin.SimplePluginDescriptor; +import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.PathMatcher; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; import static org.allaymc.api.plugin.PluginContainer.createPluginContainer; import static org.allaymc.server.plugin.DefaultPluginSource.getOrCreateDataFolder; @@ -69,7 +77,8 @@ public PluginContainer loadPlugin() { return createPluginContainer( pluginInstance, descriptor, this, - getOrCreateDataFolder(descriptor.getName()) + getOrCreateDataFolder(descriptor.getName()), + new AllayI18n(new JarPluginI18nLoader(), Server.SETTINGS.genericSettings().language()) ); } @@ -85,6 +94,23 @@ protected Class findMainClass() { } } + public class JarPluginI18nLoader implements I18nLoader { + + @Override + public Map getLangMap(LangCode langCode) { + try { + var str = Files.readString(jarFileSystem.getPath("lang/" + langCode.name() + ".json")); + TypeToken> typeToken = new TypeToken<>() {}; + return JSONUtils.fromLenient(str,typeToken); + } catch (NoSuchFileException e) { + return Collections.emptyMap(); + } catch (IOException e) { + log.error("Error while loading plugin language file", e); + return Collections.emptyMap(); + } + } + } + public static class JarPluginLoaderFactory implements PluginLoaderFactory { protected static final PathMatcher PATH_MATCHER = FileSystems.getDefault().getPathMatcher("glob:**.jar"); diff --git a/Allay-Server/src/main/java/org/allaymc/server/plugin/js/JsPluginLoader.java b/Allay-Server/src/main/java/org/allaymc/server/plugin/js/JsPluginLoader.java index 33a4efa4d..42eaa7e21 100644 --- a/Allay-Server/src/main/java/org/allaymc/server/plugin/js/JsPluginLoader.java +++ b/Allay-Server/src/main/java/org/allaymc/server/plugin/js/JsPluginLoader.java @@ -1,15 +1,26 @@ package org.allaymc.server.plugin.js; +import com.google.gson.reflect.TypeToken; import lombok.Getter; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.allaymc.api.i18n.I18nLoader; +import org.allaymc.api.i18n.LangCode; import org.allaymc.api.plugin.PluginContainer; import org.allaymc.api.plugin.PluginDescriptor; import org.allaymc.api.plugin.PluginException; import org.allaymc.api.plugin.PluginLoader; +import org.allaymc.api.server.Server; import org.allaymc.api.utils.JSONUtils; +import org.allaymc.server.i18n.AllayI18n; +import java.io.IOException; import java.nio.file.Files; +import java.nio.file.NoSuchFileException; import java.nio.file.Path; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import static org.allaymc.api.plugin.PluginContainer.createPluginContainer; import static org.allaymc.server.plugin.DefaultPluginSource.getOrCreateDataFolder; @@ -19,6 +30,7 @@ * * @author daoge_cmd */ +@Slf4j public class JsPluginLoader implements PluginLoader { @Getter @@ -49,10 +61,27 @@ public PluginContainer loadPlugin() { return createPluginContainer( new JsPlugin(), descriptor, this, - getOrCreateDataFolder(descriptor.getName()) + getOrCreateDataFolder(descriptor.getName()), + new AllayI18n(new JsPluginI18nLoader(), Server.SETTINGS.genericSettings().language()) ); } + public class JsPluginI18nLoader implements I18nLoader { + @Override + public Map getLangMap(LangCode langCode) { + try { + var str = Files.readString(pluginPath.resolve("lang").resolve(langCode.name() + ".json")); + TypeToken> typeToken = new TypeToken<>() {}; + return JSONUtils.fromLenient(str,typeToken); + } catch (NoSuchFileException e) { + return Collections.emptyMap(); + } catch (IOException e) { + log.error("Error while loading plugin language file", e); + return Collections.emptyMap(); + } + } + } + public static class JsPluginLoaderFactory implements PluginLoaderFactory { @Override diff --git a/Allay-Server/src/test/java/org/allaymc/server/i18n/AllayI18nTest.java b/Allay-Server/src/test/java/org/allaymc/server/i18n/AllayI18nTest.java index 6949c5ac9..bcf2a1955 100644 --- a/Allay-Server/src/test/java/org/allaymc/server/i18n/AllayI18nTest.java +++ b/Allay-Server/src/test/java/org/allaymc/server/i18n/AllayI18nTest.java @@ -18,7 +18,7 @@ public class AllayI18nTest { public static final String TEST_VANILLA_KEY = "minecraft:" + TEST_VANILLA_KEY_NO_NAMESPACE; public static final String TEST_ALLAY_KEY_NO_NAMESPACE = "allay.starting"; public static final String TEST_ALLAY_KEY = "allay:" + TEST_ALLAY_KEY_NO_NAMESPACE; - static I18n translator = new AllayI18N(new AllayI18nLoader(), LangCode.en_US); + static I18n translator = new AllayI18n(new AllayI18nLoader(), LangCode.en_US); @Test void testTr() {