diff --git a/api/src/main/java/me/blackvein/quests/config/ISettings.java b/api/src/main/java/me/blackvein/quests/config/ISettings.java index 8aad4071d..02855e05e 100644 --- a/api/src/main/java/me/blackvein/quests/config/ISettings.java +++ b/api/src/main/java/me/blackvein/quests/config/ISettings.java @@ -41,6 +41,8 @@ public interface ISettings { void setIgnoreLockedQuests(final boolean ignoreLockedQuests); int getKillDelay(); void setKillDelay(final int killDelay); + String getLanguage(); + void setLanguage(final String language); int getMaxQuests(); void setMaxQuests(final int maxQuests); boolean canNpcEffects(); diff --git a/api/src/main/java/me/blackvein/quests/util/Lang.java b/api/src/main/java/me/blackvein/quests/util/Lang.java index 1a8f08462..319eb30fb 100644 --- a/api/src/main/java/me/blackvein/quests/util/Lang.java +++ b/api/src/main/java/me/blackvein/quests/util/Lang.java @@ -37,17 +37,17 @@ import java.util.regex.Pattern; public class Lang { - private static String iso = "en-US"; + //private static String iso = "en-US"; private static final LinkedHashMap langMap = new LinkedHashMap<>(); private static final Pattern hexPattern = Pattern.compile("(?i)%#([0-9A-F]{6})%"); - public static String getISO() { + /*public static String getISO() { return iso; } public static void setISO(final String iso) { Lang.iso = iso; - } + }*/ public static Collection values() { return langMap.values(); @@ -61,6 +61,14 @@ public class Lang { * @return formatted string, plus processing through PlaceholderAPI by clip */ public static String get(final Player player, final String key) { + String locale; + try { + locale = player.getLocale(); + } catch (NoSuchMethodError e) { + // Older version of Minecraft + locale = player.spigot().getLocale(); + } + return langMap.containsKey(key) ? LangToken.convertString(player, langMap.get(key)) : "NULL"; } @@ -133,63 +141,64 @@ public class Lang { } } - public static void init(final QuestsAPI plugin) throws InvalidConfigurationException, IOException { + public static void init(final QuestsAPI plugin, String iso) throws InvalidConfigurationException, IOException { final File langFile = new File(plugin.getPluginDataFolder(), File.separator + "lang" + File.separator + iso + File.separator + "strings.yml"); final File langFile_new = new File(plugin.getPluginDataFolder(), File.separator + "lang" + File.separator + iso + File.separator + "strings_new.yml"); final boolean exists_new = langFile_new.exists(); final LinkedHashMap allStrings = new LinkedHashMap<>(); - if (langFile.exists() && iso.split("-").length > 1) { - final FileConfiguration config= YamlConfiguration - .loadConfiguration(new InputStreamReader(new FileInputStream(langFile), StandardCharsets.UTF_8)); - FileConfiguration config_new = null; - if (exists_new) { - config_new = YamlConfiguration.loadConfiguration(new InputStreamReader( - new FileInputStream(langFile_new), StandardCharsets.UTF_8)); - } - // Load user's lang file and determine new strings - for (final String key : config.getKeys(false)) { - allStrings.put(key, config.getString(key)); - if (exists_new) { - config_new.set(key, null); - } - } - // Add new strings and notify user - if (exists_new) { - for (final String key : config_new.getKeys(false)) { - final String value = config_new.getString(key); - if (value != null) { - allStrings.put(key, value); - plugin.getPluginLogger().warning("There are new language phrases in /lang/" + iso - + "/strings_new.yml for the current version!" - + " You must transfer them to, or regenerate, strings.yml to remove this warning!"); - } - } - config_new.options().header("Below are any new strings for your current version of Quests! " - + "Transfer them to the strings.yml of the" - + " same folder to stay up-to-date and suppress console warnings."); - config_new.options().copyHeader(true); - config_new.save(langFile_new); - } - } else { - plugin.getPluginLogger().severe("Failed loading lang files for " + iso + if (!(langFile.exists() && iso.split("-").length > 1)) { + plugin.getPluginLogger().severe("Failed loading lang files for " + iso + " because they were not found. Using default en-US"); plugin.getPluginLogger() .info("If the plugin has not generated language files, ensure Quests has write permissions"); plugin.getPluginLogger() .info("For help, visit https://github.com/PikaMug/Quests/wiki/Casual-%E2%80%90-Translations"); - iso = "en-US"; - plugin.getPluginLogger().info("CodeSource: " + plugin.getClass().getProtectionDomain().getCodeSource() - .toString()); - plugin.getPluginLogger().info("LocationPath: " + plugin.getClass().getProtectionDomain().getCodeSource() - .getLocation().getPath()); + plugin.getSettings().setLanguage("en-US"); + if (plugin.getSettings().getConsoleLogging() > 3) { + plugin.getPluginLogger().info("CodeSource: " + plugin.getClass().getProtectionDomain().getCodeSource() + .toString()); + plugin.getPluginLogger().info("LocationPath: " + plugin.getClass().getProtectionDomain().getCodeSource() + .getLocation().getPath()); + } final FileConfiguration config = YamlConfiguration.loadConfiguration(new InputStreamReader(Objects .requireNonNull(plugin.getPluginResource("strings.yml")), StandardCharsets.UTF_8)); for (final String key : config.getKeys(false)) { allStrings.put(key, config.getString(key)); } } + final FileConfiguration config= YamlConfiguration + .loadConfiguration(new InputStreamReader(new FileInputStream(langFile), StandardCharsets.UTF_8)); + FileConfiguration config_new = null; + if (exists_new) { + config_new = YamlConfiguration.loadConfiguration(new InputStreamReader( + new FileInputStream(langFile_new), StandardCharsets.UTF_8)); + } + // Load user's lang file and determine new strings + for (final String key : config.getKeys(false)) { + allStrings.put(key, config.getString(key)); + if (exists_new) { + config_new.set(key, null); + } + } + // Add new strings and notify user + if (exists_new) { + for (final String key : config_new.getKeys(false)) { + final String value = config_new.getString(key); + if (value != null) { + allStrings.put(key, value); + plugin.getPluginLogger().warning("There are new language phrases in /lang/" + iso + + "/strings_new.yml for the current version!" + + " You must transfer them to, or regenerate, strings.yml to remove this warning!"); + } + } + config_new.options().header("Below are any new strings for your current version of Quests! " + + "Transfer them to the strings.yml of the" + + " same folder to stay up-to-date and suppress console warnings."); + config_new.options().copyHeader(true); + config_new.save(langFile_new); + } final String cmdAdd = allStrings.get("cmdAdd"); final String cmdClear = allStrings.get("cmdClear"); diff --git a/core/src/main/java/me/blackvein/quests/Quests.java b/core/src/main/java/me/blackvein/quests/Quests.java index cb49722c3..ad559cf3c 100644 --- a/core/src/main/java/me/blackvein/quests/Quests.java +++ b/core/src/main/java/me/blackvein/quests/Quests.java @@ -37,10 +37,10 @@ import me.blackvein.quests.exceptions.QuestFormatException; import me.blackvein.quests.exceptions.StageFormatException; import me.blackvein.quests.interfaces.ReloadCallback; import me.blackvein.quests.listeners.BlockListener; +import me.blackvein.quests.listeners.CitizensListener; import me.blackvein.quests.listeners.CommandManager; import me.blackvein.quests.listeners.ConvoListener; import me.blackvein.quests.listeners.ItemListener; -import me.blackvein.quests.listeners.CitizensListener; import me.blackvein.quests.listeners.PartiesListener; import me.blackvein.quests.listeners.PlayerListener; import me.blackvein.quests.listeners.UniteListener; @@ -203,11 +203,13 @@ public class Quests extends JavaPlugin implements QuestsAPI { conditionFactory = new BukkitConditionFactory(this); depends = new Dependencies(this); trigger = new DenizenTrigger(this); - final Metrics metrics = new Metrics(this); - metrics.addCustomChart(new Metrics.SimplePie("language", Lang::getISO)); // 2 - Load main config settings.init(); + if (settings.getLanguage().contains("-")) { + final Metrics metrics = new Metrics(this); + metrics.addCustomChart(new Metrics.SimplePie("language", () -> settings.getLanguage())); + } // 3 - Setup language files try { @@ -761,7 +763,7 @@ public class Quests extends JavaPlugin implements QuestsAPI { } /** - * Transfer language files from jar to disk + * Transfer language files from jar to disk, then initialize default */ private void setupLang() throws IOException, URISyntaxException { final String path = "lang"; @@ -783,7 +785,7 @@ public class Quests extends JavaPlugin implements QuestsAPI { jar.close(); } try { - Lang.init(this); + Lang.init(this, settings.getLanguage()); } catch (final InvalidConfigurationException e) { e.printStackTrace(); } @@ -1719,7 +1721,7 @@ public class Quests extends JavaPlugin implements QuestsAPI { try { Lang.clear(); settings.init(); - Lang.init(Quests.this); + Lang.init(Quests.this, settings.getLanguage()); quests.clear(); actions.clear(); conditions.clear(); diff --git a/core/src/main/java/me/blackvein/quests/Settings.java b/core/src/main/java/me/blackvein/quests/Settings.java index fcd898416..b10fccb56 100644 --- a/core/src/main/java/me/blackvein/quests/Settings.java +++ b/core/src/main/java/me/blackvein/quests/Settings.java @@ -13,7 +13,6 @@ package me.blackvein.quests; import me.blackvein.quests.config.ISettings; -import me.blackvein.quests.util.Lang; import org.bukkit.configuration.file.FileConfiguration; import java.io.File; @@ -38,6 +37,7 @@ public class Settings implements ISettings { private boolean giveJournalItem = false; private boolean ignoreLockedQuests = false; private int killDelay = 0; + private String language = "en-US"; private int maxQuests = 0; private boolean npcEffects = true; private String effect = "note"; @@ -153,6 +153,12 @@ public class Settings implements ISettings { public void setKillDelay(final int killDelay) { this.killDelay = killDelay; } + public String getLanguage() { + return language; + } + public void setLanguage(final String language) { + this.language = language; + } public int getMaxQuests() { return maxQuests; } @@ -249,9 +255,9 @@ public class Settings implements ISettings { killDelay = config.getInt("kill-delay", 600); if (Objects.requireNonNull(config.getString("language")).equalsIgnoreCase("en")) { //Legacy - Lang.setISO("en-US"); + language = "en-US"; } else { - Lang.setISO(config.getString("language", "en-US")); + language = config.getString("language", "en-US"); } maxQuests = config.getInt("max-quests", maxQuests); npcEffects = config.getBoolean("npc-effects.enabled", true); diff --git a/core/src/main/java/me/blackvein/quests/convo/quests/planner/DateTimePrompt.java b/core/src/main/java/me/blackvein/quests/convo/quests/planner/DateTimePrompt.java index c20aef3e6..d9bea7269 100644 --- a/core/src/main/java/me/blackvein/quests/convo/quests/planner/DateTimePrompt.java +++ b/core/src/main/java/me/blackvein/quests/convo/quests/planner/DateTimePrompt.java @@ -12,6 +12,7 @@ package me.blackvein.quests.convo.quests.planner; +import me.blackvein.quests.Quests; import me.blackvein.quests.convo.quests.QuestsEditorNumericPrompt; import me.blackvein.quests.convo.quests.QuestsEditorStringPrompt; import me.blackvein.quests.events.editor.quests.QuestsEditorPostOpenNumericPromptEvent; @@ -30,11 +31,14 @@ import java.util.Locale; import java.util.TimeZone; public class DateTimePrompt extends QuestsEditorNumericPrompt { + + private final Quests plugin; private final Prompt oldPrompt; private final String source; public DateTimePrompt(final ConversationContext context, final Prompt old, final String origin) { super(context); + this.plugin = (Quests)context.getPlugin(); oldPrompt = old; source = origin; } @@ -71,7 +75,7 @@ public class DateTimePrompt extends QuestsEditorNumericPrompt { dateData += ChatColor.AQUA + timeFormat.format(cal.getTime()) + " "; cal.setTimeZone(TimeZone.getTimeZone((String) context.getSessionData("tempZone"))); - final String[] iso = Lang.getISO().split("-"); + final String[] iso = plugin.getSettings().getLanguage().split("-"); final Locale loc = new Locale(iso[0], iso[1]); final Double zonedHour = (double) (cal.getTimeZone().getRawOffset() / 60 / 60 / 1000); final String[] sep = String.valueOf(zonedHour).replace("-", "").split("\\."); diff --git a/core/src/main/java/me/blackvein/quests/convo/quests/planner/PlannerPrompt.java b/core/src/main/java/me/blackvein/quests/convo/quests/planner/PlannerPrompt.java index c8e5302dd..230f74c9e 100644 --- a/core/src/main/java/me/blackvein/quests/convo/quests/planner/PlannerPrompt.java +++ b/core/src/main/java/me/blackvein/quests/convo/quests/planner/PlannerPrompt.java @@ -408,7 +408,7 @@ public class PlannerPrompt extends QuestsEditorNumericPrompt { final TimeZone tz = TimeZone.getTimeZone(date[6]); cal.setTimeZone(tz); - final String[] iso = Lang.getISO().split("-"); + final String[] iso = plugin.getSettings().getLanguage().split("-"); final Locale loc = iso.length > 1 ? new Locale(iso[0], iso[1]) : new Locale(iso[0]); final Double zonehour = (double) (cal.getTimeZone().getRawOffset() / 60 / 60 / 1000); final String[] sep = String.valueOf(zonehour).replace("-", "").split("\\.");