diff --git a/src/main/java/moe/caa/fabric/quitconfirm/client/config/Config.java b/src/main/java/moe/caa/fabric/quitconfirm/client/config/Config.java index 82e1a0a..f2094e4 100644 --- a/src/main/java/moe/caa/fabric/quitconfirm/client/config/Config.java +++ b/src/main/java/moe/caa/fabric/quitconfirm/client/config/Config.java @@ -8,6 +8,8 @@ import moe.caa.fabric.quitconfirm.client.screen.confirm.style.BaseStyle; import moe.caa.fabric.quitconfirm.client.screen.confirm.style.BedrockStyle; import moe.caa.fabric.quitconfirm.client.screen.confirm.style.ClassicStyle; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableTextContent; import java.io.IOException; import java.nio.file.Files; @@ -85,12 +87,12 @@ public > T nextEnum(Class tClass, T value) { } public enum ConfirmScreenDisplayTypeEnum { - CLASSIC("经典", ClassicStyle::new), - BEDROCK("基岩", BedrockStyle::new); - public final String displayName; + CLASSIC(Text.translatable("config.quitconfirm.screentype.classic"), ClassicStyle::new), + BEDROCK(Text.translatable("config.quitconfirm.screentype.bedrock"), BedrockStyle::new); + public final Text displayName; public final Supplier baseStyleSupplier; - ConfirmScreenDisplayTypeEnum(String displayName, Supplier baseStyleSupplier) { + ConfirmScreenDisplayTypeEnum(Text displayName, Supplier baseStyleSupplier) { this.displayName = displayName; this.baseStyleSupplier = baseStyleSupplier; } @@ -98,12 +100,12 @@ public enum ConfirmScreenDisplayTypeEnum { public enum ConfirmTypeEnum { - TOAST("土司"), - SCREEN("屏幕"), - NONE("关闭"); - public final String displayName; + TOAST(Text.translatable("config.quitconfirm.confirmtype.toast")), + SCREEN(Text.translatable("config.quitconfirm.confirmtype.screen")), + NONE(Text.translatable("config.quitconfirm.confirmtype.none")); + public final Text displayName; - ConfirmTypeEnum(String displayName) { + ConfirmTypeEnum(Text displayName) { this.displayName = displayName; } } diff --git a/src/main/java/moe/caa/fabric/quitconfirm/client/handle/ToastQuitHandler.java b/src/main/java/moe/caa/fabric/quitconfirm/client/handle/ToastQuitHandler.java index d3803e3..9d821cf 100644 --- a/src/main/java/moe/caa/fabric/quitconfirm/client/handle/ToastQuitHandler.java +++ b/src/main/java/moe/caa/fabric/quitconfirm/client/handle/ToastQuitHandler.java @@ -4,13 +4,14 @@ import moe.caa.fabric.quitconfirm.client.event.EventResult; import moe.caa.fabric.quitconfirm.client.toast.QuitToast; import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; public class ToastQuitHandler { - private final String message; + private final Text message; private State state = State.INACTIVE; private long startTime = 0; - public ToastQuitHandler(String message) { + public ToastQuitHandler(Text message) { this.message = message; } diff --git a/src/main/java/moe/caa/fabric/quitconfirm/client/main/QuitConfirm.java b/src/main/java/moe/caa/fabric/quitconfirm/client/main/QuitConfirm.java index ed667bf..42cbd09 100644 --- a/src/main/java/moe/caa/fabric/quitconfirm/client/main/QuitConfirm.java +++ b/src/main/java/moe/caa/fabric/quitconfirm/client/main/QuitConfirm.java @@ -17,9 +17,9 @@ public class QuitConfirm implements ClientModInitializer { public static final Logger LOGGER = LoggerFactory.getLogger("QuitConfirm"); - private final ToastQuitHandler toastInFinalQuitHandler = new ToastQuitHandler("退出这个游戏,请再次操作"); - private final ToastQuitHandler toastInSinglePlayerQuitHandle = new ToastQuitHandler("退出单人游戏,请再次操作"); - private final ToastQuitHandler toastInMultiplayerQuitHandle = new ToastQuitHandler("退出多人游戏,请再次操作"); + private final ToastQuitHandler toastInFinalQuitHandler = new ToastQuitHandler(Text.translatable("toast.quitconfirm.confirm.content.infinal")); + private final ToastQuitHandler toastInSinglePlayerQuitHandle = new ToastQuitHandler(Text.translatable("toast.quitconfirm.confirm.content.insingleplay")); + private final ToastQuitHandler toastInMultiplayerQuitHandle = new ToastQuitHandler(Text.translatable("toast.quitconfirm.confirm.content.inmultiplay")); @Override public void onInitializeClient() { @@ -29,7 +29,7 @@ public void onInitializeClient() { return toastInFinalQuitHandler.trigger(); } if (Config.config.confirmTypeInFinalQuit == Config.ConfirmTypeEnum.SCREEN) { - MinecraftClient.getInstance().setScreen(new ConfirmScreen(MinecraftClient.getInstance().currentScreen, Text.literal("退出这个游戏"), () -> MinecraftClient.getInstance().scheduleStop())); + MinecraftClient.getInstance().setScreen(new ConfirmScreen(MinecraftClient.getInstance().currentScreen, Text.translatable("screen.quitconfirm.confirm.content.infinal"), () -> MinecraftClient.getInstance().scheduleStop())); return EventResult.CANCEL; } return EventResult.PASS; @@ -51,7 +51,7 @@ public void onInitializeClient() { return toastInSinglePlayerQuitHandle.trigger(); } if (Config.config.confirmTypeInSinglePlayer == Config.ConfirmTypeEnum.SCREEN) { - MinecraftClient.getInstance().setScreen(new ConfirmScreen(MinecraftClient.getInstance().currentScreen, Text.literal("退出单人游戏"), button::onPress)); + MinecraftClient.getInstance().setScreen(new ConfirmScreen(MinecraftClient.getInstance().currentScreen, Text.translatable("screen.quitconfirm.confirm.content.insingleplay"), button::onPress)); return EventResult.CANCEL; } return EventResult.PASS; @@ -61,7 +61,7 @@ public void onInitializeClient() { return toastInMultiplayerQuitHandle.trigger(); } if (Config.config.confirmTypeInMultiplayer == Config.ConfirmTypeEnum.SCREEN) { - MinecraftClient.getInstance().setScreen(new ConfirmScreen(MinecraftClient.getInstance().currentScreen, Text.literal("退出多人游戏"), button::onPress)); + MinecraftClient.getInstance().setScreen(new ConfirmScreen(MinecraftClient.getInstance().currentScreen, Text.translatable("screen.quitconfirm.confirm.content.inmultiplay"), button::onPress)); return EventResult.CANCEL; } return EventResult.PASS; diff --git a/src/main/java/moe/caa/fabric/quitconfirm/client/screen/confirm/ConfirmScreen.java b/src/main/java/moe/caa/fabric/quitconfirm/client/screen/confirm/ConfirmScreen.java index 3ebccd3..3f34ad4 100644 --- a/src/main/java/moe/caa/fabric/quitconfirm/client/screen/confirm/ConfirmScreen.java +++ b/src/main/java/moe/caa/fabric/quitconfirm/client/screen/confirm/ConfirmScreen.java @@ -9,8 +9,8 @@ public class ConfirmScreen extends Screen { private final Text message; - private final ButtonWidget.PressAction onCancel; - private final ButtonWidget.PressAction onConfirm; + private final Runnable onCancel; + private final Runnable onConfirm; private final long openTime; private final BaseStyle style = Config.config.confirmScreenDisplayType.baseStyleSupplier.get(); private ButtonWidget cancel; @@ -23,15 +23,14 @@ public boolean isConfirmed() { } public ConfirmScreen(Screen parentScreen, Text message, Runnable confirm) { - this(parentScreen, message, button -> confirm.run()); - } - - public ConfirmScreen(Screen parentScreen, Text message, ButtonWidget.PressAction confirm) { - super(Text.literal("你确定?")); - openTime = System.currentTimeMillis(); + super(Text.translatable("screen.quitconfirm.confirm.title")); + this.openTime = System.currentTimeMillis(); this.message = message; - onCancel = (buttonWidget) -> this.client.setScreen(parentScreen); - onConfirm = confirm; + this.onCancel = () -> this.client.setScreen(parentScreen); + this.onConfirm = () -> { + confirmed = true; + confirm.run(); + }; } @Override @@ -50,10 +49,10 @@ public void tick() { private void initButton() { confirm = style.generateConfirmButtons(this, button -> { confirmed = true; - confirm.onPress(); + onConfirm.run(); }); - cancel = style.generateCancelButtons(this, onCancel); + cancel = style.generateCancelButtons(this, button -> onCancel.run()); confirm.active = false; cancel.active = false; @@ -70,7 +69,7 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (Config.config.enableScreenShortcutKey && keyCode == 257 /* ENTER */) { - onConfirm.onPress(confirm); + onConfirm.run(); } return super.keyPressed(keyCode, scanCode, modifiers); } @@ -79,4 +78,9 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { public boolean shouldCloseOnEsc() { return Config.config.enableScreenShortcutKey; } + + @Override + public void close() { + onCancel.run(); + } } \ No newline at end of file diff --git a/src/main/java/moe/caa/fabric/quitconfirm/client/screen/setting/SettingScreen.java b/src/main/java/moe/caa/fabric/quitconfirm/client/screen/setting/SettingScreen.java index e25fa60..1fbd6b4 100644 --- a/src/main/java/moe/caa/fabric/quitconfirm/client/screen/setting/SettingScreen.java +++ b/src/main/java/moe/caa/fabric/quitconfirm/client/screen/setting/SettingScreen.java @@ -16,7 +16,7 @@ public class SettingScreen extends Screen { private ButtonWidget back; public SettingScreen(Screen screen) { - super(Text.literal("设置")); + super(Text.translatable("config.quitconfirm.setting.title")); parentScreen = screen; } @@ -31,40 +31,40 @@ protected void init() { SettingElementListWidget listWidget = new SettingElementListWidget(this.client, this.width, this.height, 30 /* 上边距 */, height - 40/* 下边距 */, 24); { - MutableText category = Text.literal("设置退出二次确认的方式"); + MutableText category = Text.translatable("config.quitconfirm.setting.confirmtype.category"); listWidget.addEntry(listWidget.new CategoryEntry(category.setStyle(category.getStyle().withBold(true)), 11184810)); listWidget.addEntry(listWidget.new ButtonListEntry(ButtonWidget - .builder(Text.literal(Config.config.confirmTypeInFinalQuit.displayName), (button) -> { + .builder(Config.config.confirmTypeInFinalQuit.displayName, (button) -> { Config.config.confirmTypeInFinalQuit = Config.config.nextEnum(Config.ConfirmTypeEnum.class, Config.config.confirmTypeInFinalQuit); - button.setMessage(Text.literal(Config.config.confirmTypeInFinalQuit.displayName)); + button.setMessage((Config.config.confirmTypeInFinalQuit.displayName)); }) - .dimensions(0, 0, 40, 20).build(), Text.literal("关闭游戏窗口时的确认方式"))); + .dimensions(0, 0, 50, 20).build(), Text.translatable("config.quitconfirm.setting.confirmtype.infinal"))); listWidget.addEntry(listWidget.new ButtonListEntry(ButtonWidget - .builder(Text.literal(Config.config.confirmTypeInSinglePlayer.displayName), (button) -> { + .builder((Config.config.confirmTypeInSinglePlayer.displayName), (button) -> { Config.config.confirmTypeInSinglePlayer = Config.config.nextEnum(Config.ConfirmTypeEnum.class, Config.config.confirmTypeInSinglePlayer); - button.setMessage(Text.literal(Config.config.confirmTypeInSinglePlayer.displayName)); + button.setMessage((Config.config.confirmTypeInSinglePlayer.displayName)); }) - .dimensions(0, 0, 40, 20).build(), Text.literal("退出单人游戏时的确认方式"))); + .dimensions(0, 0, 50, 20).build(), Text.translatable("config.quitconfirm.setting.confirmtype.insingleplayer"))); listWidget.addEntry(listWidget.new ButtonListEntry(ButtonWidget - .builder(Text.literal(Config.config.confirmTypeInMultiplayer.displayName), (button) -> { + .builder((Config.config.confirmTypeInMultiplayer.displayName), (button) -> { Config.config.confirmTypeInMultiplayer = Config.config.nextEnum(Config.ConfirmTypeEnum.class, Config.config.confirmTypeInMultiplayer); - button.setMessage(Text.literal(Config.config.confirmTypeInMultiplayer.displayName)); + button.setMessage((Config.config.confirmTypeInMultiplayer.displayName)); }) - .dimensions(0, 0, 40, 20).build(), Text.literal("退出多人游戏时的确认方式"))); + .dimensions(0, 0, 50, 20).build(), Text.translatable("config.quitconfirm.setting.confirmtype.inmultiplayer"))); } { MutableText category = Text.literal("二次确认界面屏幕设定"); listWidget.addEntry(listWidget.new CategoryEntry(category.setStyle(category.getStyle().withBold(true)), 11184810)); listWidget.addEntry(listWidget.new ButtonListEntry(ButtonWidget - .builder(Text.literal(Config.config.confirmScreenDisplayType.displayName), (button) -> { + .builder((Config.config.confirmScreenDisplayType.displayName), (button) -> { Config.config.confirmScreenDisplayType = Config.config.nextEnum(Config.ConfirmScreenDisplayTypeEnum.class, Config.config.confirmScreenDisplayType); - button.setMessage(Text.literal(Config.config.confirmScreenDisplayType.displayName)); + button.setMessage((Config.config.confirmScreenDisplayType.displayName)); }) - .dimensions(0, 0, 40, 20).build(), Text.literal("确认屏幕样式"))); + .dimensions(0, 0, 50, 20).build(), Text.literal("确认屏幕样式"))); listWidget.addEntry(listWidget.new ButtonListEntry(ButtonWidget @@ -72,9 +72,9 @@ protected void init() { Config.config.enableScreenShortcutKey = !Config.config.enableScreenShortcutKey; button.setMessage(Config.config.enableScreenShortcutKey ? ScreenTexts.ON : ScreenTexts.OFF); }) - .dimensions(0, 0, 40, 20).build(), Text.literal("允许在二次确认屏幕上使用快捷键"))); + .dimensions(0, 0, 50, 20).build(), Text.literal("允许在二次确认屏幕上使用快捷键"))); - TextFieldWidget keepDark = new TextFieldWidget(client.textRenderer, 0, 0, 38, 20, Text.empty()); + TextFieldWidget keepDark = new TextFieldWidget(client.textRenderer, 0, 0, 48, 20, Text.empty()); keepDark.setText(String.valueOf(Config.config.keepDarkInConfirmScreenTime)); keepDark.setChangedListener(new PositiveLongParser(keepDark, (it) -> Config.config.keepDarkInConfirmScreenTime = it)); listWidget.addEntry(listWidget.new InputListEntry(keepDark, Text.literal("保持确认屏幕按钮不可用时长"))); @@ -83,17 +83,17 @@ protected void init() { MutableText category = Text.literal("二次确认土司设定"); listWidget.addEntry(listWidget.new CategoryEntry(category.setStyle(category.getStyle().withBold(true)), 11184810)); - TextFieldWidget toastDisplayTime = new TextFieldWidget(client.textRenderer, 0, 0, 38, 20, Text.empty()); + TextFieldWidget toastDisplayTime = new TextFieldWidget(client.textRenderer, 0, 0, 48, 20, Text.empty()); toastDisplayTime.setText(String.valueOf(Config.config.toastConfirmDisplayTime)); toastDisplayTime.setChangedListener(new PositiveLongParser(toastDisplayTime, (it) -> Config.config.toastConfirmDisplayTime = it)); listWidget.addEntry(listWidget.new InputListEntry(toastDisplayTime, Text.literal("土司持续时间"))); - TextFieldWidget toastStartAliveTime = new TextFieldWidget(client.textRenderer, 0, 0, 38, 20, Text.empty()); + TextFieldWidget toastStartAliveTime = new TextFieldWidget(client.textRenderer, 0, 0, 48, 20, Text.empty()); toastStartAliveTime.setText(String.valueOf(Config.config.toastConfirmStartAliveTime)); toastStartAliveTime.setChangedListener(new PositiveLongParser(toastStartAliveTime, (it) -> Config.config.toastConfirmStartAliveTime = it)); listWidget.addEntry(listWidget.new InputListEntry(toastStartAliveTime, Text.literal("土司响应开始时间"))); - TextFieldWidget toastEndAliveTime = new TextFieldWidget(client.textRenderer, 0, 0, 38, 20, Text.empty()); + TextFieldWidget toastEndAliveTime = new TextFieldWidget(client.textRenderer, 0, 0, 48, 20, Text.empty()); toastEndAliveTime.setText(String.valueOf(Config.config.toastConfirmEndAliveTime)); toastEndAliveTime.setChangedListener(new PositiveLongParser(toastEndAliveTime, (it) -> Config.config.toastConfirmEndAliveTime = it)); listWidget.addEntry(listWidget.new InputListEntry(toastEndAliveTime, Text.literal("土司响应结束时间"))); diff --git a/src/main/java/moe/caa/fabric/quitconfirm/client/toast/BaseToast.java b/src/main/java/moe/caa/fabric/quitconfirm/client/toast/BaseToast.java index abf5d22..0075b32 100644 --- a/src/main/java/moe/caa/fabric/quitconfirm/client/toast/BaseToast.java +++ b/src/main/java/moe/caa/fabric/quitconfirm/client/toast/BaseToast.java @@ -3,15 +3,16 @@ import net.minecraft.client.toast.Toast; import net.minecraft.client.toast.ToastManager; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; import net.minecraft.util.Identifier; public abstract class BaseToast implements Toast { protected static final Identifier texture = new Identifier("quitconfirm", "textures/gui/toasts.png"); - protected final String title; - protected final String message; + protected final Text title; + protected final Text message; protected final long keepTime; - protected BaseToast(String title, String message, long keepTime) { + protected BaseToast(Text title, Text message, long keepTime) { this.title = title; this.message = message; this.keepTime = keepTime; diff --git a/src/main/java/moe/caa/fabric/quitconfirm/client/toast/QuitToast.java b/src/main/java/moe/caa/fabric/quitconfirm/client/toast/QuitToast.java index 0c77f19..5516c11 100644 --- a/src/main/java/moe/caa/fabric/quitconfirm/client/toast/QuitToast.java +++ b/src/main/java/moe/caa/fabric/quitconfirm/client/toast/QuitToast.java @@ -9,17 +9,27 @@ import java.awt.*; public class QuitToast extends BaseToast { - public QuitToast(String message, long keepTime) { - super("退出提醒", message, keepTime); + public QuitToast(Text message, long keepTime) { + super(Text.translatable("toast.quitconfirm.confirm.title"), message, keepTime); + } + + @Override + public int getWidth() { + return 241; + } + + @Override + public int getHeight() { + return 32; } @Override protected void drawToast(MatrixStack matrices, ToastManager manager) { RenderSystem.setShaderTexture(0, texture); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); - DrawableHelper.drawTexture(matrices, 0, 0, 0, 0, 160, 32); - DrawableHelper.drawTexture(matrices, 8, 0, 241, 0, 15, 30); - manager.getClient().textRenderer.drawWithShadow(matrices, Text.literal(title), 35.0f, 7.0f, Color.WHITE.getRGB()); - manager.getClient().textRenderer.drawWithShadow(matrices, Text.literal(message), 35.0f, 18.0f, Color.WHITE.getRGB()); + DrawableHelper.drawTexture(matrices, 0, 0, 0, 0, getWidth(), getHeight()); + DrawableHelper.drawTexture(matrices, 8, 0, 242, 0, 15, 30); + manager.getClient().textRenderer.drawWithShadow(matrices, (title), 35.0f, 7.0f, Color.WHITE.getRGB()); + manager.getClient().textRenderer.drawWithShadow(matrices, (message), 35.0f, 18.0f, Color.WHITE.getRGB()); } } diff --git a/src/main/resources/assets/quitconfirm/lang/en_us.json b/src/main/resources/assets/quitconfirm/lang/en_us.json new file mode 100644 index 0000000..9de499e --- /dev/null +++ b/src/main/resources/assets/quitconfirm/lang/en_us.json @@ -0,0 +1,20 @@ +{ + "toast.quitconfirm.confirm.title": "Exit secondary confirmation.", + "toast.quitconfirm.confirm.content.infinal": "Close the game, please try again.", + "toast.quitconfirm.confirm.content.insingleplay": "Exit single player game, please try again.", + "toast.quitconfirm.confirm.content.inmultiplay": "Exit multi player game, please try again.", + "screen.quitconfirm.confirm.title": "Are you sure?", + "screen.quitconfirm.confirm.content.infinal": "Close the game.", + "screen.quitconfirm.confirm.content.insingleplay": "Exit single player game.", + "screen.quitconfirm.confirm.content.inmultiplay": "Exit multi player game.", + "config.quitconfirm.confirmtype.toast": "Toast", + "config.quitconfirm.confirmtype.screen": "Screen", + "config.quitconfirm.confirmtype.none": "Disable", + "config.quitconfirm.screentype.classic": "Classic", + "config.quitconfirm.screentype.bedrock": "Bedrock", + "config.quitconfirm.setting.title": "Settings", + "config.quitconfirm.setting.confirmtype.category": "Set the secondary confirmation method.", + "config.quitconfirm.setting.confirmtype.infinal": "When closing the window.", + "config.quitconfirm.setting.confirmtype.inmultiplayer": "When exiting a multiplayer game.", + "config.quitconfirm.setting.confirmtype.insingleplayer": "When exiting a single player game." +} \ No newline at end of file diff --git a/src/main/resources/assets/quitconfirm/lang/zh_cn.json b/src/main/resources/assets/quitconfirm/lang/zh_cn.json new file mode 100644 index 0000000..3608cc4 --- /dev/null +++ b/src/main/resources/assets/quitconfirm/lang/zh_cn.json @@ -0,0 +1,20 @@ +{ + "config.quitconfirm.confirmtype.toast": "土司", + "config.quitconfirm.confirmtype.screen": "屏幕", + "config.quitconfirm.confirmtype.none": "关", + "config.quitconfirm.screentype.classic": "经典", + "config.quitconfirm.screentype.bedrock": "基岩", + "config.quitconfirm.setting.title": "设置", + "config.quitconfirm.setting.confirmtype.infinal": "当关闭游戏窗口时", + "config.quitconfirm.setting.confirmtype.inmultiplayer": "当退出多人游戏时", + "config.quitconfirm.setting.confirmtype.insingleplayer": "当退出单人游戏时", + "config.quitconfirm.setting.confirmtype.category": "设置退出二次确认的方式。", + "toast.quitconfirm.confirm.title": "二次确认提示", + "toast.quitconfirm.confirm.content.infinal": "你将要关闭游戏,请再次操作以关闭", + "toast.quitconfirm.confirm.content.insingleplay": "你将要退出单人游戏,请再次操作", + "toast.quitconfirm.confirm.content.inmultiplay": "你将要退出多人游戏,请再次操作", + "screen.quitconfirm.confirm.title": "你确定码?", + "screen.quitconfirm.confirm.content.infinal": "关闭这个游戏", + "screen.quitconfirm.confirm.content.insingleplay": "退出单人游戏", + "screen.quitconfirm.confirm.content.inmultiplay": "退出多人游戏" +} \ No newline at end of file diff --git a/src/main/resources/assets/quitconfirm/textures/gui/toasts.png b/src/main/resources/assets/quitconfirm/textures/gui/toasts.png index f5cd29c..77ecd74 100644 Binary files a/src/main/resources/assets/quitconfirm/textures/gui/toasts.png and b/src/main/resources/assets/quitconfirm/textures/gui/toasts.png differ