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);