Skip to content

Commit 35577c3

Browse files
committed
feat(translations): implement dynamic translation service selection based on Minecraft version
1 parent bc48953 commit 35577c3

File tree

1 file changed

+51
-21
lines changed

1 file changed

+51
-21
lines changed

src/main/java/net/onelitefeather/antiredstoneclockremastered/AntiRedstoneClockRemastered.java

Lines changed: 51 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package net.onelitefeather.antiredstoneclockremastered;
22

3-
import net.kyori.adventure.key.Key;
3+
import io.papermc.paper.ServerBuildInfo;
44
import net.kyori.adventure.text.Component;
55
import net.kyori.adventure.text.minimessage.MiniMessage;
6-
import net.kyori.adventure.text.minimessage.translation.MiniMessageTranslationStore;
7-
import net.kyori.adventure.translation.GlobalTranslator;
86
import net.kyori.adventure.util.UTF8ResourceBundleControl;
97
import net.onelitefeather.antiredstoneclockremastered.api.PlotsquaredSupport;
108
import net.onelitefeather.antiredstoneclockremastered.api.WorldGuardSupport;
@@ -16,6 +14,9 @@
1614
import net.onelitefeather.antiredstoneclockremastered.plotsquared.v7.PlotSquaredModernSupport;
1715
import net.onelitefeather.antiredstoneclockremastered.service.RedstoneClockService;
1816
import net.onelitefeather.antiredstoneclockremastered.service.UpdateService;
17+
import net.onelitefeather.antiredstoneclockremastered.service.api.TranslationService;
18+
import net.onelitefeather.antiredstoneclockremastered.service.impl.LegacyTranslationService;
19+
import net.onelitefeather.antiredstoneclockremastered.service.impl.ModernTranslationService;
1920
import net.onelitefeather.antiredstoneclockremastered.utils.CheckTPS;
2021
import net.onelitefeather.antiredstoneclockremastered.worldguard.v6.WorldGuardLegacySupport;
2122
import net.onelitefeather.antiredstoneclockremastered.worldguard.v7.WorldGuardModernSupport;
@@ -44,6 +45,7 @@
4445
import static org.incendo.cloud.parser.standard.StringParser.greedyStringParser;
4546

4647
public final class AntiRedstoneClockRemastered extends JavaPlugin {
48+
public static final String RESOURCE_BUNDLE_NAME = "antiredstoneclockremasterd";
4749
private CheckTPS tps;
4850

4951
private RedstoneClockService redstoneClockService;
@@ -67,27 +69,30 @@ public void onLoad() {
6769

6870
@Override
6971
public void onEnable() {
70-
final MiniMessageTranslationStore miniMessageTranslationStore = MiniMessageTranslationStore.create(Key.key("antiredstoneclockremastered", "translations"));
71-
miniMessageTranslationStore.defaultLocale(Locale.US);
72+
TranslationService translationService;
73+
ServerBuildInfo buildInfo = ServerBuildInfo.buildInfo();
74+
if (buildInfo.minecraftVersionId().startsWith("1.20")) {
75+
translationService = new LegacyTranslationService();
76+
getSLF4JLogger().info("Using legacy translation service");
77+
} else {
78+
translationService = new ModernTranslationService();
79+
getSLF4JLogger().info("Using modern translation service");
80+
}
7281
Path langFolder = getDataFolder().toPath().resolve("lang");
73-
var languages = new HashSet<>(getConfig().getStringList("translations"));
74-
languages.add("en-US");
75-
if (Files.exists(langFolder)) {
76-
try (var urlClassLoader = new URLClassLoader(new URL[]{langFolder.toUri().toURL()})) {
77-
languages.stream().map(Locale::forLanguageTag).forEach(r -> {
78-
var bundle = ResourceBundle.getBundle("antiredstoneclockremasterd", r, urlClassLoader, UTF8ResourceBundleControl.get());
79-
miniMessageTranslationStore.registerAll(r, bundle, false);
80-
});
82+
if (Files.notExists(langFolder)) {
83+
try {
84+
Files.createDirectories(langFolder);
8185
} catch (IOException e) {
82-
throw new RuntimeException(e);
86+
getSLF4JLogger().error("An error occurred while creating lang folder");
87+
return;
8388
}
84-
} else {
85-
languages.stream().map(Locale::forLanguageTag).forEach(r -> {
86-
var bundle = ResourceBundle.getBundle("antiredstoneclockremasterd", r, UTF8ResourceBundleControl.get());
87-
miniMessageTranslationStore.registerAll(r, bundle, false);
88-
});
8989
}
90-
GlobalTranslator.translator().addSource(miniMessageTranslationStore);
90+
var languages = new HashSet<>(getConfig().getStringList("translations"));
91+
languages.add("en-US");
92+
languages.stream()
93+
.map(Locale::forLanguageTag)
94+
.forEach(locale -> loadAndRegisterTranslation(locale, langFolder, translationService));
95+
translationService.registerGlobal();
9196
donationInformation();
9297
updateService();
9398
enableCommandFramework();
@@ -107,7 +112,9 @@ private void updateService() {
107112

108113
@Override
109114
public void onDisable() {
110-
this.updateService.shutdown();
115+
if (this.updateService != null) {
116+
this.updateService.shutdown();
117+
}
111118
}
112119

113120
private void donationInformation() {
@@ -276,6 +283,29 @@ private String bstatsWorldGuardVersion() {
276283
return "unknown";
277284
}
278285

286+
private void loadAndRegisterTranslation(Locale locale, Path langFolder, TranslationService translationService) {
287+
try {
288+
ResourceBundle bundle = loadResourceBundle(locale, langFolder);
289+
if (bundle != null) {
290+
translationService.registerAll(locale, bundle, false);
291+
}
292+
} catch (Exception e) {
293+
getSLF4JLogger().error("An error occurred while loading language file for locale {}", locale, e);
294+
}
295+
}
296+
297+
private ResourceBundle loadResourceBundle(Locale locale, Path langFolder) throws Exception {
298+
Path langFile = langFolder.resolve(RESOURCE_BUNDLE_NAME + "_" + locale.toLanguageTag() + ".properties");
299+
300+
if (Files.exists(langFile)) {
301+
try (URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{langFolder.toUri().toURL()})) {
302+
return ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME, locale, urlClassLoader, UTF8ResourceBundleControl.get());
303+
}
304+
} else {
305+
return ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME, locale, UTF8ResourceBundleControl.get());
306+
}
307+
}
308+
279309
public CheckTPS getTps() {
280310
return tps;
281311
}

0 commit comments

Comments
 (0)