From dfbf218aba3f8ec37c844db7d9ebc1865a8e264f Mon Sep 17 00:00:00 2001 From: adrian Date: Sat, 3 Jan 2026 23:16:57 -0300 Subject: [PATCH] Added support for localization and localization for Portuguese. Added support for item name localization. --- .../github/adrianvic/itemeconomy/Config.java | 59 +++++++++++++++++-- .../io/github/adrianvic/itemeconomy/Main.java | 5 ++ .../adrianvic/itemeconomy/Messages.java | 47 +++++++++++++++ .../itemeconomy/commands/Balance.java | 16 ++--- .../adrianvic/itemeconomy/commands/Pay.java | 21 ++++--- .../adrianvic/itemeconomy/commands/Utils.java | 15 +++++ src/main/resources/config.yml | 8 ++- src/main/resources/messages.properties | 10 ++++ src/main/resources/messages_en.properties | 10 ++++ src/main/resources/messages_pt.properties | 10 ++++ 10 files changed, 176 insertions(+), 25 deletions(-) create mode 100644 src/main/java/io/github/adrianvic/itemeconomy/Messages.java create mode 100644 src/main/java/io/github/adrianvic/itemeconomy/commands/Utils.java create mode 100644 src/main/resources/messages.properties create mode 100644 src/main/resources/messages_en.properties create mode 100644 src/main/resources/messages_pt.properties diff --git a/src/main/java/io/github/adrianvic/itemeconomy/Config.java b/src/main/java/io/github/adrianvic/itemeconomy/Config.java index 4b57e6f..b5dac25 100644 --- a/src/main/java/io/github/adrianvic/itemeconomy/Config.java +++ b/src/main/java/io/github/adrianvic/itemeconomy/Config.java @@ -1,10 +1,10 @@ package io.github.adrianvic.itemeconomy; +import org.bukkit.ChatColor; import org.bukkit.Material; +import org.bukkit.entity.Player; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; +import java.util.*; public class Config { private static Map entries = new HashMap<>(); @@ -18,6 +18,10 @@ public class Config { entries.put("singular", "diamond"); entries.put("ender_chest", "balance"); entries.put("commands", "true"); + entries.put("player", "&a{}"); + entries.put("localization", "default"); + getAvailableLocales().forEach(l -> entries.put("plural_%s".formatted(l.getLanguage()), entries.get("plural"))); + getAvailableLocales().forEach(l -> entries.put("singular_%s".formatted(l.getLanguage()), entries.get("singular"))); Map missingValues = new HashMap<>(); @@ -50,10 +54,38 @@ public class Config { return is(entry.toLowerCase(Locale.ROOT), value.toLowerCase(Locale.ROOT)); } - public static String getCurrencyText(int amount) { - return entries.get("format") + public static String getCurrencyText(int amount, String lang) { + String plural = entries.get("plural_%s".formatted(lang)); + String singular = entries.get("singular_%s".formatted(lang)); + + if (plural == null || singular == null) { + plural = entries.get("plural"); + singular = entries.get("singular"); + } + + return ChatColor.translateAlternateColorCodes('&', entries.get("format") .replace("{}", String.valueOf(amount)) - .replace("$", (amount != 1) ? entries.get("plural") : entries.get("singular")); + .replace("$", (amount != 1) ? plural : singular) + + ChatColor.RESET + ); + } + + public static String getCurrencyText(int amount, Locale locale) { + return getCurrencyText(amount, locale.getLanguage()); + } + + public static String getCurrencyText(int amount) { + return getCurrencyText(amount, getServerLocale().getLanguage()); + } + + + public static Locale getServerLocale() { + Locale locale = Locale.forLanguageTag(entries.get("localization")); + if (locale.getCountry().isEmpty()) { + locale = Locale.getDefault(); + } + + return locale; } public static UnrealConfig getuConf() { @@ -70,4 +102,19 @@ public class Config { return Material.DIAMOND; } + + public static String playerPrefix(String playerName) { + return ChatColor.translateAlternateColorCodes('&', entries.get("player").replace("{}", playerName)) + ChatColor.RESET; + } + + public static String playerPrefix(Player player) { + return playerPrefix(player.getName()); + } + + public static Set getAvailableLocales() { + return Set.of( + Locale.forLanguageTag("en"), + Locale.forLanguageTag("pt") + ); + } } diff --git a/src/main/java/io/github/adrianvic/itemeconomy/Main.java b/src/main/java/io/github/adrianvic/itemeconomy/Main.java index 18dc263..bb524d2 100644 --- a/src/main/java/io/github/adrianvic/itemeconomy/Main.java +++ b/src/main/java/io/github/adrianvic/itemeconomy/Main.java @@ -21,6 +21,11 @@ public class Main extends JavaPlugin { public void onEnable() { instance = this; Config.loadConfig(new UnrealConfig(this, this.getDataFolder(), "config.yml")); + getLogger().info(Messages.ENABLING.get( + "ItemEconomy", + getDescription().getVersion(), + Config.getServerLocale() + )); economy = new VaultLayer(); Bukkit.getServicesManager().register(Economy.class, economy, this, ServicePriority.High); diff --git a/src/main/java/io/github/adrianvic/itemeconomy/Messages.java b/src/main/java/io/github/adrianvic/itemeconomy/Messages.java new file mode 100644 index 0000000..d9ee83c --- /dev/null +++ b/src/main/java/io/github/adrianvic/itemeconomy/Messages.java @@ -0,0 +1,47 @@ +package io.github.adrianvic.itemeconomy; + +import io.github.adrianvic.itemeconomy.commands.Utils; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.util.Locale; +import java.util.ResourceBundle; + +public enum Messages { + ENABLING("enabling"), + BALANCE_SUCCESSFUL("balance-successful"), + BALANCE_OTHER_SUCCESSFUL("balance-other-successful"), + MUST_BE_PLAYER_TO_ISSUE_COMMAND("must-be-player-to-issue-command"), + PAY_SUCCESSFUL("pay-successful"), + PAY_RECEIVED("pay-received"), + PAY_COULD_NOT_REALIZE_TRANSACTION("pay-could-not-realize-transaction"), + PAY_COULD_NOT_FIND_TARGET("pay-could-not-find-target"), + PAY_NOT_ENOUGH_MONEY("pay-not-enough-money"), + PAY_INVALID_AMOUNT("pay-invalid-amount"); + + private final String path; + Messages(String path) { this.path = path; } + + private String raw(Locale locale) { + ResourceBundle bundle = ResourceBundle.getBundle("messages", locale); + return bundle.getString(path); + } + + public String get(Locale locale, Object... args) { + String pattern = raw(locale); + try { + return ChatColor.translateAlternateColorCodes('&', args.length == 0 ? pattern : String.format(pattern, args)); + } catch (Exception e) { + return pattern; + } + } + + public String get(Player player, Object... args) { + Locale locale = Utils.localeOrDefault(player); + return get(locale, args); + } + + public String get(Object... args) { + return get(Config.getServerLocale(), args); + } +} diff --git a/src/main/java/io/github/adrianvic/itemeconomy/commands/Balance.java b/src/main/java/io/github/adrianvic/itemeconomy/commands/Balance.java index e42b456..e5e93f7 100644 --- a/src/main/java/io/github/adrianvic/itemeconomy/commands/Balance.java +++ b/src/main/java/io/github/adrianvic/itemeconomy/commands/Balance.java @@ -2,6 +2,7 @@ package io.github.adrianvic.itemeconomy.commands; import io.github.adrianvic.itemeconomy.Config; import io.github.adrianvic.itemeconomy.Main; +import io.github.adrianvic.itemeconomy.Messages; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -19,18 +20,17 @@ public class Balance implements CommandExecutor, TabCompleter { public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String @NotNull [] strings) { if ((commandSender.isOp() || commandSender.hasPermission("iteco.balance.others")) && strings.length > 0) { double amount = Main.getEconomy().getBalance(strings[0]); - commandSender.sendMessage("%s has %s.".formatted( - strings[0], - Config.getCurrencyText((int) amount) - )); + commandSender.sendMessage(Messages.BALANCE_OTHER_SUCCESSFUL.get( + Utils.localeOrDefault(commandSender), + Config.playerPrefix(strings[0]), + Config.getCurrencyText((int) amount, Utils.localeOrDefault(commandSender)) + )); } else { if (commandSender instanceof Player player) { double amount = Main.getEconomy().getBalance(player); - commandSender.sendMessage("You have %s.".formatted( - Config.getCurrencyText((int) amount) - )); + commandSender.sendMessage(Messages.BALANCE_SUCCESSFUL.get(player, Config.getCurrencyText((int) amount, Utils.localeOrDefault(commandSender)))); } else { - commandSender.sendMessage("One must be a player to have a balance."); + commandSender.sendMessage(Messages.MUST_BE_PLAYER_TO_ISSUE_COMMAND.get()); } } return true; diff --git a/src/main/java/io/github/adrianvic/itemeconomy/commands/Pay.java b/src/main/java/io/github/adrianvic/itemeconomy/commands/Pay.java index f71a679..f87cb38 100644 --- a/src/main/java/io/github/adrianvic/itemeconomy/commands/Pay.java +++ b/src/main/java/io/github/adrianvic/itemeconomy/commands/Pay.java @@ -2,6 +2,7 @@ package io.github.adrianvic.itemeconomy.commands; import io.github.adrianvic.itemeconomy.Config; import io.github.adrianvic.itemeconomy.Main; +import io.github.adrianvic.itemeconomy.Messages; import net.milkbowl.vault.economy.EconomyResponse; import org.bukkit.Bukkit; import org.bukkit.command.Command; @@ -13,6 +14,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Locale; import java.util.stream.Collectors; public class Pay implements CommandExecutor, TabCompleter { @@ -27,7 +29,7 @@ public class Pay implements CommandExecutor, TabCompleter { try { amount = Integer.parseInt(strings[1]); - String amountString = Config.getCurrencyText(amount); + String amountString = Config.getCurrencyText(amount, Utils.localeOrDefault(commandSender)); if (commandSender instanceof Player player && Main.getEconomy().has(player, amount)) { if (Bukkit.getPlayer(strings[0]) instanceof Player target) { @@ -35,23 +37,26 @@ public class Pay implements CommandExecutor, TabCompleter { if (withdrawResponse.transactionSuccess()) { EconomyResponse depositResponse = Main.getEconomy().depositPlayer(target.getName(), amount); if (depositResponse.transactionSuccess()) { - commandSender.sendMessage("Transaction of %s to %s was successfully realized.".formatted(amountString, target.getName())); - target.sendMessage("You received %s from %s.".formatted(amountString, player.getName())); + commandSender.sendMessage(Messages.PAY_SUCCESSFUL.get( + Utils.localeOrDefault(commandSender), + amountString, + Config.playerPrefix(target))); + target.sendMessage(Messages.PAY_RECEIVED.get(target, amountString, Config.playerPrefix(player))); } else { - commandSender.sendMessage("Could not realize transaction: %s".formatted(depositResponse.errorMessage)); + commandSender.sendMessage(Messages.PAY_COULD_NOT_REALIZE_TRANSACTION.get(Utils.localeOrDefault(commandSender), depositResponse.errorMessage)); Main.getEconomy().depositPlayer(player.getName(), amount); } } else { - commandSender.sendMessage("Could not realize transaction: %s".formatted(withdrawResponse.errorMessage)); + commandSender.sendMessage(Messages.PAY_COULD_NOT_REALIZE_TRANSACTION.get(Utils.localeOrDefault(commandSender), withdrawResponse.errorMessage));; } } else { - commandSender.sendMessage("Could not find target player."); + commandSender.sendMessage(Messages.PAY_COULD_NOT_FIND_TARGET.get(Utils.localeOrDefault(commandSender))); } } else { - commandSender.sendMessage("You don't have enough money."); + commandSender.sendMessage(Messages.PAY_NOT_ENOUGH_MONEY.get(Utils.localeOrDefault(commandSender))); } } catch (NumberFormatException nfe) { - commandSender.sendMessage("The amount you tried to pay is not valid."); + commandSender.sendMessage(Messages.PAY_INVALID_AMOUNT.get(Utils.localeOrDefault(commandSender))); return true; } diff --git a/src/main/java/io/github/adrianvic/itemeconomy/commands/Utils.java b/src/main/java/io/github/adrianvic/itemeconomy/commands/Utils.java new file mode 100644 index 0000000..aceb749 --- /dev/null +++ b/src/main/java/io/github/adrianvic/itemeconomy/commands/Utils.java @@ -0,0 +1,15 @@ +package io.github.adrianvic.itemeconomy.commands; + +import io.github.adrianvic.itemeconomy.Config; +import io.github.adrianvic.itemeconomy.Main; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.Locale; + +public class Utils { + public static Locale localeOrDefault(CommandSender sender) { + return (sender instanceof Player p) ? Locale.forLanguageTag(p.getLocale().replace('_', '-')) : Config.getServerLocale(); + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 49262a7..1b2d06d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,7 @@ -item: "diamond" +item: "diamond" # MUST be a valid item. singular: "diamond" plural: "diamonds" -format: "{} $" -commands: "true" \ No newline at end of file +format: "&b{} $" # {} unfolds to amount and $ to singular or plural. +commands: "true" # Enables or disables plugin commands. +player: "&b{}" # {} unfolds to player name. +localization: "default" # can be "en" and "pt" too, if set to anything else uses system locale. \ No newline at end of file diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties new file mode 100644 index 0000000..8dde12e --- /dev/null +++ b/src/main/resources/messages.properties @@ -0,0 +1,10 @@ +enabling=enabling +balance-successful=balance-successful +balance-other-successful=balance-other-successful +must-be-player-to-issue-command=must-be-player-to-issue-command +pay-successful=pay-successful +pay-received=pay-received +pay-could-not-realize-transaction=pay-could-not-realize-transaction +pay-could-not-find-target=pay-could-not-find-target +pay-not-enough-money=pay-not-enough-money +pay-invalid-amount=pay-invalid-amount \ No newline at end of file diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties new file mode 100644 index 0000000..06b8422 --- /dev/null +++ b/src/main/resources/messages_en.properties @@ -0,0 +1,10 @@ +enabling=Starting %s version %s with locale '%s'. +balance-successful=You have %s. +balance-other-successful=%s has %s. +must-be-player-to-issue-command=You must be a player to issue this command. +pay-successful=Transaction of %s to %s was successfully realized. +pay-received=You received %s from %s. +pay-could-not-realize-transaction=Could not realize transaction: %s +pay-could-not-find-target=Could not find target player. +pay-not-enough-money=You don't have enough money. +pay-invalid-amount=The amount you tried to pay is not valid. \ No newline at end of file diff --git a/src/main/resources/messages_pt.properties b/src/main/resources/messages_pt.properties new file mode 100644 index 0000000..8b624b1 --- /dev/null +++ b/src/main/resources/messages_pt.properties @@ -0,0 +1,10 @@ +enabling=Iniciando %s versão %s com localização para %s. +balance-successful=Você tem %s. +balance-other-successful=%s possui %s. +must-be-player-to-issue-command=Você precisa ser um jogador para executar esse comando. +pay-successful=Transação de %s para %s realizada com sucesso. +pay-received=Você recebeu %s de %s. +pay-could-not-realize-transaction=Não foi possível realizar a transação: %s +pay-could-not-find-target=Não foi possível encontrar o jogador-alvo. +pay-not-enough-money=Você não tem dinheiro suficiente. +pay-invalid-amount=A quantidade que você tentou enviar é inválida. \ No newline at end of file