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 8a0b682a0..d3ab60159 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -494,4 +494,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 692b1378e..5f92bb676 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 @@ -33,6 +33,7 @@ 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; @@ -67,6 +68,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; + } } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 56064f3d5..034fd98b5 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1361,7 +1361,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 b117bf296..6a08be09d 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_lzh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_lzh.properties @@ -1157,7 +1157,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 310a52a46..2c988ec09 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ru.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ru.properties @@ -1357,7 +1357,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 bf2a920e3..701d184ea 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_uk.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_uk.properties @@ -1298,7 +1298,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 d01764c5f..6e0a7b23e 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -1149,7 +1149,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 43603a3cb..2a3f77a23 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -1160,7 +1160,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”