diff --git a/.idea/compiler.xml b/.idea/compiler.xml index f44dea3..5cde25e 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -9,7 +9,7 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index 5e60aa6..6dfc449 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -9,7 +9,7 @@ - + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 7c3be47..94fdc48 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,9 @@ - + + + \ No newline at end of file diff --git a/langlibs-api/src/main/java/li/cinnazeyy/langlibs/core/LangLibAPI.java b/langlibs-api/src/main/java/li/cinnazeyy/langlibs/core/LangLibAPI.java index c1b676f..2e09748 100644 --- a/langlibs-api/src/main/java/li/cinnazeyy/langlibs/core/LangLibAPI.java +++ b/langlibs-api/src/main/java/li/cinnazeyy/langlibs/core/LangLibAPI.java @@ -2,6 +2,7 @@ import li.cinnazeyy.langlibs.core.database.DatabaseConnection; import li.cinnazeyy.langlibs.core.file.LanguageFile; +import li.cinnazeyy.langlibs.core.language.LanguageUtil; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.Sound; @@ -37,7 +38,16 @@ public static String getPlayerLang(UUID playerUUID) { if (lang != null) return lang; else { try (ResultSet rsUser = DatabaseConnection.createStatement("SELECT uuid, lang FROM langUsers WHERE uuid = ?").setValue(playerUUID.toString()).executeQuery()) { - if (rsUser.next()) playerLocale.put(UUID.fromString(rsUser.getString(1)),rsUser.getString(2)); + if (rsUser.next()) { + playerLocale.put(UUID.fromString(rsUser.getString(1)),rsUser.getString(2)); + } else { + Player p = Bukkit.getPlayer(playerUUID); + if (p != null) { + playerLocale.put(playerUUID, LanguageUtil.getLocaleTagByPlayer(p)); + } else { + playerLocale.put(playerUUID, "en_US"); + } + } DatabaseConnection.closeResultSet(rsUser); } catch (SQLException e) { logger.error("A SQL error occurred!", e); diff --git a/langlibs-api/src/main/java/li/cinnazeyy/langlibs/core/file/LanguageFile.java b/langlibs-api/src/main/java/li/cinnazeyy/langlibs/core/file/LanguageFile.java index 0c8c18f..dddfed2 100644 --- a/langlibs-api/src/main/java/li/cinnazeyy/langlibs/core/file/LanguageFile.java +++ b/langlibs-api/src/main/java/li/cinnazeyy/langlibs/core/file/LanguageFile.java @@ -7,6 +7,7 @@ import org.spongepowered.configurate.CommentedConfigurationNode; import org.spongepowered.configurate.ConfigurateException; import org.spongepowered.configurate.serialize.SerializationException; +import org.spongepowered.configurate.yaml.NodeStyle; import org.spongepowered.configurate.yaml.YamlConfigurationLoader; import java.io.BufferedReader; @@ -30,7 +31,7 @@ public class LanguageFile { public String[] additionalLang; private CommentedConfigurationNode root = null; - + private boolean lastTranslationNotSuccessful = false; public LanguageFile(@NotNull Plugin plugin, double version, Language lang) { this.plugin = plugin; @@ -39,6 +40,7 @@ public LanguageFile(@NotNull Plugin plugin, double version, Language lang) { this.filePath = plugin.getDataPath().toAbsolutePath().resolve(Paths.get("lang", lang + ".yml")); languageLoader = YamlConfigurationLoader.builder() + .nodeStyle(NodeStyle.BLOCK) .path(filePath) .build(); @@ -60,7 +62,8 @@ public LanguageFile(Plugin plugin, double version, Language lang, String... addi public String getTranslation(@NotNull String key) { String translation = root.node((Object[]) key.split("\\.")).getString(); - return translation != null ? translation : "undefined"; + lastTranslationNotSuccessful = translation == null; + return translation != null ? translation : "undefined (" + getFileName() + ": " + key + ")"; } public String getTranslation(String key, String @NotNull ... args) { @@ -71,11 +74,14 @@ public String getTranslation(String key, String @NotNull ... args) { public List getTranslations(@NotNull String key) { try { - return root.node((Object[]) key.split("\\.")).getList(String.class); + var list = root.node((Object[]) key.split("\\.")).getList(String.class); + lastTranslationNotSuccessful = false; + return list; } catch (SerializationException e) { plugin.getComponentLogger().error("Could not parse string list in language file {} with key {}!", filePath.toString(), key); } - return List.of("undefined"); + lastTranslationNotSuccessful = true; + return List.of("undefined (" + getFileName() + ": " + key + ")"); } public List getTranslations(String key, String @NotNull ... args) { @@ -92,6 +98,15 @@ public InputStream getDefaultFileStream() { return plugin.getResource("lang/" + filePath.toFile().getName()); } + public void setTranslation(String key, Object value) { + try { + root.node((Object[]) key.split("\\.")).raw(value); + saveFile(); + } catch (ConfigurateException e) { + plugin.getComponentLogger().error("Could not set key {} in language file {} with value {}!", key, filePath.toString(), value); + } + } + public List readDefaultFile() { try (InputStream in = getDefaultFileStream()) { BufferedReader input = new BufferedReader(new InputStreamReader(in)); @@ -116,4 +131,6 @@ public void loadFile() { plugin.getComponentLogger().error(Component.text("Could not properly load language file" + filePath), e); } } + + public boolean lastTranslationWasNotSuccessful() {return lastTranslationNotSuccessful;} } \ No newline at end of file diff --git a/langlibs-api/src/main/java/li/cinnazeyy/langlibs/core/language/LanguageUtil.java b/langlibs-api/src/main/java/li/cinnazeyy/langlibs/core/language/LanguageUtil.java index 9ab319c..cbcfab2 100644 --- a/langlibs-api/src/main/java/li/cinnazeyy/langlibs/core/language/LanguageUtil.java +++ b/langlibs-api/src/main/java/li/cinnazeyy/langlibs/core/language/LanguageUtil.java @@ -1,6 +1,5 @@ package li.cinnazeyy.langlibs.core.language; -import com.destroystokyo.paper.ClientOption; import li.cinnazeyy.langlibs.core.LangLibAPI; import li.cinnazeyy.langlibs.core.file.LanguageFile; import li.cinnazeyy.langlibs.core.file.LanguageFileFactory; @@ -38,8 +37,13 @@ public LanguageUtil(Plugin plugin) { @SuppressWarnings("unused") public String get(CommandSender sender, String key) { - return (sender instanceof Player ? getLanguageFileByPlayer(((Player) sender).getUniqueId()) : - languageFiles[0]).getTranslation(key); + if (sender instanceof Player p) { + var languageFile = getLanguageFileByPlayer(p.getUniqueId()); + var translation = languageFile.getTranslation(key); + if (languageFile.lastTranslationWasNotSuccessful()) translation = languageFiles[0].getTranslation(key); + return translation; + } + return languageFiles[0].getTranslation(key); } @SuppressWarnings("unused") @@ -49,8 +53,13 @@ public String get(UUID playerUUID, String key) { @SuppressWarnings("unused") public String get(CommandSender sender, String key, String... args) { - return (sender instanceof Player ? getLanguageFileByPlayer(((Player) sender).getUniqueId()) : - languageFiles[0]).getTranslation(key, args); + if (sender instanceof Player p) { + var languageFile = getLanguageFileByPlayer(p.getUniqueId()); + var translation = languageFile.getTranslation(key, args); + if (languageFile.lastTranslationWasNotSuccessful()) translation = languageFiles[0].getTranslation(key, args); + return translation; + } + return languageFiles[0].getTranslation(key, args); } @SuppressWarnings("unused") @@ -86,8 +95,13 @@ public Component getComponent(UUID playerUUID, String key, TextColor baseColor, @SuppressWarnings("unused") public List getList(CommandSender sender, String key) { - return (sender instanceof Player ? getLanguageFileByPlayer(((Player) sender).getUniqueId()) : - languageFiles[0]).getTranslations(key); + if (sender instanceof Player p) { + var languageFile = getLanguageFileByPlayer(p.getUniqueId()); + var translation = languageFile.getTranslations(key); + if (languageFile.lastTranslationWasNotSuccessful()) translation = languageFiles[0].getTranslations(key); + return translation; + } + return languageFiles[0].getTranslations(key); } @SuppressWarnings("unused") @@ -97,8 +111,13 @@ public List getList(UUID playerUUID, String key) { @SuppressWarnings("unused") public List getList(CommandSender sender, String key, String... args) { - return (sender instanceof Player ? getLanguageFileByPlayer(((Player) sender).getUniqueId()) : - languageFiles[0]).getTranslations(key, args); + if (sender instanceof Player p) { + var languageFile = getLanguageFileByPlayer(p.getUniqueId()); + var translation = languageFile.getTranslations(key, args); + if (languageFile.lastTranslationWasNotSuccessful()) translation = languageFiles[0].getTranslations(key, args); + return translation; + } + return languageFiles[0].getTranslations(key, args); } @SuppressWarnings("unused") @@ -119,7 +138,7 @@ public LanguageFile getLanguageFileByPlayer(@NotNull UUID playerUUID) { } @SuppressWarnings("unused") - public String getLocaleTagByPlayer(Player player) { - return player != null ? player.getClientOption(ClientOption.LOCALE) : null; + public static String getLocaleTagByPlayer(Player player) { + return player != null ? player.locale().toString() : null; } } \ No newline at end of file diff --git a/langlibs-paper/build.gradle.kts b/langlibs-paper/build.gradle.kts index 9d16a51..26df570 100644 --- a/langlibs-paper/build.gradle.kts +++ b/langlibs-paper/build.gradle.kts @@ -33,7 +33,7 @@ tasks.processResources { // work around IDEA-296490 duplicatesStrategy = DuplicatesStrategy.INCLUDE with(copySpec { - from("langui-paper/src/main/resources/plugin.yml") { + from("langui-paper/src/main/resources/paper-plugin.yml") { expand("version" to version) } }) diff --git a/langlibs-paper/src/main/java/li/cinnazeyy/langlibs/core/EventListener.java b/langlibs-paper/src/main/java/li/cinnazeyy/langlibs/core/EventListener.java index 7223a81..cc58828 100644 --- a/langlibs-paper/src/main/java/li/cinnazeyy/langlibs/core/EventListener.java +++ b/langlibs-paper/src/main/java/li/cinnazeyy/langlibs/core/EventListener.java @@ -9,6 +9,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.jetbrains.annotations.NotNull; import java.sql.ResultSet; import java.sql.SQLException; @@ -17,13 +18,12 @@ public class EventListener implements Listener { @EventHandler(priority = EventPriority.LOWEST) - public void onJoin(PlayerJoinEvent event) { + public void onJoin(@NotNull PlayerJoinEvent event) { Player player = event.getPlayer(); Bukkit.getScheduler().runTaskAsynchronously(LangLibs.getPlugin(), () -> { String uuid = player.getUniqueId().toString(); try (ResultSet rsUser = DatabaseConnection.createStatement("SELECT uuid, lang FROM langUsers WHERE uuid = ?").setValue(uuid).executeQuery()) { - if (!rsUser.next()) LangLibAPI.setPlayerLang(player,"en_GB"); - else LangLibAPI.setPlayerLang(player,rsUser.getString(2)); + if (rsUser.next()) LangLibAPI.setPlayerLang(player,rsUser.getString(2)); DatabaseConnection.closeResultSet(rsUser); } catch (SQLException e) { LangLibs.getPlugin().getComponentLogger().error(text("A SQL error occurred!"), e);