11package net .onelitefeather .antiredstoneclockremastered ;
22
3- import net . kyori . adventure . key . Key ;
3+ import io . papermc . paper . ServerBuildInfo ;
44import net .kyori .adventure .text .Component ;
55import net .kyori .adventure .text .minimessage .MiniMessage ;
6- import net .kyori .adventure .text .minimessage .translation .MiniMessageTranslationStore ;
7- import net .kyori .adventure .translation .GlobalTranslator ;
86import net .kyori .adventure .util .UTF8ResourceBundleControl ;
97import net .onelitefeather .antiredstoneclockremastered .api .PlotsquaredSupport ;
108import net .onelitefeather .antiredstoneclockremastered .api .WorldGuardSupport ;
1614import net .onelitefeather .antiredstoneclockremastered .plotsquared .v7 .PlotSquaredModernSupport ;
1715import net .onelitefeather .antiredstoneclockremastered .service .RedstoneClockService ;
1816import 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 ;
1920import net .onelitefeather .antiredstoneclockremastered .utils .CheckTPS ;
2021import net .onelitefeather .antiredstoneclockremastered .worldguard .v6 .WorldGuardLegacySupport ;
2122import net .onelitefeather .antiredstoneclockremastered .worldguard .v7 .WorldGuardModernSupport ;
4445import static org .incendo .cloud .parser .standard .StringParser .greedyStringParser ;
4546
4647public 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