Skip to content

Commit 1d0fb1e

Browse files
committed
feat: translations
1 parent 1db2135 commit 1d0fb1e

8 files changed

Lines changed: 379 additions & 3 deletions

File tree

commons/src/main/java/net/swofty/commons/StringUtility.java

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
66
import net.minestom.server.instance.block.Block;
77
import net.minestom.server.item.Material;
8-
import net.swofty.commons.skyblock.statistics.ItemStatistic;
98

109
import java.math.RoundingMode;
1110
import java.text.DecimalFormat;
@@ -152,6 +151,85 @@ public static String profileAge(long tbf) {
152151
return formatTimeWentBy(System.currentTimeMillis() - tbf);
153152
}
154153

154+
/**
155+
* Unescapes a string that contains standard Java escape sequences.
156+
* This is untested and may not work as expected.
157+
*
158+
* @param input the string to unescape
159+
* @return the unescaped string
160+
*/
161+
public static String unescapeJava(String input) {
162+
if (input == null) {
163+
return null;
164+
}
165+
StringBuilder sb = new StringBuilder(input.length());
166+
for (int i = 0; i < input.length(); i++) {
167+
char c = input.charAt(i);
168+
if (c == '\\' && i < input.length() - 1) {
169+
char next = input.charAt(i + 1);
170+
switch (next) {
171+
case 'b':
172+
sb.append('\b');
173+
i++;
174+
break;
175+
case 't':
176+
i++;
177+
break;
178+
case 'n':
179+
sb.append('\n');
180+
i++;
181+
break;
182+
case 'f':
183+
sb.append('\f');
184+
i++;
185+
break;
186+
case 'r':
187+
sb.append('\r');
188+
i++;
189+
break;
190+
case '\"':
191+
sb.append('\"');
192+
i++;
193+
break;
194+
case '\'':
195+
sb.append('\'');
196+
i++;
197+
break;
198+
case '\\':
199+
sb.append('\\');
200+
i++;
201+
break;
202+
case 'u':
203+
// Unicode escape sequence:
204+
if (i + 5 < input.length()) {
205+
String hex = input.substring(i + 2, i + 6);
206+
try {
207+
int code = Integer.parseInt(hex, 16);
208+
sb.append((char) code);
209+
i += 5;
210+
} catch (NumberFormatException e) {
211+
// Not a valid Unicode escape, so fall back
212+
sb.append('\\').append('u');
213+
i++;
214+
}
215+
} else {
216+
sb.append('\\').append('u');
217+
i++;
218+
}
219+
break;
220+
default:
221+
// Unrecognized escape, skip the backslash
222+
sb.append(next);
223+
i++;
224+
break;
225+
}
226+
} else {
227+
sb.append(c);
228+
}
229+
}
230+
return sb.toString();
231+
}
232+
155233
public static String getAsRomanNumeral(int num) {
156234
if (num == 0) return "";
157235
int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
bedwars.kill.died.default="<player> <gray>died."
2+
bedwars.kill.died_by.default="<player> <gray>was killed by <killer><gray>."
3+
bedwars.kill.projectile.default="<player> <gray>was shot by <killer><gray>."
4+
bedwars.kill.assist.default="<player> <gray>was killed by <victim><gray>'s <entity>."
5+
bedwars.kill.void.default="<player> <gray>fell in to the void."
6+
bedwars.kill.void_by.default="<player> <gray>was knocked into the void by <killer><gray>."
7+
bedwars.kill.bed.default="<gray>was destroyed by"
8+
bedwars.kill.final_kill="<aqua><bold>FINAL KILL!</aqua></bold>"
9+
bedwars.bed_destroyed="<white><bold>BED DESTRUCTION ></bold> <gray><team> Bed <gray><message> <gray>."
10+
bedwars.bed_destroyed_self="<white><bold>BED DESTRUCTION ></bold> <gray>Your bed <gray><message> <gray>."
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
bedwars.kill.died.default="<player> kuoli."
2+
bedwars.kill.died_by.default="<player> tapettiin pelaajan <killer> toimesta."
3+
bedwars.kill.projectile.default="Pelaajan <player> ampui <killer>."
4+
bedwars.kill.assist.default="<player> tapettiin pelaajan <victim> <entity> avulla."
5+
bedwars.kill.void.default="<player> putosi tyhjyyteen."
6+
bedwars.kill.void_by.default="<player> putosi tyhjyyteen pelaajan <killer> toimesta."
7+
bedwars.kill.bed.default="<gray>tuhosi pelaaja"
8+
bedwars.kill.final_kill="<aqua><bold>VIIMEISTELYTAPPO!</aqua></bold>"
9+
bedwars.bed_destroyed="<white><bold>SÄNKY TUHOTTU ></bold> <gray><team> Sänky <gray><message> <gray>."
10+
bedwars.bed_destroyed_self="<white><bold>SÄNKY TUHOTTU ></bold> <gray>Sänkysi <gray><message> <gray>."

loader/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ dependencies {
6767
implementation("net.minestom:minestom:2025.12.20c-1.21.11") {
6868
exclude(group = "org.jboss.shrinkwrap.resolver", module = "shrinkwrap-resolver-depchain")
6969
}
70+
implementation("com.github.ben-manes.caffeine:caffeine:3.2.3")
7071
implementation("dev.hollowcube:polar:1.15.0")
7172
implementation("org.yaml:snakeyaml:2.0")
7273
}

loader/src/main/java/net/swofty/loader/Hypixel.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
import lombok.Getter;
66
import lombok.Setter;
77
import lombok.SneakyThrows;
8+
import net.kyori.adventure.translation.GlobalTranslator;
89
import net.minestom.server.Auth;
910
import net.minestom.server.MinecraftServer;
11+
import net.minestom.server.adventure.MinestomAdventure;
1012
import net.minestom.server.timer.ExecutionType;
1113
import net.minestom.server.timer.Scheduler;
1214
import net.minestom.server.timer.TaskSchedule;
@@ -31,20 +33,26 @@
3133
import net.swofty.type.generic.HypixelTypeLoader;
3234
import net.swofty.type.generic.RavengardTypeLoader;
3335
import net.swofty.type.generic.SkyBlockTypeLoader;
36+
import net.swofty.type.generic.i18n.HypixelTranslator;
3437
import net.swofty.type.ravengardgeneric.RavengardGenericLoader;
3538
import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader;
3639
import org.json.JSONArray;
3740
import org.json.JSONObject;
3841
import org.reflections.Reflections;
3942
import org.tinylog.Logger;
4043

44+
import java.net.InetAddress;
4145
import java.nio.file.Files;
42-
import java.util.*;
46+
import java.util.Arrays;
47+
import java.util.HashMap;
48+
import java.util.List;
49+
import java.util.Map;
50+
import java.util.Set;
51+
import java.util.UUID;
4352
import java.util.concurrent.CompletableFuture;
4453
import java.util.concurrent.TimeUnit;
4554
import java.util.concurrent.atomic.AtomicBoolean;
4655
import java.util.stream.Collectors;
47-
import java.net.InetAddress;
4856

4957

5058
public class Hypixel {
@@ -180,6 +188,10 @@ static void main(String[] args) {
180188
});
181189
typeLoader.afterInitialize(minecraftServer);
182190

191+
MinestomAdventure.AUTOMATIC_COMPONENT_TRANSLATION = true;
192+
HypixelTranslator translator = new HypixelTranslator();
193+
GlobalTranslator.translator().addSource(translator);
194+
183195
// Start the server
184196
MinecraftServer.setBrandName("Hypixel");
185197
CompletableFuture<Integer> startServer = new CompletableFuture<>();

type.generic/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ dependencies {
3333
compileOnly("net.minestom:minestom:2025.12.20c-1.21.11") {
3434
exclude(group = "org.jboss.shrinkwrap.resolver", module = "shrinkwrap-resolver-depchain")
3535
}
36+
implementation("net.kyori:adventure-text-minimessage:4.25.0")
37+
implementation("com.github.ben-manes.caffeine:caffeine:3.2.3")
3638
implementation("dev.hollowcube:polar:1.15.0")
3739
implementation("org.yaml:snakeyaml:2.2")
3840
implementation("it.unimi.dsi:fastutil:8.5.18")

0 commit comments

Comments
 (0)