From c4cdab8b7f5d9010db6d7622b568d02212766c23 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Thu, 2 Jun 2022 21:29:02 +0200 Subject: [PATCH] Makes language configurable Changes the translator to load translations from several files Moves strings.yml to en-US.yml and removes the "en" root node Makes sure to use UTF-8 for custom languages Improves some translator console messages and behavior when the selected language cannot be loaded --- .../stargatecommand/StargateCommand.java | 3 +- .../formatting/Translator.java | 45 ++++++++++--------- src/main/resources/config.yml | 2 + src/main/resources/strings.yml | 23 ---------- src/main/resources/translations/en-US.yml | 22 +++++++++ 5 files changed, 50 insertions(+), 45 deletions(-) delete mode 100644 src/main/resources/strings.yml create mode 100644 src/main/resources/translations/en-US.yml diff --git a/src/main/java/net/knarcraft/stargatecommand/StargateCommand.java b/src/main/java/net/knarcraft/stargatecommand/StargateCommand.java index 48b22d7..187ce4b 100644 --- a/src/main/java/net/knarcraft/stargatecommand/StargateCommand.java +++ b/src/main/java/net/knarcraft/stargatecommand/StargateCommand.java @@ -39,8 +39,8 @@ public class StargateCommand extends JavaPlugin { this.saveDefaultConfig(); configuration.options().copyDefaults(true); loadConfiguration(configuration); + saveConfig(); - Translator.loadLanguages("en"); //Get the Stargate API ServicesManager servicesManager = this.getServer().getServicesManager(); RegisteredServiceProvider stargateProvider = servicesManager.getRegistration(StargateAPI.class); @@ -81,6 +81,7 @@ public class StargateCommand extends JavaPlugin { * @param fileConfiguration

The configuration to load

*/ private void loadConfiguration(FileConfiguration fileConfiguration) { + Translator.loadLanguages(fileConfiguration.getString("language")); //Load all icons from config for (Icon icon : Icon.values()) { String iconString = fileConfiguration.getString(icon.getConfigNode()); diff --git a/src/main/java/net/knarcraft/stargatecommand/formatting/Translator.java b/src/main/java/net/knarcraft/stargatecommand/formatting/Translator.java index bf377e2..1b7187d 100644 --- a/src/main/java/net/knarcraft/stargatecommand/formatting/Translator.java +++ b/src/main/java/net/knarcraft/stargatecommand/formatting/Translator.java @@ -9,6 +9,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; @@ -18,6 +19,7 @@ import java.util.logging.Level; */ public final class Translator { + private static final String translationsFolder = "translations"; private static Map translatedMessages; private static Map backupTranslatedMessages; @@ -29,7 +31,7 @@ public final class Translator { * Loads the languages used by this translator */ public static void loadLanguages(String selectedLanguage) { - backupTranslatedMessages = loadTranslatedMessages("en"); + backupTranslatedMessages = loadTranslatedMessages("en-US"); translatedMessages = loadCustomTranslatedMessages(selectedLanguage); if (translatedMessages == null) { translatedMessages = loadTranslatedMessages(selectedLanguage); @@ -43,16 +45,13 @@ public final class Translator { * @return

The translated message

*/ public static String getTranslatedMessage(TranslatableMessage translatableMessage) { - if (translatedMessages == null) { - return "Translated strings not loaded"; - } String translatedMessage; - if (translatedMessages.containsKey(translatableMessage)) { + if (translatedMessages != null && translatedMessages.containsKey(translatableMessage)) { translatedMessage = translatedMessages.get(translatableMessage); - } else if (backupTranslatedMessages.containsKey(translatableMessage)) { + } else if (backupTranslatedMessages != null && backupTranslatedMessages.containsKey(translatableMessage)) { translatedMessage = backupTranslatedMessages.get(translatableMessage); } else { - translatedMessage = translatableMessage.toString(); + return "Translated strings not loaded"; } return StringFormatter.translateAllColorCodes(translatedMessage); } @@ -65,32 +64,37 @@ public final class Translator { */ public static Map loadTranslatedMessages(String language) { try { - BufferedReader reader = FileHelper.getBufferedReaderForInternalFile("/strings.yml"); - return loadTranslatableMessages(language, reader); + BufferedReader reader = FileHelper.getBufferedReaderForInternalFile("/" + translationsFolder + "/" + + language + ".yml"); + return loadTranslatableMessages(reader); } catch (FileNotFoundException e) { - StargateCommand.getInstance().getLogger().log(Level.SEVERE, "Unable to load translated messages"); + StargateCommand.getInstance().getLogger().log(Level.SEVERE, + String.format("Unable to load translated messages from %s.yml", language)); return null; } } /** - * Tries to load translated messages from a custom strings.yml file + * Tries to load translated messages from a custom en-US.yml file * * @param language

The selected language

* @return

The loaded translated strings, or null if no custom language file exists

*/ public static Map loadCustomTranslatedMessages(String language) { - File strings = new File(StargateCommand.getInstance().getDataFolder(), "strings.yml"); - if (!strings.exists()) { - StargateCommand.getInstance().getLogger().log(Level.FINEST, "Strings file not found"); + File translationsFolderFile = new File(StargateCommand.getInstance().getDataFolder(), translationsFolder); + File languageFile = new File(translationsFolderFile, language + ".yml"); + if (!languageFile.exists()) { return null; } try { - StargateCommand.getInstance().getLogger().log(Level.WARNING, "Loading custom strings..."); - return loadTranslatableMessages(language, new BufferedReader(new InputStreamReader(new FileInputStream(strings)))); + StargateCommand.getInstance().getLogger().log(Level.INFO, + String.format("Loading custom strings from %s.yml", language)); + return loadTranslatableMessages(new BufferedReader(new InputStreamReader(new FileInputStream(languageFile), + StandardCharsets.UTF_8))); } catch (FileNotFoundException e) { - StargateCommand.getInstance().getLogger().log(Level.WARNING, "Unable to load custom messages"); + StargateCommand.getInstance().getLogger().log(Level.WARNING, + String.format("Unable to load custom messages from %s.yml", language)); return null; } } @@ -98,16 +102,15 @@ public final class Translator { /** * Loads translatable messages from the given reader * - * @param language

The selected language

- * @param reader

The buffered reader to read from

+ * @param reader

The buffered reader to read from

* @return

The loaded translated strings

*/ - private static Map loadTranslatableMessages(String language, BufferedReader reader) { + private static Map loadTranslatableMessages(BufferedReader reader) { Map translatedMessages = new HashMap<>(); YamlConfiguration configuration = YamlConfiguration.loadConfiguration(reader); for (TranslatableMessage message : TranslatableMessage.values()) { - String translated = configuration.getString(language + "." + message.toString()); + String translated = configuration.getString(message.toString()); if (translated != null) { translatedMessages.put(message, translated); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 818cf4f..1cfef57 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,3 +1,5 @@ +# The language used for all text displayed to players +language: "en-US" icon: # The "icon" used to mark a Stargate as hidden when visualizing the network hiddenIcon: "⇒" diff --git a/src/main/resources/strings.yml b/src/main/resources/strings.yml deleted file mode 100644 index 7021839..0000000 --- a/src/main/resources/strings.yml +++ /dev/null @@ -1,23 +0,0 @@ -en: - PREFIX: "[StargateCommand]" - PERMISSION_DENIED: "Permission Denied" - INVALID_CONFIGURATION_OPTION: "Invalid configuration option specified" - INVALID_DATATYPE_GIVEN: "Invalid {datatype} given" - CONFIG_UPDATED: "Configuration updated" - POSITIVE_NUMBER_REQUIRED: "This config option cannot be negative" - INVALID_NUMBER_GIVEN: "Invalid number given" - CONFIG_OPTION_CURRENT_VALUE: "&aCurrent value: &6{value}" - CONFIG_VALUES_HEADER: "&aStargate &6Config values:" - CONFIG_OPTION_DESCRIPTION: "&6{name}&r - &a{description}&8 (Default: &7{value}&8)" - COMMAND_PLAYER_ONLY: "This command can only be used by players" - COMMAND_DIAL_ARGUMENTS: "You need to provide a network name and a Stargate name to dial" - INVALID_NETWORK_GIVEN: "Invalid network specified in input" - INVALID_PORTAL_GIVEN: "Invalid Stargate specified in input" - PORTAL_NO_ACCESS: "You don't have access to the selected Stargate" - NO_PORTAL_IN_SIGHT: "You need to look at a Stargate to use this command" - DIAL_SUCCESSFUL: "Your Stargate has been prepared" - COMMAND_VISUALIZER_ARGUMENTS: "A network must be provided to visualize" - COMMAND_VISUALIZER_FORMAT: "Symbol explanation: \n&6{icon_h}&r = hidden, &6{icon_nh}&r = not hidden\n&6{icon_a}&r = always open, &6{icon_na}&r = not always open\n&6{icon_r}&r = random destination, &6{icon_nr}&r = non-random destination\n&6{icon_arrow_right}&r = fixed Stargate going to the specified Stargate\n|\nAll Stargates in network &a{network}&r:" - COMMAND_VISUALIZER_PORTAL_FORMAT: "&6{icons} &a{portal}&r{fixed}" - COMMAND_VISUALIZER_FIXED_FORMAT: " {icon_arrow_right} &a{portal}" - COMMAND_INFO_FORMAT: "Stargate info:\n|- &6Name&r: &a{portal}&r\n|- &6Destination&r: &a{destination}&r\n|- &6Network&r: &a{network}&r\n|- &6Owner&r: &a{owner}&r\n|- &6Flags&r: &a{flags}&r" \ No newline at end of file diff --git a/src/main/resources/translations/en-US.yml b/src/main/resources/translations/en-US.yml new file mode 100644 index 0000000..fb53157 --- /dev/null +++ b/src/main/resources/translations/en-US.yml @@ -0,0 +1,22 @@ +PREFIX: "[StargateCommand]" +PERMISSION_DENIED: "Permission Denied" +INVALID_CONFIGURATION_OPTION: "Invalid configuration option specified" +INVALID_DATATYPE_GIVEN: "Invalid {datatype} given" +CONFIG_UPDATED: "Configuration updated" +POSITIVE_NUMBER_REQUIRED: "This config option cannot be negative" +INVALID_NUMBER_GIVEN: "Invalid number given" +CONFIG_OPTION_CURRENT_VALUE: "&aCurrent value: &6{value}" +CONFIG_VALUES_HEADER: "&aStargate &6Config values:" +CONFIG_OPTION_DESCRIPTION: "&6{name}&r - &a{description}&8 (Default: &7{value}&8)" +COMMAND_PLAYER_ONLY: "This command can only be used by players" +COMMAND_DIAL_ARGUMENTS: "You need to provide a network name and a Stargate name to dial" +INVALID_NETWORK_GIVEN: "Invalid network specified in input" +INVALID_PORTAL_GIVEN: "Invalid Stargate specified in input" +PORTAL_NO_ACCESS: "You don't have access to the selected Stargate" +NO_PORTAL_IN_SIGHT: "You need to look at a Stargate to use this command" +DIAL_SUCCESSFUL: "Your Stargate has been prepared" +COMMAND_VISUALIZER_ARGUMENTS: "A network must be provided to visualize" +COMMAND_VISUALIZER_FORMAT: "Symbol explanation: \n&6{icon_h}&r = hidden, &6{icon_nh}&r = not hidden\n&6{icon_a}&r = always open, &6{icon_na}&r = not always open\n&6{icon_r}&r = random destination, &6{icon_nr}&r = non-random destination\n&6{icon_arrow_right}&r = fixed Stargate going to the specified Stargate\n|\nAll Stargates in network &a{network}&r:" +COMMAND_VISUALIZER_PORTAL_FORMAT: "&6{icons} &a{portal}&r{fixed}" +COMMAND_VISUALIZER_FIXED_FORMAT: " {icon_arrow_right} &a{portal}" +COMMAND_INFO_FORMAT: "Stargate info:\n|- &6Name&r: &a{portal}&r\n|- &6Destination&r: &a{destination}&r\n|- &6Network&r: &a{network}&r\n|- &6Owner&r: &a{owner}&r\n|- &6Flags&r: &a{flags}&r" \ No newline at end of file