Skip to content

Commit 941de54

Browse files
committed
feat: adventure 5
untested, not sure how to test it lol? not sure if its in paper or anything yet, kinda seems like theyre skipping 26.1 for platform-mod
1 parent 89ea284 commit 941de54

5 files changed

Lines changed: 60 additions & 91 deletions

File tree

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package dev.qixils.crowdcontrol.common;
2+
3+
import net.kyori.adventure.key.Key;
4+
import net.kyori.adventure.translation.AbstractTranslationStore;
5+
import org.jspecify.annotations.Nullable;
6+
7+
import java.text.MessageFormat;
8+
import java.util.Locale;
9+
10+
public class KyoriStoreAccessor extends AbstractTranslationStore.StringBased<String> {
11+
/**
12+
* Creates a new abstract, string-based translation store with a given name.
13+
*
14+
* @param name the name
15+
* @since 4.20.0
16+
*/
17+
protected KyoriStoreAccessor(Key name) {
18+
super(name);
19+
}
20+
21+
@Override
22+
protected String parse(String string, Locale locale) {
23+
return string;
24+
}
25+
26+
@Override
27+
public @Nullable MessageFormat translate(String key, Locale locale) {
28+
return null;
29+
}
30+
31+
public String getTranslationString(String string, Locale locale) {
32+
return this.translationValue(string, locale);
33+
}
34+
}

common/src/main/java/dev/qixils/crowdcontrol/common/KyoriTranslator.java

Lines changed: 17 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
package dev.qixils.crowdcontrol.common;
22

33
import net.kyori.adventure.key.Key;
4-
import net.kyori.adventure.text.Component;
5-
import net.kyori.adventure.text.TextComponent;
6-
import net.kyori.adventure.text.TranslatableComponent;
7-
import net.kyori.adventure.text.minimessage.tag.Tag;
8-
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
9-
import net.kyori.adventure.text.renderer.TranslatableComponentRenderer;
10-
import net.kyori.adventure.translation.GlobalTranslator;
11-
import net.kyori.adventure.translation.TranslationRegistry;
4+
import net.kyori.adventure.text.minimessage.translation.MiniMessageTranslationStore;
125
import net.kyori.adventure.translation.Translator;
136
import org.jetbrains.annotations.NotNull;
147
import org.jetbrains.annotations.Nullable;
@@ -21,22 +14,20 @@
2114
import java.nio.file.Files;
2215
import java.nio.file.Path;
2316
import java.nio.file.Paths;
24-
import java.text.MessageFormat;
2517
import java.util.*;
2618
import java.util.jar.JarFile;
2719
import java.util.regex.Matcher;
2820
import java.util.regex.Pattern;
2921
import java.util.stream.Collectors;
3022
import java.util.stream.Stream;
3123

32-
import static net.kyori.adventure.text.minimessage.MiniMessage.miniMessage;
33-
3424
// TODO: remove sponge cope
3525

36-
public final class KyoriTranslator extends TranslatableComponentRenderer<Locale> implements TranslationRegistry {
26+
public final class KyoriTranslator {
3727
private static final Logger logger = LoggerFactory.getLogger("CrowdControl/KyoriTranslator");
3828
private final String prefix;
39-
private final TranslationRegistry translator;
29+
private final KyoriStoreAccessor intermediate;
30+
private final MiniMessageTranslationStore translator;
4031
private final ClassLoader pluginClassLoader;
4132

4233
private static @Nullable URL loadFirst(String path, ClassLoader... classLoaders) {
@@ -120,8 +111,10 @@ public KyoriTranslator(@NotNull String modId, @NotNull String prefix, @NotNull P
120111
logger.debug("Registering translator");
121112

122113
// create translator
123-
Key name = Key.key(modId, "translations");
124-
translator = TranslationRegistry.create(name);
114+
intermediate = new KyoriStoreAccessor(Key.key(modId, "intermediate_translations"));
115+
intermediate.defaultLocale(Objects.requireNonNull(Translator.parseLocale("en_US")));
116+
117+
translator = MiniMessageTranslationStore.create(Key.key(modId, "translations"));
125118
translator.defaultLocale(Objects.requireNonNull(Translator.parseLocale("en_US")));
126119

127120
// load locales
@@ -154,79 +147,20 @@ public KyoriTranslator(@NotNull String modId, @NotNull String prefix, @NotNull P
154147
}
155148
}
156149

157-
@Override
158-
public @NotNull Key name() {
159-
return translator.name();
160-
}
161-
162-
@Override
163-
public boolean contains(@NotNull String key) {
164-
return translator.contains(key);
165-
}
166-
167-
@Override
168-
public boolean contains(@NotNull String key, @NotNull Locale locale) {
169-
return translator.contains(key, locale);
170-
}
171-
172-
@Override
173-
public void defaultLocale(@NotNull Locale locale) {
174-
translator.defaultLocale(locale);
175-
}
176-
177-
@Override
178-
public void register(@NotNull String key, @NotNull Locale locale, @NotNull MessageFormat format) {
179-
translator.register(key, locale, format);
180-
}
181-
182-
@Override
183-
public void unregister(@NotNull String key) {
184-
translator.unregister(key);
185-
}
186-
187150
private void register(Locale locale) {
188151
ResourceBundle bundle = ResourceBundle.getBundle("i18n." + prefix, locale, pluginClassLoader);
189-
translator.registerAll(locale, bundle, false);
190-
logger.info("Registered locale {}", locale);
191-
}
152+
intermediate.registerAll(locale, bundle, false);
153+
for (String key : bundle.keySet()) {
154+
String value = intermediate.getTranslationString(key, locale);
155+
if (value == null) continue; // !?
192156

193-
@Override
194-
public @Nullable Component translate(final @NotNull TranslatableComponent component, final @NotNull Locale context) {
195-
if (translate(component.key(), context) == null) return null;
196-
return renderTranslatable(component, context);
197-
}
157+
translator.register(key, locale, value.replaceAll("<(\\d+)>", "<arg:$1>"));
158+
}
198159

199-
@Override
200-
public @Nullable MessageFormat translate(@NotNull String key, @NotNull Locale locale) {
201-
logger.debug("Plainly translating {} for {}", key, locale);
202-
return translator.translate(key, locale);
160+
logger.info("Registered locale {}", locale);
203161
}
204162

205-
@Override
206-
protected @NotNull Component renderTranslatable(@NotNull TranslatableComponent component, @NotNull Locale context) {
207-
logger.debug("Richly translating {} for {}", component.key(), context);
208-
final @Nullable MessageFormat format = translate(component.key(), context);
209-
210-
// this probably shouldn't cause a stack overflow because of the top-level check for null in the #translate method
211-
// (and in fact, it hasn't from a lot of testing)
212-
// also this needs to be here because #optionallyRenderChildrenAppendAndBuild calls this method to, well, render children
213-
// although that's not to say that this couldn't be improved. it probably could be.
214-
if (format == null)
215-
return GlobalTranslator.renderer().render(component, context);
216-
217-
final TextComponent.Builder builder = Component.text(); // mostly just a dummy for appending children
218-
this.mergeStyle(component, builder, context);
219-
220-
final List<Component> args = component.args();
221-
if (args.isEmpty()) {
222-
// no arguments makes this render very simple
223-
builder.append(miniMessage().deserialize(format.format(null, new StringBuffer(), null).toString()));
224-
} else {
225-
final TagResolver.Builder resolver = TagResolver.builder();
226-
for (int i = 0; i < args.size(); i++)
227-
resolver.tag(String.valueOf(i), Tag.selfClosingInserting(this.render(args.get(i), context)));
228-
builder.append(miniMessage().deserialize(format.format(null, new StringBuffer(), null).toString(), resolver.build()));
229-
}
230-
return this.optionallyRenderChildrenAppendAndBuild(component.children(), builder, context);
163+
public MiniMessageTranslationStore getTranslator() {
164+
return translator;
231165
}
232166
}

common/src/main/java/dev/qixils/crowdcontrol/common/Plugin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ public void startSession(@NotNull CCPlayer ccPlayer) {
634634
*/
635635
public Iterable<LiteralArgumentBuilder<S>> registerChatCommands() {
636636
try {
637-
GlobalTranslator.translator().addSource(new KyoriTranslator("crowdcontrol", "CrowdControl", this, Locale.US));
637+
GlobalTranslator.translator().addSource(new KyoriTranslator("crowdcontrol", "CrowdControl", this, Locale.US).getTranslator());
638638
} catch (Exception e) {
639639
getSLF4JLogger().error("Failed to initialize i18n", e);
640640
}
@@ -1414,7 +1414,7 @@ public void onPlayerJoin(P joiningPlayer) {
14141414
UserToken user = ccPlayer.getUserToken();
14151415
if (user == null) return; // !?
14161416
playerMapper().getPlayer(ccPlayer.getUuid()).ifPresent(p -> playerMapper().asAudience(p)
1417-
.sendMessage(PREFIX_COMPONENT.append(translatable("cc.join.authenticated").args(text(user.getName())))));
1417+
.sendMessage(PREFIX_COMPONENT.append(translatable("cc.join.authenticated").arguments(text(user.getName())))));
14181418
// start session
14191419
getScheduledExecutor().schedule(
14201420
() -> startSession(ccPlayer),

common/src/main/java/dev/qixils/crowdcontrol/common/command/Command.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import live.crowdcontrol.cc4j.websocket.payload.PublicEffectPayload;
2222
import net.kyori.adventure.text.Component;
2323
import net.kyori.adventure.text.TranslatableComponent;
24+
import net.kyori.adventure.text.TranslationArgument;
2425
import org.jetbrains.annotations.ApiStatus;
2526
import org.jetbrains.annotations.CheckReturnValue;
2627
import org.jetbrains.annotations.NotNull;
@@ -248,14 +249,14 @@ default Component getQuantityName(@NotNull Component displayName, @NotNull Publi
248249
return displayName;
249250

250251
TranslatableComponent translatable = (TranslatableComponent) displayName;
251-
List<Component> args = new ArrayList<>(translatable.args());
252+
List<TranslationArgument> args = new ArrayList<>(translatable.arguments());
252253
Component quantity = Component.text(request.getQuantity());
253254
if (style == QuantityStyle.APPEND || style == QuantityStyle.APPEND_X) {
254-
args.add(quantity);
255+
args.add(TranslationArgument.component(quantity));
255256
} else if (style == QuantityStyle.PREPEND || style == QuantityStyle.PREPEND_X) {
256-
args.add(0, quantity);
257+
args.add(0, TranslationArgument.component(quantity));
257258
}
258-
translatable = translatable.args(args);
259+
translatable = translatable.arguments(args);
259260

260261
if ((style == QuantityStyle.APPEND_X || style == QuantityStyle.PREPEND_X) && request.getQuantity() > 1) {
261262
String[] keyParts = translatable.key().split("\\.");

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
group = dev.qixils.crowdcontrol.plugin
2-
version = 4.5.2
2+
version = 4.5.3-SNAPSHOT
33
java_version = 25
44

55
# increase available memory
@@ -41,7 +41,7 @@ yaclVersion=3.9.1+26.1
4141

4242
# variables
4343
crowdControlVersion=1.2.4
44-
adventureVersion=4.25.0
44+
adventureVersion=5.0.1
4545
adventurePlatformVersion=4.4.1
4646
configurateVersion=4.2.0
4747
nettyVersion=4.1.119.Final

0 commit comments

Comments
 (0)