1
mirror of https://github.com/Shiewk/SModeration.git synced 2026-04-28 05:54:16 +02:00

Fix hardcoded page switching strings; add German translations

This commit is contained in:
Shy
2026-04-03 16:52:11 +02:00
parent fc8c1c9f26
commit fecd21bf19
5 changed files with 127 additions and 8 deletions
@@ -55,7 +55,8 @@ public final class SModerationPaper extends JavaPlugin {
createMiniMessage(),
"smoderation/translations/",
new Locale[] {
Locale.forLanguageTag("en-US")
Locale.forLanguageTag("en-US"),
Locale.forLanguageTag("de-DE")
}
);
@@ -1,12 +1,17 @@
package de.shiewk.smoderation.paper.inventory;
import net.kyori.adventure.text.Component;
import io.papermc.paper.datacomponent.DataComponentTypes;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;
import static net.kyori.adventure.text.Component.text;
import static net.kyori.adventure.text.Component.translatable;
@SuppressWarnings("UnstableApiUsage") // Paper Data Component API
public abstract class PageableCustomInventory implements CustomInventory {
protected final int prevSlot, nextSlot;
@@ -49,21 +54,21 @@ public abstract class PageableCustomInventory implements CustomInventory {
}
}
public ItemStack createPreviousPageStack(){
public ItemStack createPreviousPageStack(Player viewer){
boolean allowed = page > 0;
TextColor color = allowed ? NamedTextColor.GREEN : NamedTextColor.RED;
int skip = allowed ? page : page+1;
ItemStack stack = new ItemStack(allowed ? Material.GREEN_STAINED_GLASS_PANE : Material.RED_STAINED_GLASS_PANE);
stack.editMeta(meta -> meta.displayName(applyFormatting(Component.text("Previous page (%s/%s)".formatted(skip, lastPage()+1)).color(color))));
stack.setData(DataComponentTypes.ITEM_NAME, CustomInventory.renderComponent(viewer, applyFormatting(translatable("smod.inventory.previous", text(skip), text(lastPage()+1)).color(color))));
return stack;
}
public ItemStack createNextPageStack(){
public ItemStack createNextPageStack(Player viewer){
boolean allowed = page < lastPage();
TextColor color = allowed ? NamedTextColor.GREEN : NamedTextColor.RED;
int skip = allowed ? page+2 : page+1;
ItemStack stack = new ItemStack(allowed ? Material.GREEN_STAINED_GLASS_PANE : Material.RED_STAINED_GLASS_PANE);
stack.editMeta(meta -> meta.displayName(applyFormatting(Component.text("Next page (%s/%s)".formatted(skip, lastPage()+1)).color(color))));
stack.setData(DataComponentTypes.ITEM_NAME, CustomInventory.renderComponent(viewer, applyFormatting(translatable("smod.inventory.next", text(skip), text(lastPage()+1)).color(color))));
return stack;
}
}
@@ -356,8 +356,8 @@ public class SModMenu extends PageableCustomInventory {
for (int i = 45; i < 54; i++) {
inventory.setItem(i, createEmptyStack());
}
inventory.setItem(prevSlot, createPreviousPageStack());
inventory.setItem(nextSlot, createNextPageStack());
inventory.setItem(prevSlot, createPreviousPageStack(player));
inventory.setItem(nextSlot, createNextPageStack(player));
inventory.setItem(47, createSearchItem());
inventory.setItem(48, createTypeItem());
inventory.setItem(50, createFilterItem());
@@ -0,0 +1,111 @@
{
"smod.argument.duration.fail.invalid": "Ungültige Zeit '<arg:0>'",
"smod.argument.duration.fail.pattern": "Bitte gib eine gültige Zeit an, z.B. '1d6h30min'",
"smod.argument.offlinePlayer.fail.notCached": "Dieser Spieler ist nicht gespeichert.",
"smod.argument.uuid.fail.notCached": "Dieser Spieler ist nicht gespeichert. Versuche, stattdessen seine UUID anzugeben.",
"smod.chatInput.remainingTime": "<gray><arg:0> Sekunden",
"smod.command.ban.fail.forceReason": "Bitte gib einen Grund an.",
"smod.command.ban.fail.protect": "Dieser Spieler kann nicht gebannt werden.",
"smod.command.ban.fail.self": "Du kannst dich nicht selbst bannen.",
"smod.command.ban.fail.tooShort": "Du kannst Spieler, die nicht online sind, nicht so kurz bannen.",
"smod.command.ecsee.opening": "<primary>Enderkiste von <secondary><arg:0></secondary> wird geöffnet.",
"smod.command.fail.invalidPlayer": "Bitte gib einen gültigen Spieler an.",
"smod.command.fail.players": "Nur Spieler können diesen Befehl ausführen.",
"smod.command.fail.playersConsole": "Nur Spieler und die Konsole können diesen Befehl ausführen.",
"smod.command.invsee.fail.self": "Du kannst dein eigenes Inventar nicht öffnen.",
"smod.command.invsee.opening": "<primary>Inventar von <secondary><arg:0></secondary> wird geöffnet.",
"smod.command.kick.fail.forceReason": "Bitte gib einen Grund an.",
"smod.command.kick.fail.protect": "Dieser Spieler kann nicht gekickt werden.",
"smod.command.kick.fail.self": "Du kannst dich nicht selbst kicken.",
"smod.command.modlogs.ban": "<primary>- ist bis <secondary><arg:0></secondary> <gray>(in <arg:1>)</gray> gebannt. Grund: <secondary><arg:2>",
"smod.command.modlogs.heading": "<primary>Spieler <secondary><arg:0> <gray>(<arg:1>)",
"smod.command.modlogs.mute": "<primary>- ist bis <secondary><arg:0></secondary> <gray>(in <arg:1>)</gray> stummgeschaltet. Grund: <secondary><arg:2>",
"smod.command.modlogs.none": "<primary>- ist momentan nicht gebannt oder stummgeschaltet.",
"smod.command.mute.fail.forceReason": "Bitte gib einen Grund an.",
"smod.command.mute.fail.protect": "Dieser Spieler kann nicht stummgeschaltet werden.",
"smod.command.mute.fail.self": "Du kannst dich nicht selbst stummschalten.",
"smod.command.mute.fail.tooShort": "Du kannst Spieler nicht so kurz stummschalten.",
"smod.command.offlinetp.fail.unknown": "Die Position des Spielers ist nicht bekannt.",
"smod.command.offlinetp.teleporting": "<primary>Du wirst zu <secondary><arg:0></secondary> teleportiert.",
"smod.command.socialspy.disabled": "<primary>SocialSpy <red>deaktiviert</red>.",
"smod.command.socialspy.enabled": "<primary>SocialSpy <green>aktiviert</green>.",
"smod.command.unban.fail.notBanned": "Dieser Spieler ist nicht gebannt.",
"smod.command.unmute.fail.notMuted": "Dieser Spieler ist nicht stummgeschaltet.",
"smod.command.vanish.broadcast.off": "<primary><secondary><arg:0></secondary> ist wieder erschienen.",
"smod.command.vanish.broadcast.on": "<primary><secondary><arg:0></secondary> ist verschwunden.",
"smod.command.vanish.fail.noPlayersFound": "Kein Spieler wurde gefunden.",
"smod.command.vanish.list": "<primary>Diese Spieler sind momentan versteckt: <arg:0>",
"smod.command.vanish.list.none": "<primary>Keine Spieler sind gerade versteckt.",
"smod.command.vanish.stillEnabled": "<bold><primary>Du bist noch unsichtbar!",
"smod.command.vanish.toggle.off": "<primary>Du bist nicht mehr versteckt.",
"smod.command.vanish.toggle.on": "<primary>Du bist jetzt unsichtbar.",
"smod.confirm.no": "<red>Nein",
"smod.confirm.yes": "<green>Ja",
"smod.menu": "SMod Menü",
"smod.menu.filter": "Filter: <arg:0>",
"smod.menu.filter.active": "Aktive Strafen",
"smod.menu.filter.all": "Alle Strafen",
"smod.menu.filter.expired": "Abgelaufene Strafen",
"smod.menu.filter.switch": "\u00BB Klicke, um den Filter zu ändern",
"smod.menu.info.click": "\u00BB Klicke, um die Strafe aufzuheben",
"smod.menu.info.duration": "<secondary>Dauer: <primary><arg:0>",
"smod.menu.info.expiry.future": "<secondary>Läuft ab: <primary>In <arg:0>",
"smod.menu.info.expiry.past": "<secondary>Ist abgelaufen: <primary><arg:0> ago",
"smod.menu.info.player": "<secondary>Spieler: <primary><arg:0>",
"smod.menu.info.punishedBy": "<secondary>Bestraft von: <primary><arg:0>",
"smod.menu.info.reason": "<secondary>Grund: <primary><arg:0>",
"smod.menu.info.timestamp": "<secondary>Zeitpunkt: <primary><arg:0>",
"smod.menu.info.undone": "<red>Aufgehoben von: <gold><arg:0>",
"smod.menu.search": "Suchen",
"smod.menu.search.current": "Aktueller Suchbegriff: <arg:0>",
"smod.menu.search.new": "\u00BB Klicke, um einen neuen Suchbegriff einzugeben",
"smod.menu.search.none": "Keiner",
"smod.menu.search.query": "Gib deinen Suchbegriff in den Chat ein",
"smod.menu.search.remove": "\u00BB Rechtsklick, um die Suche aufzuheben",
"smod.menu.sort": "Sortieren nach: <arg:0>",
"smod.menu.sort.expiry": "Ablaufzeitpunkt",
"smod.menu.sort.moderatorName": "Moderatorname",
"smod.menu.sort.playerName": "Spielername",
"smod.menu.sort.switch": "\u00BB Klicke, um die Sortierung zu ändern",
"smod.menu.sort.time": "Ausstellungszeitpunkt",
"smod.menu.type": "Typ: <arg:0>",
"smod.menu.type.all": "Alle",
"smod.menu.type.switch": "\u00BB Klicke, um den Typ zu ändern",
"smod.menu.undoConfirmation": "Bist du sicher, dass du die Strafe aufheben willst?",
"smod.punishment.broadcast.ban": "<primary><secondary><arg:0></secondary> wurde von <secondary><arg:1></secondary> für <secondary><arg:2></secondary> gebannt.<newline>Grund: <secondary><arg:3>",
"smod.punishment.broadcast.kick": "<primary><secondary><arg:0></secondary> wurde von <secondary><arg:1></secondary> gekickt.<newline>Grund: <secondary><arg:3>",
"smod.punishment.broadcast.mute": "<primary><secondary><arg:0></secondary> wurde von <secondary><arg:1></secondary> für <secondary><arg:2></secondary> stummgeschaltet.<newline>Grund: <secondary><arg:3>",
"smod.punishment.name.ban": "Bann",
"smod.punishment.name.kick": "Kick",
"smod.punishment.name.mute": "Stummschaltung",
"smod.punishment.playerMessage.ban": "<primary>Du wurdest von <secondary><arg:0></secondary> vom Server gebannt.<newline>Grund: <secondary><arg:1></secondary><newline>Dein Bann läuft in <secondary><arg:2></secondary> ab.",
"smod.punishment.playerMessage.kick": "<primary>Du wurdest von <secondary><arg:0></secondary> vom Server gekickt.<newline>Grund: <secondary><arg:1>",
"smod.punishment.playerMessage.mute": "<primary>Du wurdest von <secondary><arg:0></secondary> stummgeschaltet.<newline>Grund: <secondary><arg:1></secondary><newline>Du kannst in <secondary><arg:2></secondary> wieder schreiben.",
"smod.punishment.playerMessage.mute.chat": "<primary>Du kannst diesen Befehl nicht ausführen, während du stummgeschaltet bist.",
"smod.punishment.undo.ban": "<primary><secondary><arg:0></secondary> wurde von <secondary><arg:1></secondary> entbannt.",
"smod.punishment.undo.mute": "<primary><secondary><arg:0></secondary>s Stummschaltung wurde von <secondary><arg:1></secondary> aufgehoben.",
"smod.socialspy.command": "<primary>[<secondary>SocialSpy</secondary>] <arg:0>: <secondary><arg:1>",
"smod.time.days": "<arg:0> Tage",
"smod.time.hours": "<arg:0> Stunden",
"smod.time.milliseconds": "<arg:0> Millisekunden",
"smod.time.minutes": "<arg:0> Minuten",
"smod.time.month.0": "Januar",
"smod.time.month.1": "Februar",
"smod.time.month.10": "November",
"smod.time.month.11": "Dezember",
"smod.time.month.2": "März",
"smod.time.month.3": "April",
"smod.time.month.4": "Mai",
"smod.time.month.5": "Juni",
"smod.time.month.6": "Juli",
"smod.time.month.7": "August",
"smod.time.month.8": "September",
"smod.time.month.9": "Oktober",
"smod.time.months": "<arg:0> Monate",
"smod.time.seconds": "<arg:0> Sekunden",
"smod.time.timestamp": "<arg:2>. <arg:1> <arg:0> <arg:3>:<arg:4>:<arg:5> <arg:6>",
"smod.time.weeks": "<arg:0> Wochen",
"smod.time.years": "<arg:0> Jahre",
"smod.inventory.next": "Nächste Seite (<arg:0>/<arg:1>)",
"smod.inventory.previous": "Vorherige Seite (<arg:0>/<arg:1>)"
}
@@ -41,6 +41,8 @@
"smod.command.vanish.toggle.on": "<primary>You are now vanished.",
"smod.confirm.no": "<red>No",
"smod.confirm.yes": "<green>Yes",
"smod.inventory.next": "Next page (<arg:0>/<arg:1>)",
"smod.inventory.previous": "Previous page (<arg:0>/<arg:1>)",
"smod.menu": "SMod Menu",
"smod.menu.filter": "Filter: <arg:0>",
"smod.menu.filter.active": "Active punishments",