diff --git a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java index 44a9cb6..6cfee42 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java @@ -1,5 +1,6 @@ package net.knarcraft.dynmapcitizens; +import net.knarcraft.dynmapcitizens.formatting.Translator; import net.knarcraft.dynmapcitizens.handler.VaultHandler; import net.knarcraft.dynmapcitizens.handler.trait.BlacksmithHandler; import net.knarcraft.dynmapcitizens.handler.trait.CitizensTraitHandler; @@ -49,6 +50,9 @@ public final class DynmapCitizens extends JavaPlugin { configuration = this.getConfig(); this.globalSettings.load(configuration); + //Load all messages + Translator.loadLanguages("en"); + //Initialize all enabled traits initializeTraitHandlers(configuration); diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/StringFormatter.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/StringFormatter.java new file mode 100644 index 0000000..ce14013 --- /dev/null +++ b/src/main/java/net/knarcraft/dynmapcitizens/formatting/StringFormatter.java @@ -0,0 +1,114 @@ +package net.knarcraft.dynmapcitizens.formatting; + +import net.knarcraft.dynmapcitizens.DynmapCitizens; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.command.CommandSender; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A formatter for formatting displayed messages + */ +public final class StringFormatter { + + private final static String pluginName = DynmapCitizens.getInstance().getDescription().getName(); + + private StringFormatter() { + + } + + /** + * Displays a message signifying a successful action + * + * @param sender
The command sender to display the message to
+ * @param messageThe translatable message to display
+ */ + public static void displaySuccessMessage(CommandSender sender, TranslatableMessage message) { + sender.sendMessage(ChatColor.GREEN + getFormattedMessage(Translator.getTranslatedMessage(message))); + } + + /** + * Displays a message signifying a successful action + * + * @param senderThe command sender to display the message to
+ * @param messageThe raw message to display
+ */ + public static void displaySuccessMessage(CommandSender sender, String message) { + sender.sendMessage(ChatColor.GREEN + getFormattedMessage(message)); + } + + /** + * Displays a message signifying an unsuccessful action + * + * @param senderThe command sender to display the message to
+ * @param messageThe translatable message to display
+ */ + public static void displayErrorMessage(CommandSender sender, TranslatableMessage message) { + sender.sendMessage(ChatColor.DARK_RED + getFormattedMessage(Translator.getTranslatedMessage(message))); + } + + /** + * Gets the formatted version of any chat message + * + * @param messageThe message to format
+ * @returnThe formatted message
+ */ + private static String getFormattedMessage(String message) { + return "[" + pluginName + "] " + ChatColor.RESET + translateColors(message); + } + + /** + * Translates & color codes to proper colors + * + * @param inputThe input string to translate colors for
+ * @returnThe input with color codes translated
+ */ + private static String translateColors(String input) { + return ChatColor.translateAlternateColorCodes('&', input); + } + + /** + * Replaces a placeholder in a string + * + * @param inputThe input string to replace in
+ * @param placeholderThe placeholder to replace
+ * @param replacementThe replacement value
+ * @returnThe input string with the placeholder replaced
+ */ + public static String replacePlaceholder(String input, String placeholder, String replacement) { + return input.replace(placeholder, replacement); + } + + /** + * Replaces placeholders in a string + * + * @param inputThe input string to replace in
+ * @param placeholdersThe placeholders to replace
+ * @param replacementsThe replacement values
+ * @returnThe input string with placeholders replaced
+ */ + public static String replacePlaceholders(String input, String[] placeholders, String[] replacements) { + for (int i = 0; i < Math.min(placeholders.length, replacements.length); i++) { + input = replacePlaceholder(input, placeholders[i], replacements[i]); + } + return input; + } + + /** + * Translates all found color codes to formatting in a string + * + * @param messageThe string to search for color codes
+ * @returnThe message with color codes translated
+ */ + public static String translateAllColorCodes(String message) { + message = ChatColor.translateAlternateColorCodes('&', message); + Pattern pattern = Pattern.compile("(#[a-fA-F0-9]{6})"); + Matcher matcher = pattern.matcher(message); + while (matcher.find()) { + message = message.replace(matcher.group(), "" + ChatColor.of(matcher.group())); + } + return message; + } + +} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/TranslatableMessage.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/TranslatableMessage.java new file mode 100644 index 0000000..46ebefe --- /dev/null +++ b/src/main/java/net/knarcraft/dynmapcitizens/formatting/TranslatableMessage.java @@ -0,0 +1,7 @@ +package net.knarcraft.dynmapcitizens.formatting; + +public enum TranslatableMessage { + + SENTINEL_DETAILS + +} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/Translator.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/Translator.java new file mode 100644 index 0000000..85c3716 --- /dev/null +++ b/src/main/java/net/knarcraft/dynmapcitizens/formatting/Translator.java @@ -0,0 +1,120 @@ +package net.knarcraft.dynmapcitizens.formatting; + +import net.knarcraft.dynmapcitizens.DynmapCitizens; +import net.knarcraft.dynmapcitizens.util.FileHelper; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Level; + +/** + * A tool to get strings translated to the correct language + */ +public final class Translator { + + private static MapThe message to translate
+ * @returnThe translated message
+ */ + public static String getTranslatedMessage(TranslatableMessage translatableMessage) { + if (translatedMessages == null) { + return "Translated strings not loaded"; + } + String translatedMessage; + if (translatedMessages.containsKey(translatableMessage)) { + translatedMessage = translatedMessages.get(translatableMessage); + } else if (backupTranslatedMessages.containsKey(translatableMessage)) { + translatedMessage = backupTranslatedMessages.get(translatableMessage); + } else { + translatedMessage = translatableMessage.toString(); + } + return StringFormatter.translateAllColorCodes(translatedMessage); + } + + /** + * Loads all translated messages for the given language + * + * @param languageThe language chosen by the user
+ * @returnA mapping of all strings for the given language
+ */ + public static MapThe selected language
+ * @returnThe loaded translated strings, or null if no custom language file exists
+ */ + public static MapThe selected language
+ * @param readerThe buffered reader to read from
+ * @returnThe loaded translated strings
+ */ + private static MapA buffered read for reading the file
+ * @throws FileNotFoundExceptionIf unable to get an input stream for the given file
+ */ + public static BufferedReader getBufferedReaderForInternalFile(String file) throws FileNotFoundException { + InputStream inputStream = FileHelper.class.getResourceAsStream(file); + if (inputStream == null) { + throw new FileNotFoundException("Unable to read the given file"); + } + return new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + } + +} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/util/TimeFormatter.java b/src/main/java/net/knarcraft/dynmapcitizens/util/TimeFormatter.java index 5ebc8ba..30c0753 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/util/TimeFormatter.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/util/TimeFormatter.java @@ -9,7 +9,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import static net.knarcraft.blacksmith.formatting.StringFormatter.replacePlaceholder; +import static net.knarcraft.dynmapcitizens.formatting.StringFormatter.replacePlaceholder; /** * A helper class for time formatting diff --git a/src/main/resources/strings.yml b/src/main/resources/strings.yml new file mode 100644 index 0000000..05aec0f --- /dev/null +++ b/src/main/resources/strings.yml @@ -0,0 +1,55 @@ +en: + SENTINEL_DESCRIPTION: | +