From f6836ac920322c63ce046547f2b1c45f5086988d Mon Sep 17 00:00:00 2001 From: Ciilu <109708109+Ciilu@users.noreply.github.com> Date: Fri, 12 Sep 2025 23:30:23 +0800 Subject: [PATCH 1/2] update --- .../main/java/org/jackhuang/hmcl/ui/Controllers.java | 9 +++++++++ .../org/jackhuang/hmcl/ui/construct/Navigator.java | 11 +++++++++-- .../hmcl/ui/decorator/DecoratorController.java | 12 ++++++++++-- .../org/jackhuang/hmcl/ui/main/SettingsPage.java | 12 ++++++++++++ HMCL/src/main/java/org/jackhuang/hmcl/util/Lazy.java | 9 ++++++--- 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java index a4273bb1c..e8d467ec9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -474,4 +474,13 @@ public final class Controllers { FXUtils.shutdown(); } + + public static void resetAllLazyPage() { + rootPage.reset(); + versionPage.reset(); + gameListPage.reset(); + downloadPage.reset(); + accountListPage.reset(); + settingsPage.reset(); + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/Navigator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/Navigator.java index 4ec498992..f4c632588 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/Navigator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/Navigator.java @@ -45,16 +45,23 @@ public class Navigator extends TransitionPane { private boolean initialized = false; public void init(Node init) { - stack.push(init); backable.set(canGoBack()); + setRootPage(init); getChildren().setAll(init); - fireEvent(new NavigationEvent(this, init, Navigation.NavigationDirection.START, NavigationEvent.NAVIGATED)); if (init instanceof PageAware) ((PageAware) init).onPageShown(); initialized = true; } + public void setRootPage(Node root) { + if (stack.isEmpty()) { + stack.push(root); + } else { + stack.set(0, root); + } + } + public void navigate(Node node, AnimationProducer animationProducer) { FXUtils.checkFxUserThread(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java index 27ff5bccf..4f28bd180 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/decorator/DecoratorController.java @@ -53,8 +53,8 @@ import org.jackhuang.hmcl.ui.animation.AnimationUtils; import org.jackhuang.hmcl.ui.animation.ContainerAnimations; import org.jackhuang.hmcl.ui.construct.DialogAware; import org.jackhuang.hmcl.ui.construct.DialogCloseEvent; -import org.jackhuang.hmcl.ui.construct.Navigator; import org.jackhuang.hmcl.ui.construct.JFXDialogPane; +import org.jackhuang.hmcl.ui.construct.Navigator; import org.jackhuang.hmcl.ui.wizard.Refreshable; import org.jackhuang.hmcl.ui.wizard.WizardProvider; import org.jackhuang.hmcl.util.Lang; @@ -65,7 +65,10 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; +import java.util.List; +import java.util.Locale; +import java.util.Optional; +import java.util.Random; import java.util.stream.Stream; import static java.util.stream.Collectors.toList; @@ -547,4 +550,9 @@ public class DecoratorController { decorator.addEventFilter(DragEvent.DRAG_DROPPED, AuthlibInjectorDnD.dragDroppedHandler( url -> Controllers.dialog(new AddAuthlibInjectorServerPane(url)))); } + + public void setRootPage(Node n) { + navigator.setRootPage(n); + navigator.clear(); + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java index f937da70d..020bc6aaf 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java @@ -28,11 +28,14 @@ import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.construct.MessageDialogPane.MessageType; +import org.jackhuang.hmcl.ui.decorator.Decorator; +import org.jackhuang.hmcl.ui.decorator.DecoratorController; import org.jackhuang.hmcl.upgrade.RemoteVersion; import org.jackhuang.hmcl.upgrade.UpdateChannel; import org.jackhuang.hmcl.upgrade.UpdateChecker; import org.jackhuang.hmcl.upgrade.UpdateHandler; import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.i18n.I18n; import org.jackhuang.hmcl.util.i18n.Locales; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.io.IOUtils; @@ -68,6 +71,15 @@ public final class SettingsPage extends SettingsView { // ==== Languages ==== cboLanguage.getItems().setAll(Locales.LOCALES); selectedItemPropertyFor(cboLanguage).bindBidirectional(config().localizationProperty()); + selectedItemPropertyFor(cboLanguage).addListener((observableValue, oldValue, newValue) -> { + I18n.setLocale(newValue); + + Controllers.resetAllLazyPage(); + + System.gc(); + + Controllers.getDecorator().setRootPage(Controllers.getRootPage()); + }); disableAutoGameOptionsPane.selectedProperty().bindBidirectional(config().disableAutoGameOptionsProperty()); // ==== diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/Lazy.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/Lazy.java index dacdea2d3..a6bd427b8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/Lazy.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/Lazy.java @@ -26,7 +26,7 @@ import java.util.function.Supplier; * @param value type */ public final class Lazy { - private Supplier supplier; + private final Supplier supplier; private T value = null; public Lazy(Supplier supplier) { @@ -34,10 +34,13 @@ public final class Lazy { } public T get() { - if (supplier != null) { + if (value == null) { value = supplier.get(); - supplier = null; } return value; } + + public void reset() { + value = null; + } } From 5844cf25a6982fbbcafea95978a8eac38ec7e19c Mon Sep 17 00:00:00 2001 From: Ciilu <109708109+Ciilu@users.noreply.github.com> Date: Fri, 12 Sep 2025 23:35:37 +0800 Subject: [PATCH 2/2] i18n --- HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java | 2 -- HMCL/src/main/resources/assets/lang/I18N.properties | 2 +- HMCL/src/main/resources/assets/lang/I18N_lzh.properties | 2 +- HMCL/src/main/resources/assets/lang/I18N_ru.properties | 2 +- HMCL/src/main/resources/assets/lang/I18N_uk.properties | 2 +- HMCL/src/main/resources/assets/lang/I18N_zh.properties | 2 +- HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties | 2 +- 7 files changed, 6 insertions(+), 8 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java index 020bc6aaf..5e58663f2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java @@ -28,8 +28,6 @@ import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.construct.MessageDialogPane.MessageType; -import org.jackhuang.hmcl.ui.decorator.Decorator; -import org.jackhuang.hmcl.ui.decorator.DecoratorController; import org.jackhuang.hmcl.upgrade.RemoteVersion; import org.jackhuang.hmcl.upgrade.UpdateChannel; import org.jackhuang.hmcl.upgrade.UpdateChecker; diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 2bcb9b5b3..ea50c3810 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1357,7 +1357,7 @@ settings.launcher.font.anti_aliasing.auto=Auto settings.launcher.font.anti_aliasing.gray=Grayscale settings.launcher.font.anti_aliasing.lcd=Sub-pixel settings.launcher.general=General -settings.launcher.language=Language (Applies After Restart) +settings.launcher.language=Language settings.launcher.launcher_log.export=Export Launcher Logs settings.launcher.launcher_log.export.failed=Failed to export logs. settings.launcher.launcher_log.export.success=Logs have been exported to "%s". diff --git a/HMCL/src/main/resources/assets/lang/I18N_lzh.properties b/HMCL/src/main/resources/assets/lang/I18N_lzh.properties index 121a37f21..aa557716a 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_lzh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_lzh.properties @@ -1155,7 +1155,7 @@ settings.launcher.font.anti_aliasing.auto=自調 settings.launcher.font.anti_aliasing.gray=灰階 settings.launcher.font.anti_aliasing.lcd=子像素 settings.launcher.general=貫用 -settings.launcher.language=文 (複啟而效) +settings.launcher.language=文 settings.launcher.launcher_log.export=錄出啟者之誌 settings.launcher.launcher_log.export.failed=錄誌出而未成 settings.launcher.launcher_log.export.success=誌既存於「%s」 diff --git a/HMCL/src/main/resources/assets/lang/I18N_ru.properties b/HMCL/src/main/resources/assets/lang/I18N_ru.properties index f25afb1c3..599cadd0c 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ru.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ru.properties @@ -1355,7 +1355,7 @@ settings.launcher.font.anti_aliasing.auto=Автоматический settings.launcher.font.anti_aliasing.gray=Оттенки серого settings.launcher.font.anti_aliasing.lcd=Субпиксель settings.launcher.general=Общие -settings.launcher.language=Язык (Применится после перезапуска) +settings.launcher.language=Язык settings.launcher.launcher_log.export=Экспорт логов лаунчера settings.launcher.launcher_log.export.failed=Не удалось экспортировать логи settings.launcher.launcher_log.export.success=Логи экспортированы в %s diff --git a/HMCL/src/main/resources/assets/lang/I18N_uk.properties b/HMCL/src/main/resources/assets/lang/I18N_uk.properties index 525038c87..7dde2db46 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_uk.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_uk.properties @@ -1296,7 +1296,7 @@ settings.launcher.font.anti_aliasing.auto=Авто settings.launcher.font.anti_aliasing.gray=Відтінки сірого settings.launcher.font.anti_aliasing.lcd=Субпіксельне settings.launcher.general=Загальні -settings.launcher.language=Мова (Застосовується після перезавантаження) +settings.launcher.language=Мова settings.launcher.launcher_log.export=Експортувати журнали лаунчера settings.launcher.launcher_log.export.failed=Не вдалося експортувати журнали. settings.launcher.launcher_log.export.success=Журнали було експортовано до "%s". diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index ebb749f8e..683104eca 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -1145,7 +1145,7 @@ settings.launcher.font.anti_aliasing.auto=自動 settings.launcher.font.anti_aliasing.gray=灰階 settings.launcher.font.anti_aliasing.lcd=子像素 settings.launcher.general=一般 -settings.launcher.language=語言 (重啟後生效) +settings.launcher.language=語言 settings.launcher.launcher_log.export=匯出啟動器日誌 settings.launcher.launcher_log.export.failed=無法匯出日誌。 settings.launcher.launcher_log.export.success=日誌已儲存到「%s」。 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 59c813c05..e444442b7 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -1156,7 +1156,7 @@ settings.launcher.font.anti_aliasing.auto=自动 settings.launcher.font.anti_aliasing.gray=灰度 settings.launcher.font.anti_aliasing.lcd=子像素 settings.launcher.general=通用 -settings.launcher.language=语言 (重启后生效) +settings.launcher.language=语言 settings.launcher.launcher_log.export=导出启动器日志 settings.launcher.launcher_log.export.failed=无法导出日志 settings.launcher.launcher_log.export.success=日志已保存到“%s”