Merge 80c92904adbe5306f7d253aa48d84c4d9942e63f into bd9ae189f83e33a6977bbe056774c851e96fe0a7

This commit is contained in:
郝某人BH 2025-09-21 17:26:58 +08:00 committed by GitHub
commit 5c53378bd3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 158 additions and 0 deletions

View File

@ -17,6 +17,7 @@
*/ */
package org.jackhuang.hmcl.ui.main; package org.jackhuang.hmcl.ui.main;
import com.jfoenix.controls.JFXButton;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.InvalidationListener; import javafx.beans.InvalidationListener;
import javafx.beans.WeakInvalidationListener; import javafx.beans.WeakInvalidationListener;
@ -32,10 +33,12 @@ import org.jackhuang.hmcl.upgrade.RemoteVersion;
import org.jackhuang.hmcl.upgrade.UpdateChannel; import org.jackhuang.hmcl.upgrade.UpdateChannel;
import org.jackhuang.hmcl.upgrade.UpdateChecker; import org.jackhuang.hmcl.upgrade.UpdateChecker;
import org.jackhuang.hmcl.upgrade.UpdateHandler; import org.jackhuang.hmcl.upgrade.UpdateHandler;
import org.jackhuang.hmcl.util.Restarter;
import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.StringUtils;
import org.jackhuang.hmcl.util.i18n.Locales; import org.jackhuang.hmcl.util.i18n.Locales;
import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.io.FileUtils;
import org.jackhuang.hmcl.util.io.IOUtils; import org.jackhuang.hmcl.util.io.IOUtils;
import org.jackhuang.hmcl.util.logging.Level;
import org.tukaani.xz.XZInputStream; import org.tukaani.xz.XZInputStream;
import java.io.IOException; import java.io.IOException;
@ -61,6 +64,8 @@ public final class SettingsPage extends SettingsView {
private InvalidationListener updateListener; private InvalidationListener updateListener;
private boolean ignoreLanguageChange = false;
public SettingsPage() { public SettingsPage() {
FXUtils.smoothScrolling(scroll); FXUtils.smoothScrolling(scroll);
@ -68,6 +73,39 @@ public final class SettingsPage extends SettingsView {
cboLanguage.getItems().setAll(Locales.LOCALES); cboLanguage.getItems().setAll(Locales.LOCALES);
selectedItemPropertyFor(cboLanguage).bindBidirectional(config().localizationProperty()); selectedItemPropertyFor(cboLanguage).bindBidirectional(config().localizationProperty());
cboLanguage.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
if (ignoreLanguageChange) return;
if (oldValue != null && newValue != null && !oldValue.equals(newValue)) {
JFXButton restartButton = new JFXButton(i18n("button.restart"));
restartButton.getStyleClass().add("dialog-accept");
restartButton.setOnAction(e -> {
try {
Restarter.builder().restart();
} catch (IOException ex) {
LOG.log(Level.WARNING, "Failed to restart", ex);
ignoreLanguageChange = true;
cboLanguage.getSelectionModel().select(oldValue);
ignoreLanguageChange = false;
}
});
Runnable cancelAction = () -> {
ignoreLanguageChange = true;
cboLanguage.getSelectionModel().select(newValue);
ignoreLanguageChange = false;
};
Controllers.confirmAction(
i18n("settings.launcher.language.restart"),
i18n("message.info"),
MessageType.INFO,
restartButton,
cancelAction
);
}
});
disableAutoGameOptionsPane.selectedProperty().bindBidirectional(config().disableAutoGameOptionsProperty()); disableAutoGameOptionsPane.selectedProperty().bindBidirectional(config().disableAutoGameOptionsProperty());
// ==== // ====

View File

@ -0,0 +1,105 @@
/*
* Hello Minecraft! Launcher
* Copyright (C) 2020 huangyuhui <huanghongxun2008@126.com> and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.jackhuang.hmcl.util;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.jackhuang.hmcl.EntryPoint;
import org.jackhuang.hmcl.java.JavaRuntime;
import org.jackhuang.hmcl.util.io.JarUtils;
/**
* <p>A common restart tool class, used for:</p>
* <ul>
* <li>Restart after update</li>
* <li>Restart after switching interface language</li>
* <li>Any scenario that requires a restart to take effect</li>
* </ul>
*/
public final class Restarter {
private final List<String> jvmOptions = new ArrayList<>();
private final List<String> programArgs = new ArrayList<>();
private Path jarPath;
private Restarter() { }
public static Restarter builder() {
return new Restarter();
}
public Restarter addSystemProperty(String key, String value) {
jvmOptions.add("-D" + key + "=" + value);
return this;
}
public Restarter addProgramArguments(List<String> args) {
programArgs.addAll(args);
return this;
}
/**
* <p>
* Set the JAR path to start
* If not, the current running JAR will be used by default
* </p>
*/
public Restarter setJarPath(Path jarPath) {
this.jarPath = jarPath;
return this;
}
public void restart() throws IOException {
Path jar = this.jarPath;
if (jar == null) {
jar = JarUtils.thisJarPath();
}
if (jar == null) {
throw new IOException("Cannot locate JAR file");
}
List<String> command = new ArrayList<>();
command.add(JavaRuntime.getDefault().getBinary().toString());
for (Map.Entry<Object, Object> e : System.getProperties().entrySet()) {
Object k = e.getKey();
if (k instanceof String && ((String) k).startsWith("hmcl.")) {
command.add("-D" + k + "=" + e.getValue());
}
}
command.addAll(jvmOptions);
command.add("-jar");
command.add(jar.toAbsolutePath().toString());
command.addAll(programArgs);
new ProcessBuilder(command)
.directory(new File(System.getProperty("user.dir")))
.inheritIO()
.start();
EntryPoint.exit(0);
}
}

View File

@ -195,6 +195,7 @@ button.save_as=Save As
button.select_all=Select All button.select_all=Select All
button.view=View button.view=View
button.yes=Yes button.yes=Yes
button.restart=Restart
chat=Join Group Chat chat=Join Group Chat
@ -1362,6 +1363,7 @@ settings.launcher.font.anti_aliasing.gray=Grayscale
settings.launcher.font.anti_aliasing.lcd=Sub-pixel settings.launcher.font.anti_aliasing.lcd=Sub-pixel
settings.launcher.general=General settings.launcher.general=General
settings.launcher.language=Language (Applies After Restart) settings.launcher.language=Language (Applies After Restart)
settings.launcher.language.restart=Changing the language requires restarting the launcher to take effect. Restart now?
settings.launcher.launcher_log.export=Export Launcher Logs settings.launcher.launcher_log.export=Export Launcher Logs
settings.launcher.launcher_log.export.failed=Failed to export logs. settings.launcher.launcher_log.export.failed=Failed to export logs.
settings.launcher.launcher_log.export.success=Logs have been exported to "%s". settings.launcher.launcher_log.export.success=Logs have been exported to "%s".

View File

@ -195,6 +195,7 @@ button.save_as=Guardar como
button.select_all=Seleccionar todo button.select_all=Seleccionar todo
button.view=Vista button.view=Vista
button.yes= button.yes=
button.restart=Reiniciar
chat=Chat de grupo chat=Chat de grupo
@ -1358,6 +1359,7 @@ settings.launcher.font.anti_aliasing.gray=Escala de grises
settings.launcher.font.anti_aliasing.lcd=Subpíxel settings.launcher.font.anti_aliasing.lcd=Subpíxel
settings.launcher.general=General settings.launcher.general=General
settings.launcher.language=Idioma settings.launcher.language=Idioma
settings.launcher.language.restart=¿Reiniciar ahora? El cambio de idioma requiere reiniciar el launcher para que surta efecto.
settings.launcher.launcher_log.export=Exportar registros del launcher settings.launcher.launcher_log.export=Exportar registros del launcher
settings.launcher.launcher_log.export.failed=No se han podido exportar los registros settings.launcher.launcher_log.export.failed=No se han podido exportar los registros
settings.launcher.launcher_log.export.success=Los registros se han exportado a «%s» settings.launcher.launcher_log.export.success=Los registros se han exportado a «%s»

View File

@ -156,6 +156,7 @@ button.save_as=名前を付けて保存
button.select_all=すべて選択 button.select_all=すべて選択
button.view=読む button.view=読む
button.yes=はい button.yes=はい
button.restart=再起動
chat=グループチャット chat=グループチャット
@ -852,6 +853,7 @@ settings.launcher.enable_game_list=メインページにバージョンリスト
settings.launcher.font=フォント settings.launcher.font=フォント
settings.launcher.general=全般的 settings.launcher.general=全般的
settings.launcher.language=言語 settings.launcher.language=言語
settings.launcher.language.restart=言語を変更するにはランチャーを再起動する必要があります。今すぐ再起動しますか?
settings.launcher.launcher_log.export=ランチャーログのエクスポート settings.launcher.launcher_log.export=ランチャーログのエクスポート
settings.launcher.launcher_log.export.failed=ログのエクスポートに失敗しました settings.launcher.launcher_log.export.failed=ログのエクスポートに失敗しました
settings.launcher.launcher_log.export.success=ログが %s にエクスポートされました settings.launcher.launcher_log.export.success=ログが %s にエクスポートされました

View File

@ -205,6 +205,7 @@ button.save_as=另存
button.select_all=悉擇之 button.select_all=悉擇之
button.view= button.view=
button.yes= button.yes=
button.restart=復啟
chat=會集 chat=會集

View File

@ -196,6 +196,7 @@ button.save_as=Сохранить как
button.select_all=Выбрать все button.select_all=Выбрать все
button.view=Просмотреть button.view=Просмотреть
button.yes=Да button.yes=Да
button.restart=Перезагрузить
chat=Групповой чат chat=Групповой чат
@ -1358,6 +1359,7 @@ settings.launcher.font.anti_aliasing.gray=Оттенки серого
settings.launcher.font.anti_aliasing.lcd=Субпиксель settings.launcher.font.anti_aliasing.lcd=Субпиксель
settings.launcher.general=Общие settings.launcher.general=Общие
settings.launcher.language=Язык (Применится после перезапуска) settings.launcher.language=Язык (Применится после перезапуска)
settings.launcher.language.restart=Для применения изменений языка требуется перезагрузка лаунчера. Перезагрузить сейчас?
settings.launcher.launcher_log.export=Экспорт логов лаунчера settings.launcher.launcher_log.export=Экспорт логов лаунчера
settings.launcher.launcher_log.export.failed=Не удалось экспортировать логи settings.launcher.launcher_log.export.failed=Не удалось экспортировать логи
settings.launcher.launcher_log.export.success=Логи экспортированы в %s settings.launcher.launcher_log.export.success=Логи экспортированы в %s

View File

@ -193,6 +193,7 @@ button.save_as=Зберегти як
button.select_all=Вибрати все button.select_all=Вибрати все
button.view=Переглянути button.view=Переглянути
button.yes=Так button.yes=Так
button.restart=Перезавантажити
chat=Приєднатися до групового чату chat=Приєднатися до групового чату
@ -1299,6 +1300,7 @@ settings.launcher.font.anti_aliasing.gray=Відтінки сірого
settings.launcher.font.anti_aliasing.lcd=Субпіксельне settings.launcher.font.anti_aliasing.lcd=Субпіксельне
settings.launcher.general=Загальні settings.launcher.general=Загальні
settings.launcher.language=Мова (Застосовується після перезавантаження) settings.launcher.language=Мова (Застосовується після перезавантаження)
settings.launcher.language.restart=Для застосування зміни мови необхідно перезавантажити лаунчер. Перезавантажити зараз?
settings.launcher.launcher_log.export=Експортувати журнали лаунчера settings.launcher.launcher_log.export=Експортувати журнали лаунчера
settings.launcher.launcher_log.export.failed=Не вдалося експортувати журнали. settings.launcher.launcher_log.export.failed=Не вдалося експортувати журнали.
settings.launcher.launcher_log.export.success=Журнали було експортовано до "%s". settings.launcher.launcher_log.export.success=Журнали було експортовано до "%s".

View File

@ -198,6 +198,7 @@ button.save_as=另存新檔
button.select_all=全選 button.select_all=全選
button.view=查看 button.view=查看
button.yes= button.yes=
button.restart=重新啟動
chat=官方群組 chat=官方群組
@ -1150,6 +1151,7 @@ settings.launcher.font.anti_aliasing.gray=灰階
settings.launcher.font.anti_aliasing.lcd=子像素 settings.launcher.font.anti_aliasing.lcd=子像素
settings.launcher.general=一般 settings.launcher.general=一般
settings.launcher.language=語言 (重啟後生效) settings.launcher.language=語言 (重啟後生效)
settings.launcher.language.restart=切換語言需要重新啟動啟動器才能生效。是否立即重新啟動?
settings.launcher.launcher_log.export=匯出啟動器日誌 settings.launcher.launcher_log.export=匯出啟動器日誌
settings.launcher.launcher_log.export.failed=無法匯出日誌。 settings.launcher.launcher_log.export.failed=無法匯出日誌。
settings.launcher.launcher_log.export.success=日誌已儲存到「%s」。 settings.launcher.launcher_log.export.success=日誌已儲存到「%s」。

View File

@ -206,6 +206,7 @@ button.save_as=另存为
button.select_all=全选 button.select_all=全选
button.view=查看 button.view=查看
button.yes= button.yes=
button.restart=立即重启
chat=官方群组 chat=官方群组
@ -1161,6 +1162,7 @@ settings.launcher.font.anti_aliasing.gray=灰度
settings.launcher.font.anti_aliasing.lcd=子像素 settings.launcher.font.anti_aliasing.lcd=子像素
settings.launcher.general=通用 settings.launcher.general=通用
settings.launcher.language=语言 (重启后生效) settings.launcher.language=语言 (重启后生效)
settings.launcher.language.restart=切换语言需要重启启动器才能生效。是否立即重启?
settings.launcher.launcher_log.export=导出启动器日志 settings.launcher.launcher_log.export=导出启动器日志
settings.launcher.launcher_log.export.failed=无法导出日志 settings.launcher.launcher_log.export.failed=无法导出日志
settings.launcher.launcher_log.export.success=日志已保存到“%s” settings.launcher.launcher_log.export.success=日志已保存到“%s”