From 4701066da1ae7554487ee2c848f40e60c0b20514 Mon Sep 17 00:00:00 2001 From: Marcos Paulo Date: Wed, 12 Aug 2026 12:00:39 -0300 Subject: [PATCH] i18n: migrate CanalhandiaCommand player-facing strings to Lang.tr Player-facing Msg.* call sites in commands module now resolve per-locale via Adventure GlobalTranslator (PT source-of-truth + EN translation). Admin-tuning, help blocks, OfflineStats.summary and enum labels deferred. Bundles: +6 keys (ia.uso, nota.lista.{tudo,escopo,busca}, nota.nao-encontrada, recado.desconhecido), -2 unused (curiosidade.uso-buscar, nota.ver-uso). PT/EN key parity holds; I18nTest green (316/316). Co-Authored-By: Claude --- .../canalhandia/CanalhandiaCommand.java | 237 +++++++++--------- .../java/dev/marcospaulo/canalhandia/Msg.java | 23 ++ .../resources/lang/messages_en.properties | 113 ++++++++- .../resources/lang/messages_pt.properties | 119 ++++++++- 4 files changed, 376 insertions(+), 116 deletions(-) diff --git a/src/main/java/dev/marcospaulo/canalhandia/CanalhandiaCommand.java b/src/main/java/dev/marcospaulo/canalhandia/CanalhandiaCommand.java index 193d95d..8958bf5 100644 --- a/src/main/java/dev/marcospaulo/canalhandia/CanalhandiaCommand.java +++ b/src/main/java/dev/marcospaulo/canalhandia/CanalhandiaCommand.java @@ -127,7 +127,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { return denied(sender); } if (!plugin.announceCuriosity(null)) { - Msg.error(sender, "Ninguém elegível online (ou sem estatísticas suficientes)."); + Msg.error(sender, Lang.tr("canalhandia.cmd.curiosidade.nenhum-elegivel")); } return true; } @@ -191,11 +191,12 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { default -> { Player target = Bukkit.getPlayerExact(args[0]); if (target == null) { - Msg.error(sender, "Subcomando ou jogador desconhecido. Use /curiosidade ajuda"); + Msg.error(sender, Lang.tr("canalhandia.cmd.curiosidade.subdesconhecido")); } else if (!sender.hasPermission("canalhandia.forcar")) { denied(sender); } else if (!plugin.announceCuriosity(target)) { - Msg.error(sender, target.getName() + " ainda não tem estatísticas suficientes."); + Msg.error(sender, Lang.tr("canalhandia.cmd.curiosidade.sem-stats", + Component.text(target.getName()))); } } } @@ -209,7 +210,8 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { } List facts = CuriosityFactory.facts(target, plugin.settings()); if (facts.isEmpty()) { - Msg.error(sender, "Nenhuma curiosidade disponível para " + target.getName() + "."); + Msg.error(sender, Lang.tr("canalhandia.cmd.curiosidade.sem-curiosidade", + Component.text(target.getName()))); return; } Fact fact = facts.get((int) (Math.random() * facts.size())); @@ -243,27 +245,27 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { if (args.length > 0) { Player target = Bukkit.getPlayerExact(args[0]); if (target == null) { - Msg.error(sender, "Jogador '" + args[0] + "' não está online."); + Msg.error(sender, Lang.tr("canalhandia.cmd.jogador.offline", Component.text(args[0]))); } return target; } if (sender instanceof Player player) { return player; } - Msg.error(sender, "Informe um jogador."); + Msg.error(sender, Lang.tr("canalhandia.cmd.jogador.informe")); return null; } private void toggle(CommandSender sender) { if (!(sender instanceof Player player)) { - Msg.error(sender, "Só jogadores podem usar isso."); + Msg.error(sender, Lang.tr("canalhandia.cmd.sojogador.usar")); return; } boolean optedOut = !plugin.isOptedOut(player); plugin.setOptedOut(player, optedOut); sender.sendMessage(optedOut - ? Component.text("Você não aparecerá mais nas curiosidades.", NamedTextColor.YELLOW) - : Component.text("Você voltou a aparecer nas curiosidades.", NamedTextColor.GREEN)); + ? Lang.tr("canalhandia.cmd.curiosidade.toggle-off").color(NamedTextColor.YELLOW) + : Lang.tr("canalhandia.cmd.curiosidade.toggle-on").color(NamedTextColor.GREEN)); } // --- /adivinha ---------------------------------------------------------- @@ -273,7 +275,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { return denied(sender); } if (!plugin.settings().moduleEnabled(Module.ADIVINHA)) { - Msg.error(sender, "O módulo adivinha está desativado."); + Msg.error(sender, Lang.tr("canalhandia.cmd.modulo.desativado", Component.text("adivinha"))); } else if (!plugin.startGuess()) { Msg.error(sender, "Precisa de pelo menos 2 jogadores online com estatísticas."); } @@ -286,7 +288,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { } GuessRound round = plugin.guessRound(); if (round == null || round.id() != parse(args[0], -1)) { - player.sendActionBar(Component.text("Essa rodada já acabou.", NamedTextColor.RED)); + player.sendActionBar(Lang.tr("canalhandia.cmd.adivinha.rodada-acabou").color(NamedTextColor.RED)); return; } player.sendActionBar(round.guess(player, args[1])); @@ -299,13 +301,13 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { return denied(sender); } if (!plugin.settings().moduleEnabled(Module.ENQUETE)) { - Msg.error(sender, "O módulo enquete está desativado."); + Msg.error(sender, Lang.tr("canalhandia.cmd.modulo.desativado", Component.text("enquete"))); return true; } if (args.length == 1 && args[0].equalsIgnoreCase("encerrar")) { Poll poll = plugin.poll(); if (poll == null || poll.closed()) { - Msg.error(sender, "Nenhuma enquete aberta."); + Msg.error(sender, Lang.tr("canalhandia.cmd.enquete.nenhuma")); } else { Bukkit.broadcast(poll.close()); } @@ -339,7 +341,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { } Poll poll = plugin.poll(); if (poll == null || poll.id() != parse(args[0], -1)) { - player.sendActionBar(Component.text("Essa enquete já foi encerrada.", NamedTextColor.RED)); + player.sendActionBar(Lang.tr("canalhandia.cmd.votar.encerrada").color(NamedTextColor.RED)); return; } Component result = poll.vote(player, parse(args[1], -1)); @@ -355,7 +357,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { return denied(sender); } if (!plugin.settings().moduleEnabled(Module.RANKING)) { - Msg.error(sender, "O módulo ranking está desativado."); + Msg.error(sender, Lang.tr("canalhandia.cmd.modulo.desativado", Component.text("ranking"))); return true; } if (args.length == 0) { @@ -383,7 +385,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { RankingMetric metric = RankingMetric.byKey(rest[0]); if (metric == null) { - Msg.error(sender, "Ranking desconhecido. Use /ranking para ver a lista."); + Msg.error(sender, Lang.tr("canalhandia.cmd.ranking.desconhecido")); return true; } int size = plugin.settings().rankingSize(); @@ -400,7 +402,8 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { Msg.line(sender, "desde", taken == 0 ? "o começo" : Msg.ago(taken)); } if (rows.isEmpty()) { - sender.sendMessage(Component.text(" (sem dados ainda)", NamedTextColor.GRAY)); + sender.sendMessage(Component.text(" ", NamedTextColor.GRAY) + .append(Lang.tr("canalhandia.cmd.ranking.sem-dados"))); return true; } for (int i = 0; i < rows.size(); i++) { @@ -426,7 +429,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { */ private boolean reactLatest(CommandSender sender, String key) { if (!(sender instanceof Player player)) { - Msg.error(sender, "Só jogadores podem reagir."); + Msg.error(sender, Lang.tr("canalhandia.cmd.sojogador.reagir")); return true; } if (!player.hasPermission("canalhandia.reagir")) { @@ -434,15 +437,16 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { } Reactions reactions = plugin.latestReactions(); if (reactions == null) { - Msg.error(sender, "Nada para reagir agora."); + Msg.error(sender, Lang.tr("canalhandia.cmd.reagir.nada")); return true; } if (key == null) { - Msg.error(sender, "Uso: /reagir <" + String.join("|", reactionKeys()) + ">"); + Msg.error(sender, Lang.tr("canalhandia.cmd.reagir.uso", + Component.text(String.join("|", reactionKeys())))); return true; } if (!reactions.react(player, key)) { - Msg.error(sender, "Essa reação não vale para a última mensagem."); + Msg.error(sender, Lang.tr("canalhandia.cmd.reagir.invalida")); } else { plugin.afterReact(player, reactions.id(), key); } @@ -455,11 +459,11 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { } GuessRound round = plugin.guessRound(); if (round == null || round.finished()) { - Msg.error(sender, "Nenhuma adivinha aberta."); + Msg.error(sender, Lang.tr("canalhandia.cmd.palpite.nenhuma")); return true; } if (args.length == 0) { - Msg.error(sender, "Uso: /palpite "); + Msg.error(sender, Lang.tr("canalhandia.cmd.palpite.uso")); return true; } player.sendMessage(round.guess(player, args[0])); @@ -472,16 +476,16 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { } Poll poll = plugin.poll(); if (poll == null || poll.closed()) { - Msg.error(sender, "Nenhuma enquete aberta."); + Msg.error(sender, Lang.tr("canalhandia.cmd.enquete.nenhuma")); return true; } if (args.length == 0) { - Msg.error(sender, "Uso: /votar "); + Msg.error(sender, Lang.tr("canalhandia.cmd.votar.uso")); return true; } Component result = poll.vote(player, parse(args[0], -1)); player.sendMessage(result == null - ? Component.text("Essa opção não existe.", NamedTextColor.RED) + ? Lang.tr("canalhandia.cmd.votar.opcao-inexistente").color(NamedTextColor.RED) : result); return true; } @@ -490,11 +494,11 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { private boolean whoReacted(CommandSender sender) { Reactions reactions = plugin.latestReactions(); if (reactions == null || !reactions.hasAnyVote()) { - Msg.error(sender, "Ninguém reagiu à última mensagem ainda."); + Msg.error(sender, Lang.tr("canalhandia.cmd.reacoes.nenhuma")); return true; } boolean bedrock = sender instanceof Player player && Platform.isBedrock(player); - Msg.header(sender, "Quem reagiu (" + reactions.total() + ")"); + Msg.header(sender, Lang.tr("canalhandia.cmd.reacoes.cabecalho", Component.text(reactions.total()))); reactions.breakdown(bedrock).forEach(sender::sendMessage); return true; } @@ -532,11 +536,11 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { } Reactions reactions = plugin.findReactions(parse(args[0], -1)); if (reactions == null) { - player.sendActionBar(Component.text("Essa mensagem já expirou.", NamedTextColor.RED)); + player.sendActionBar(Lang.tr("canalhandia.cmd.reagir.expirou").color(NamedTextColor.RED)); return; } if (!reactions.react(player, args[1])) { - player.sendActionBar(Component.text("Reação desconhecida.", NamedTextColor.RED)); + player.sendActionBar(Lang.tr("canalhandia.cmd.reagir.desconhecida").color(NamedTextColor.RED)); } else { plugin.afterReact(player, reactions.id(), args[1]); } @@ -940,11 +944,11 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { return denied(sender); } if (!plugin.settings().moduleEnabled(Module.IA)) { - Msg.error(sender, "O módulo de IA está desligado."); + Msg.error(sender, Lang.tr("canalhandia.cmd.modulo.desligado", Component.text("IA"))); return true; } if (!(sender instanceof Player player)) { - Msg.error(sender, "Só jogadores podem usar /ia."); + Msg.error(sender, Lang.tr("canalhandia.cmd.sojogador.ia")); return true; } // Subcommands come before the question. They only hijack when the @@ -996,7 +1000,8 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { // default: treat all args as the question } if (args.length == 0) { - Msg.error(sender, isPrivate ? "Uso: /iap " : "Uso: /ia "); + Msg.error(sender, Lang.tr("canalhandia.cmd.ia.uso", + Component.text(isPrivate ? "iap" : "ia"))); return true; } plugin.ai().ask(player, String.join(" ", args), isPrivate); @@ -1062,7 +1067,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { */ private boolean nota(CommandSender sender, String[] args) { if (!plugin.settings().moduleEnabled(Module.NOTAS)) { - Msg.error(sender, "O módulo de anotações está desligado."); + Msg.error(sender, Lang.tr("canalhandia.cmd.modulo.desligado", Component.text("anotações"))); return true; } if (!sender.hasPermission("canalhandia.nota")) { @@ -1096,14 +1101,14 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { */ private boolean saveShortcut(CommandSender sender, String[] args) { if (!plugin.settings().moduleEnabled(Module.NOTAS)) { - Msg.error(sender, "O módulo de anotações está desligado."); + Msg.error(sender, Lang.tr("canalhandia.cmd.modulo.desligado", Component.text("anotações"))); return true; } if (!sender.hasPermission("canalhandia.nota")) { return denied(sender); } if (!(sender instanceof Player player)) { - Msg.error(sender, "Só jogadores podem anotar (a anotação guarda onde você está)."); + Msg.error(sender, Lang.tr("canalhandia.cmd.sojogador.nota")); return true; } // "/save" and "/save coords" mean the same thing: just the place. The @@ -1130,23 +1135,23 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { */ private boolean recado(CommandSender sender, String[] args) { if (!plugin.settings().moduleEnabled(Module.RECADOS)) { - Msg.error(sender, "O módulo de recados está desligado."); + Msg.error(sender, Lang.tr("canalhandia.cmd.modulo.desligado", Component.text("recados"))); return true; } if (!sender.hasPermission("canalhandia.recado")) { return denied(sender); } if (!(sender instanceof Player player)) { - Msg.error(sender, "Só jogadores podem mandar recado."); + Msg.error(sender, Lang.tr("canalhandia.cmd.sojogador.recado")); return true; } if (args.length < 2) { - Msg.error(sender, "Uso: /recado "); + Msg.error(sender, Lang.tr("canalhandia.cmd.recado.uso")); return true; } String text = Note.cleanText(String.join(" ", Arrays.copyOfRange(args, 1, args.length))); if (text == null) { - Msg.error(sender, "O recado está vazio."); + Msg.error(sender, Lang.tr("canalhandia.cmd.recado.vazio")); return true; } @@ -1159,23 +1164,21 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { // anyone who has played here before. OfflineStats.Known target = plugin.offlineStats().resolve(args[0]); if (target == null) { - Msg.error(sender, "Não conheço ninguém chamado \"" + args[0] - + "\". (Só dá para mandar recado para quem já entrou no servidor.)"); + Msg.error(sender, Lang.tr("canalhandia.cmd.recado.desconhecido", Component.text(args[0]))); return true; } if (target.uuid().equals(player.getUniqueId().toString())) { - Msg.error(sender, "Recado para você mesmo? Use /save."); + Msg.error(sender, Lang.tr("canalhandia.cmd.recado.mesmo")); return true; } Mail.Message message = plugin.mail().send(player.getName(), player.getUniqueId().toString(), target.uuid(), text); if (message == null) { - Msg.error(sender, "A caixa de " + target.name() + " está cheia (" - + Mail.MAX_PER_RECIPIENT + " recados). Espere ela entrar."); + Msg.error(sender, Lang.tr("canalhandia.cmd.recado.caixa-cheia", + Component.text(target.name()), Component.text(Mail.MAX_PER_RECIPIENT))); return true; } - Msg.ok(sender, "Recado guardado para " + target.name() - + ". Vai chegar quando " + target.name() + " entrar."); + Msg.ok(sender, Lang.tr("canalhandia.cmd.recado.guardado", Component.text(target.name()))); return true; } @@ -1184,24 +1187,25 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { to.sendMessage(Msg.tag("Recado", NamedTextColor.AQUA) .append(Component.text(from.getName() + ": ", NamedTextColor.GRAY)) .append(Component.text(text, NamedTextColor.WHITE))); - Msg.ok(from, to.getName() + " está online — recado entregue na hora."); + Msg.ok(from, Lang.tr("canalhandia.cmd.recado.online", Component.text(to.getName()))); } /** {@code /recados} — how many of your messages are still unread. */ private boolean recados(CommandSender sender) { if (!plugin.settings().moduleEnabled(Module.RECADOS)) { - Msg.error(sender, "O módulo de recados está desligado."); + Msg.error(sender, Lang.tr("canalhandia.cmd.modulo.desligado", Component.text("recados"))); return true; } if (!(sender instanceof Player player)) { - Msg.error(sender, "Só jogadores têm recados."); + Msg.error(sender, Lang.tr("canalhandia.cmd.sojogador.recados")); return true; } int pending = plugin.mail().countFrom(player.getUniqueId().toString()); Msg.ok(sender, pending == 0 - ? "Todos os seus recados já foram entregues." - : pending + (pending == 1 ? " recado seu ainda não foi lido." - : " recados seus ainda não foram lidos.")); + ? Lang.tr("canalhandia.cmd.recados.tudo-entregue") + : Lang.tr(pending == 1 ? "canalhandia.cmd.recados.pendentes-singular" + : "canalhandia.cmd.recados.pendentes-plural", + Component.text(pending))); return true; } @@ -1215,27 +1219,26 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { */ private boolean mortes(CommandSender sender) { if (!plugin.settings().moduleEnabled(Module.MORTES)) { - Msg.error(sender, "O módulo de mortes está desligado."); + Msg.error(sender, Lang.tr("canalhandia.cmd.modulo.desligado", Component.text("mortes"))); return true; } if (!(sender instanceof Player player)) { - Msg.error(sender, "Só jogadores têm histórico de mortes."); + Msg.error(sender, Lang.tr("canalhandia.cmd.sojogador.mortes")); return true; } List deaths = plugin.deathLog().forPlayer(player.getUniqueId().toString()); if (deaths.isEmpty()) { - Msg.ok(sender, "Você ainda não morreu. Aproveite enquanto dura."); + Msg.ok(sender, Lang.tr("canalhandia.cmd.mortes.nenhuma")); return true; } - Msg.header(sender, "Suas últimas mortes (" + deaths.size() + ")"); + Msg.header(sender, Lang.tr("canalhandia.cmd.mortes.cabecalho", Component.text(deaths.size()))); boolean bedrock = Platform.isBedrock(player); for (DeathLog.Entry death : deaths) { Component place = Component.text(death.place(), NamedTextColor.GRAY); if (!bedrock) { place = place.clickEvent(ClickEvent.copyToClipboard(death.coords())) .hoverEvent(net.kyori.adventure.text.event.HoverEvent.showText( - Component.text("Clique para copiar as coordenadas", - NamedTextColor.DARK_GRAY))); + Lang.tr("canalhandia.cmd.mortes.copiar").color(NamedTextColor.DARK_GRAY))); } sender.sendMessage(Component.text(" " + death.flavor(), NamedTextColor.YELLOW) .append(Component.text(" — ", NamedTextColor.DARK_GRAY)) @@ -1257,12 +1260,12 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { */ private boolean conquistas(CommandSender sender, String[] args) { if (!plugin.settings().moduleEnabled(Module.CONQUISTAS)) { - Msg.error(sender, "O módulo de conquistas está desligado."); + Msg.error(sender, Lang.tr("canalhandia.cmd.modulo.desligado", Component.text("conquistas"))); return true; } if (args.length == 0) { if (!(sender instanceof Player player)) { - Msg.error(sender, "Só jogadores têm conquistas. Use /conquistas ."); + Msg.error(sender, Lang.tr("canalhandia.cmd.sojogador.conquistas")); return true; } renderCatalogue(sender, plugin.achievements().earnedBy(player), @@ -1272,12 +1275,12 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { String wanted = String.join(" ", args); OfflineStats.Known who = plugin.offlineStats().resolve(wanted); if (who == null) { - Msg.error(sender, "Não conheço ninguém chamado \"" + wanted + "\"."); + Msg.error(sender, Lang.tr("canalhandia.cmd.jogador.desconhecido", Component.text(wanted))); return true; } Map stats = plugin.offlineStats().achievementStats(UUID.fromString(who.uuid())); if (stats == null) { - Msg.error(sender, "Ainda não tenho estatísticas de " + who.name() + "."); + Msg.error(sender, Lang.tr("canalhandia.cmd.conquistas.sem-stats", Component.text(who.name()))); return true; } boolean bedrock = sender instanceof Player viewer && Platform.isBedrock(viewer); @@ -1288,8 +1291,9 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { /** The catalogue with earned entries ticked — shared by self and lookup. */ private void renderCatalogue(CommandSender sender, java.util.Collection earned, boolean bedrock, String who) { - Msg.header(sender, "Conquistas de " + who + " (" - + earned.size() + "/" + Achievement.values().length + ")"); + Msg.header(sender, Lang.tr("canalhandia.cmd.conquistas.cabecalho", + Component.text(who), Component.text(earned.size()), + Component.text(Achievement.values().length))); // Bedrock renders "✔" as a tofu box, so it gets an ASCII marker — the // same rule the reaction labels follow. String tick = bedrock ? " [x] " : " ✔ "; @@ -1315,7 +1319,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { String name; if (args.length == 0) { if (!(sender instanceof Player player)) { - Msg.error(sender, "Diga de quem: /perfil ."); + Msg.error(sender, Lang.tr("canalhandia.cmd.perfil.diga")); return true; } uuid = player.getUniqueId().toString(); @@ -1324,18 +1328,20 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { String wanted = String.join(" ", args); OfflineStats.Known who = plugin.offlineStats().resolve(wanted); if (who == null) { - Msg.error(sender, "Não conheço ninguém chamado \"" + wanted + "\"."); + Msg.error(sender, Lang.tr("canalhandia.cmd.jogador.desconhecido", + Component.text(wanted))); return true; } uuid = who.uuid(); name = who.name(); } UUID id = UUID.fromString(uuid); - Msg.header(sender, "Perfil de " + name); + Msg.header(sender, Lang.tr("canalhandia.cmd.perfil.cabecalho", Component.text(name))); String summary = plugin.offlineStats().summary(id); if (summary == null) { - Msg.line(sender, "Estatísticas", "sem dados ainda"); + Msg.line(sender, Lang.tr("canalhandia.cmd.perfil.rotulo.estatisticas"), + Lang.tr("canalhandia.cmd.perfil.sem-dados")); } else { // summary() prefixes the name; the header already has it, so drop it. int colon = summary.indexOf(": "); @@ -1345,11 +1351,14 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { Map stats = plugin.offlineStats().achievementStats(id); List earned = stats == null ? List.of() : Achievement.earned(stats); - Msg.line(sender, "Conquistas", earned.size() + "/" + Achievement.values().length - + (earned.isEmpty() ? "" : " (" + titlesList(earned) + ")")); + Msg.line(sender, Lang.tr("canalhandia.cmd.perfil.rotulo.conquistas"), + Component.text(earned.size() + "/" + Achievement.values().length + + (earned.isEmpty() ? "" : " (" + titlesList(earned) + ")"))); Achievement worn = plugin.titles().chosenAchievement(id); - Msg.line(sender, "Título", worn == null ? "nenhum" : worn.title()); + Msg.line(sender, Lang.tr("canalhandia.cmd.perfil.rotulo.titulo"), + worn == null ? Lang.tr("canalhandia.cmd.perfil.titulo.nenhum") + : Component.text(worn.title())); return true; } @@ -1360,39 +1369,41 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { */ private boolean titulo(CommandSender sender, String[] args) { if (!plugin.settings().moduleEnabled(Module.CONQUISTAS)) { - Msg.error(sender, "O módulo de conquistas está desligado."); + Msg.error(sender, Lang.tr("canalhandia.cmd.modulo.desligado", Component.text("conquistas"))); return true; } if (!(sender instanceof Player player)) { - Msg.error(sender, "Só jogadores usam títulos."); + Msg.error(sender, Lang.tr("canalhandia.cmd.sojogador.titulo")); return true; } List earned = plugin.achievements().earnedBy(player); if (args.length == 0) { Achievement worn = plugin.titles().chosenAchievement(player.getUniqueId()); - Msg.line(sender, "Título atual", worn == null ? "nenhum" : worn.title()); + Msg.line(sender, Lang.tr("canalhandia.cmd.titulo.atual"), + worn == null ? Lang.tr("canalhandia.cmd.perfil.titulo.nenhum") + : Component.text(worn.title())); if (earned.isEmpty()) { - Msg.error(sender, "Você ainda não desbloqueou nenhum título. Veja /conquistas."); + Msg.error(sender, Lang.tr("canalhandia.cmd.titulo.nenhum-bloqueado")); } else { - Msg.line(sender, "Disponíveis", titlesList(earned)); - sender.sendMessage(Component.text(" Use /titulo para usar, " - + "ou /titulo limpar para tirar.", NamedTextColor.DARK_GRAY)); + Msg.line(sender, Lang.tr("canalhandia.cmd.titulo.disponiveis"), + Component.text(titlesList(earned))); + sender.sendMessage(Lang.tr("canalhandia.cmd.titulo.uso").color(NamedTextColor.DARK_GRAY)); } return true; } String arg = String.join(" ", args); if (arg.equalsIgnoreCase("limpar") || arg.equalsIgnoreCase("nenhum")) { plugin.titles().clear(player.getUniqueId()); - Msg.ok(player, "Título removido."); + Msg.ok(player, Lang.tr("canalhandia.cmd.titulo.removido")); return true; } Achievement chosen = matchEarned(arg, earned); if (chosen == null) { - Msg.error(sender, "Você não tem o título \"" + arg + "\". Veja /titulo para a lista."); + Msg.error(sender, Lang.tr("canalhandia.cmd.titulo.nao-tem", Component.text(arg))); return true; } plugin.titles().set(player.getUniqueId(), chosen); - Msg.ok(player, "Título definido: " + chosen.title() + "."); + Msg.ok(player, Lang.tr("canalhandia.cmd.titulo.definido", Component.text(chosen.title()))); return true; } @@ -1424,12 +1435,11 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { return; } if (scope == Note.Scope.PUBLICA && !sender.hasPermission("canalhandia.nota.publica")) { - Msg.error(sender, "Você não pode criar anotações públicas. Use /nota add " - + "para uma anotação só sua."); + Msg.error(sender, Lang.tr("canalhandia.cmd.nota.publica-negado")); return; } if (args.length == 0) { - Msg.error(sender, "Uso: /nota " + scope.key() + " "); + Msg.error(sender, Lang.tr("canalhandia.cmd.nota.uso-escopo", Component.text(scope.key()))); return; } store(player, scope, String.join(" ", args)); @@ -1439,7 +1449,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { private void store(Player player, Note.Scope scope, String rawText) { String text = Note.cleanText(rawText); if (text == null) { - Msg.error(player, "A anotação está vazia."); + Msg.error(player, Lang.tr("canalhandia.cmd.nota.vazia")); return; } Location at = player.getLocation(); @@ -1447,12 +1457,13 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { text, ServerState.worldLabel(player.getWorld()), at.getBlockX(), at.getBlockY(), at.getBlockZ()); if (note == null) { - Msg.error(player, "Você já tem " + Notes.MAX_PER_PLAYER - + " anotações. Apague alguma com /nota remover ."); + Msg.error(player, Lang.tr("canalhandia.cmd.nota.cheia", + Component.text(Notes.MAX_PER_PLAYER))); return; } - Msg.ok(player, "Anotação #" + note.id() + " salva (" + scope.label() + ") em " - + note.place() + "."); + Msg.ok(player, Lang.tr("canalhandia.cmd.nota.salva", + Component.text(note.id()), Component.text(scope.label()), + Component.text(note.place()))); if (scope == Note.Scope.PUBLICA) { // A new public note changes what the web map should show. plugin.blueMap().sync(); @@ -1469,21 +1480,23 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { private void notaList(CommandSender sender, String[] args) { Note.Scope scope = args.length > 0 ? Note.Scope.byKey(args[0]) : null; if (args.length > 0 && scope == null) { - Msg.error(sender, "Uso: /nota listar [publicas|privadas]"); + Msg.error(sender, Lang.tr("canalhandia.cmd.nota.listar-uso")); return; } - show(sender, plugin.notes().visibleTo(viewerId(sender), scope, null), - scope == null ? "Suas anotações e as públicas" : "Anotações " + scope.key() + "s"); + Component title = scope == null + ? Lang.tr("canalhandia.cmd.nota.lista.tudo") + : Lang.tr("canalhandia.cmd.nota.lista.escopo", Component.text(scope.key() + "s")); + show(sender, plugin.notes().visibleTo(viewerId(sender), scope, null), title); } private void notaSearch(CommandSender sender, String[] args) { if (args.length == 0) { - Msg.error(sender, "Uso: /nota buscar "); + Msg.error(sender, Lang.tr("canalhandia.cmd.nota.buscar-uso")); return; } String query = String.join(" ", args); show(sender, plugin.notes().visibleTo(viewerId(sender), null, query), - "Anotações com \"" + query + "\""); + Lang.tr("canalhandia.cmd.nota.lista.busca", Component.text(query))); } private void notaShow(CommandSender sender, String[] args) { @@ -1492,43 +1505,44 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { // forbidden: saying "that one is private" would confirm it exists, which // is itself a leak about someone else's note. if (note == null || !note.visibleTo(viewerId(sender))) { - Msg.error(sender, "Anotação não encontrada."); + Msg.error(sender, Lang.tr("canalhandia.cmd.nota.nao-encontrada")); return; } - Msg.header(sender, "Anotação #" + note.id()); + Msg.header(sender, Lang.tr("canalhandia.cmd.nota.cabecalho", Component.text(note.id()))); sender.sendMessage(noteBody(note, isBedrock(sender))); - Msg.line(sender, "autor", note.author()); - Msg.line(sender, "escopo", note.scope().key() + " (" + note.scope().label() + ")"); - Msg.line(sender, "lugar", note.place()); + Msg.line(sender, Lang.tr("canalhandia.cmd.nota.autor"), Component.text(note.author())); + Msg.line(sender, Lang.tr("canalhandia.cmd.nota.escopo"), + Component.text(note.scope().key() + " (" + note.scope().label() + ")")); + Msg.line(sender, Lang.tr("canalhandia.cmd.nota.lugar"), Component.text(note.place())); } private void notaRemove(CommandSender sender, String[] args) { if (args.length == 0) { - Msg.error(sender, "Uso: /nota remover "); + Msg.error(sender, Lang.tr("canalhandia.cmd.nota.remover-uso")); return; } Note note = plugin.notes().byId(parseLong(args[0])); if (note == null || !note.visibleTo(viewerId(sender))) { - Msg.error(sender, "Anotação não encontrada."); + Msg.error(sender, Lang.tr("canalhandia.cmd.nota.nao-encontrada")); return; } if (!note.deletableBy(viewerId(sender), sender.hasPermission(ADMIN))) { - Msg.error(sender, "Essa anotação é de " + note.author() + "."); + Msg.error(sender, Lang.tr("canalhandia.cmd.nota.de-outro", Component.text(note.author()))); return; } plugin.notes().remove(note.id()); if (note.scope() == Note.Scope.PUBLICA) { plugin.blueMap().sync(); } - Msg.ok(sender, "Anotação #" + note.id() + " apagada."); + Msg.ok(sender, Lang.tr("canalhandia.cmd.nota.apagada", Component.text(note.id()))); } - private void show(CommandSender sender, List notes, String title) { + private void show(CommandSender sender, List notes, Component title) { if (notes.isEmpty()) { - Msg.error(sender, "Nenhuma anotação."); + Msg.error(sender, Lang.tr("canalhandia.cmd.nota.nenhuma")); return; } - Msg.header(sender, title + " (" + notes.size() + ")"); + Msg.header(sender, title.append(Component.text(" (" + notes.size() + ")"))); boolean bedrock = isBedrock(sender); // Capped so a long list cannot push everything else out of the chat // window; the rest are reachable with /nota buscar. @@ -1537,8 +1551,8 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { sender.sendMessage(noteBody(notes.get(i), bedrock)); } if (notes.size() > shown) { - Msg.line(sender, "…", "e mais " + (notes.size() - shown) - + ". Use /nota buscar para filtrar."); + Msg.line(sender, Component.text("…"), + Lang.tr("canalhandia.cmd.nota.e-mais", Component.text(notes.size() - shown))); } } @@ -1556,8 +1570,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { if (!bedrock) { place = place.clickEvent(ClickEvent.copyToClipboard(note.coords())) .hoverEvent(net.kyori.adventure.text.event.HoverEvent.showText( - Component.text("Clique para copiar as coordenadas", - NamedTextColor.DARK_GRAY))); + Lang.tr("canalhandia.cmd.mortes.copiar").color(NamedTextColor.DARK_GRAY))); } return Component.text(" #" + note.id() + " ", colour) .append(Component.text(note.text(), NamedTextColor.WHITE)) @@ -1643,7 +1656,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { } private boolean denied(CommandSender sender) { - Msg.error(sender, "Você não tem permissão para isso."); + Msg.error(sender, Lang.tr("canalhandia.cmd.negado")); return true; } diff --git a/src/main/java/dev/marcospaulo/canalhandia/Msg.java b/src/main/java/dev/marcospaulo/canalhandia/Msg.java index e0ac793..5a6fa4b 100644 --- a/src/main/java/dev/marcospaulo/canalhandia/Msg.java +++ b/src/main/java/dev/marcospaulo/canalhandia/Msg.java @@ -31,20 +31,43 @@ final class Msg { .append(Component.text(text, NamedTextColor.GREEN).decoration(TextDecoration.BOLD, false))); } + static void ok(CommandSender sender, Component text) { + sender.sendMessage(tag("Canalhandia", NamedTextColor.GOLD) + .append(text.color(NamedTextColor.GREEN).decoration(TextDecoration.BOLD, false))); + } + static void error(CommandSender sender, String text) { sender.sendMessage(tag("Canalhandia", NamedTextColor.GOLD) .append(Component.text(text, NamedTextColor.RED).decoration(TextDecoration.BOLD, false))); } + static void error(CommandSender sender, Component text) { + sender.sendMessage(tag("Canalhandia", NamedTextColor.GOLD) + .append(text.color(NamedTextColor.RED).decoration(TextDecoration.BOLD, false))); + } + static void header(CommandSender sender, String text) { sender.sendMessage(Component.text("— " + text + " —", NamedTextColor.GOLD, TextDecoration.BOLD)); } + static void header(CommandSender sender, Component text) { + sender.sendMessage(Component.text("— ", NamedTextColor.GOLD, TextDecoration.BOLD) + .append(text) + .append(Component.text(" —", NamedTextColor.GOLD, TextDecoration.BOLD))); + } + static void line(CommandSender sender, String key, String value) { sender.sendMessage(Component.text(" " + key + ": ", NamedTextColor.GRAY) .append(Component.text(value, NamedTextColor.AQUA))); } + static void line(CommandSender sender, Component key, Component value) { + sender.sendMessage(Component.text(" ", NamedTextColor.GRAY) + .append(key.color(NamedTextColor.GRAY)) + .append(Component.text(": ", NamedTextColor.GRAY)) + .append(value.color(NamedTextColor.AQUA))); + } + /** Renders a duration in ticks as "3 dias e 4 horas" / "1 hora" / "12 minutos". */ static String duration(long ticks) { long minutes = ticks / 20L / 60L; diff --git a/src/main/resources/lang/messages_en.properties b/src/main/resources/lang/messages_en.properties index 03ed83b..7280644 100644 --- a/src/main/resources/lang/messages_en.properties +++ b/src/main/resources/lang/messages_en.properties @@ -4,4 +4,115 @@ # Mourning (Canalhandia.onDeath) — F button under each death message. canalhandia.morte.luto.prestar=pay respects for {0} canalhandia.morte.luto.digitar=type /f to pay respects for {0} -canalhandia.morte.luto.resumo={0} paid respects for {1}. \ No newline at end of file +canalhandia.morte.luto.resumo={0} paid respects for {1}. + +# Commands — messages any player sees (not just the operator). +canalhandia.cmd.negado=You don't have permission for that. +canalhandia.cmd.sojogador.reagir=Only players can react. +canalhandia.cmd.sojogador.usar=Only players can use this. +canalhandia.cmd.sojogador.ia=Only players can use /ia. +canalhandia.cmd.sojogador.nota=Only players can take notes (a note stores where you are). +canalhandia.cmd.sojogador.recado=Only players can leave a message. +canalhandia.cmd.sojogador.recados=Only players have messages. +canalhandia.cmd.sojogador.mortes=Only players have a death history. +canalhandia.cmd.sojogador.conquistas=Only players have achievements. Use /conquistas . +canalhandia.cmd.sojogador.titulo=Only players use titles. + +canalhandia.cmd.modulo.desligado=The {0} module is off. +canalhandia.cmd.modulo.desativado=The {0} module is disabled. + +canalhandia.cmd.jogador.informe=Specify a player. +canalhandia.cmd.jogador.offline=Player ''{0}'' is not online. +canalhandia.cmd.jogador.desconhecido=I don't know anyone called "{0}". + +# /ranking +canalhandia.cmd.ranking.desconhecido=Unknown ranking. Use /ranking to see the list. +canalhandia.cmd.ranking.sem-dados=(no data yet) + +# /conquistas +canalhandia.cmd.conquistas.sem-stats=I don't have stats for {0} yet. +canalhandia.cmd.conquistas.cabecalho=Achievements of {0} ({1}/{2}) + +# /perfil +canalhandia.cmd.perfil.diga=Say who: /perfil . +canalhandia.cmd.perfil.cabecalho=Profile of {0} +canalhandia.cmd.perfil.rotulo.estatisticas=Stats +canalhandia.cmd.perfil.sem-dados=no data yet +canalhandia.cmd.perfil.rotulo.conquistas=Achievements +canalhandia.cmd.perfil.rotulo.titulo=Title +canalhandia.cmd.perfil.titulo.nenhum=none + +# /titulo +canalhandia.cmd.titulo.atual=Current title +canalhandia.cmd.titulo.disponiveis=Available +canalhandia.cmd.titulo.uso=Use /titulo to wear one, or /titulo limpar to clear it. +canalhandia.cmd.titulo.nenhum-bloqueado=You haven't unlocked a title yet. See /conquistas. +canalhandia.cmd.titulo.nao-tem=You don't have the title "{0}". See /titulo for the list. +canalhandia.cmd.titulo.removido=Title removed. +canalhandia.cmd.titulo.definido=Title set: {0}. + +# /mortes +canalhandia.cmd.mortes.cabecalho=Your last deaths ({0}) +canalhandia.cmd.mortes.nenhuma=You haven't died yet. Enjoy it while it lasts. +canalhandia.cmd.mortes.copiar=Click to copy the coordinates + +# /recado and /recados +canalhandia.cmd.recado.uso=Usage: /recado +canalhandia.cmd.recado.vazio=The message is empty. +canalhandia.cmd.recado.mesmo=A message to yourself? Use /save. +canalhandia.cmd.recado.caixa-cheia={0}'s mailbox is full ({1} messages). Wait for them to join. +canalhandia.cmd.recado.guardado=Message saved for {0}. It'll arrive when {0} joins. +canalhandia.cmd.recado.online={0} is online — message delivered now. +canalhandia.cmd.recados.tudo-entregue=All your messages have been delivered. +canalhandia.cmd.recados.pendentes-singular={0} of your messages hasn't been read yet. +canalhandia.cmd.recados.pendentes-plural={0} of your messages haven't been read yet. +canalhandia.cmd.recado.desconhecido=I don't know anyone called "{0}". (You can only leave a message for someone who has joined the server.) +canalhandia.cmd.reagir.uso=Usage: /reagir <{0}> +canalhandia.cmd.reagir.nada=Nothing to react to right now. +canalhandia.cmd.reagir.invalida=That reaction doesn't apply to the last message. +canalhandia.cmd.reagir.expirou=That message has expired. +canalhandia.cmd.reagir.desconhecida=Unknown reaction. +canalhandia.cmd.reacoes.nenhuma=Nobody has reacted to the last message yet. +canalhandia.cmd.reacoes.cabecalho=Who reacted ({0}) + +# guess / poll (action bars) +canalhandia.cmd.palpite.uso=Usage: /palpite +canalhandia.cmd.palpite.nenhuma=No guess round open. +canalhandia.cmd.adivinha.rodada-acabou=That round is already over. +canalhandia.cmd.votar.uso=Usage: /votar +canalhandia.cmd.votar.encerrada=That poll has already closed. +canalhandia.cmd.votar.opcao-inexistente=That option doesn't exist. +canalhandia.cmd.enquete.nenhuma=No poll open. + +# /ia (messages the player sees; tone tuning is operator-only) +canalhandia.cmd.ia.uso=Usage: /{0} + +# /nota and /save +canalhandia.cmd.nota.publica-negado=You can't create public notes. Use /nota add for a private one. +canalhandia.cmd.nota.uso-escopo=Usage: /nota {0} +canalhandia.cmd.nota.vazia=The note is empty. +canalhandia.cmd.nota.cheia=You already have {0} notes. Delete one with /nota remover . +canalhandia.cmd.nota.salva=Note #{0} saved ({1}) at {2}. +canalhandia.cmd.nota.listar-uso=Usage: /nota listar [publicas|privadas] +canalhandia.cmd.nota.buscar-uso=Usage: /nota buscar +canalhandia.cmd.nota.cabecalho=Note #{0} +canalhandia.cmd.nota.autor=author +canalhandia.cmd.nota.escopo=scope +canalhandia.cmd.nota.lugar=place +canalhandia.cmd.nota.remover-uso=Usage: /nota remover +canalhandia.cmd.nota.de-outro=That note belongs to {0}. +canalhandia.cmd.nota.apagada=Note #{0} deleted. +canalhandia.cmd.nota.nenhuma=No notes. +canalhandia.cmd.nota.e-mais=… and {0} more. Use /nota buscar to filter. +canalhandia.cmd.nota.lista.tudo=Your notes and the public ones +canalhandia.cmd.nota.lista.escopo={0} notes +canalhandia.cmd.nota.lista.busca=Notes containing "{0}" +canalhandia.cmd.nota.nao-encontrada=Note not found. + +# /curiosidade (seen by players) +canalhandia.cmd.curiosidade.nenhum-elegivel=Nobody eligible is online (or without enough stats). +canalhandia.cmd.curiosidade.sem-stats={0} doesn't have enough stats yet. +canalhandia.cmd.curiosidade.sem-curiosidade=No curiosity available for {0}. +canalhandia.cmd.curiosidade.toggle-off=You won't appear in curiosities anymore. +canalhandia.cmd.curiosidade.toggle-on=You're back in the curiosities. +canalhandia.cmd.curiosidade.subdesconhecido=Unknown subcommand or player. Use /curiosidade ajuda \ No newline at end of file diff --git a/src/main/resources/lang/messages_pt.properties b/src/main/resources/lang/messages_pt.properties index 48aad2e..890f820 100644 --- a/src/main/resources/lang/messages_pt.properties +++ b/src/main/resources/lang/messages_pt.properties @@ -1,7 +1,120 @@ -# Canalhandia — portugues (fonte de verdade). Padroes MessageFormat: {0}, {1}, ... +# Canalhandia — português (fonte de verdade). Padrões MessageFormat: {0}, {1}, ... # NUNCA altere os placeholders {0}/{1} nem as tags MiniMessage <...>. -# Luto (Canalhandia.onDeath) — botao F sob cada mensagem de morte. +# Luto (Canalhandia.onDeath) — botão F sob cada mensagem de morte. canalhandia.morte.luto.prestar=prestar luto por {0} canalhandia.morte.luto.digitar=digite /f para prestar luto por {0} -canalhandia.morte.luto.resumo={0} prestaram luto por {1}. \ No newline at end of file +canalhandia.morte.luto.resumo={0} prestaram luto por {1}. + +# Comandos — mensagens que qualquer jogador vê (não só o operador). +canalhandia.cmd.negado=Você não tem permissão para isso. +canalhandia.cmd.sojogador.reagir=Só jogadores podem reagir. +canalhandia.cmd.sojogador.usar=Só jogadores podem usar isso. +canalhandia.cmd.sojogador.ia=Só jogadores podem usar /ia. +canalhandia.cmd.sojogador.nota=Só jogadores podem anotar (a anotação guarda onde você está). +canalhandia.cmd.sojogador.recado=Só jogadores podem mandar recado. +canalhandia.cmd.sojogador.recados=Só jogadores têm recados. +canalhandia.cmd.sojogador.mortes=Só jogadores têm histórico de mortes. +canalhandia.cmd.sojogador.conquistas=Só jogadores têm conquistas. Use /conquistas . +canalhandia.cmd.sojogador.titulo=Só jogadores usam títulos. + +canalhandia.cmd.modulo.desligado=O módulo de {0} está desligado. +canalhandia.cmd.modulo.desativado=O módulo {0} está desativado. + +canalhandia.cmd.jogador.informe=Informe um jogador. +canalhandia.cmd.jogador.offline=Jogador ''{0}'' não está online. +canalhandia.cmd.jogador.desconhecido=Não conheço ninguém chamado "{0}". + +# /ranking +canalhandia.cmd.ranking.desconhecido=Ranking desconhecido. Use /ranking para ver a lista. +canalhandia.cmd.ranking.sem-dados=(sem dados ainda) + +# /conquistas +canalhandia.cmd.conquistas.sem-stats=Ainda não tenho estatísticas de {0}. +canalhandia.cmd.conquistas.cabecalho=Conquistas de {0} ({1}/{2}) + +# /perfil +canalhandia.cmd.perfil.diga=Diga de quem: /perfil . +canalhandia.cmd.perfil.cabecalho=Perfil de {0} +canalhandia.cmd.perfil.rotulo.estatisticas=Estatísticas +canalhandia.cmd.perfil.sem-dados=sem dados ainda +canalhandia.cmd.perfil.rotulo.conquistas=Conquistas +canalhandia.cmd.perfil.rotulo.titulo=Título +canalhandia.cmd.perfil.titulo.nenhum=nenhum + +# /titulo +canalhandia.cmd.titulo.atual=Título atual +canalhandia.cmd.titulo.disponiveis=Disponíveis +canalhandia.cmd.titulo.uso=Use /titulo para usar, ou /titulo limpar para tirar. +canalhandia.cmd.titulo.nenhum-bloqueado=Você ainda não desbloqueou nenhum título. Veja /conquistas. +canalhandia.cmd.titulo.nao-tem=Você não tem o título "{0}". Veja /titulo para a lista. +canalhandia.cmd.titulo.removido=Título removido. +canalhandia.cmd.titulo.definido=Título definido: {0}. + +# /mortes +canalhandia.cmd.mortes.cabecalho=Suas últimas mortes ({0}) +canalhandia.cmd.mortes.nenhuma=Você ainda não morreu. Aproveite enquanto dura. +canalhandia.cmd.mortes.copiar=Clique para copiar as coordenadas + +# /recado e /recados +canalhandia.cmd.recado.uso=Uso: /recado +canalhandia.cmd.recado.vazio=O recado está vazio. +canalhandia.cmd.recado.mesmo=Recado para você mesmo? Use /save. +canalhandia.cmd.recado.caixa-cheia=A caixa de {0} está cheia ({1} recados). Espere ela entrar. +canalhandia.cmd.recado.guardado=Recado guardado para {0}. Vai chegar quando {0} entrar. +canalhandia.cmd.recado.online={0} está online — recado entregue na hora. +canalhandia.cmd.recados.tudo-entregue=Todos os seus recados já foram entregues. +canalhandia.cmd.recados.pendentes-singular={0} recado seu ainda não foi lido. +canalhandia.cmd.recados.pendentes-plural={0} recados seus ainda não foram lidos. +canalhandia.cmd.recado.desconhecido=Não conheço ninguém chamado "{0}". (Só dá para mandar recado para quem já entrou no servidor.) + +# /reagir e /reacoes +canalhandia.cmd.reagir.uso=Uso: /reagir <{0}> +canalhandia.cmd.reagir.nada=Nada para reagir agora. +canalhandia.cmd.reagir.invalida=Essa reação não vale para a última mensagem. +canalhandia.cmd.reagir.expirou=Essa mensagem já expirou. +canalhandia.cmd.reagir.desconhecida=Reação desconhecida. +canalhandia.cmd.reacoes.nenhuma=Ninguém reagiu à última mensagem ainda. +canalhandia.cmd.reacoes.cabecalho=Quem reagiu ({0}) + +# adivinha / enquete (action bars) +canalhandia.cmd.palpite.uso=Uso: /palpite +canalhandia.cmd.palpite.nenhuma=Nenhuma adivinha aberta. +canalhandia.cmd.adivinha.rodada-acabou=Essa rodada já acabou. +canalhandia.cmd.votar.uso=Uso: /votar +canalhandia.cmd.votar.encerrada=Essa enquete já foi encerrada. +canalhandia.cmd.votar.opcao-inexistente=Essa opção não existe. +canalhandia.cmd.enquete.nenhuma=Nenhuma enquete aberta. + +# /ia (mensagens que o jogador vê; o ajuste de tom é só do operador) +canalhandia.cmd.ia.uso=Uso: /{0} + +# /nota e /save +canalhandia.cmd.nota.publica-negado=Você não pode criar anotações públicas. Use /nota add para uma anotação só sua. +canalhandia.cmd.nota.uso-escopo=Uso: /nota {0} +canalhandia.cmd.nota.vazia=A anotação está vazia. +canalhandia.cmd.nota.cheia=Você já tem {0} anotações. Apague alguma com /nota remover . +canalhandia.cmd.nota.salva=Anotação #{0} salva ({1}) em {2}. +canalhandia.cmd.nota.listar-uso=Uso: /nota listar [publicas|privadas] +canalhandia.cmd.nota.buscar-uso=Uso: /nota buscar +canalhandia.cmd.nota.cabecalho=Anotação #{0} +canalhandia.cmd.nota.autor=autor +canalhandia.cmd.nota.escopo=escopo +canalhandia.cmd.nota.lugar=lugar +canalhandia.cmd.nota.remover-uso=Uso: /nota remover +canalhandia.cmd.nota.de-outro=Essa anotação é de {0}. +canalhandia.cmd.nota.apagada=Anotação #{0} apagada. +canalhandia.cmd.nota.nenhuma=Nenhuma anotação. +canalhandia.cmd.nota.e-mais=… e mais {0}. Use /nota buscar para filtrar. +canalhandia.cmd.nota.lista.tudo=Suas anotações e as públicas +canalhandia.cmd.nota.lista.escopo=Anotações {0} +canalhandia.cmd.nota.lista.busca=Anotações com "{0}" +canalhandia.cmd.nota.nao-encontrada=Anotação não encontrada. + +# /curiosidade (vistas por jogador) +canalhandia.cmd.curiosidade.nenhum-elegivel=Ninguém elegível online (ou sem estatísticas suficientes). +canalhandia.cmd.curiosidade.sem-stats={0} ainda não tem estatísticas suficientes. +canalhandia.cmd.curiosidade.sem-curiosidade=Nenhuma curiosidade disponível para {0}. +canalhandia.cmd.curiosidade.toggle-off=Você não aparecerá mais nas curiosidades. +canalhandia.cmd.curiosidade.toggle-on=Você voltou a aparecer nas curiosidades. +canalhandia.cmd.curiosidade.subdesconhecido=Subcomando ou jogador desconhecido. Use /curiosidade ajuda \ No newline at end of file