Skip to content

Commit de95594

Browse files
authored
Merge pull request #91 from EarthPol/translations
1.3.0 - Add translation from EPol Lib
2 parents 12655f8 + 855e09f commit de95594

41 files changed

Lines changed: 1051 additions & 647 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

dependency-reduced-pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<groupId>com.earthpol</groupId>
55
<artifactId>FoliaCore</artifactId>
66
<name>FoliaCore</name>
7-
<version>1.2.36</version>
7+
<version>1.3.0</version>
88
<build>
99
<resources>
1010
<resource>

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.earthpol</groupId>
88
<artifactId>FoliaCore</artifactId>
9-
<version>1.2.36</version>
9+
<version>1.3.0</version>
1010
<packaging>jar</packaging>
1111

1212
<name>FoliaCore</name>
@@ -114,7 +114,7 @@
114114
<dependency>
115115
<groupId>com.github.earthpol</groupId>
116116
<artifactId>earthpollib</artifactId>
117-
<version>1.11.1</version>
117+
<version>1.12.1</version>
118118
<scope>compile</scope>
119119
</dependency>
120120
<dependency>

src/main/java/com/earthpol/foliacore/FoliaCore.java

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.earthpol.earthPolLib.logging.EnhancedLogger;
44
import com.earthpol.earthPolLib.logging.LogRetentionPolicy;
55
import com.earthpol.earthPolLib.logging.LogRetentionTask;
6+
import com.earthpol.earthPolLib.translation.TranslationService;
67
import com.earthpol.foliacore.commands.*;
78
import com.earthpol.foliacore.config.ConfigManager;
89
import com.earthpol.foliacore.config.ConfigNodes;
@@ -11,6 +12,7 @@
1112
import com.earthpol.foliacore.session.QuickLoginTracker;
1213
import com.earthpol.foliacore.util.ColorManager;
1314
import com.earthpol.foliacore.util.HonorPointsManager;
15+
import com.earthpol.earthPolLib.translation.Translations;
1416
import com.earthpol.foliacore.util.PlayerDataManager;
1517
import com.earthpol.foliacore.util.UniqueCounter;
1618
import com.palmergames.bukkit.towny.TownyAPI;
@@ -47,11 +49,14 @@ public final class FoliaCore extends JavaPlugin {
4749
private static Logger log = Bukkit.getLogger();
4850
public static final String PREFIX = "";
4951
public static final String DISCORD = "https://discord.gg/epmc";
52+
private TranslationService translationService;
5053

5154
public static FoliaCore getInstance() {
5255
return instance;
5356
}
5457
public static ConfigManager getConfigManager() {return instance.cfgMgr;}
58+
public static TranslationService translations() {return instance.translationService;}
59+
public TranslationService getTranslationService() {return translationService;}
5560
private HikariDataSource discordDataSource;
5661

5762
//logging
@@ -86,9 +91,13 @@ public static File getPlayerDataFolder() {
8691
@Override
8792
public void onEnable() {
8893
instance = this;
94+
// Initialize logger early so bootstrap/config code can log safely.
95+
logger = EnhancedLogger.create(this, "FoliaCore", false);
8996
cfgMgr = new ConfigManager(this);
9097
playerDataManager = new PlayerDataManager(instance);
9198
cfgMgr.loadAndMigrate();
99+
translationService = new TranslationService(this, FoliaCore.class);
100+
translationService.load();
92101

93102
isDebug = cfgMgr.getBoolean(ConfigNodes.DEBUG);
94103
prefix = cfgMgr.getString(ConfigNodes.MSG_PREFIX);
@@ -260,25 +269,25 @@ private void setupCommands() {
260269
getCommand("premium").setExecutor(new PremiumCommand());
261270
getCommand("store").setExecutor(new PremiumCommand());
262271
getCommand("shop").setExecutor(new PremiumCommand());
263-
TransportationCommand transportationCommand = new TransportationCommand(cfgMgr);
272+
TransportationCommand transportationCommand = new TransportationCommand();
264273
getCommand("boat").setExecutor(transportationCommand);
265274
getCommand("cart").setExecutor(transportationCommand);
266275
if(isLuckPermsOn){
267276
getCommand("staffmode").setExecutor(new StaffModeCommand(luckPerms));
268277
}
269278
getCommand("namemckit").setExecutor(new NameMCKitCommand(cfgMgr));
270-
getCommand("docs").setExecutor(new ComponentCommand(clickableMessage("online docs", cfgMgr.getString(ConfigNodes.MSG_DOCS))));
271-
getCommand("guide").setExecutor(new ComponentCommand(clickableMessage("online guide", cfgMgr.getString(ConfigNodes.MSG_GUIDE_LINK2))));
272-
getCommand("support").setExecutor(new ComponentCommand(clickableMessage("support discord", cfgMgr.getString(ConfigNodes.MSG_SUPPORT))));
273-
getCommand("wiki").setExecutor(new ComponentCommand(clickableMessage("online wiki", cfgMgr.getString(ConfigNodes.MSG_WIKI))));
274-
getCommand("recipes").setExecutor(new ComponentCommand(clickableMessage("recipe page", cfgMgr.getString(ConfigNodes.MSG_RECIPE))));
275-
getCommand("rules").setExecutor(new ComponentCommand(clickableMessage("rules page", cfgMgr.getString(ConfigNodes.MSG_RULES_LINK2))));
276-
277-
getCommand("insights").setExecutor(new ComponentCommand(clickableMessage(" EarthPol Observatory", "https://earthpol.org/")));
278-
getCommand("shops").setExecutor(new ComponentCommand(clickableMessage(" EarthPol Observatory Shop Page", "https://earthpol.org/shops")));
279-
getCommand("players").setExecutor(new ComponentCommand(clickableMessage(" EarthPol Observatory Players Page", "https://earthpol.org/players")));
280-
getCommand("towns").setExecutor(new ComponentCommand(clickableMessage(" EarthPol Observatory Towns Page", "https://earthpol.org/towns")));
281-
getCommand("nations").setExecutor(new ComponentCommand(clickableMessage(" EarthPol Observatory Nations Page", "https://earthpol.org/nations")));
279+
getCommand("docs").setExecutor(new ComponentCommand(sender -> clickableMessage(sender, "links.docs.description", Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.docs.url"))));
280+
getCommand("guide").setExecutor(new ComponentCommand(sender -> clickableMessage(sender, "links.guide.description", Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.guide.url"))));
281+
getCommand("support").setExecutor(new ComponentCommand(sender -> clickableMessage(sender, "links.support.description", Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.support.url"))));
282+
getCommand("wiki").setExecutor(new ComponentCommand(sender -> clickableMessage(sender, "links.wiki.description", Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.wiki.url"))));
283+
getCommand("recipes").setExecutor(new ComponentCommand(sender -> clickableMessage(sender, "links.recipes.description", Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.recipes.url"))));
284+
getCommand("rules").setExecutor(new ComponentCommand(sender -> clickableMessage(sender, "links.rules.description", Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.rules.url"))));
285+
286+
getCommand("insights").setExecutor(new ComponentCommand(sender -> clickableMessage(sender, "links.insights.description", Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.insights.url"))));
287+
getCommand("shops").setExecutor(new ComponentCommand(sender -> clickableMessage(sender, "links.shops.description", Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.shops.url"))));
288+
getCommand("players").setExecutor(new ComponentCommand(sender -> clickableMessage(sender, "links.players.description", Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.players.url"))));
289+
getCommand("towns").setExecutor(new ComponentCommand(sender -> clickableMessage(sender, "links.towns.description", Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.towns.url"))));
290+
getCommand("nations").setExecutor(new ComponentCommand(sender -> clickableMessage(sender, "links.nations.description", Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.nations.url"))));
282291

283292
getCommand("distance").setExecutor(new DistanceCommand());
284293
getCommand("distance").setTabCompleter(new DistanceCommand());
@@ -300,8 +309,11 @@ private void setupCommands() {
300309
getCommand("reactclaim").setExecutor(new ReactClaimCommand(this));
301310
}
302311

303-
private Component clickableMessage(String description, String url) {
304-
return Component.text("Click here for a link to the " + description + ".", NamedTextColor.GREEN).clickEvent(ClickEvent.openUrl(url)).hoverEvent(HoverEvent.showText(Component.text("Click me to open!", NamedTextColor.GREEN)));
312+
private Component clickableMessage(org.bukkit.command.CommandSender sender, String descriptionKey, String url) {
313+
return Component.text(
314+
Translations.text(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.command.body", Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), sender, descriptionKey)),
315+
NamedTextColor.GREEN
316+
).clickEvent(ClickEvent.openUrl(url)).hoverEvent(HoverEvent.showText(Component.text(Translations.text(com.earthpol.foliacore.FoliaCore.translations(), sender, "links.command.hover"), NamedTextColor.GREEN)));
305317
}
306318

307319
public ColorManager getColorManager() {
@@ -323,8 +335,13 @@ public PlayerDataManager getPlayerDataManager() {
323335

324336
@Override
325337
public void onDisable() {
326-
log().debug(prefix + "Shutting down FoliaCore");
327-
log().debug(prefix + "Saving Honor Point Data");
338+
if (logger != null) {
339+
log().debug(prefix + "Shutting down FoliaCore");
340+
log().debug(prefix + "Saving Honor Point Data");
341+
} else {
342+
getLogger().info("Shutting down FoliaCore");
343+
getLogger().info("Saving Honor Point Data");
344+
}
328345
if (honorMgr != null)
329346
honorMgr.saveAll();
330347
if (discordDataSource != null) {
Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
11
package com.earthpol.foliacore.commands;
22

3-
import net.kyori.adventure.text.Component;
4-
import org.bukkit.command.Command;
5-
import org.bukkit.command.CommandExecutor;
6-
import org.bukkit.command.CommandSender;
7-
import org.jetbrains.annotations.NotNull;
3+
import net.kyori.adventure.text.Component;
4+
import org.bukkit.command.Command;
5+
import org.bukkit.command.CommandExecutor;
6+
import org.bukkit.command.CommandSender;
7+
import org.jetbrains.annotations.NotNull;
8+
9+
import java.util.function.Function;
810

911
/**
1012
* Command class for generic commands that only return a component
1113
*/
12-
public class ComponentCommand implements CommandExecutor {
13-
private final Component component;
14-
15-
public ComponentCommand(@NotNull Component component) {
16-
this.component = component;
17-
}
18-
19-
@Override
20-
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
21-
sender.sendMessage(component);
22-
return true;
23-
}
24-
}
14+
public class ComponentCommand implements CommandExecutor {
15+
private final Function<CommandSender, Component> componentFactory;
16+
17+
public ComponentCommand(@NotNull Component component) {
18+
this.componentFactory = sender -> component;
19+
}
20+
21+
public ComponentCommand(@NotNull Function<CommandSender, Component> componentFactory) {
22+
this.componentFactory = componentFactory;
23+
}
24+
25+
@Override
26+
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
27+
sender.sendMessage(componentFactory.apply(sender));
28+
return true;
29+
}
30+
}

src/main/java/com/earthpol/foliacore/commands/CustomLoreCommand.java

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.earthpol.foliacore.commands;
22

33
import com.earthpol.foliacore.FoliaCore;
4+
import com.earthpol.earthPolLib.translation.Translations;
5+
import com.earthpol.foliacore.util.LoreKillCounter;
46
import org.bukkit.Bukkit;
57
import org.bukkit.ChatColor;
68
import org.bukkit.Material;
@@ -40,7 +42,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
4042

4143
private boolean handleSetLoreCommand(CommandSender sender, String[] args) {
4244
if (!(sender instanceof Player)) {
43-
sender.sendMessage(ChatColor.RED + "Only players can use this command.");
45+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), sender, "customlore.setlore.only_players");
4446
return true;
4547
}
4648

@@ -49,7 +51,7 @@ private boolean handleSetLoreCommand(CommandSender sender, String[] args) {
4951
int usesLeft = plugin.getPlayerDataManager().getUses(uuid);
5052

5153
if (args.length == 0) {
52-
player.sendMessage(ChatColor.GREEN + "You have " + usesLeft + " uses left for /setlore.");
54+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), player, "customlore.setlore.uses_left", usesLeft);
5355
return true;
5456
}
5557

@@ -58,53 +60,57 @@ private boolean handleSetLoreCommand(CommandSender sender, String[] args) {
5860
String pendingPlayerName = pendingPlayerNameMap.get(uuid);
5961

6062
if (pendingLore == null) {
61-
player.sendMessage(ChatColor.RED + "No lore set to confirm.");
63+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), player, "customlore.setlore.no_pending");
6264
return true;
6365
}
6466

6567
ItemStack item = player.getInventory().getItemInMainHand();
6668
if (item == null || item.getType() == Material.AIR || !isAllowedItem(item.getType())) {
67-
player.sendMessage(ChatColor.RED + "You must hold a valid item to set lore.");
69+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), player, "customlore.setlore.invalid_item");
6870
return true;
6971
}
7072

7173
if (usesLeft <= 0) {
72-
player.sendMessage(ChatColor.RED + "You have no uses left.");
74+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), player, "customlore.setlore.no_uses");
7375
return true;
7476
}
7577

7678
ItemMeta meta = item.getItemMeta();
7779
List<String> lore = new ArrayList<>();
7880
lore.add(ChatColor.translateAlternateColorCodes('&', pendingLore));
79-
lore.add(ChatColor.GRAY + "- " + pendingPlayerName);
80-
lore.add(ChatColor.RED + "PVP KILLS: " + ChatColor.GREEN + "0");
81+
lore.add(ChatColor.GRAY + Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), player, "customlore.owner_prefix") + pendingPlayerName);
82+
lore.add(LoreKillCounter.attachMarker(
83+
ChatColor.RED
84+
+ Translations.raw(com.earthpol.foliacore.FoliaCore.translations(), player, "customlore.kill_tag")
85+
+ ChatColor.GREEN + "0"
86+
));
8187
meta.setLore(lore);
8288
item.setItemMeta(meta);
8389
plugin.getPlayerDataManager().removeUses(uuid, 1);
84-
player.sendMessage(ChatColor.GREEN + "Lore set successfully.");
90+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), player, "customlore.setlore.success");
8591
pendingLoreMap.remove(uuid);
8692
pendingPlayerNameMap.remove(uuid);
8793
return true;
8894
} else if (args.length > 0) {
8995
String lore = String.join(" ", args);
9096
if (!lorePattern.matcher(lore).matches()) {
91-
player.sendMessage(ChatColor.RED + "Lore can only contain letters, numbers, and color codes.");
97+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), player, "customlore.setlore.invalid_characters");
9298
return true;
9399
}
94100

95101
pendingLoreMap.put(uuid, lore);
96102
pendingPlayerNameMap.put(uuid, player.getName());
97-
player.sendMessage(ChatColor.YELLOW + "Type /setlore confirm to confirm setting the lore.");
103+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), player, "customlore.setlore.confirm_prompt");
98104
return true;
99105
} else {
100-
player.sendMessage(ChatColor.RED + "Usage: /setlore <text> or /setlore confirm");
106+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), player, "customlore.setlore.usage");
101107
return true;
102108
}
103109
}
104110

105111
private boolean handleCustomLoreCommand(CommandSender sender, String[] args) {
106112
if (args.length < 4 || !args[0].equalsIgnoreCase("use")) {
107-
sender.sendMessage(ChatColor.RED + "Usage: /customlore use <add|remove|set> <player> <amount>");
113+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), sender, "customlore.manage.usage");
108114
return true;
109115
}
110116

@@ -115,7 +121,7 @@ private boolean handleCustomLoreCommand(CommandSender sender, String[] args) {
115121
try {
116122
amount = Integer.parseInt(args[3]);
117123
} catch (NumberFormatException e) {
118-
sender.sendMessage(ChatColor.RED + "Amount must be a number.");
124+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), sender, "customlore.manage.amount_number");
119125
return true;
120126
}
121127

@@ -125,24 +131,23 @@ private boolean handleCustomLoreCommand(CommandSender sender, String[] args) {
125131
switch (action.toLowerCase()) {
126132
case "add":
127133
plugin.getPlayerDataManager().addUses(uuid, amount);
128-
sender.sendMessage(ChatColor.GREEN + "Added " + amount + " uses to " + playerName);
134+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), sender, "customlore.manage.added", amount, playerName);
129135
break;
130136
case "remove":
131137
plugin.getPlayerDataManager().removeUses(uuid, amount);
132-
sender.sendMessage(ChatColor.GREEN + "Removed " + amount + " uses from " + playerName);
138+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), sender, "customlore.manage.removed", amount, playerName);
133139
break;
134140
case "set":
135141
plugin.getPlayerDataManager().setUses(uuid, amount);
136-
sender.sendMessage(ChatColor.GREEN + "Set uses for " + playerName + " to " + amount);
142+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), sender, "customlore.manage.set", playerName, amount);
137143
break;
138144
default:
139-
sender.sendMessage(ChatColor.RED + "Invalid action. Use add, remove, or set.");
145+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), sender, "customlore.manage.invalid_action");
140146
return true;
141147
}
142148

143149
if (offlinePlayer.isOnline()) {
144-
offlinePlayer.getPlayer().sendMessage(ChatColor.GREEN + "Your uses for /setlore have been updated. You now have " +
145-
plugin.getPlayerDataManager().getUses(uuid) + " uses left.");
150+
Translations.send(com.earthpol.foliacore.FoliaCore.translations(), offlinePlayer.getPlayer(), "customlore.manage.target_updated", plugin.getPlayerDataManager().getUses(uuid));
146151
}
147152
return true;
148153
}
@@ -151,4 +156,4 @@ private boolean isAllowedItem(Material material) {
151156
List<String> allowedItems = FoliaCore.getInstance().getAllowedItems();
152157
return allowedItems.contains(material.toString());
153158
}
154-
}
159+
}

0 commit comments

Comments
 (0)