From e5ee5702f854b7004044a55e043f673119dfed8d Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sun, 1 Jul 2018 21:08:02 +0800 Subject: [PATCH 1/5] Move i18n things to util.i18n package --- .../java/org/jackhuang/hmcl/Launcher.java | 18 +------ .../jackhuang/hmcl/game/LauncherHelper.java | 38 ++++++++------- .../org/jackhuang/hmcl/game/LoadingState.java | 4 +- .../org/jackhuang/hmcl/setting/Profiles.java | 6 +-- .../org/jackhuang/hmcl/setting/Settings.java | 1 + .../org/jackhuang/hmcl/ui/AccountPage.java | 5 +- .../org/jackhuang/hmcl/ui/AddAccountPane.java | 33 ++++++------- .../hmcl/ui/AuthlibInjectorServersPage.java | 7 +-- .../org/jackhuang/hmcl/ui/CrashWindow.java | 9 ++-- .../java/org/jackhuang/hmcl/ui/Decorator.java | 2 +- .../java/org/jackhuang/hmcl/ui/FXUtils.java | 4 +- .../hmcl/ui/InstallerController.java | 5 +- .../org/jackhuang/hmcl/ui/InstallerItem.java | 5 +- .../jackhuang/hmcl/ui/LeftPaneController.java | 23 ++++----- .../java/org/jackhuang/hmcl/ui/LogWindow.java | 5 +- .../java/org/jackhuang/hmcl/ui/MainPage.java | 47 ++++++++++--------- .../org/jackhuang/hmcl/ui/ModController.java | 13 ++--- .../java/org/jackhuang/hmcl/ui/ModItem.java | 7 +-- .../org/jackhuang/hmcl/ui/ProfilePage.java | 5 +- .../org/jackhuang/hmcl/ui/SettingsPage.java | 22 +++++---- .../org/jackhuang/hmcl/ui/VersionItem.java | 11 +++-- .../org/jackhuang/hmcl/ui/VersionPage.java | 19 ++++---- .../hmcl/ui/VersionSettingsController.java | 17 +++---- .../jackhuang/hmcl/ui/construct/FileItem.java | 5 +- .../hmcl/ui/construct/ImagePickerItem.java | 5 +- .../hmcl/ui/construct/MessageBox.java | 5 +- .../hmcl/ui/construct/MessageDialogPane.java | 7 +-- .../hmcl/ui/construct/MultiColorItem.java | 7 +-- .../hmcl/ui/construct/MultiFileItem.java | 9 ++-- .../TaskExecutorDialogWizardDisplayer.java | 9 ++-- .../hmcl/ui/construct/TaskListPane.java | 27 ++++++----- .../ui/download/AdditionalInstallersPage.java | 27 +++++------ .../ui/download/DownloadWizardProvider.java | 10 ++-- .../hmcl/ui/download/InstallTypePage.java | 5 +- .../ui/download/InstallerWizardProvider.java | 7 +-- .../hmcl/ui/download/InstallersPage.java | 27 ++++++----- .../hmcl/ui/download/ModpackPage.java | 17 +++---- .../hmcl/ui/download/VersionsPageItem.java | 9 ++-- .../ui/export/ModpackFileSelectionPage.java | 31 ++++++------ .../hmcl/ui/export/ModpackInfoPage.java | 7 +-- .../hmcl/upgrade/AppDataUpgrader.java | 7 +-- .../hmcl/upgrade/NewFileUpgrader.java | 7 +-- .../jackhuang/hmcl/upgrade/UpdateChecker.java | 3 +- .../jackhuang/hmcl/util/CrashReporter.java | 25 +++++----- .../org/jackhuang/hmcl/util/i18n/I18n.java | 45 ++++++++++++++++++ .../hmcl/util/{ => i18n}/I18nException.java | 4 +- .../hmcl/{setting => util/i18n}/Locales.java | 5 +- .../construct => util/i18n}/UTF8Control.java | 14 +++--- 48 files changed, 350 insertions(+), 280 deletions(-) create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java rename HMCL/src/main/java/org/jackhuang/hmcl/util/{ => i18n}/I18nException.java (94%) rename HMCL/src/main/java/org/jackhuang/hmcl/{setting => util/i18n}/Locales.java (97%) rename HMCL/src/main/java/org/jackhuang/hmcl/{ui/construct => util/i18n}/UTF8Control.java (89%) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index 38a479c5c..9a95c7b01 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -21,7 +21,7 @@ import com.jfoenix.concurrency.JFXUtilities; import javafx.application.Application; import javafx.application.Platform; import javafx.stage.Stage; -import org.jackhuang.hmcl.setting.Settings; + import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.Controllers; @@ -37,9 +37,7 @@ import java.net.URLClassLoader; import java.util.Arrays; import java.util.LinkedList; import java.util.List; -import java.util.ResourceBundle; import java.util.concurrent.TimeUnit; -import java.util.logging.Level; public final class Launcher extends Application { @@ -139,19 +137,6 @@ public final class Launcher extends Application { return result; } - public static String i18n(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (Exception e) { - Logging.LOG.log(Level.SEVERE, "Cannot find key " + key + " in resource bundle", e); - return key; - } - } - - public static String i18n(String key, Object... formatArgs) { - return String.format(i18n(key), formatArgs); - } - public static final File MINECRAFT_DIRECTORY = OperatingSystem.getWorkingDirectory("minecraft"); public static final File HMCL_DIRECTORY = OperatingSystem.getWorkingDirectory("hmcl"); public static final File LOG_DIRECTORY = new File(Launcher.HMCL_DIRECTORY, "logs"); @@ -159,7 +144,6 @@ public final class Launcher extends Application { public static final String VERSION = System.getProperty("hmcl.version.override", "@HELLO_MINECRAFT_LAUNCHER_VERSION_FOR_GRADLE_REPLACING@"); public static final String NAME = "HMCL"; public static final String TITLE = NAME + " " + VERSION; - public static final ResourceBundle RESOURCE_BUNDLE = Settings.INSTANCE.getLocale().getResourceBundle(); public static final UpdateChecker UPDATE_CHECKER = new UpdateChecker(VersionNumber.asVersion(VERSION)); public static final IUpgrader UPGRADER = new AppDataUpgrader(); public static final CrashReporter CRASH_REPORTER = new CrashReporter(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index c4120f3cf..9534e8272 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -41,6 +41,8 @@ import org.jackhuang.hmcl.ui.LogWindow; import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogPane; import org.jackhuang.hmcl.util.*; +import org.jackhuang.hmcl.util.i18n.I18n; +import org.jackhuang.hmcl.util.i18n.I18nException; import java.io.File; import java.io.IOException; @@ -106,7 +108,7 @@ public final class LauncherHelper { } }) .then(Task.of(Schedulers.javafx(), () -> emitStatus(LoadingState.LOGGING_IN))) - .then(Task.of(Launcher.i18n("account.methods"), variables -> { + .then(Task.of(I18n.i18n("account.methods"), variables -> { try { variables.set("account", account.logIn()); } catch (CredentialExpiredException e) { @@ -131,12 +133,12 @@ public final class LauncherHelper { .then(variables -> { DefaultLauncher launcher = variables.get("launcher"); if (scriptFile == null) { - return new LaunchTask<>(launcher::launch).setName(Launcher.i18n("version.launch")); + return new LaunchTask<>(launcher::launch).setName(I18n.i18n("version.launch")); } else { return new LaunchTask<>(() -> { launcher.makeLaunchScript(scriptFile); return null; - }).setName(Launcher.i18n("version.launch_script")); + }).setName(I18n.i18n("version.launch_script")); } }) .then(Task.of(variables -> { @@ -153,7 +155,7 @@ public final class LauncherHelper { } else Platform.runLater(() -> { Controllers.closeDialog(launchingStepsPane); - Controllers.dialog(Launcher.i18n("version.launch_script.success", scriptFile.getAbsolutePath())); + Controllers.dialog(I18n.i18n("version.launch_script.success", scriptFile.getAbsolutePath())); }); })) @@ -182,11 +184,11 @@ public final class LauncherHelper { if (ex != null) { String message; if (ex instanceof CurseCompletionException) - message = Launcher.i18n("modpack.type.curse.error"); + message = I18n.i18n("modpack.type.curse.error"); else message = I18nException.getStackTrace(ex); Controllers.dialog(message, - scriptFile == null ? Launcher.i18n("launch.failed") : Launcher.i18n("version.launch_script.failed"), + scriptFile == null ? I18n.i18n("launch.failed") : I18n.i18n("version.launch_script.failed"), MessageBox.ERROR_MESSAGE); } } @@ -207,7 +209,7 @@ public final class LauncherHelper { VersionNumber gameVersion = VersionNumber.asVersion(GameVersion.minecraftVersion(profile.getRepository().getVersionJar(version)).orElse("Unknown")); JavaVersion java = setting.getJavaVersion(); if (java == null) { - Controllers.dialog(Launcher.i18n("launch.wrong_javadir"), Launcher.i18n("message.error"), MessageBox.WARNING_MESSAGE, onAccept); + Controllers.dialog(I18n.i18n("launch.wrong_javadir"), I18n.i18n("message.error"), MessageBox.WARNING_MESSAGE, onAccept); setting.setJava(null); setting.setDefaultJavaPath(null); java = JavaVersion.fromCurrentEnvironment(); @@ -218,10 +220,10 @@ public final class LauncherHelper { if (gameVersion.compareTo(VersionNumber.asVersion("1.13")) >= 0) { // Minecraft 1.13 and later versions only support Java 8 or later. // Terminate launching operation. - Controllers.dialog(Launcher.i18n("launch.advice.java8_1_13"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, null); + Controllers.dialog(I18n.i18n("launch.advice.java8_1_13"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE, null); } else { // Most mods require Java 8 or later version. - Controllers.dialog(Launcher.i18n("launch.advice.newer_java"), Launcher.i18n("message.error"), MessageBox.WARNING_MESSAGE, onAccept); + Controllers.dialog(I18n.i18n("launch.advice.newer_java"), I18n.i18n("message.error"), MessageBox.WARNING_MESSAGE, onAccept); } flag = true; } @@ -229,24 +231,24 @@ public final class LauncherHelper { // LaunchWrapper will crash because of assuming the system class loader is an instance of URLClassLoader. // cpw has claimed that he will make MinecraftForge of 1.13 and later versions able to run on Java 9. if (!flag && java.getParsedVersion() >= JavaVersion.JAVA_9 && gameVersion.compareTo(VersionNumber.asVersion("1.12.5")) < 0 && version.getMainClass().contains("launchwrapper")) { - Controllers.dialog(Launcher.i18n("launch.advice.java9"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, null); + Controllers.dialog(I18n.i18n("launch.advice.java9"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE, null); flag = true; } if (!flag && java.getPlatform() == org.jackhuang.hmcl.util.Platform.BIT_32 && org.jackhuang.hmcl.util.Platform.IS_64_BIT) { - Controllers.dialog(Launcher.i18n("launch.advice.different_platform"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); + Controllers.dialog(I18n.i18n("launch.advice.different_platform"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); flag = true; } if (!flag && java.getPlatform() == org.jackhuang.hmcl.util.Platform.BIT_32 && setting.getMaxMemory() > 1.5 * 1024) { // 1.5 * 1024 is an inaccurate number. // Actual memory limit depends on operating system and memory. - Controllers.dialog(Launcher.i18n("launch.advice.too_large_memory_for_32bit"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); + Controllers.dialog(I18n.i18n("launch.advice.too_large_memory_for_32bit"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); flag = true; } if (!flag && OperatingSystem.TOTAL_MEMORY > 0 && OperatingSystem.TOTAL_MEMORY < setting.getMaxMemory()) { - Controllers.dialog(Launcher.i18n("launch.advice.not_enough_space", OperatingSystem.TOTAL_MEMORY), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); + Controllers.dialog(I18n.i18n("launch.advice.not_enough_space", OperatingSystem.TOTAL_MEMORY), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); flag = true; } @@ -300,11 +302,11 @@ public final class LauncherHelper { try { setResult(supplier.get()); } catch (PermissionException e) { - throw new I18nException(Launcher.i18n("launch.failed.executable_permission"), e); + throw new I18nException(I18n.i18n("launch.failed.executable_permission"), e); } catch (ProcessCreationException e) { - throw new I18nException(Launcher.i18n("launch.failed.creating_process") + e.getLocalizedMessage(), e); + throw new I18nException(I18n.i18n("launch.failed.creating_process") + e.getLocalizedMessage(), e); } catch (NotDecompressingNativesException e) { - throw new I18nException(Launcher.i18n("launch.failed.decompressing_natives") + e.getLocalizedMessage(), e); + throw new I18nException(I18n.i18n("launch.failed.decompressing_natives") + e.getLocalizedMessage(), e); } } @@ -424,10 +426,10 @@ public final class LauncherHelper { switch (exitType) { case JVM_ERROR: - logWindow.setTitle(Launcher.i18n("launch.failed.cannot_create_jvm")); + logWindow.setTitle(I18n.i18n("launch.failed.cannot_create_jvm")); break; case APPLICATION_ERROR: - logWindow.setTitle(Launcher.i18n("launch.failed.exited_abnormally")); + logWindow.setTitle(I18n.i18n("launch.failed.exited_abnormally")); break; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LoadingState.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LoadingState.java index 9f71f91d8..847e9e112 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LoadingState.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LoadingState.java @@ -17,7 +17,7 @@ */ package org.jackhuang.hmcl.game; -import org.jackhuang.hmcl.Launcher; +import org.jackhuang.hmcl.util.i18n.I18n; public enum LoadingState { DEPENDENCIES("launch.state.dependencies"), @@ -33,6 +33,6 @@ public enum LoadingState { } public String getLocalizedMessage() { - return Launcher.i18n(key); + return I18n.i18n(key); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profiles.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profiles.java index 5582bb567..c9a5e8b3f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profiles.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profiles.java @@ -17,7 +17,7 @@ */ package org.jackhuang.hmcl.setting; -import org.jackhuang.hmcl.Launcher; +import org.jackhuang.hmcl.util.i18n.I18n; public final class Profiles { @@ -30,9 +30,9 @@ public final class Profiles { public static String getProfileDisplayName(Profile profile) { switch (profile.getName()) { case Profiles.DEFAULT_PROFILE: - return Launcher.i18n("profile.default"); + return I18n.i18n("profile.default"); case Profiles.HOME_PROFILE: - return Launcher.i18n("profile.home"); + return I18n.i18n("profile.home"); default: return profile.getName(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index 09cb5ad42..dc7f3f7c0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -41,6 +41,7 @@ import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.event.*; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.util.*; +import org.jackhuang.hmcl.util.i18n.Locales; import java.io.File; import java.io.IOException; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountPage.java index af9cedf5e..deda63804 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountPage.java @@ -28,7 +28,7 @@ import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.layout.BorderPane; import javafx.scene.layout.StackPane; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorAccount; import org.jackhuang.hmcl.auth.offline.OfflineAccount; @@ -39,6 +39,7 @@ import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.ui.construct.ComponentList; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.Optional; @@ -73,7 +74,7 @@ public class AccountPage extends StackPane implements DecoratorPage { this.account = account; this.item = item; - title = new SimpleStringProperty(this, "title", Launcher.i18n("account") + " - " + account.getCharacter()); + title = new SimpleStringProperty(this, "title", I18n.i18n("account") + " - " + account.getCharacter()); FXUtils.loadFXML(this, "/assets/fxml/account.fxml"); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java index 732efb929..97bb3cb2e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java @@ -30,7 +30,7 @@ import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.auth.*; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorAccount; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer; @@ -49,6 +49,7 @@ import org.jackhuang.hmcl.ui.construct.SpinnerPane; import org.jackhuang.hmcl.ui.construct.Validator; import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.Logging; +import org.jackhuang.hmcl.util.i18n.I18n; import static org.jackhuang.hmcl.ui.FXUtils.jfxListCellFactory; import static org.jackhuang.hmcl.ui.FXUtils.stringConverter; @@ -82,13 +83,13 @@ public class AddAccountPane extends StackPane { cboServers.setCellFactory(jfxListCellFactory(server -> new TwoLineListItem(server.getName(), server.getUrl()))); cboServers.setConverter(stringConverter(AuthlibInjectorServer::getName)); cboServers.setItems(Settings.SETTINGS.authlibInjectorServers); - cboServers.setPromptText(Launcher.i18n("general.prompt.empty")); + cboServers.setPromptText(I18n.i18n("general.prompt.empty")); // workaround: otherwise the combox will be black if (!cboServers.getItems().isEmpty()) cboServers.getSelectionModel().select(0); - cboType.getItems().setAll(Launcher.i18n("account.methods.offline"), Launcher.i18n("account.methods.yggdrasil"), Launcher.i18n("account.methods.authlib_injector")); + cboType.getItems().setAll(I18n.i18n("account.methods.offline"), I18n.i18n("account.methods.yggdrasil"), I18n.i18n("account.methods.authlib_injector")); cboType.getSelectionModel().selectedIndexProperty().addListener((a, b, newValue) -> { txtPassword.setVisible(newValue.intValue() != 0); lblPassword.setVisible(newValue.intValue() != 0); @@ -101,7 +102,7 @@ public class AddAccountPane extends StackPane { txtPassword.setOnAction(e -> onCreationAccept()); txtUsername.setOnAction(e -> onCreationAccept()); - txtUsername.getValidators().add(new Validator(Launcher.i18n("input.email"), str -> !txtPassword.isVisible() || str.contains("@"))); + txtUsername.getValidators().add(new Validator(I18n.i18n("input.email"), str -> !txtPassword.isVisible() || str.contains("@"))); txtUsername.textProperty().addListener(it -> validateAcceptButton()); txtPassword.textProperty().addListener(it -> validateAcceptButton()); @@ -134,7 +135,7 @@ public class AddAccountPane extends StackPane { if (server.isPresent()) { addtionalData = server.get(); } else { - lblCreationWarning.setText(Launcher.i18n("account.failed.no_selected_server")); + lblCreationWarning.setText(I18n.i18n("account.failed.no_selected_server")); return; } break; @@ -189,11 +190,11 @@ public class AddAccountPane extends StackPane { { setStyle("-fx-padding: 8px;"); - cancel.setText(Launcher.i18n("button.cancel")); + cancel.setText(I18n.i18n("button.cancel")); StackPane.setAlignment(cancel, Pos.BOTTOM_RIGHT); cancel.setOnMouseClicked(e -> latch.countDown()); - listBox.startCategory(Launcher.i18n("account.choose")); + listBox.startCategory(I18n.i18n("account.choose")); setCenter(listBox); @@ -254,19 +255,19 @@ public class AddAccountPane extends StackPane { public static String accountException(Exception exception) { if (exception instanceof NoCharacterException) { - return Launcher.i18n("account.failed.no_character"); + return I18n.i18n("account.failed.no_character"); } else if (exception instanceof ServerDisconnectException) { - return Launcher.i18n("account.failed.connect_authentication_server"); + return I18n.i18n("account.failed.connect_authentication_server"); } else if (exception instanceof RemoteAuthenticationException) { RemoteAuthenticationException remoteException = (RemoteAuthenticationException) exception; String remoteMessage = remoteException.getRemoteMessage(); if ("ForbiddenOperationException".equals(remoteException.getRemoteName()) && remoteMessage != null) { if (remoteMessage.contains("Invalid credentials")) - return Launcher.i18n("account.failed.invalid_credentials"); + return I18n.i18n("account.failed.invalid_credentials"); else if (remoteMessage.contains("Invalid token")) - return Launcher.i18n("account.failed.invalid_token"); + return I18n.i18n("account.failed.invalid_token"); else if (remoteMessage.contains("Invalid username or password")) - return Launcher.i18n("account.failed.invalid_password"); + return I18n.i18n("account.failed.invalid_password"); } return exception.getMessage(); } else { @@ -275,9 +276,9 @@ public class AddAccountPane extends StackPane { } public static String accountType(Account account) { - if (account instanceof OfflineAccount) return Launcher.i18n("account.methods.offline"); - else if (account instanceof AuthlibInjectorAccount) return Launcher.i18n("account.methods.authlib_injector"); - else if (account instanceof YggdrasilAccount) return Launcher.i18n("account.methods.yggdrasil"); - else throw new Error(Launcher.i18n("account.methods.no_method") + ": " + account); + if (account instanceof OfflineAccount) return I18n.i18n("account.methods.offline"); + else if (account instanceof AuthlibInjectorAccount) return I18n.i18n("account.methods.authlib_injector"); + else if (account instanceof YggdrasilAccount) return I18n.i18n("account.methods.yggdrasil"); + else throw new Error(I18n.i18n("account.methods.no_method") + ": " + account); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java index 472d899ae..bd4b21897 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java @@ -8,7 +8,7 @@ import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.task.Schedulers; @@ -18,13 +18,14 @@ import org.jackhuang.hmcl.ui.animation.TransitionHandler; import org.jackhuang.hmcl.ui.construct.SpinnerPane; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.NetworkUtils; +import org.jackhuang.hmcl.util.i18n.I18n; import static java.util.stream.Collectors.toList; import java.io.IOException; public class AuthlibInjectorServersPage extends StackPane implements DecoratorPage { - private final StringProperty title = new SimpleStringProperty(this, "title", Launcher.i18n("account.injector.server")); + private final StringProperty title = new SimpleStringProperty(this, "title", I18n.i18n("account.injector.server")); @FXML private ScrollPane scrollPane; @FXML private StackPane addServerContainer; @@ -153,7 +154,7 @@ public class AuthlibInjectorServersPage extends StackPane implements DecoratorPa private String resolveFetchExceptionMessage(Throwable exception) { if (exception instanceof IOException) { - return Launcher.i18n("account.failed.connect_injector_server"); + return I18n.i18n("account.failed.connect_injector_server"); } else { return exception.getClass() + ": " + exception.getLocalizedMessage(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java index 285c6e640..753557743 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java @@ -28,6 +28,7 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.stage.Stage; import org.jackhuang.hmcl.Launcher; +import org.jackhuang.hmcl.util.i18n.I18n; /** * @author huangyuhui @@ -37,9 +38,9 @@ public class CrashWindow extends Stage { public CrashWindow(String text) { Label lblCrash = new Label(); if (Launcher.UPDATE_CHECKER.isOutOfDate()) - lblCrash.setText(Launcher.i18n("launcher.crash_out_dated")); + lblCrash.setText(I18n.i18n("launcher.crash_out_dated")); else - lblCrash.setText(Launcher.i18n("launcher.crash")); + lblCrash.setText(I18n.i18n("launcher.crash")); lblCrash.setWrapText(true); TextArea textArea = new TextArea(); @@ -47,7 +48,7 @@ public class CrashWindow extends Stage { textArea.setEditable(false); Button btnContact = new Button(); - btnContact.setText(Launcher.i18n("launcher.contact")); + btnContact.setText(I18n.i18n("launcher.contact")); btnContact.setOnMouseClicked(event -> FXUtils.openLink(Launcher.CONTACT)); HBox box = new HBox(); box.setStyle("-fx-padding: 8px;"); @@ -65,7 +66,7 @@ public class CrashWindow extends Stage { Scene scene = new Scene(pane, 800, 480); setScene(scene); getIcons().add(new Image("/assets/img/icon.png")); - setTitle(Launcher.i18n("message.error")); + setTitle(I18n.i18n("message.error")); setOnCloseRequest(e -> System.exit(1)); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java index fe9447664..8e4db9316 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java @@ -53,7 +53,6 @@ import javafx.stage.StageStyle; import javafx.util.Duration; import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.setting.EnumBackgroundImage; -import org.jackhuang.hmcl.setting.Locales; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.animation.AnimationProducer; @@ -66,6 +65,7 @@ import org.jackhuang.hmcl.ui.wizard.*; import org.jackhuang.hmcl.util.FileUtils; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.i18n.Locales; import java.io.File; import java.util.Locale; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java index 7d80a6217..ca210febc 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java @@ -45,8 +45,8 @@ import javafx.util.Callback; import javafx.util.Duration; import javafx.util.StringConverter; -import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.util.*; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.io.IOException; @@ -203,7 +203,7 @@ public final class FXUtils { } public static void loadFXML(Node node, String absolutePath) { - FXMLLoader loader = new FXMLLoader(node.getClass().getResource(absolutePath), Launcher.RESOURCE_BUNDLE); + FXMLLoader loader = new FXMLLoader(node.getClass().getResource(absolutePath), I18n.RESOURCE_BUNDLE); loader.setRoot(node); loader.setController(node); Lang.invoke((ExceptionalSupplier) loader::load); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerController.java index 4a5ce5886..954b4d224 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerController.java @@ -20,7 +20,7 @@ package org.jackhuang.hmcl.ui; import javafx.fxml.FXML; import javafx.scene.control.ScrollPane; import javafx.scene.layout.VBox; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.download.MaintainTask; import org.jackhuang.hmcl.download.game.VersionJsonSaveTask; import org.jackhuang.hmcl.game.GameVersion; @@ -30,6 +30,7 @@ import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.download.InstallerWizardProvider; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.LinkedList; import java.util.Optional; @@ -90,7 +91,7 @@ public class InstallerController { Optional gameVersion = GameVersion.minecraftVersion(profile.getRepository().getVersionJar(version)); if (!gameVersion.isPresent()) - Controllers.dialog(Launcher.i18n("version.cannot_read")); + Controllers.dialog(I18n.i18n("version.cannot_read")); else Controllers.getDecorator().startWizard(new InstallerWizardProvider(profile, gameVersion.get(), version, forge, liteLoader, optiFine)); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java index 225b8d8df..f7fd2efc2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java @@ -21,10 +21,11 @@ import com.jfoenix.effects.JFXDepthManager; import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.layout.BorderPane; -import org.jackhuang.hmcl.Launcher; import java.util.function.Consumer; +import org.jackhuang.hmcl.util.i18n.I18n; + /** * @author huangyuhui */ @@ -44,7 +45,7 @@ public class InstallerItem extends BorderPane { setStyle("-fx-background-radius: 2; -fx-background-color: white; -fx-padding: 8;"); JFXDepthManager.setDepth(this, 1); lblInstallerArtifact.setText(artifact); - lblInstallerVersion.setText(Launcher.i18n("archive.version") + ": " + version); + lblInstallerVersion.setText(I18n.i18n("archive.version") + ": " + version); } @FXML diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java index 8ed51b8ad..a4a48a1fb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java @@ -28,7 +28,7 @@ import javafx.scene.input.MouseButton; import javafx.scene.layout.Region; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorAccount; import org.jackhuang.hmcl.auth.offline.OfflineAccount; @@ -49,6 +49,7 @@ import org.jackhuang.hmcl.ui.construct.ClassTitle; import org.jackhuang.hmcl.ui.construct.IconedItem; import org.jackhuang.hmcl.ui.construct.RipplerContainer; import org.jackhuang.hmcl.util.Lang; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.util.HashMap; @@ -61,27 +62,27 @@ public final class LeftPaneController { private final VBox profilePane = new VBox(); private final VBox accountPane = new VBox(); private final IconedItem launcherSettingsItem; - private final VersionListItem missingAccountItem = new VersionListItem(Launcher.i18n("account.missing"), Launcher.i18n("message.unknown")); + private final VersionListItem missingAccountItem = new VersionListItem(I18n.i18n("account.missing"), I18n.i18n("message.unknown")); private final HashMap items = new HashMap<>(); public LeftPaneController(AdvancedListBox leftPane) { this.leftPane = leftPane; - this.launcherSettingsItem = Lang.apply(new IconedItem(SVG.gear(Theme.blackFillBinding(), 20, 20), Launcher.i18n("settings.launcher")), iconedItem -> { + this.launcherSettingsItem = Lang.apply(new IconedItem(SVG.gear(Theme.blackFillBinding(), 20, 20), I18n.i18n("settings.launcher")), iconedItem -> { iconedItem.prefWidthProperty().bind(leftPane.widthProperty()); iconedItem.setOnMouseClicked(e -> Controllers.navigate(Controllers.getSettingsPage())); }); leftPane - .add(new ClassTitle(Launcher.i18n("account").toUpperCase(), Lang.apply(new JFXButton(), button -> { + .add(new ClassTitle(I18n.i18n("account").toUpperCase(), Lang.apply(new JFXButton(), button -> { button.setGraphic(SVG.plus(Theme.blackFillBinding(), 10, 10)); button.getStyleClass().add("toggle-icon-tiny"); button.setOnMouseClicked(e -> addNewAccount()); }))) .add(accountPane) - .startCategory(Launcher.i18n("launcher").toUpperCase()) + .startCategory(I18n.i18n("launcher").toUpperCase()) .add(launcherSettingsItem) - .add(new ClassTitle(Launcher.i18n("profile.title").toUpperCase(), Lang.apply(new JFXButton(), button -> { + .add(new ClassTitle(I18n.i18n("profile.title").toUpperCase(), Lang.apply(new JFXButton(), button -> { button.setGraphic(SVG.plus(Theme.blackFillBinding(), 10, 10)); button.getStyleClass().add("toggle-icon-tiny"); button.setOnMouseClicked(e -> @@ -122,7 +123,7 @@ public final class LeftPaneController { if (node instanceof RipplerContainer && node.getProperties().get("profile") instanceof String) { boolean current = Objects.equals(node.getProperties().get("profile"), profile.getName()); ((RipplerContainer) node).setSelected(current); - ((VersionListItem) ((RipplerContainer) node).getContainer()).setGameVersion(current ? Launcher.i18n("profile.selected") : ""); + ((VersionListItem) ((RipplerContainer) node).getContainer()).setGameVersion(current ? I18n.i18n("profile.selected") : ""); } } }); @@ -143,9 +144,9 @@ public final class LeftPaneController { } private static String accountType(Account account) { - if (account instanceof OfflineAccount) return Launcher.i18n("account.methods.offline"); + if (account instanceof OfflineAccount) return I18n.i18n("account.methods.offline"); else if (account instanceof YggdrasilAccount) return account.getUsername(); - else throw new Error(Launcher.i18n("account.methods.no_method") + ": " + account); + else throw new Error(I18n.i18n("account.methods.no_method") + ": " + account); } private void onAccountAdd(AccountAddedEvent event) { @@ -207,7 +208,7 @@ public final class LeftPaneController { } public void showUpdate() { - launcherSettingsItem.setText(Launcher.i18n("update.found")); + launcherSettingsItem.setText(I18n.i18n("update.found")); launcherSettingsItem.setTextFill(Color.RED); } @@ -231,7 +232,7 @@ public final class LeftPaneController { Controllers.closeDialog(region.get()); checkAccount(); })).executor(); - region.set(Controllers.taskDialog(executor, Launcher.i18n("modpack.installing"), "")); + region.set(Controllers.taskDialog(executor, I18n.i18n("modpack.installing"), "")); executor.start(); showNewAccount = false; } catch (UnsupportedModpackException ignore) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java index 7801ef900..3396bee2d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java @@ -30,7 +30,7 @@ import javafx.scene.layout.StackPane; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.stage.Stage; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.event.Event; import org.jackhuang.hmcl.event.EventManager; import org.jackhuang.hmcl.game.LauncherHelper; @@ -39,6 +39,7 @@ import org.jackhuang.hmcl.util.IOUtils; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.Log4jLevel; import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.i18n.I18n; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -63,7 +64,7 @@ public final class LogWindow extends Stage { public LogWindow() { setScene(new Scene(impl, 800, 480)); getScene().getStylesheets().addAll(Settings.INSTANCE.getTheme().getStylesheets()); - setTitle(Launcher.i18n("logwindow.title")); + setTitle(I18n.i18n("logwindow.title")); getIcons().add(new Image("/assets/img/icon.png")); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java index edabc4d43..44692f130 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java @@ -29,7 +29,7 @@ import javafx.scene.input.MouseButton; import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import javafx.stage.FileChooser; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.event.EventBus; import org.jackhuang.hmcl.event.ProfileChangedEvent; import org.jackhuang.hmcl.event.RefreshedVersionsEvent; @@ -47,6 +47,7 @@ import org.jackhuang.hmcl.ui.download.DownloadWizardProvider; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.OperatingSystem; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.io.IOException; @@ -60,7 +61,7 @@ import static org.jackhuang.hmcl.util.StringUtils.removeSuffix; public final class MainPage extends StackPane implements DecoratorPage { - private final StringProperty title = new SimpleStringProperty(this, "title", Launcher.i18n("main_page")); + private final StringProperty title = new SimpleStringProperty(this, "title", I18n.i18n("main_page")); private Profile profile; @@ -95,10 +96,10 @@ public final class MainPage extends StackPane implements DecoratorPage { this.profile = event.getProfile(); }); - btnAdd.setOnMouseClicked(e -> Controllers.getDecorator().startWizard(new DownloadWizardProvider(), Launcher.i18n("install"))); - FXUtils.installTooltip(btnAdd, Launcher.i18n("install")); + btnAdd.setOnMouseClicked(e -> Controllers.getDecorator().startWizard(new DownloadWizardProvider(), I18n.i18n("install"))); + FXUtils.installTooltip(btnAdd, I18n.i18n("install")); btnRefresh.setOnMouseClicked(e -> Settings.INSTANCE.getSelectedProfile().getRepository().refreshVersionsAsync().start()); - FXUtils.installTooltip(btnRefresh, Launcher.i18n("button.refresh")); + FXUtils.installTooltip(btnRefresh, I18n.i18n("button.refresh")); } private String modifyVersion(String gameVersion, String version) { @@ -117,13 +118,13 @@ public final class MainPage extends StackPane implements DecoratorPage { StringBuilder libraries = new StringBuilder(); for (Library library : version.getLibraries()) { if (library.getGroupId().equalsIgnoreCase("net.minecraftforge") && library.getArtifactId().equalsIgnoreCase("forge")) { - libraries.append(Launcher.i18n("install.installer.forge")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)forge", ""))).append("\n"); + libraries.append(I18n.i18n("install.installer.forge")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)forge", ""))).append("\n"); } if (library.getGroupId().equalsIgnoreCase("com.mumfrey") && library.getArtifactId().equalsIgnoreCase("liteloader")) { - libraries.append(Launcher.i18n("install.installer.liteloader")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)liteloader", ""))).append("\n"); + libraries.append(I18n.i18n("install.installer.liteloader")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)liteloader", ""))).append("\n"); } if (library.getGroupId().equalsIgnoreCase("net.optifine") && library.getArtifactId().equalsIgnoreCase("optifine")) { - libraries.append(Launcher.i18n("install.installer.optifine")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)optifine", ""))).append("\n"); + libraries.append(I18n.i18n("install.installer.optifine")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)optifine", ""))).append("\n"); } } @@ -138,15 +139,15 @@ public final class MainPage extends StackPane implements DecoratorPage { }); item.setOnScriptButtonClicked(e -> { if (Settings.INSTANCE.getSelectedAccount() == null) - Controllers.dialog(Launcher.i18n("login.empty_username")); + Controllers.dialog(I18n.i18n("login.empty_username")); else { FileChooser chooser = new FileChooser(); if (repository.getRunDirectory(id).isDirectory()) chooser.setInitialDirectory(repository.getRunDirectory(id)); - chooser.setTitle(Launcher.i18n("version.launch_script.save")); + chooser.setTitle(I18n.i18n("version.launch_script.save")); chooser.getExtensionFilters().add(OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS - ? new FileChooser.ExtensionFilter(Launcher.i18n("extension.bat"), "*.bat") - : new FileChooser.ExtensionFilter(Launcher.i18n("extension.sh"), "*.sh")); + ? new FileChooser.ExtensionFilter(I18n.i18n("extension.bat"), "*.bat") + : new FileChooser.ExtensionFilter(I18n.i18n("extension.sh"), "*.sh")); File file = chooser.showSaveDialog(Controllers.getStage()); if (file != null) LauncherHelper.INSTANCE.launch(profile, Settings.INSTANCE.getSelectedAccount(), id, file); @@ -158,25 +159,25 @@ public final class MainPage extends StackPane implements DecoratorPage { }); item.setOnUpdateButtonClicked(event -> { FileChooser chooser = new FileChooser(); - chooser.setTitle(Launcher.i18n("modpack.choose")); - chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(Launcher.i18n("modpack"), "*.zip")); + chooser.setTitle(I18n.i18n("modpack.choose")); + chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(I18n.i18n("modpack"), "*.zip")); File selectedFile = chooser.showOpenDialog(Controllers.getStage()); if (selectedFile != null) { AtomicReference region = new AtomicReference<>(); try { TaskExecutor executor = ModpackHelper.getUpdateTask(profile, selectedFile, id, ModpackHelper.readModpackConfiguration(repository.getModpackConfiguration(id))) .then(Task.of(Schedulers.javafx(), () -> Controllers.closeDialog(region.get()))).executor(); - region.set(Controllers.taskDialog(executor, Launcher.i18n("modpack.update"), "")); + region.set(Controllers.taskDialog(executor, I18n.i18n("modpack.update"), "")); executor.start(); } catch (UnsupportedModpackException e) { Controllers.closeDialog(region.get()); - Controllers.dialog(Launcher.i18n("modpack.unsupported"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE); + Controllers.dialog(I18n.i18n("modpack.unsupported"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE); } catch (MismatchedModpackTypeException e) { Controllers.closeDialog(region.get()); - Controllers.dialog(Launcher.i18n("modpack.mismatched_type"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE); + Controllers.dialog(I18n.i18n("modpack.mismatched_type"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE); } catch (IOException e) { Controllers.closeDialog(region.get()); - Controllers.dialog(Launcher.i18n("modpack.invalid"), Launcher.i18n("message.error"), MessageBox.ERROR_MESSAGE); + Controllers.dialog(I18n.i18n("modpack.invalid"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE); } } }); @@ -187,10 +188,10 @@ public final class MainPage extends StackPane implements DecoratorPage { versionList.getStyleClass().add("option-list-view"); FXUtils.setLimitWidth(versionList, 150); versionList.getItems().setAll(Lang.immutableListOf( - Launcher.i18n("version.manage.rename"), - Launcher.i18n("version.manage.remove"), - Launcher.i18n("modpack.export"), - Launcher.i18n("folder.game") + I18n.i18n("version.manage.rename"), + I18n.i18n("version.manage.remove"), + I18n.i18n("modpack.export"), + I18n.i18n("folder.game") )); versionList.setOnMouseClicked(e -> { versionPopup.hide(); @@ -214,7 +215,7 @@ public final class MainPage extends StackPane implements DecoratorPage { versionPopup.show(item, JFXPopup.PopupVPosition.TOP, JFXPopup.PopupHPosition.LEFT, event.getX(), event.getY()); } else if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) { if (Settings.INSTANCE.getSelectedAccount() == null) - Controllers.dialog(Launcher.i18n("login.empty_username")); + Controllers.dialog(I18n.i18n("login.empty_username")); else LauncherHelper.INSTANCE.launch(profile, Settings.INSTANCE.getSelectedAccount(), id, null); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModController.java index d280b7f3c..0bb6e8f0a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModController.java @@ -26,13 +26,14 @@ import javafx.scene.input.TransferMode; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.stage.FileChooser; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.mod.ModInfo; import org.jackhuang.hmcl.mod.ModManager; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.FileUtils; import org.jackhuang.hmcl.util.Logging; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.io.IOException; @@ -140,8 +141,8 @@ public final class ModController { @FXML private void onAdd() { FileChooser chooser = new FileChooser(); - chooser.setTitle(Launcher.i18n("mods.choose_mod")); - chooser.getExtensionFilters().setAll(new FileChooser.ExtensionFilter(Launcher.i18n("extension.mod"), "*.jar", "*.zip", "*.litemod")); + chooser.setTitle(I18n.i18n("mods.choose_mod")); + chooser.getExtensionFilters().setAll(new FileChooser.ExtensionFilter(I18n.i18n("extension.mod"), "*.jar", "*.zip", "*.litemod")); List res = chooser.showOpenMultipleDialog(Controllers.getStage()); // It's guaranteed that succeeded and failed are thread safe here. @@ -163,10 +164,10 @@ public final class ModController { }).with(Task.of(Schedulers.javafx(), variables -> { List prompt = new LinkedList<>(); if (!succeeded.isEmpty()) - prompt.add(Launcher.i18n("mods.add.success", String.join(", ", succeeded))); + prompt.add(I18n.i18n("mods.add.success", String.join(", ", succeeded))); if (!failed.isEmpty()) - prompt.add(Launcher.i18n("mods.add.failed", String.join(", ", failed))); - Controllers.dialog(String.join("\n", prompt), Launcher.i18n("mods.add")); + prompt.add(I18n.i18n("mods.add.failed", String.join(", ", failed))); + Controllers.dialog(String.join("\n", prompt), I18n.i18n("mods.add")); loadMods(modManager, versionId); })).start(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModItem.java index 94ae4c0b2..7aa35aefc 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModItem.java @@ -23,9 +23,10 @@ import com.jfoenix.controls.JFXCheckBox; import com.jfoenix.effects.JFXDepthManager; import javafx.geometry.Pos; import javafx.scene.layout.BorderPane; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.mod.ModInfo; import org.jackhuang.hmcl.setting.Theme; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.function.Consumer; @@ -42,7 +43,7 @@ public final class ModItem extends BorderPane { JFXButton btnRemove = new JFXButton(); JFXUtilities.runInFX(() -> { - FXUtils.installTooltip(btnRemove, Launcher.i18n("mods.remove")); + FXUtils.installTooltip(btnRemove, I18n.i18n("mods.remove")); }); btnRemove.setOnMouseClicked(e -> deleteCallback.accept(this)); btnRemove.getStyleClass().add("toggle-icon4"); @@ -53,7 +54,7 @@ public final class ModItem extends BorderPane { setStyle("-fx-background-radius: 2; -fx-background-color: white; -fx-padding: 8;"); JFXDepthManager.setDepth(this, 1); modItem.setTitle(info.getFileName()); - modItem.setSubtitle(info.getName() + ", " + Launcher.i18n("archive.version") + ": " + info.getVersion() + ", " + Launcher.i18n("archive.game_version") + ": " + info.getGameVersion() + ", " + Launcher.i18n("archive.author") + ": " + info.getAuthors()); + modItem.setSubtitle(info.getName() + ", " + I18n.i18n("archive.version") + ": " + info.getVersion() + ", " + I18n.i18n("archive.game_version") + ": " + info.getGameVersion() + ", " + I18n.i18n("archive.author") + ": " + info.getAuthors()); chkEnabled.setSelected(info.isActive()); chkEnabled.selectedProperty().addListener((a, b, newValue) -> info.activeProperty().set(newValue)); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ProfilePage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ProfilePage.java index c579d135d..71c790a6e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ProfilePage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ProfilePage.java @@ -23,13 +23,14 @@ import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.fxml.FXML; import javafx.scene.layout.StackPane; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.setting.Profiles; import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.ui.construct.FileItem; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.util.Optional; @@ -54,7 +55,7 @@ public final class ProfilePage extends StackPane implements DecoratorPage { String profileDisplayName = Optional.ofNullable(profile).map(Profiles::getProfileDisplayName).orElse(""); title = new SimpleStringProperty(this, "title", - profile == null ? Launcher.i18n("profile.new") : Launcher.i18n("profile") + " - " + profileDisplayName); + profile == null ? I18n.i18n("profile.new") : I18n.i18n("profile") + " - " + profileDisplayName); location = new SimpleStringProperty(this, "location", Optional.ofNullable(profile).map(Profile::getGameDir).map(File::getAbsolutePath).orElse("")); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index 16e28e2ab..c8b2883e5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -42,6 +42,8 @@ import org.jackhuang.hmcl.ui.construct.MultiFileItem; import org.jackhuang.hmcl.ui.construct.Validator; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.Lang; +import org.jackhuang.hmcl.util.i18n.I18n; +import org.jackhuang.hmcl.util.i18n.Locales; import java.net.Proxy; import java.util.Arrays; @@ -49,7 +51,7 @@ import java.util.Collections; import java.util.stream.Collectors; public final class SettingsPage extends StackPane implements DecoratorPage { - private final StringProperty title = new SimpleStringProperty(this, "title", Launcher.i18n("settings.launcher")); + private final StringProperty title = new SimpleStringProperty(this, "title", I18n.i18n("settings.launcher")); @FXML private JFXTextField txtProxyHost; @@ -177,12 +179,12 @@ public final class SettingsPage extends StackPane implements DecoratorPage { fileCommonLocation.setProperty(Settings.INSTANCE.commonPathProperty()); - FXUtils.installTooltip(btnUpdate, Launcher.i18n("update.tooltip")); + FXUtils.installTooltip(btnUpdate, I18n.i18n("update.tooltip")); checkUpdate(); // background backgroundItem.loadChildren(Collections.singletonList( - backgroundItem.createChildren(Launcher.i18n("launcher.background.default"), EnumBackgroundImage.DEFAULT) + backgroundItem.createChildren(I18n.i18n("launcher.background.default"), EnumBackgroundImage.DEFAULT) )); FXUtils.bindString(backgroundItem.getTxtCustom(), Settings.INSTANCE.backgroundImageProperty()); @@ -199,8 +201,8 @@ public final class SettingsPage extends StackPane implements DecoratorPage { // theme JFXColorPicker picker = new JFXColorPicker(Color.web(Settings.INSTANCE.getTheme().getColor()), null); - picker.setCustomColorText(Launcher.i18n("color.custom")); - picker.setRecentColorsText(Launcher.i18n("color.recent")); + picker.setCustomColorText(I18n.i18n("color.custom")); + picker.setRecentColorsText(I18n.i18n("color.recent")); picker.getCustomColors().setAll(Arrays.stream(Theme.VALUES).map(Theme::getColor).map(Color::web).collect(Collectors.toList())); picker.setOnAction(e -> { Theme theme = Theme.custom(Theme.getColorDisplayName(picker.getValue())); @@ -214,7 +216,7 @@ public final class SettingsPage extends StackPane implements DecoratorPage { private void initBackgroundItemSubtitle() { switch (Settings.INSTANCE.getBackgroundImageType()) { case DEFAULT: - backgroundItem.setSubtitle(Launcher.i18n("launcher.background.default")); + backgroundItem.setSubtitle(I18n.i18n("launcher.background.default")); break; case CUSTOM: backgroundItem.setSubtitle(Settings.INSTANCE.getBackgroundImage()); @@ -239,16 +241,16 @@ public final class SettingsPage extends StackPane implements DecoratorPage { btnUpdate.setVisible(Launcher.UPDATE_CHECKER.isOutOfDate()); if (Launcher.UPDATE_CHECKER.isOutOfDate()) { - lblUpdateSub.setText(Launcher.i18n("update.newest_version", Launcher.UPDATE_CHECKER.getNewVersion().toString())); + lblUpdateSub.setText(I18n.i18n("update.newest_version", Launcher.UPDATE_CHECKER.getNewVersion().toString())); lblUpdateSub.getStyleClass().setAll("update-label"); - lblUpdate.setText(Launcher.i18n("update.found")); + lblUpdate.setText(I18n.i18n("update.found")); lblUpdate.getStyleClass().setAll("update-label"); } else { - lblUpdateSub.setText(Launcher.i18n("update.latest")); + lblUpdateSub.setText(I18n.i18n("update.latest")); lblUpdateSub.getStyleClass().setAll("subtitle-label"); - lblUpdate.setText(Launcher.i18n("update")); + lblUpdate.setText(I18n.i18n("update")); lblUpdate.getStyleClass().setAll(); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionItem.java index 9e9f7443f..08cd97786 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionItem.java @@ -34,8 +34,9 @@ import javafx.scene.input.MouseEvent; import javafx.scene.layout.*; import javafx.scene.paint.Color; import javafx.scene.text.TextAlignment; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.setting.Theme; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.Optional; @@ -175,10 +176,10 @@ public final class VersionItem extends StackPane { btnScript.setGraphic(SVG.script(Theme.blackFillBinding(), 15, 15)); JFXUtilities.runInFX(() -> { - FXUtils.installTooltip(btnSettings, Launcher.i18n("version.settings")); - FXUtils.installTooltip(btnUpdate, Launcher.i18n("version.update")); - FXUtils.installTooltip(btnLaunch, Launcher.i18n("version.launch")); - FXUtils.installTooltip(btnScript, Launcher.i18n("version.launch_script")); + FXUtils.installTooltip(btnSettings, I18n.i18n("version.settings")); + FXUtils.installTooltip(btnUpdate, I18n.i18n("version.update")); + FXUtils.installTooltip(btnLaunch, I18n.i18n("version.launch")); + FXUtils.installTooltip(btnScript, I18n.i18n("version.launch_script")); }); icon.translateYProperty().bind(Bindings.createDoubleBinding(() -> header.getBoundsInParent().getHeight() - icon.getHeight() / 2 - 16, header.boundsInParentProperty(), icon.heightProperty())); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionPage.java index eb66d705f..be3369387 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionPage.java @@ -26,12 +26,13 @@ import javafx.beans.property.StringProperty; import javafx.fxml.FXML; import javafx.scene.control.Tab; import javafx.scene.layout.StackPane; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.download.game.GameAssetIndexDownloadTask; import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.ui.export.ExportWizardProvider; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.FileUtils; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; @@ -79,17 +80,17 @@ public final class VersionPage extends StackPane implements DecoratorPage { browsePopup = new JFXPopup(browseList); managementPopup = new JFXPopup(managementList); - FXUtils.installTooltip(btnDelete, Launcher.i18n("version.manage.remove")); - FXUtils.installTooltip(btnBrowseMenu, Launcher.i18n("settings.game.exploration")); - FXUtils.installTooltip(btnManagementMenu, Launcher.i18n("settings.game.management")); - FXUtils.installTooltip(btnExport, Launcher.i18n("modpack.export")); + FXUtils.installTooltip(btnDelete, I18n.i18n("version.manage.remove")); + FXUtils.installTooltip(btnBrowseMenu, I18n.i18n("settings.game.exploration")); + FXUtils.installTooltip(btnManagementMenu, I18n.i18n("settings.game.management")); + FXUtils.installTooltip(btnExport, I18n.i18n("modpack.export")); } public void load(String id, Profile profile) { this.version = id; this.profile = profile; - title.set(Launcher.i18n("settings.game") + " - " + id); + title.set(I18n.i18n("settings.game") + " - " + id); versionSettingsController.loadVersionSetting(profile, id); modController.setParentTab(tabPane); @@ -185,7 +186,7 @@ public final class VersionPage extends StackPane implements DecoratorPage { } public static void deleteVersion(Profile profile, String version) { - Controllers.confirmDialog(Launcher.i18n("version.manage.remove.confirm", version), Launcher.i18n("message.confirm"), () -> { + Controllers.confirmDialog(I18n.i18n("version.manage.remove.confirm", version), I18n.i18n("message.confirm"), () -> { if (profile.getRepository().removeVersionFromDisk(version)) { profile.getRepository().refreshVersionsAsync().start(); Controllers.navigate(null); @@ -194,7 +195,7 @@ public final class VersionPage extends StackPane implements DecoratorPage { } public static void renameVersion(Profile profile, String version) { - Controllers.inputDialog(Launcher.i18n("version.manage.rename.message"), res -> { + Controllers.inputDialog(I18n.i18n("version.manage.rename.message"), res -> { if (profile.getRepository().renameVersion(version, res)) { profile.getRepository().refreshVersionsAsync().start(); Controllers.navigate(null); @@ -203,6 +204,6 @@ public final class VersionPage extends StackPane implements DecoratorPage { } public static void exportVersion(Profile profile, String version) { - Controllers.getDecorator().startWizard(new ExportWizardProvider(profile, version), Launcher.i18n("modpack.wizard")); + Controllers.getDecorator().startWizard(new ExportWizardProvider(profile, version), I18n.i18n("modpack.wizard")); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java index b675e8ac7..a9284458c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java @@ -29,7 +29,7 @@ import javafx.scene.control.Toggle; import javafx.scene.image.Image; import javafx.scene.layout.VBox; import javafx.stage.FileChooser; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.setting.EnumGameDirectory; import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.setting.VersionSetting; @@ -39,6 +39,7 @@ import org.jackhuang.hmcl.ui.construct.ComponentList; import org.jackhuang.hmcl.ui.construct.ImagePickerItem; import org.jackhuang.hmcl.ui.construct.MultiFileItem; import org.jackhuang.hmcl.util.*; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.io.IOException; @@ -79,7 +80,7 @@ public final class VersionSettingsController { @FXML private void initialize() { - lblPhysicalMemory.setText(Launcher.i18n("settings.physical_memory") + ": " + OperatingSystem.TOTAL_MEMORY + "MB"); + lblPhysicalMemory.setText(I18n.i18n("settings.physical_memory") + ": " + OperatingSystem.TOTAL_MEMORY + "MB"); FXUtils.smoothScrolling(scroll); @@ -96,13 +97,13 @@ public final class VersionSettingsController { javaItem.getExtensionFilters().add(new FileChooser.ExtensionFilter("Java", "java.exe", "javaw.exe")); gameDirItem.loadChildren(Arrays.asList( - gameDirItem.createChildren(Launcher.i18n("settings.advanced.game_dir.default"), EnumGameDirectory.ROOT_FOLDER), - gameDirItem.createChildren(Launcher.i18n("settings.advanced.game_dir.independent"), EnumGameDirectory.VERSION_FOLDER) + gameDirItem.createChildren(I18n.i18n("settings.advanced.game_dir.default"), EnumGameDirectory.ROOT_FOLDER), + gameDirItem.createChildren(I18n.i18n("settings.advanced.game_dir.independent"), EnumGameDirectory.VERSION_FOLDER) )); globalItem.loadChildren(Arrays.asList( - globalItem.createChildren(Launcher.i18n("settings.type.global"), true), - globalItem.createChildren(Launcher.i18n("settings.type.special"), false) + globalItem.createChildren(I18n.i18n("settings.type.global"), true), + globalItem.createChildren(I18n.i18n("settings.type.special"), false) )); } @@ -182,7 +183,7 @@ public final class VersionSettingsController { }); versionSetting.usesGlobalProperty().setChangedListenerAndOperate(it -> - globalItem.setSubtitle(Launcher.i18n(versionSetting.isUsesGlobal() ? "settings.type.global" : "settings.type.special"))); + globalItem.setSubtitle(I18n.i18n(versionSetting.isUsesGlobal() ? "settings.type.global" : "settings.type.special"))); gameDirItem.getGroup().getToggles().stream() .filter(it -> it.getUserData() == versionSetting.getGameDirType()) @@ -238,7 +239,7 @@ public final class VersionSettingsController { @FXML private void onExploreIcon() { FileChooser chooser = new FileChooser(); - chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(Launcher.i18n("extension.png"), "*.png")); + chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(I18n.i18n("extension.png"), "*.png")); File selectedFile = chooser.showOpenDialog(Controllers.getStage()); if (selectedFile != null) { File iconFile = profile.getRepository().getVersionIcon(versionId); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/FileItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/FileItem.java index b80c23113..d85316d8a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/FileItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/FileItem.java @@ -26,11 +26,12 @@ import javafx.scene.control.Tooltip; import javafx.scene.layout.BorderPane; import javafx.scene.layout.VBox; import javafx.stage.DirectoryChooser; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; @@ -54,7 +55,7 @@ public class FileItem extends BorderPane { right.setGraphic(SVG.pencil(Theme.blackFillBinding(), 15, 15)); right.getStyleClass().add("toggle-icon4"); right.setOnMouseClicked(e -> onExplore()); - FXUtils.installTooltip(right, Launcher.i18n("button.edit")); + FXUtils.installTooltip(right, I18n.i18n("button.edit")); setRight(right); Tooltip tip = new Tooltip(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/ImagePickerItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/ImagePickerItem.java index 178d6b10a..71f767e1a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/ImagePickerItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/ImagePickerItem.java @@ -15,10 +15,11 @@ import javafx.scene.input.MouseEvent; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; +import org.jackhuang.hmcl.util.i18n.I18n; @DefaultProperty("image") public final class ImagePickerItem extends BorderPane { @@ -41,7 +42,7 @@ public final class ImagePickerItem extends BorderPane { selectButton.onMouseClickedProperty().bind(onSelectButtonClicked); selectButton.getStyleClass().add("toggle-icon4"); - FXUtils.installTooltip(selectButton, Launcher.i18n("button.edit")); + FXUtils.installTooltip(selectButton, I18n.i18n("button.edit")); HBox hBox = new HBox(); hBox.getChildren().setAll(imageView, selectButton); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageBox.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageBox.java index 939f39e4a..5a1b012d8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageBox.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageBox.java @@ -20,8 +20,9 @@ package org.jackhuang.hmcl.ui.construct; import javafx.scene.control.Alert; import javafx.scene.control.ButtonType; import javafx.scene.control.TextInputDialog; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.ui.FXUtils; +import org.jackhuang.hmcl.util.i18n.I18n; import javax.swing.*; import java.util.Optional; @@ -30,7 +31,7 @@ public final class MessageBox { private MessageBox() { } - private static final String TITLE = Launcher.i18n("message.info"); + private static final String TITLE = I18n.i18n("message.info"); /** * User Operation: Yes diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java index 306467b23..69494e115 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java @@ -23,10 +23,11 @@ import javafx.scene.control.Label; import javafx.scene.layout.HBox; import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.Optional; import java.util.function.Consumer; @@ -91,8 +92,8 @@ public final class MessageDialogPane extends StackPane { Optional.ofNullable(onCancel).ifPresent(Runnable::run); }); - acceptButton.setText(Launcher.i18n("button.yes")); - cancelButton.setText(Launcher.i18n("button.no")); + acceptButton.setText(I18n.i18n("button.yes")); + cancelButton.setText(I18n.i18n("button.no")); actions.getChildren().add(cancelButton); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiColorItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiColorItem.java index 8e7ec20e3..2c0155ccb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiColorItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiColorItem.java @@ -13,16 +13,17 @@ import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.ui.FXUtils; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.Collection; import java.util.Optional; import java.util.function.Consumer; public class MultiColorItem extends ComponentList { - private final StringProperty customTitle = new SimpleStringProperty(this, "customTitle", Launcher.i18n("selector.custom")); - private final StringProperty chooserTitle = new SimpleStringProperty(this, "chooserTitle", Launcher.i18n("selector.choose_file")); + private final StringProperty customTitle = new SimpleStringProperty(this, "customTitle", I18n.i18n("selector.custom")); + private final StringProperty chooserTitle = new SimpleStringProperty(this, "chooserTitle", I18n.i18n("selector.choose_file")); private final ToggleGroup group = new ToggleGroup(); private final JFXColorPicker colorPicker = new JFXColorPicker(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiFileItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiFileItem.java index 9fa65db10..c55e0f124 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiFileItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiFileItem.java @@ -37,19 +37,20 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.DirectoryChooser; import javafx.stage.FileChooser; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.util.Collection; import java.util.function.Consumer; public class MultiFileItem extends ComponentList { - private final StringProperty customTitle = new SimpleStringProperty(this, "customTitle", Launcher.i18n("selector.custom")); - private final StringProperty chooserTitle = new SimpleStringProperty(this, "chooserTitle", Launcher.i18n("selector.choose_file")); + private final StringProperty customTitle = new SimpleStringProperty(this, "customTitle", I18n.i18n("selector.custom")); + private final StringProperty chooserTitle = new SimpleStringProperty(this, "chooserTitle", I18n.i18n("selector.choose_file")); private final BooleanProperty directory = new SimpleBooleanProperty(this, "directory", false); private final ObservableList extensionFilters = FXCollections.observableArrayList(); @@ -147,7 +148,7 @@ public class MultiFileItem extends ComponentList { public void onExploreJavaDir() { DirectoryChooser chooser = new DirectoryChooser(); - chooser.setTitle(Launcher.i18n(getChooserTitle())); + chooser.setTitle(I18n.i18n(getChooserTitle())); File selectedDir = chooser.showDialog(Controllers.getStage()); if (selectedDir != null) txtCustom.setText(selectedDir.getAbsolutePath()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java index 0b69e4f95..8a97c4ff5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java @@ -19,13 +19,14 @@ package org.jackhuang.hmcl.ui.construct; import com.jfoenix.concurrency.JFXUtilities; import javafx.beans.property.StringProperty; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.task.TaskListener; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.wizard.AbstractWizardDisplayer; import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.Map; @@ -38,7 +39,7 @@ public interface TaskExecutorDialogWizardDisplayer extends AbstractWizardDisplay Controllers.navigate(null); }); - pane.setTitle(Launcher.i18n("message.doing")); + pane.setTitle(I18n.i18n("message.doing")); pane.setProgress(Double.MAX_VALUE); if (settings.containsKey("title")) { Object title = settings.get("title"); @@ -66,7 +67,7 @@ public interface TaskExecutorDialogWizardDisplayer extends AbstractWizardDisplay if (settings.containsKey("success_message") && settings.get("success_message") instanceof String) Controllers.dialog((String) settings.get("success_message"), null, MessageBox.FINE_MESSAGE, () -> Controllers.navigate(null)); else if (!settings.containsKey("forbid_success_message")) - Controllers.dialog(Launcher.i18n("message.success"), null, MessageBox.FINE_MESSAGE, () -> Controllers.navigate(null)); + Controllers.dialog(I18n.i18n("message.success"), null, MessageBox.FINE_MESSAGE, () -> Controllers.navigate(null)); } else { if (executor.getLastException() == null) return; @@ -74,7 +75,7 @@ public interface TaskExecutorDialogWizardDisplayer extends AbstractWizardDisplay if (settings.containsKey("failure_message") && settings.get("failure_message") instanceof String) Controllers.dialog(appendix, (String) settings.get("failure_message"), MessageBox.ERROR_MESSAGE, () -> Controllers.navigate(null)); else if (!settings.containsKey("forbid_failure_message")) - Controllers.dialog(appendix, Launcher.i18n("wizard.failed"), MessageBox.ERROR_MESSAGE, () -> Controllers.navigate(null)); + Controllers.dialog(appendix, I18n.i18n("wizard.failed"), MessageBox.ERROR_MESSAGE, () -> Controllers.navigate(null)); } }); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java index 40bdbb3bd..c0c5ca83d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java @@ -23,7 +23,7 @@ import javafx.scene.control.Label; import javafx.scene.layout.BorderPane; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.download.forge.ForgeInstallTask; import org.jackhuang.hmcl.download.game.GameAssetDownloadTask; import org.jackhuang.hmcl.download.game.GameAssetRefreshTask; @@ -35,6 +35,7 @@ import org.jackhuang.hmcl.mod.*; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.task.TaskListener; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.HashMap; import java.util.Map; @@ -62,29 +63,29 @@ public final class TaskListPane extends StackPane { return; if (task instanceof GameAssetRefreshTask) { - task.setName(Launcher.i18n("assets.download")); + task.setName(I18n.i18n("assets.download")); } else if (task instanceof GameAssetDownloadTask) { - task.setName(Launcher.i18n("assets.download_all")); + task.setName(I18n.i18n("assets.download_all")); } else if (task instanceof ForgeInstallTask) { - task.setName(Launcher.i18n("install.installer.install", Launcher.i18n("install.installer.forge"))); + task.setName(I18n.i18n("install.installer.install", I18n.i18n("install.installer.forge"))); } else if (task instanceof LiteLoaderInstallTask) { - task.setName(Launcher.i18n("install.installer.install", Launcher.i18n("install.installer.liteloader"))); + task.setName(I18n.i18n("install.installer.install", I18n.i18n("install.installer.liteloader"))); } else if (task instanceof OptiFineInstallTask) { - task.setName(Launcher.i18n("install.installer.install", Launcher.i18n("install.installer.optifine"))); + task.setName(I18n.i18n("install.installer.install", I18n.i18n("install.installer.optifine"))); } else if (task instanceof CurseCompletionTask) { - task.setName(Launcher.i18n("modpack.type.curse.completion")); + task.setName(I18n.i18n("modpack.type.curse.completion")); } else if (task instanceof ModpackInstallTask) { - task.setName(Launcher.i18n("modpack.installing")); + task.setName(I18n.i18n("modpack.installing")); } else if (task instanceof CurseInstallTask) { - task.setName(Launcher.i18n("modpack.install", Launcher.i18n("modpack.type.curse"))); + task.setName(I18n.i18n("modpack.install", I18n.i18n("modpack.type.curse"))); } else if (task instanceof MultiMCModpackInstallTask) { - task.setName(Launcher.i18n("modpack.install", Launcher.i18n("modpack.type.multimc"))); + task.setName(I18n.i18n("modpack.install", I18n.i18n("modpack.type.multimc"))); } else if (task instanceof HMCLModpackInstallTask) { - task.setName(Launcher.i18n("modpack.install", Launcher.i18n("modpack.type.hmcl"))); + task.setName(I18n.i18n("modpack.install", I18n.i18n("modpack.type.hmcl"))); } else if (task instanceof HMCLModpackExportTask) { - task.setName(Launcher.i18n("modpack.export")); + task.setName(I18n.i18n("modpack.export")); } else if (task instanceof MinecraftInstanceTask) { - task.setName(Launcher.i18n("modpack.scan")); + task.setName(I18n.i18n("modpack.scan")); } ProgressListNode node = new ProgressListNode(task); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java index 71d2c9f28..8001bca32 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java @@ -22,7 +22,7 @@ import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.RemoteVersion; import org.jackhuang.hmcl.game.GameRepository; @@ -30,12 +30,11 @@ import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; import org.jackhuang.hmcl.util.Lang; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.Map; import java.util.Optional; -import static org.jackhuang.hmcl.Launcher.i18n; - class AdditionalInstallersPage extends StackPane implements WizardPage { private final InstallerWizardProvider provider; private final WizardController controller; @@ -72,21 +71,21 @@ class AdditionalInstallersPage extends StackPane implements WizardPage { btnForge.setOnMouseClicked(e -> { controller.getSettings().put(INSTALLER_TYPE, 0); - controller.onNext(new VersionsPage(controller, i18n("install.installer.choose", i18n("install.installer.forge")), provider.getGameVersion(), downloadProvider, "forge", () -> { + controller.onNext(new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.forge")), provider.getGameVersion(), downloadProvider, "forge", () -> { controller.onPrev(false); })); }); btnLiteLoader.setOnMouseClicked(e -> { controller.getSettings().put(INSTALLER_TYPE, 1); - controller.onNext(new VersionsPage(controller, i18n("install.installer.choose", i18n("install.installer.liteloader")), provider.getGameVersion(), downloadProvider, "liteloader", () -> { + controller.onNext(new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.liteloader")), provider.getGameVersion(), downloadProvider, "liteloader", () -> { controller.onPrev(false); })); }); btnOptiFine.setOnMouseClicked(e -> { controller.getSettings().put(INSTALLER_TYPE, 2); - controller.onNext(new VersionsPage(controller, i18n("install.installer.choose", i18n("install.installer.optifine")), provider.getGameVersion(), downloadProvider, "optifine", () -> { + controller.onNext(new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.optifine")), provider.getGameVersion(), downloadProvider, "optifine", () -> { controller.onPrev(false); })); }); @@ -100,7 +99,7 @@ class AdditionalInstallersPage extends StackPane implements WizardPage { @Override public String getTitle() { - return Launcher.i18n("settings.tabs.installers"); + return I18n.i18n("settings.tabs.installers"); } private String getVersion(String id) { @@ -109,24 +108,24 @@ class AdditionalInstallersPage extends StackPane implements WizardPage { @Override public void onNavigate(Map settings) { - lblGameVersion.setText(Launcher.i18n("install.new_game.current_game_version") + ": " + provider.getGameVersion()); + lblGameVersion.setText(I18n.i18n("install.new_game.current_game_version") + ": " + provider.getGameVersion()); btnForge.setDisable(provider.getForge() != null); if (provider.getForge() != null || controller.getSettings().containsKey("forge")) - lblForge.setText(Launcher.i18n("install.installer.version", Launcher.i18n("install.installer.forge")) + ": " + Lang.nonNull(provider.getForge(), getVersion("forge"))); + lblForge.setText(I18n.i18n("install.installer.version", I18n.i18n("install.installer.forge")) + ": " + Lang.nonNull(provider.getForge(), getVersion("forge"))); else - lblForge.setText(Launcher.i18n("install.installer.not_installed", Launcher.i18n("install.installer.forge"))); + lblForge.setText(I18n.i18n("install.installer.not_installed", I18n.i18n("install.installer.forge"))); btnLiteLoader.setDisable(provider.getLiteLoader() != null); if (provider.getLiteLoader() != null || controller.getSettings().containsKey("liteloader")) - lblLiteLoader.setText(Launcher.i18n("install.installer.version", Launcher.i18n("install.installer.liteloader")) + ": " + Lang.nonNull(provider.getLiteLoader(), getVersion("liteloader"))); + lblLiteLoader.setText(I18n.i18n("install.installer.version", I18n.i18n("install.installer.liteloader")) + ": " + Lang.nonNull(provider.getLiteLoader(), getVersion("liteloader"))); else - lblLiteLoader.setText(Launcher.i18n("install.installer.not_installed", Launcher.i18n("install.installer.liteloader"))); + lblLiteLoader.setText(I18n.i18n("install.installer.not_installed", I18n.i18n("install.installer.liteloader"))); btnOptiFine.setDisable(provider.getOptiFine() != null); if (provider.getOptiFine() != null || controller.getSettings().containsKey("optifine")) - lblOptiFine.setText(Launcher.i18n("install.installer.version", Launcher.i18n("install.installer.optifine")) + ": " + Lang.nonNull(provider.getOptiFine(), getVersion("optifine"))); + lblOptiFine.setText(I18n.i18n("install.installer.version", I18n.i18n("install.installer.optifine")) + ": " + Lang.nonNull(provider.getOptiFine(), getVersion("optifine"))); else - lblOptiFine.setText(Launcher.i18n("install.installer.not_installed", Launcher.i18n("install.installer.optifine"))); + lblOptiFine.setText(I18n.i18n("install.installer.not_installed", I18n.i18n("install.installer.optifine"))); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadWizardProvider.java index 00cb98ed9..67eda71f6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadWizardProvider.java @@ -18,7 +18,7 @@ package org.jackhuang.hmcl.ui.download; import javafx.scene.Node; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.GameBuilder; import org.jackhuang.hmcl.download.RemoteVersion; @@ -30,11 +30,11 @@ import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardProvider; import org.jackhuang.hmcl.util.Lang; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.util.Map; -import static org.jackhuang.hmcl.Launcher.i18n; import static org.jackhuang.hmcl.util.Lang.tryCast; public final class DownloadWizardProvider implements WizardProvider { @@ -78,8 +78,8 @@ public final class DownloadWizardProvider implements WizardProvider { @Override public Object finish(Map settings) { - settings.put("success_message", Launcher.i18n("install.success")); - settings.put("failure_message", Launcher.i18n("install.failed")); + settings.put("success_message", I18n.i18n("install.success")); + settings.put("failure_message", I18n.i18n("install.failed")); switch (Lang.parseInt(settings.get(InstallTypePage.INSTALL_TYPE), -1)) { case 0: return finishVersionDownloadingAsync(settings); @@ -98,7 +98,7 @@ public final class DownloadWizardProvider implements WizardProvider { int subStep = Lang.parseInt(settings.get(InstallTypePage.INSTALL_TYPE), -1); switch (subStep) { case 0: - return new VersionsPage(controller, i18n("install.installer.choose", i18n("install.installer.game")), "", provider, "game", () -> controller.onNext(new InstallersPage(controller, profile.getRepository(), provider))); + return new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.game")), "", provider, "game", () -> controller.onNext(new InstallersPage(controller, profile.getRepository(), provider))); case 1: return new ModpackPage(controller); default: diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallTypePage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallTypePage.java index 5c8212ee3..d733bb991 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallTypePage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallTypePage.java @@ -20,10 +20,11 @@ package org.jackhuang.hmcl.ui.download; import com.jfoenix.controls.JFXListView; import javafx.fxml.FXML; import javafx.scene.layout.StackPane; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.Map; @@ -49,7 +50,7 @@ public final class InstallTypePage extends StackPane implements WizardPage { @Override public String getTitle() { - return Launcher.i18n("install.select"); + return I18n.i18n("install.select"); } public static final String INSTALL_TYPE = "INSTALL_TYPE"; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallerWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallerWizardProvider.java index d8e77a3b7..ee94a8632 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallerWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallerWizardProvider.java @@ -18,7 +18,7 @@ package org.jackhuang.hmcl.ui.download; import javafx.scene.Node; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.download.BMCLAPIDownloadProvider; import org.jackhuang.hmcl.download.RemoteVersion; import org.jackhuang.hmcl.game.Version; @@ -26,6 +26,7 @@ import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardProvider; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.Map; @@ -80,8 +81,8 @@ public final class InstallerWizardProvider implements WizardProvider { @Override public Object finish(Map settings) { - settings.put("success_message", Launcher.i18n("install.success")); - settings.put("failure_message", Launcher.i18n("install.failed")); + settings.put("success_message", I18n.i18n("install.success")); + settings.put("failure_message", I18n.i18n("install.failed")); Task ret = Task.empty(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java index df52ef8c7..af204e13c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java @@ -23,7 +23,7 @@ import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.RemoteVersion; import org.jackhuang.hmcl.game.GameRepository; @@ -32,6 +32,7 @@ import org.jackhuang.hmcl.ui.construct.Validator; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.Map; @@ -75,30 +76,30 @@ public class InstallersPage extends StackPane implements WizardPage { String gameVersion = ((RemoteVersion) controller.getSettings().get("game")).getGameVersion(); Validator hasVersion = new Validator(s -> !repository.hasVersion(s) && StringUtils.isNotBlank(s)); - hasVersion.setMessage(Launcher.i18n("install.new_game.already_exists")); + hasVersion.setMessage(I18n.i18n("install.new_game.already_exists")); txtName.getValidators().add(hasVersion); txtName.textProperty().addListener(e -> btnInstall.setDisable(!txtName.validate())); txtName.setText(gameVersion); btnForge.setOnMouseClicked(e -> { controller.getSettings().put(INSTALLER_TYPE, 0); - controller.onNext(new VersionsPage(controller, Launcher.i18n("install.installer.choose", Launcher.i18n("install.installer.forge")), gameVersion, downloadProvider, "forge", () -> controller.onPrev(false))); + controller.onNext(new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.forge")), gameVersion, downloadProvider, "forge", () -> controller.onPrev(false))); }); btnLiteLoader.setOnMouseClicked(e -> { controller.getSettings().put(INSTALLER_TYPE, 1); - controller.onNext(new VersionsPage(controller, Launcher.i18n("install.installer.choose", Launcher.i18n("install.installer.liteloader")), gameVersion, downloadProvider, "liteloader", () -> controller.onPrev(false))); + controller.onNext(new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.liteloader")), gameVersion, downloadProvider, "liteloader", () -> controller.onPrev(false))); }); btnOptiFine.setOnMouseClicked(e -> { controller.getSettings().put(INSTALLER_TYPE, 2); - controller.onNext(new VersionsPage(controller, Launcher.i18n("install.installer.choose", Launcher.i18n("install.installer.optifine")), gameVersion, downloadProvider, "optifine", () -> controller.onPrev(false))); + controller.onNext(new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.optifine")), gameVersion, downloadProvider, "optifine", () -> controller.onPrev(false))); }); } @Override public String getTitle() { - return Launcher.i18n("install.new_game"); + return I18n.i18n("install.new_game"); } private String getVersion(String id) { @@ -107,21 +108,21 @@ public class InstallersPage extends StackPane implements WizardPage { @Override public void onNavigate(Map settings) { - lblGameVersion.setText(Launcher.i18n("install.new_game.current_game_version") + ": " + getVersion("game")); + lblGameVersion.setText(I18n.i18n("install.new_game.current_game_version") + ": " + getVersion("game")); if (controller.getSettings().containsKey("forge")) - lblForge.setText(Launcher.i18n("install.installer.version", Launcher.i18n("install.installer.forge")) + ": " + getVersion("forge")); + lblForge.setText(I18n.i18n("install.installer.version", I18n.i18n("install.installer.forge")) + ": " + getVersion("forge")); else - lblForge.setText(Launcher.i18n("install.installer.not_installed", Launcher.i18n("install.installer.forge"))); + lblForge.setText(I18n.i18n("install.installer.not_installed", I18n.i18n("install.installer.forge"))); if (controller.getSettings().containsKey("liteloader")) - lblLiteLoader.setText(Launcher.i18n("install.installer.version", Launcher.i18n("install.installer.liteloader")) + ": " + getVersion("liteloader")); + lblLiteLoader.setText(I18n.i18n("install.installer.version", I18n.i18n("install.installer.liteloader")) + ": " + getVersion("liteloader")); else - lblLiteLoader.setText(Launcher.i18n("install.installer.not_installed", Launcher.i18n("install.installer.liteloader"))); + lblLiteLoader.setText(I18n.i18n("install.installer.not_installed", I18n.i18n("install.installer.liteloader"))); if (controller.getSettings().containsKey("optifine")) - lblOptiFine.setText(Launcher.i18n("install.installer.version", Launcher.i18n("install.installer.optifine")) + ": " + getVersion("optifine")); + lblOptiFine.setText(I18n.i18n("install.installer.version", I18n.i18n("install.installer.optifine")) + ": " + getVersion("optifine")); else - lblOptiFine.setText(Launcher.i18n("install.installer.not_installed", Launcher.i18n("install.installer.optifine"))); + lblOptiFine.setText(I18n.i18n("install.installer.not_installed", I18n.i18n("install.installer.optifine"))); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java index ac39bbca1..55298f6e6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java @@ -25,7 +25,7 @@ import javafx.scene.control.Label; import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import javafx.stage.FileChooser; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.game.ModpackHelper; import org.jackhuang.hmcl.mod.Modpack; import org.jackhuang.hmcl.mod.UnsupportedModpackException; @@ -37,6 +37,7 @@ import org.jackhuang.hmcl.ui.construct.Validator; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.util.Map; @@ -75,16 +76,16 @@ public final class ModpackPage extends StackPane implements WizardPage { Profile profile = (Profile) controller.getSettings().get("PROFILE"); FileChooser chooser = new FileChooser(); - chooser.setTitle(Launcher.i18n("modpack.choose")); - chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(Launcher.i18n("modpack"), "*.zip")); + chooser.setTitle(I18n.i18n("modpack.choose")); + chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(I18n.i18n("modpack"), "*.zip")); File selectedFile = chooser.showOpenDialog(Controllers.getStage()); if (selectedFile == null) Platform.runLater(() -> Controllers.navigate(null)); else { controller.getSettings().put(MODPACK_FILE, selectedFile); lblModpackLocation.setText(selectedFile.getAbsolutePath()); txtModpackName.getValidators().addAll( - new Validator(Launcher.i18n("install.new_game.already_exists"), str -> !profile.getRepository().hasVersion(str) && StringUtils.isNotBlank(str)), - new Validator(Launcher.i18n("version.forbidden_name"), str -> !profile.getRepository().forbidsVersion(str)) + new Validator(I18n.i18n("install.new_game.already_exists"), str -> !profile.getRepository().hasVersion(str) && StringUtils.isNotBlank(str)), + new Validator(I18n.i18n("version.forbidden_name"), str -> !profile.getRepository().forbidsVersion(str)) ); txtModpackName.textProperty().addListener(e -> btnInstall.setDisable(!txtModpackName.validate())); @@ -96,7 +97,7 @@ public final class ModpackPage extends StackPane implements WizardPage { lblAuthor.setText(manifest.getAuthor()); txtModpackName.setText(manifest.getName() + (StringUtils.isBlank(manifest.getVersion()) ? "" : "-" + manifest.getVersion())); } catch (UnsupportedModpackException e) { - txtModpackName.setText(Launcher.i18n("modpack.task.install.error")); + txtModpackName.setText(I18n.i18n("modpack.task.install.error")); } } } @@ -118,14 +119,14 @@ public final class ModpackPage extends StackPane implements WizardPage { if (manifest != null) { WebStage stage = new WebStage(); stage.getWebView().getEngine().loadContent(manifest.getDescription()); - stage.setTitle(Launcher.i18n("modpack.wizard.step.3")); + stage.setTitle(I18n.i18n("modpack.wizard.step.3")); stage.showAndWait(); } } @Override public String getTitle() { - return Launcher.i18n("modpack.task.install"); + return I18n.i18n("modpack.task.install"); } public static final String MODPACK_FILE = "MODPACK_FILE"; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPageItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPageItem.java index 79f2633fc..907afecb2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPageItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPageItem.java @@ -23,12 +23,13 @@ import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.download.RemoteVersion; import org.jackhuang.hmcl.download.game.GameRemoteVersionTag; import org.jackhuang.hmcl.download.liteloader.LiteLoaderRemoteVersionTag; import org.jackhuang.hmcl.download.optifine.OptiFineRemoteVersion; import org.jackhuang.hmcl.ui.FXUtils; +import org.jackhuang.hmcl.util.i18n.I18n; import java.util.Objects; @@ -57,15 +58,15 @@ public final class VersionsPageItem extends StackPane { if (remoteVersion.getTag() instanceof GameRemoteVersionTag) { switch (((GameRemoteVersionTag) remoteVersion.getTag()).getType()) { case RELEASE: - lblGameVersion.setText(Launcher.i18n("version.game.release")); + lblGameVersion.setText(I18n.i18n("version.game.release")); imageView.setImage(new Image("/assets/img/icon.png", 32, 32, false, true)); break; case SNAPSHOT: - lblGameVersion.setText(Launcher.i18n("version.game.snapshot")); + lblGameVersion.setText(I18n.i18n("version.game.snapshot")); imageView.setImage(new Image("/assets/img/command.png", 32, 32, false, true)); break; default: - lblGameVersion.setText(Launcher.i18n("version.game.old")); + lblGameVersion.setText(I18n.i18n("version.game.old")); imageView.setImage(new Image("/assets/img/grass.png", 32, 32, false, true)); break; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java index 5915c4d9e..46503b53a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java @@ -25,7 +25,7 @@ import javafx.scene.control.Label; import javafx.scene.control.TreeItem; import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.game.ModAdviser; import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.ui.FXUtils; @@ -34,6 +34,7 @@ import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; import org.jackhuang.hmcl.util.FileUtils; import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.util.LinkedList; @@ -151,23 +152,23 @@ public final class ModpackFileSelectionPage extends StackPane implements WizardP @Override public String getTitle() { - return Launcher.i18n("modpack.wizard.step.2.title"); + return I18n.i18n("modpack.wizard.step.2.title"); } public static final String MODPACK_FILE_SELECTION = "modpack.accepted"; private static final Map TRANSLATION = mapOf( - pair("minecraft/servers.dat", Launcher.i18n("modpack.files.servers_dat")), - pair("minecraft/saves", Launcher.i18n("modpack.files.saves")), - pair("minecraft/mods", Launcher.i18n("modpack.files.mods")), - pair("minecraft/config", Launcher.i18n("modpack.files.config")), - pair("minecraft/liteconfig", Launcher.i18n("modpack.files.liteconfig")), - pair("minecraft/resourcepacks", Launcher.i18n("modpack.files.resourcepacks")), - pair("minecraft/resources", Launcher.i18n("modpack.files.resourcepacks")), - pair("minecraft/options.txt", Launcher.i18n("modpack.files.options_txt")), - pair("minecraft/optionsshaders.txt", Launcher.i18n("modpack.files.optionsshaders_txt")), - pair("minecraft/mods/VoxelMods", Launcher.i18n("modpack.files.mods.voxelmods")), - pair("minecraft/dumps", Launcher.i18n("modpack.files.dumps")), - pair("minecraft/blueprints", Launcher.i18n("modpack.files.blueprints")), - pair("minecraft/scripts", Launcher.i18n("modpack.files.scripts")) + pair("minecraft/servers.dat", I18n.i18n("modpack.files.servers_dat")), + pair("minecraft/saves", I18n.i18n("modpack.files.saves")), + pair("minecraft/mods", I18n.i18n("modpack.files.mods")), + pair("minecraft/config", I18n.i18n("modpack.files.config")), + pair("minecraft/liteconfig", I18n.i18n("modpack.files.liteconfig")), + pair("minecraft/resourcepacks", I18n.i18n("modpack.files.resourcepacks")), + pair("minecraft/resources", I18n.i18n("modpack.files.resourcepacks")), + pair("minecraft/options.txt", I18n.i18n("modpack.files.options_txt")), + pair("minecraft/optionsshaders.txt", I18n.i18n("modpack.files.optionsshaders_txt")), + pair("minecraft/mods/VoxelMods", I18n.i18n("modpack.files.mods.voxelmods")), + pair("minecraft/dumps", I18n.i18n("modpack.files.dumps")), + pair("minecraft/blueprints", I18n.i18n("modpack.files.blueprints")), + pair("minecraft/scripts", I18n.i18n("modpack.files.scripts")) ); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java index a178be5bf..566c9f117 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java @@ -33,6 +33,7 @@ import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.util.List; @@ -81,8 +82,8 @@ public final class ModpackInfoPage extends StackPane implements WizardPage { @FXML private void onNext() { FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle(Launcher.i18n("modpack.wizard.step.initialization.save")); - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(Launcher.i18n("modpack"), "*.zip")); + fileChooser.setTitle(I18n.i18n("modpack.wizard.step.initialization.save")); + fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(I18n.i18n("modpack"), "*.zip")); File file = fileChooser.showSaveDialog(Controllers.getStage()); if (file == null) { Controllers.navigate(null); @@ -109,7 +110,7 @@ public final class ModpackInfoPage extends StackPane implements WizardPage { @Override public String getTitle() { - return Launcher.i18n("modpack.wizard.step.1.title"); + return I18n.i18n("modpack.wizard.step.1.title"); } public static final String MODPACK_NAME = "modpack.name"; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java index 03c4d5686..770e0022e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java @@ -29,6 +29,7 @@ import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.util.*; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.io.FileInputStream; @@ -113,7 +114,7 @@ public class AppDataUpgrader extends IUpgrader { Task task = new AppDataUpgraderJarTask(NetworkUtils.toURL(map.get("jar")), version.toString(), hash); TaskExecutor executor = task.executor(); AtomicReference region = new AtomicReference<>(); - JFXUtilities.runInFX(() -> region.set(Controllers.taskDialog(executor, Launcher.i18n("message.downloading"), "", null))); + JFXUtilities.runInFX(() -> region.set(Controllers.taskDialog(executor, I18n.i18n("message.downloading"), "", null))); if (executor.test()) { new ProcessBuilder(JavaVersion.fromCurrentEnvironment().getBinary().getAbsolutePath(), "-jar", AppDataUpgraderJarTask.getSelf(version.toString()).getAbsolutePath()) .directory(new File("").getAbsoluteFile()).start(); @@ -131,7 +132,7 @@ public class AppDataUpgrader extends IUpgrader { Task task = new AppDataUpgraderPackGzTask(NetworkUtils.toURL(map.get("pack")), version.toString(), hash); TaskExecutor executor = task.executor(); AtomicReference region = new AtomicReference<>(); - JFXUtilities.runInFX(() -> region.set(Controllers.taskDialog(executor, Launcher.i18n("message.downloading"), "", null))); + JFXUtilities.runInFX(() -> region.set(Controllers.taskDialog(executor, I18n.i18n("message.downloading"), "", null))); if (executor.test()) { new ProcessBuilder(JavaVersion.fromCurrentEnvironment().getBinary().getAbsolutePath(), "-jar", AppDataUpgraderPackGzTask.getSelf(version.toString()).getAbsolutePath()) .directory(new File("").getAbsoluteFile()).start(); @@ -153,7 +154,7 @@ public class AppDataUpgrader extends IUpgrader { } catch (URISyntaxException | IOException e) { Logging.LOG.log(Level.SEVERE, "Failed to browse uri: " + url, e); OperatingSystem.setClipboard(url); - MessageBox.show(Launcher.i18n("update.no_browser")); + MessageBox.show(I18n.i18n("update.no_browser")); } } })).start(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java index 47dfae750..2a690f171 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java @@ -19,13 +19,14 @@ package org.jackhuang.hmcl.upgrade; import com.jfoenix.concurrency.JFXUtilities; import javafx.scene.layout.Region; -import org.jackhuang.hmcl.Launcher; + import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.VersionNumber; +import org.jackhuang.hmcl.util.i18n.I18n; import java.io.File; import java.io.IOException; @@ -57,11 +58,11 @@ public class NewFileUpgrader extends IUpgrader { URL url = requestDownloadLink(); if (url == null) return; File newf = new File(url.getFile()); - Controllers.dialog(Launcher.i18n("message.downloading")); + Controllers.dialog(I18n.i18n("message.downloading")); Task task = new FileDownloadTask(url, newf); TaskExecutor executor = task.executor(); AtomicReference region = new AtomicReference<>(); - JFXUtilities.runInFX(() -> region.set(Controllers.taskDialog(executor, Launcher.i18n("message.downloading"), "", null))); + JFXUtilities.runInFX(() -> region.set(Controllers.taskDialog(executor, I18n.i18n("message.downloading"), "", null))); if (executor.test()) { try { new ProcessBuilder(newf.getCanonicalPath(), "--removeOldLauncher", getRealPath()) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java index 8230d01f1..c898bc185 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java @@ -29,6 +29,7 @@ import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.NetworkUtils; import org.jackhuang.hmcl.util.VersionNumber; +import org.jackhuang.hmcl.util.i18n.I18n; import static org.jackhuang.hmcl.util.Logging.LOG; @@ -92,7 +93,7 @@ public final class UpdateChecker { if (value == null) { LOG.warning("Unable to check update..."); if (showMessage) - MessageBox.show(Launcher.i18n("update.failed")); + MessageBox.show(I18n.i18n("update.failed")); } else if (base.compareTo(value) < 0) outOfDate = true; if (outOfDate) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java index d51052ebf..b89ebd3e7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java @@ -21,6 +21,7 @@ import javafx.application.Platform; import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.ui.CrashWindow; import org.jackhuang.hmcl.ui.construct.MessageBox; +import org.jackhuang.hmcl.util.i18n.I18n; import static java.util.Collections.newSetFromMap; import static org.jackhuang.hmcl.util.Logging.LOG; @@ -41,19 +42,19 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { private static final Map SOURCE = new HashMap() { { - put("javafx.fxml.LoadException", Launcher.i18n("crash.NoClassDefFound")); - put("Location is not set", Launcher.i18n("crash.NoClassDefFound")); - put("UnsatisfiedLinkError", Launcher.i18n("crash.user_fault")); - put("java.lang.NoClassDefFoundError", Launcher.i18n("crash.NoClassDefFound")); - put("java.lang.VerifyError", Launcher.i18n("crash.NoClassDefFound")); - put("java.lang.NoSuchMethodError", Launcher.i18n("crash.NoClassDefFound")); - put("java.lang.NoSuchFieldError", Launcher.i18n("crash.NoClassDefFound")); - put("netscape.javascript.JSException", Launcher.i18n("crash.NoClassDefFound")); - put("java.lang.IncompatibleClassChangeError", Launcher.i18n("crash.NoClassDefFound")); - put("java.lang.ClassFormatError", Launcher.i18n("crash.NoClassDefFound")); + put("javafx.fxml.LoadException", I18n.i18n("crash.NoClassDefFound")); + put("Location is not set", I18n.i18n("crash.NoClassDefFound")); + put("UnsatisfiedLinkError", I18n.i18n("crash.user_fault")); + put("java.lang.NoClassDefFoundError", I18n.i18n("crash.NoClassDefFound")); + put("java.lang.VerifyError", I18n.i18n("crash.NoClassDefFound")); + put("java.lang.NoSuchMethodError", I18n.i18n("crash.NoClassDefFound")); + put("java.lang.NoSuchFieldError", I18n.i18n("crash.NoClassDefFound")); + put("netscape.javascript.JSException", I18n.i18n("crash.NoClassDefFound")); + put("java.lang.IncompatibleClassChangeError", I18n.i18n("crash.NoClassDefFound")); + put("java.lang.ClassFormatError", I18n.i18n("crash.NoClassDefFound")); put("java.lang.OutOfMemoryError", "FUCKING MEMORY LIMIT!"); - put("Trampoline", Launcher.i18n("launcher.update_java")); - put("com.sun.javafx.css.StyleManager.findMatchingStyles", Launcher.i18n("launcher.update_java")); + put("Trampoline", I18n.i18n("launcher.update_java")); + put("com.sun.javafx.css.StyleManager.findMatchingStyles", I18n.i18n("launcher.update_java")); put("NoSuchAlgorithmException", "Has your operating system been installed completely or is a ghost system?"); } }; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java new file mode 100644 index 000000000..b1e8066a7 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java @@ -0,0 +1,45 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2018 huangyuhui + * + * 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 {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.util.i18n; + +import java.util.ResourceBundle; +import java.util.logging.Level; + +import org.jackhuang.hmcl.setting.Settings; +import org.jackhuang.hmcl.util.Logging; + +public final class I18n { + + public static final ResourceBundle RESOURCE_BUNDLE = Settings.INSTANCE.getLocale().getResourceBundle(); + + private I18n() {} + + public static String i18n(String key, Object... formatArgs) { + return String.format(I18n.i18n(key), formatArgs); + } + + public static String i18n(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (Exception e) { + Logging.LOG.log(Level.SEVERE, "Cannot find key " + key + " in resource bundle", e); + return key; + } + } + +} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/I18nException.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18nException.java similarity index 94% rename from HMCL/src/main/java/org/jackhuang/hmcl/util/I18nException.java rename to HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18nException.java index cb46ebc01..bd1b49884 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/I18nException.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18nException.java @@ -15,7 +15,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see {http://www.gnu.org/licenses/}. */ -package org.jackhuang.hmcl.util; +package org.jackhuang.hmcl.util.i18n; + +import org.jackhuang.hmcl.util.StringUtils; public class I18nException extends Exception { private final String localizedMessage; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Locales.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/Locales.java similarity index 97% rename from HMCL/src/main/java/org/jackhuang/hmcl/setting/Locales.java rename to HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/Locales.java index b5a8d8bd4..78b02c102 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Locales.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/Locales.java @@ -1,7 +1,7 @@ /* * Hello Minecraft! Launcher. * Copyright (C) 2018 huangyuhui - * + * * 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 @@ -15,9 +15,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see {http://www.gnu.org/licenses/}. */ -package org.jackhuang.hmcl.setting; +package org.jackhuang.hmcl.util.i18n; -import org.jackhuang.hmcl.ui.construct.UTF8Control; import org.jackhuang.hmcl.util.Lang; import java.util.List; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/UTF8Control.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/UTF8Control.java similarity index 89% rename from HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/UTF8Control.java rename to HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/UTF8Control.java index d77d236f6..e53acf7db 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/UTF8Control.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/UTF8Control.java @@ -1,7 +1,7 @@ /* * Hello Minecraft! Launcher. * Copyright (C) 2018 huangyuhui - * + * * 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 @@ -15,7 +15,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see {http://www.gnu.org/licenses/}. */ -package org.jackhuang.hmcl.ui.construct; +package org.jackhuang.hmcl.util.i18n; + +import static java.nio.charset.StandardCharsets.UTF_8; import java.io.IOException; import java.io.InputStream; @@ -26,14 +28,14 @@ import java.util.Locale; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; -public final class UTF8Control extends ResourceBundle.Control { +final class UTF8Control extends ResourceBundle.Control { + public static final UTF8Control INSTANCE = new UTF8Control(); private UTF8Control() {} @Override - public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) - throws IOException { + public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IOException { // The below is a copy of the default implementation. String bundleName = toBundleName(baseName, locale); String resourceName = toResourceName(bundleName, "properties"); @@ -54,7 +56,7 @@ public final class UTF8Control extends ResourceBundle.Control { if (stream != null) { try { // Only this line is changed to make it to read properties files as UTF-8. - bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8")); + bundle = new PropertyResourceBundle(new InputStreamReader(stream, UTF_8)); } finally { stream.close(); } From 9743cf8351d75eca49e982a98e9fd5fdd973fadd Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sun, 1 Jul 2018 21:16:50 +0800 Subject: [PATCH 2/5] Use static import for I18n.i18n --- .../jackhuang/hmcl/game/LauncherHelper.java | 39 ++++++++------- .../org/jackhuang/hmcl/game/LoadingState.java | 4 +- .../org/jackhuang/hmcl/setting/Profiles.java | 6 +-- .../org/jackhuang/hmcl/ui/AccountPage.java | 4 +- .../org/jackhuang/hmcl/ui/AddAccountPane.java | 33 +++++++------ .../hmcl/ui/AuthlibInjectorServersPage.java | 7 ++- .../org/jackhuang/hmcl/ui/CrashWindow.java | 12 +++-- .../java/org/jackhuang/hmcl/ui/Decorator.java | 2 - .../hmcl/ui/InstallerController.java | 4 +- .../org/jackhuang/hmcl/ui/InstallerItem.java | 6 +-- .../jackhuang/hmcl/ui/LeftPaneController.java | 23 +++++---- .../java/org/jackhuang/hmcl/ui/LogWindow.java | 5 +- .../java/org/jackhuang/hmcl/ui/MainPage.java | 47 +++++++++---------- .../org/jackhuang/hmcl/ui/ModController.java | 13 +++-- .../java/org/jackhuang/hmcl/ui/ModItem.java | 6 +-- .../org/jackhuang/hmcl/ui/ProfilePage.java | 4 +- .../org/jackhuang/hmcl/ui/SettingsPage.java | 23 ++++----- .../org/jackhuang/hmcl/ui/VersionItem.java | 10 ++-- .../org/jackhuang/hmcl/ui/VersionPage.java | 18 +++---- .../hmcl/ui/VersionSettingsController.java | 16 +++---- .../jackhuang/hmcl/ui/construct/FileItem.java | 4 +- .../hmcl/ui/construct/ImagePickerItem.java | 5 +- .../hmcl/ui/construct/MessageBox.java | 7 +-- .../hmcl/ui/construct/MessageDialogPane.java | 6 +-- .../hmcl/ui/construct/MultiColorItem.java | 6 +-- .../hmcl/ui/construct/MultiFileItem.java | 8 ++-- .../TaskExecutorDialogWizardDisplayer.java | 8 ++-- .../hmcl/ui/construct/TaskListPane.java | 26 +++++----- .../ui/download/AdditionalInstallersPage.java | 24 +++++----- .../ui/download/DownloadWizardProvider.java | 9 ++-- .../hmcl/ui/download/InstallTypePage.java | 4 +- .../ui/download/InstallerWizardProvider.java | 6 +-- .../hmcl/ui/download/InstallersPage.java | 26 +++++----- .../hmcl/ui/download/ModpackPage.java | 16 +++---- .../hmcl/ui/download/VersionsPageItem.java | 8 ++-- .../ui/export/ModpackFileSelectionPage.java | 31 ++++++------ .../hmcl/ui/export/ModpackInfoPage.java | 8 ++-- .../hmcl/upgrade/AppDataUpgrader.java | 8 ++-- .../hmcl/upgrade/NewFileUpgrader.java | 7 ++- .../jackhuang/hmcl/upgrade/UpdateChecker.java | 5 +- .../jackhuang/hmcl/util/CrashReporter.java | 27 +++++------ .../org/jackhuang/hmcl/util/i18n/I18n.java | 2 +- 42 files changed, 263 insertions(+), 270 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index 9534e8272..af7ec1328 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -23,7 +23,6 @@ import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.AuthInfo; import org.jackhuang.hmcl.auth.AuthenticationException; import org.jackhuang.hmcl.auth.CredentialExpiredException; -import org.jackhuang.hmcl.auth.ServerDisconnectException; import org.jackhuang.hmcl.download.DefaultDependencyManager; import org.jackhuang.hmcl.download.MaintainTask; import org.jackhuang.hmcl.launch.*; @@ -41,7 +40,6 @@ import org.jackhuang.hmcl.ui.LogWindow; import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogPane; import org.jackhuang.hmcl.util.*; -import org.jackhuang.hmcl.util.i18n.I18n; import org.jackhuang.hmcl.util.i18n.I18nException; import java.io.File; @@ -53,6 +51,7 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Pair.pair; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class LauncherHelper { public static final LauncherHelper INSTANCE = new LauncherHelper(); @@ -108,7 +107,7 @@ public final class LauncherHelper { } }) .then(Task.of(Schedulers.javafx(), () -> emitStatus(LoadingState.LOGGING_IN))) - .then(Task.of(I18n.i18n("account.methods"), variables -> { + .then(Task.of(i18n("account.methods"), variables -> { try { variables.set("account", account.logIn()); } catch (CredentialExpiredException e) { @@ -133,12 +132,12 @@ public final class LauncherHelper { .then(variables -> { DefaultLauncher launcher = variables.get("launcher"); if (scriptFile == null) { - return new LaunchTask<>(launcher::launch).setName(I18n.i18n("version.launch")); + return new LaunchTask<>(launcher::launch).setName(i18n("version.launch")); } else { return new LaunchTask<>(() -> { launcher.makeLaunchScript(scriptFile); return null; - }).setName(I18n.i18n("version.launch_script")); + }).setName(i18n("version.launch_script")); } }) .then(Task.of(variables -> { @@ -155,7 +154,7 @@ public final class LauncherHelper { } else Platform.runLater(() -> { Controllers.closeDialog(launchingStepsPane); - Controllers.dialog(I18n.i18n("version.launch_script.success", scriptFile.getAbsolutePath())); + Controllers.dialog(i18n("version.launch_script.success", scriptFile.getAbsolutePath())); }); })) @@ -184,11 +183,11 @@ public final class LauncherHelper { if (ex != null) { String message; if (ex instanceof CurseCompletionException) - message = I18n.i18n("modpack.type.curse.error"); + message = i18n("modpack.type.curse.error"); else message = I18nException.getStackTrace(ex); Controllers.dialog(message, - scriptFile == null ? I18n.i18n("launch.failed") : I18n.i18n("version.launch_script.failed"), + scriptFile == null ? i18n("launch.failed") : i18n("version.launch_script.failed"), MessageBox.ERROR_MESSAGE); } } @@ -209,7 +208,7 @@ public final class LauncherHelper { VersionNumber gameVersion = VersionNumber.asVersion(GameVersion.minecraftVersion(profile.getRepository().getVersionJar(version)).orElse("Unknown")); JavaVersion java = setting.getJavaVersion(); if (java == null) { - Controllers.dialog(I18n.i18n("launch.wrong_javadir"), I18n.i18n("message.error"), MessageBox.WARNING_MESSAGE, onAccept); + Controllers.dialog(i18n("launch.wrong_javadir"), i18n("message.error"), MessageBox.WARNING_MESSAGE, onAccept); setting.setJava(null); setting.setDefaultJavaPath(null); java = JavaVersion.fromCurrentEnvironment(); @@ -220,10 +219,10 @@ public final class LauncherHelper { if (gameVersion.compareTo(VersionNumber.asVersion("1.13")) >= 0) { // Minecraft 1.13 and later versions only support Java 8 or later. // Terminate launching operation. - Controllers.dialog(I18n.i18n("launch.advice.java8_1_13"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE, null); + Controllers.dialog(i18n("launch.advice.java8_1_13"), i18n("message.error"), MessageBox.ERROR_MESSAGE, null); } else { // Most mods require Java 8 or later version. - Controllers.dialog(I18n.i18n("launch.advice.newer_java"), I18n.i18n("message.error"), MessageBox.WARNING_MESSAGE, onAccept); + Controllers.dialog(i18n("launch.advice.newer_java"), i18n("message.error"), MessageBox.WARNING_MESSAGE, onAccept); } flag = true; } @@ -231,24 +230,24 @@ public final class LauncherHelper { // LaunchWrapper will crash because of assuming the system class loader is an instance of URLClassLoader. // cpw has claimed that he will make MinecraftForge of 1.13 and later versions able to run on Java 9. if (!flag && java.getParsedVersion() >= JavaVersion.JAVA_9 && gameVersion.compareTo(VersionNumber.asVersion("1.12.5")) < 0 && version.getMainClass().contains("launchwrapper")) { - Controllers.dialog(I18n.i18n("launch.advice.java9"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE, null); + Controllers.dialog(i18n("launch.advice.java9"), i18n("message.error"), MessageBox.ERROR_MESSAGE, null); flag = true; } if (!flag && java.getPlatform() == org.jackhuang.hmcl.util.Platform.BIT_32 && org.jackhuang.hmcl.util.Platform.IS_64_BIT) { - Controllers.dialog(I18n.i18n("launch.advice.different_platform"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); + Controllers.dialog(i18n("launch.advice.different_platform"), i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); flag = true; } if (!flag && java.getPlatform() == org.jackhuang.hmcl.util.Platform.BIT_32 && setting.getMaxMemory() > 1.5 * 1024) { // 1.5 * 1024 is an inaccurate number. // Actual memory limit depends on operating system and memory. - Controllers.dialog(I18n.i18n("launch.advice.too_large_memory_for_32bit"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); + Controllers.dialog(i18n("launch.advice.too_large_memory_for_32bit"), i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); flag = true; } if (!flag && OperatingSystem.TOTAL_MEMORY > 0 && OperatingSystem.TOTAL_MEMORY < setting.getMaxMemory()) { - Controllers.dialog(I18n.i18n("launch.advice.not_enough_space", OperatingSystem.TOTAL_MEMORY), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); + Controllers.dialog(i18n("launch.advice.not_enough_space", OperatingSystem.TOTAL_MEMORY), i18n("message.error"), MessageBox.ERROR_MESSAGE, onAccept); flag = true; } @@ -302,11 +301,11 @@ public final class LauncherHelper { try { setResult(supplier.get()); } catch (PermissionException e) { - throw new I18nException(I18n.i18n("launch.failed.executable_permission"), e); + throw new I18nException(i18n("launch.failed.executable_permission"), e); } catch (ProcessCreationException e) { - throw new I18nException(I18n.i18n("launch.failed.creating_process") + e.getLocalizedMessage(), e); + throw new I18nException(i18n("launch.failed.creating_process") + e.getLocalizedMessage(), e); } catch (NotDecompressingNativesException e) { - throw new I18nException(I18n.i18n("launch.failed.decompressing_natives") + e.getLocalizedMessage(), e); + throw new I18nException(i18n("launch.failed.decompressing_natives") + e.getLocalizedMessage(), e); } } @@ -426,10 +425,10 @@ public final class LauncherHelper { switch (exitType) { case JVM_ERROR: - logWindow.setTitle(I18n.i18n("launch.failed.cannot_create_jvm")); + logWindow.setTitle(i18n("launch.failed.cannot_create_jvm")); break; case APPLICATION_ERROR: - logWindow.setTitle(I18n.i18n("launch.failed.exited_abnormally")); + logWindow.setTitle(i18n("launch.failed.exited_abnormally")); break; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LoadingState.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LoadingState.java index 847e9e112..c19c6707e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LoadingState.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LoadingState.java @@ -17,7 +17,7 @@ */ package org.jackhuang.hmcl.game; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public enum LoadingState { DEPENDENCIES("launch.state.dependencies"), @@ -33,6 +33,6 @@ public enum LoadingState { } public String getLocalizedMessage() { - return I18n.i18n(key); + return i18n(key); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profiles.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profiles.java index c9a5e8b3f..5b6d69b7f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profiles.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Profiles.java @@ -17,7 +17,7 @@ */ package org.jackhuang.hmcl.setting; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class Profiles { @@ -30,9 +30,9 @@ public final class Profiles { public static String getProfileDisplayName(Profile profile) { switch (profile.getName()) { case Profiles.DEFAULT_PROFILE: - return I18n.i18n("profile.default"); + return i18n("profile.default"); case Profiles.HOME_PROFILE: - return I18n.i18n("profile.home"); + return i18n("profile.home"); default: return profile.getName(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountPage.java index deda63804..10e2f1979 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountPage.java @@ -39,7 +39,7 @@ import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.ui.construct.ComponentList; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.Optional; @@ -74,7 +74,7 @@ public class AccountPage extends StackPane implements DecoratorPage { this.account = account; this.item = item; - title = new SimpleStringProperty(this, "title", I18n.i18n("account") + " - " + account.getCharacter()); + title = new SimpleStringProperty(this, "title", i18n("account") + " - " + account.getCharacter()); FXUtils.loadFXML(this, "/assets/fxml/account.fxml"); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java index 97bb3cb2e..138acab4f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AddAccountPane.java @@ -49,10 +49,9 @@ import org.jackhuang.hmcl.ui.construct.SpinnerPane; import org.jackhuang.hmcl.ui.construct.Validator; import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.Logging; -import org.jackhuang.hmcl.util.i18n.I18n; - import static org.jackhuang.hmcl.ui.FXUtils.jfxListCellFactory; import static org.jackhuang.hmcl.ui.FXUtils.stringConverter; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.List; import java.util.Optional; @@ -83,13 +82,13 @@ public class AddAccountPane extends StackPane { cboServers.setCellFactory(jfxListCellFactory(server -> new TwoLineListItem(server.getName(), server.getUrl()))); cboServers.setConverter(stringConverter(AuthlibInjectorServer::getName)); cboServers.setItems(Settings.SETTINGS.authlibInjectorServers); - cboServers.setPromptText(I18n.i18n("general.prompt.empty")); + cboServers.setPromptText(i18n("general.prompt.empty")); // workaround: otherwise the combox will be black if (!cboServers.getItems().isEmpty()) cboServers.getSelectionModel().select(0); - cboType.getItems().setAll(I18n.i18n("account.methods.offline"), I18n.i18n("account.methods.yggdrasil"), I18n.i18n("account.methods.authlib_injector")); + cboType.getItems().setAll(i18n("account.methods.offline"), i18n("account.methods.yggdrasil"), i18n("account.methods.authlib_injector")); cboType.getSelectionModel().selectedIndexProperty().addListener((a, b, newValue) -> { txtPassword.setVisible(newValue.intValue() != 0); lblPassword.setVisible(newValue.intValue() != 0); @@ -102,7 +101,7 @@ public class AddAccountPane extends StackPane { txtPassword.setOnAction(e -> onCreationAccept()); txtUsername.setOnAction(e -> onCreationAccept()); - txtUsername.getValidators().add(new Validator(I18n.i18n("input.email"), str -> !txtPassword.isVisible() || str.contains("@"))); + txtUsername.getValidators().add(new Validator(i18n("input.email"), str -> !txtPassword.isVisible() || str.contains("@"))); txtUsername.textProperty().addListener(it -> validateAcceptButton()); txtPassword.textProperty().addListener(it -> validateAcceptButton()); @@ -135,7 +134,7 @@ public class AddAccountPane extends StackPane { if (server.isPresent()) { addtionalData = server.get(); } else { - lblCreationWarning.setText(I18n.i18n("account.failed.no_selected_server")); + lblCreationWarning.setText(i18n("account.failed.no_selected_server")); return; } break; @@ -190,11 +189,11 @@ public class AddAccountPane extends StackPane { { setStyle("-fx-padding: 8px;"); - cancel.setText(I18n.i18n("button.cancel")); + cancel.setText(i18n("button.cancel")); StackPane.setAlignment(cancel, Pos.BOTTOM_RIGHT); cancel.setOnMouseClicked(e -> latch.countDown()); - listBox.startCategory(I18n.i18n("account.choose")); + listBox.startCategory(i18n("account.choose")); setCenter(listBox); @@ -255,19 +254,19 @@ public class AddAccountPane extends StackPane { public static String accountException(Exception exception) { if (exception instanceof NoCharacterException) { - return I18n.i18n("account.failed.no_character"); + return i18n("account.failed.no_character"); } else if (exception instanceof ServerDisconnectException) { - return I18n.i18n("account.failed.connect_authentication_server"); + return i18n("account.failed.connect_authentication_server"); } else if (exception instanceof RemoteAuthenticationException) { RemoteAuthenticationException remoteException = (RemoteAuthenticationException) exception; String remoteMessage = remoteException.getRemoteMessage(); if ("ForbiddenOperationException".equals(remoteException.getRemoteName()) && remoteMessage != null) { if (remoteMessage.contains("Invalid credentials")) - return I18n.i18n("account.failed.invalid_credentials"); + return i18n("account.failed.invalid_credentials"); else if (remoteMessage.contains("Invalid token")) - return I18n.i18n("account.failed.invalid_token"); + return i18n("account.failed.invalid_token"); else if (remoteMessage.contains("Invalid username or password")) - return I18n.i18n("account.failed.invalid_password"); + return i18n("account.failed.invalid_password"); } return exception.getMessage(); } else { @@ -276,9 +275,9 @@ public class AddAccountPane extends StackPane { } public static String accountType(Account account) { - if (account instanceof OfflineAccount) return I18n.i18n("account.methods.offline"); - else if (account instanceof AuthlibInjectorAccount) return I18n.i18n("account.methods.authlib_injector"); - else if (account instanceof YggdrasilAccount) return I18n.i18n("account.methods.yggdrasil"); - else throw new Error(I18n.i18n("account.methods.no_method") + ": " + account); + if (account instanceof OfflineAccount) return i18n("account.methods.offline"); + else if (account instanceof AuthlibInjectorAccount) return i18n("account.methods.authlib_injector"); + else if (account instanceof YggdrasilAccount) return i18n("account.methods.yggdrasil"); + else throw new Error(i18n("account.methods.no_method") + ": " + account); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java index bd4b21897..7b676d198 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AuthlibInjectorServersPage.java @@ -18,14 +18,13 @@ import org.jackhuang.hmcl.ui.animation.TransitionHandler; import org.jackhuang.hmcl.ui.construct.SpinnerPane; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.NetworkUtils; -import org.jackhuang.hmcl.util.i18n.I18n; - import static java.util.stream.Collectors.toList; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.IOException; public class AuthlibInjectorServersPage extends StackPane implements DecoratorPage { - private final StringProperty title = new SimpleStringProperty(this, "title", I18n.i18n("account.injector.server")); + private final StringProperty title = new SimpleStringProperty(this, "title", i18n("account.injector.server")); @FXML private ScrollPane scrollPane; @FXML private StackPane addServerContainer; @@ -154,7 +153,7 @@ public class AuthlibInjectorServersPage extends StackPane implements DecoratorPa private String resolveFetchExceptionMessage(Throwable exception) { if (exception instanceof IOException) { - return I18n.i18n("account.failed.connect_injector_server"); + return i18n("account.failed.connect_injector_server"); } else { return exception.getClass() + ": " + exception.getLocalizedMessage(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java index 753557743..eb52b7429 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/CrashWindow.java @@ -27,8 +27,10 @@ import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.stage.Stage; + +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; + import org.jackhuang.hmcl.Launcher; -import org.jackhuang.hmcl.util.i18n.I18n; /** * @author huangyuhui @@ -38,9 +40,9 @@ public class CrashWindow extends Stage { public CrashWindow(String text) { Label lblCrash = new Label(); if (Launcher.UPDATE_CHECKER.isOutOfDate()) - lblCrash.setText(I18n.i18n("launcher.crash_out_dated")); + lblCrash.setText(i18n("launcher.crash_out_dated")); else - lblCrash.setText(I18n.i18n("launcher.crash")); + lblCrash.setText(i18n("launcher.crash")); lblCrash.setWrapText(true); TextArea textArea = new TextArea(); @@ -48,7 +50,7 @@ public class CrashWindow extends Stage { textArea.setEditable(false); Button btnContact = new Button(); - btnContact.setText(I18n.i18n("launcher.contact")); + btnContact.setText(i18n("launcher.contact")); btnContact.setOnMouseClicked(event -> FXUtils.openLink(Launcher.CONTACT)); HBox box = new HBox(); box.setStyle("-fx-padding: 8px;"); @@ -66,7 +68,7 @@ public class CrashWindow extends Stage { Scene scene = new Scene(pane, 800, 480); setScene(scene); getIcons().add(new Image("/assets/img/icon.png")); - setTitle(I18n.i18n("message.error")); + setTitle(i18n("message.error")); setOnCloseRequest(e -> System.exit(1)); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java index 8e4db9316..afea4c9f9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Decorator.java @@ -65,8 +65,6 @@ import org.jackhuang.hmcl.ui.wizard.*; import org.jackhuang.hmcl.util.FileUtils; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; -import org.jackhuang.hmcl.util.i18n.Locales; - import java.io.File; import java.util.Locale; import java.util.Queue; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerController.java index 954b4d224..666266287 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerController.java @@ -30,7 +30,7 @@ import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.download.InstallerWizardProvider; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.LinkedList; import java.util.Optional; @@ -91,7 +91,7 @@ public class InstallerController { Optional gameVersion = GameVersion.minecraftVersion(profile.getRepository().getVersionJar(version)); if (!gameVersion.isPresent()) - Controllers.dialog(I18n.i18n("version.cannot_read")); + Controllers.dialog(i18n("version.cannot_read")); else Controllers.getDecorator().startWizard(new InstallerWizardProvider(profile, gameVersion.get(), version, forge, liteLoader, optiFine)); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java index f7fd2efc2..4c990af53 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java @@ -22,9 +22,9 @@ import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.layout.BorderPane; -import java.util.function.Consumer; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; -import org.jackhuang.hmcl.util.i18n.I18n; +import java.util.function.Consumer; /** * @author huangyuhui @@ -45,7 +45,7 @@ public class InstallerItem extends BorderPane { setStyle("-fx-background-radius: 2; -fx-background-color: white; -fx-padding: 8;"); JFXDepthManager.setDepth(this, 1); lblInstallerArtifact.setText(artifact); - lblInstallerVersion.setText(I18n.i18n("archive.version") + ": " + version); + lblInstallerVersion.setText(i18n("archive.version") + ": " + version); } @FXML diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java index a4a48a1fb..164adfcae 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LeftPaneController.java @@ -33,7 +33,6 @@ import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorAccount; import org.jackhuang.hmcl.auth.offline.OfflineAccount; import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilAccount; -import org.jackhuang.hmcl.download.VersionList; import org.jackhuang.hmcl.event.*; import org.jackhuang.hmcl.game.AccountHelper; import org.jackhuang.hmcl.game.HMCLGameRepository; @@ -49,7 +48,7 @@ import org.jackhuang.hmcl.ui.construct.ClassTitle; import org.jackhuang.hmcl.ui.construct.IconedItem; import org.jackhuang.hmcl.ui.construct.RipplerContainer; import org.jackhuang.hmcl.util.Lang; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.File; import java.util.HashMap; @@ -62,27 +61,27 @@ public final class LeftPaneController { private final VBox profilePane = new VBox(); private final VBox accountPane = new VBox(); private final IconedItem launcherSettingsItem; - private final VersionListItem missingAccountItem = new VersionListItem(I18n.i18n("account.missing"), I18n.i18n("message.unknown")); + private final VersionListItem missingAccountItem = new VersionListItem(i18n("account.missing"), i18n("message.unknown")); private final HashMap items = new HashMap<>(); public LeftPaneController(AdvancedListBox leftPane) { this.leftPane = leftPane; - this.launcherSettingsItem = Lang.apply(new IconedItem(SVG.gear(Theme.blackFillBinding(), 20, 20), I18n.i18n("settings.launcher")), iconedItem -> { + this.launcherSettingsItem = Lang.apply(new IconedItem(SVG.gear(Theme.blackFillBinding(), 20, 20), i18n("settings.launcher")), iconedItem -> { iconedItem.prefWidthProperty().bind(leftPane.widthProperty()); iconedItem.setOnMouseClicked(e -> Controllers.navigate(Controllers.getSettingsPage())); }); leftPane - .add(new ClassTitle(I18n.i18n("account").toUpperCase(), Lang.apply(new JFXButton(), button -> { + .add(new ClassTitle(i18n("account").toUpperCase(), Lang.apply(new JFXButton(), button -> { button.setGraphic(SVG.plus(Theme.blackFillBinding(), 10, 10)); button.getStyleClass().add("toggle-icon-tiny"); button.setOnMouseClicked(e -> addNewAccount()); }))) .add(accountPane) - .startCategory(I18n.i18n("launcher").toUpperCase()) + .startCategory(i18n("launcher").toUpperCase()) .add(launcherSettingsItem) - .add(new ClassTitle(I18n.i18n("profile.title").toUpperCase(), Lang.apply(new JFXButton(), button -> { + .add(new ClassTitle(i18n("profile.title").toUpperCase(), Lang.apply(new JFXButton(), button -> { button.setGraphic(SVG.plus(Theme.blackFillBinding(), 10, 10)); button.getStyleClass().add("toggle-icon-tiny"); button.setOnMouseClicked(e -> @@ -123,7 +122,7 @@ public final class LeftPaneController { if (node instanceof RipplerContainer && node.getProperties().get("profile") instanceof String) { boolean current = Objects.equals(node.getProperties().get("profile"), profile.getName()); ((RipplerContainer) node).setSelected(current); - ((VersionListItem) ((RipplerContainer) node).getContainer()).setGameVersion(current ? I18n.i18n("profile.selected") : ""); + ((VersionListItem) ((RipplerContainer) node).getContainer()).setGameVersion(current ? i18n("profile.selected") : ""); } } }); @@ -144,9 +143,9 @@ public final class LeftPaneController { } private static String accountType(Account account) { - if (account instanceof OfflineAccount) return I18n.i18n("account.methods.offline"); + if (account instanceof OfflineAccount) return i18n("account.methods.offline"); else if (account instanceof YggdrasilAccount) return account.getUsername(); - else throw new Error(I18n.i18n("account.methods.no_method") + ": " + account); + else throw new Error(i18n("account.methods.no_method") + ": " + account); } private void onAccountAdd(AccountAddedEvent event) { @@ -208,7 +207,7 @@ public final class LeftPaneController { } public void showUpdate() { - launcherSettingsItem.setText(I18n.i18n("update.found")); + launcherSettingsItem.setText(i18n("update.found")); launcherSettingsItem.setTextFill(Color.RED); } @@ -232,7 +231,7 @@ public final class LeftPaneController { Controllers.closeDialog(region.get()); checkAccount(); })).executor(); - region.set(Controllers.taskDialog(executor, I18n.i18n("modpack.installing"), "")); + region.set(Controllers.taskDialog(executor, i18n("modpack.installing"), "")); executor.start(); showNewAccount = false; } catch (UnsupportedModpackException ignore) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java index 3396bee2d..4a2de4f0f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LogWindow.java @@ -39,11 +39,12 @@ import org.jackhuang.hmcl.util.IOUtils; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.Log4jLevel; import org.jackhuang.hmcl.util.StringUtils; -import org.jackhuang.hmcl.util.i18n.I18n; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; + import java.util.concurrent.CountDownLatch; /** @@ -64,7 +65,7 @@ public final class LogWindow extends Stage { public LogWindow() { setScene(new Scene(impl, 800, 480)); getScene().getStylesheets().addAll(Settings.INSTANCE.getTheme().getStylesheets()); - setTitle(I18n.i18n("logwindow.title")); + setTitle(i18n("logwindow.title")); getIcons().add(new Image("/assets/img/icon.png")); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java index 44692f130..943a9ddb3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java @@ -47,8 +47,6 @@ import org.jackhuang.hmcl.ui.download.DownloadWizardProvider; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.OperatingSystem; -import org.jackhuang.hmcl.util.i18n.I18n; - import java.io.File; import java.io.IOException; import java.util.List; @@ -58,10 +56,11 @@ import java.util.stream.Collectors; import static org.jackhuang.hmcl.util.StringUtils.removePrefix; import static org.jackhuang.hmcl.util.StringUtils.removeSuffix; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class MainPage extends StackPane implements DecoratorPage { - private final StringProperty title = new SimpleStringProperty(this, "title", I18n.i18n("main_page")); + private final StringProperty title = new SimpleStringProperty(this, "title", i18n("main_page")); private Profile profile; @@ -96,10 +95,10 @@ public final class MainPage extends StackPane implements DecoratorPage { this.profile = event.getProfile(); }); - btnAdd.setOnMouseClicked(e -> Controllers.getDecorator().startWizard(new DownloadWizardProvider(), I18n.i18n("install"))); - FXUtils.installTooltip(btnAdd, I18n.i18n("install")); + btnAdd.setOnMouseClicked(e -> Controllers.getDecorator().startWizard(new DownloadWizardProvider(), i18n("install"))); + FXUtils.installTooltip(btnAdd, i18n("install")); btnRefresh.setOnMouseClicked(e -> Settings.INSTANCE.getSelectedProfile().getRepository().refreshVersionsAsync().start()); - FXUtils.installTooltip(btnRefresh, I18n.i18n("button.refresh")); + FXUtils.installTooltip(btnRefresh, i18n("button.refresh")); } private String modifyVersion(String gameVersion, String version) { @@ -118,13 +117,13 @@ public final class MainPage extends StackPane implements DecoratorPage { StringBuilder libraries = new StringBuilder(); for (Library library : version.getLibraries()) { if (library.getGroupId().equalsIgnoreCase("net.minecraftforge") && library.getArtifactId().equalsIgnoreCase("forge")) { - libraries.append(I18n.i18n("install.installer.forge")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)forge", ""))).append("\n"); + libraries.append(i18n("install.installer.forge")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)forge", ""))).append("\n"); } if (library.getGroupId().equalsIgnoreCase("com.mumfrey") && library.getArtifactId().equalsIgnoreCase("liteloader")) { - libraries.append(I18n.i18n("install.installer.liteloader")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)liteloader", ""))).append("\n"); + libraries.append(i18n("install.installer.liteloader")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)liteloader", ""))).append("\n"); } if (library.getGroupId().equalsIgnoreCase("net.optifine") && library.getArtifactId().equalsIgnoreCase("optifine")) { - libraries.append(I18n.i18n("install.installer.optifine")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)optifine", ""))).append("\n"); + libraries.append(i18n("install.installer.optifine")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)optifine", ""))).append("\n"); } } @@ -139,15 +138,15 @@ public final class MainPage extends StackPane implements DecoratorPage { }); item.setOnScriptButtonClicked(e -> { if (Settings.INSTANCE.getSelectedAccount() == null) - Controllers.dialog(I18n.i18n("login.empty_username")); + Controllers.dialog(i18n("login.empty_username")); else { FileChooser chooser = new FileChooser(); if (repository.getRunDirectory(id).isDirectory()) chooser.setInitialDirectory(repository.getRunDirectory(id)); - chooser.setTitle(I18n.i18n("version.launch_script.save")); + chooser.setTitle(i18n("version.launch_script.save")); chooser.getExtensionFilters().add(OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS - ? new FileChooser.ExtensionFilter(I18n.i18n("extension.bat"), "*.bat") - : new FileChooser.ExtensionFilter(I18n.i18n("extension.sh"), "*.sh")); + ? new FileChooser.ExtensionFilter(i18n("extension.bat"), "*.bat") + : new FileChooser.ExtensionFilter(i18n("extension.sh"), "*.sh")); File file = chooser.showSaveDialog(Controllers.getStage()); if (file != null) LauncherHelper.INSTANCE.launch(profile, Settings.INSTANCE.getSelectedAccount(), id, file); @@ -159,25 +158,25 @@ public final class MainPage extends StackPane implements DecoratorPage { }); item.setOnUpdateButtonClicked(event -> { FileChooser chooser = new FileChooser(); - chooser.setTitle(I18n.i18n("modpack.choose")); - chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(I18n.i18n("modpack"), "*.zip")); + chooser.setTitle(i18n("modpack.choose")); + chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(i18n("modpack"), "*.zip")); File selectedFile = chooser.showOpenDialog(Controllers.getStage()); if (selectedFile != null) { AtomicReference region = new AtomicReference<>(); try { TaskExecutor executor = ModpackHelper.getUpdateTask(profile, selectedFile, id, ModpackHelper.readModpackConfiguration(repository.getModpackConfiguration(id))) .then(Task.of(Schedulers.javafx(), () -> Controllers.closeDialog(region.get()))).executor(); - region.set(Controllers.taskDialog(executor, I18n.i18n("modpack.update"), "")); + region.set(Controllers.taskDialog(executor, i18n("modpack.update"), "")); executor.start(); } catch (UnsupportedModpackException e) { Controllers.closeDialog(region.get()); - Controllers.dialog(I18n.i18n("modpack.unsupported"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE); + Controllers.dialog(i18n("modpack.unsupported"), i18n("message.error"), MessageBox.ERROR_MESSAGE); } catch (MismatchedModpackTypeException e) { Controllers.closeDialog(region.get()); - Controllers.dialog(I18n.i18n("modpack.mismatched_type"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE); + Controllers.dialog(i18n("modpack.mismatched_type"), i18n("message.error"), MessageBox.ERROR_MESSAGE); } catch (IOException e) { Controllers.closeDialog(region.get()); - Controllers.dialog(I18n.i18n("modpack.invalid"), I18n.i18n("message.error"), MessageBox.ERROR_MESSAGE); + Controllers.dialog(i18n("modpack.invalid"), i18n("message.error"), MessageBox.ERROR_MESSAGE); } } }); @@ -188,10 +187,10 @@ public final class MainPage extends StackPane implements DecoratorPage { versionList.getStyleClass().add("option-list-view"); FXUtils.setLimitWidth(versionList, 150); versionList.getItems().setAll(Lang.immutableListOf( - I18n.i18n("version.manage.rename"), - I18n.i18n("version.manage.remove"), - I18n.i18n("modpack.export"), - I18n.i18n("folder.game") + i18n("version.manage.rename"), + i18n("version.manage.remove"), + i18n("modpack.export"), + i18n("folder.game") )); versionList.setOnMouseClicked(e -> { versionPopup.hide(); @@ -215,7 +214,7 @@ public final class MainPage extends StackPane implements DecoratorPage { versionPopup.show(item, JFXPopup.PopupVPosition.TOP, JFXPopup.PopupHPosition.LEFT, event.getX(), event.getY()); } else if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) { if (Settings.INSTANCE.getSelectedAccount() == null) - Controllers.dialog(I18n.i18n("login.empty_username")); + Controllers.dialog(i18n("login.empty_username")); else LauncherHelper.INSTANCE.launch(profile, Settings.INSTANCE.getSelectedAccount(), id, null); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModController.java index 0bb6e8f0a..88d1255a7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModController.java @@ -33,7 +33,7 @@ import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.FileUtils; import org.jackhuang.hmcl.util.Logging; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.File; import java.io.IOException; @@ -43,7 +43,6 @@ import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.stream.Collectors; -import java.util.stream.Stream; public final class ModController { @FXML @@ -141,8 +140,8 @@ public final class ModController { @FXML private void onAdd() { FileChooser chooser = new FileChooser(); - chooser.setTitle(I18n.i18n("mods.choose_mod")); - chooser.getExtensionFilters().setAll(new FileChooser.ExtensionFilter(I18n.i18n("extension.mod"), "*.jar", "*.zip", "*.litemod")); + chooser.setTitle(i18n("mods.choose_mod")); + chooser.getExtensionFilters().setAll(new FileChooser.ExtensionFilter(i18n("extension.mod"), "*.jar", "*.zip", "*.litemod")); List res = chooser.showOpenMultipleDialog(Controllers.getStage()); // It's guaranteed that succeeded and failed are thread safe here. @@ -164,10 +163,10 @@ public final class ModController { }).with(Task.of(Schedulers.javafx(), variables -> { List prompt = new LinkedList<>(); if (!succeeded.isEmpty()) - prompt.add(I18n.i18n("mods.add.success", String.join(", ", succeeded))); + prompt.add(i18n("mods.add.success", String.join(", ", succeeded))); if (!failed.isEmpty()) - prompt.add(I18n.i18n("mods.add.failed", String.join(", ", failed))); - Controllers.dialog(String.join("\n", prompt), I18n.i18n("mods.add")); + prompt.add(i18n("mods.add.failed", String.join(", ", failed))); + Controllers.dialog(String.join("\n", prompt), i18n("mods.add")); loadMods(modManager, versionId); })).start(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModItem.java index 7aa35aefc..b4c74eb90 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ModItem.java @@ -26,7 +26,7 @@ import javafx.scene.layout.BorderPane; import org.jackhuang.hmcl.mod.ModInfo; import org.jackhuang.hmcl.setting.Theme; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.function.Consumer; @@ -43,7 +43,7 @@ public final class ModItem extends BorderPane { JFXButton btnRemove = new JFXButton(); JFXUtilities.runInFX(() -> { - FXUtils.installTooltip(btnRemove, I18n.i18n("mods.remove")); + FXUtils.installTooltip(btnRemove, i18n("mods.remove")); }); btnRemove.setOnMouseClicked(e -> deleteCallback.accept(this)); btnRemove.getStyleClass().add("toggle-icon4"); @@ -54,7 +54,7 @@ public final class ModItem extends BorderPane { setStyle("-fx-background-radius: 2; -fx-background-color: white; -fx-padding: 8;"); JFXDepthManager.setDepth(this, 1); modItem.setTitle(info.getFileName()); - modItem.setSubtitle(info.getName() + ", " + I18n.i18n("archive.version") + ": " + info.getVersion() + ", " + I18n.i18n("archive.game_version") + ": " + info.getGameVersion() + ", " + I18n.i18n("archive.author") + ": " + info.getAuthors()); + modItem.setSubtitle(info.getName() + ", " + i18n("archive.version") + ": " + info.getVersion() + ", " + i18n("archive.game_version") + ": " + info.getGameVersion() + ", " + i18n("archive.author") + ": " + info.getAuthors()); chkEnabled.setSelected(info.isActive()); chkEnabled.selectedProperty().addListener((a, b, newValue) -> info.activeProperty().set(newValue)); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ProfilePage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ProfilePage.java index 71c790a6e..fb3caba32 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/ProfilePage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/ProfilePage.java @@ -30,7 +30,7 @@ import org.jackhuang.hmcl.setting.Settings; import org.jackhuang.hmcl.ui.construct.FileItem; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.StringUtils; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.File; import java.util.Optional; @@ -55,7 +55,7 @@ public final class ProfilePage extends StackPane implements DecoratorPage { String profileDisplayName = Optional.ofNullable(profile).map(Profiles::getProfileDisplayName).orElse(""); title = new SimpleStringProperty(this, "title", - profile == null ? I18n.i18n("profile.new") : I18n.i18n("profile") + " - " + profileDisplayName); + profile == null ? i18n("profile.new") : i18n("profile") + " - " + profileDisplayName); location = new SimpleStringProperty(this, "location", Optional.ofNullable(profile).map(Profile::getGameDir).map(File::getAbsolutePath).orElse("")); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java index c8b2883e5..5619747a0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/SettingsPage.java @@ -42,16 +42,17 @@ import org.jackhuang.hmcl.ui.construct.MultiFileItem; import org.jackhuang.hmcl.ui.construct.Validator; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.Lang; -import org.jackhuang.hmcl.util.i18n.I18n; import org.jackhuang.hmcl.util.i18n.Locales; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; + import java.net.Proxy; import java.util.Arrays; import java.util.Collections; import java.util.stream.Collectors; public final class SettingsPage extends StackPane implements DecoratorPage { - private final StringProperty title = new SimpleStringProperty(this, "title", I18n.i18n("settings.launcher")); + private final StringProperty title = new SimpleStringProperty(this, "title", i18n("settings.launcher")); @FXML private JFXTextField txtProxyHost; @@ -179,12 +180,12 @@ public final class SettingsPage extends StackPane implements DecoratorPage { fileCommonLocation.setProperty(Settings.INSTANCE.commonPathProperty()); - FXUtils.installTooltip(btnUpdate, I18n.i18n("update.tooltip")); + FXUtils.installTooltip(btnUpdate, i18n("update.tooltip")); checkUpdate(); // background backgroundItem.loadChildren(Collections.singletonList( - backgroundItem.createChildren(I18n.i18n("launcher.background.default"), EnumBackgroundImage.DEFAULT) + backgroundItem.createChildren(i18n("launcher.background.default"), EnumBackgroundImage.DEFAULT) )); FXUtils.bindString(backgroundItem.getTxtCustom(), Settings.INSTANCE.backgroundImageProperty()); @@ -201,8 +202,8 @@ public final class SettingsPage extends StackPane implements DecoratorPage { // theme JFXColorPicker picker = new JFXColorPicker(Color.web(Settings.INSTANCE.getTheme().getColor()), null); - picker.setCustomColorText(I18n.i18n("color.custom")); - picker.setRecentColorsText(I18n.i18n("color.recent")); + picker.setCustomColorText(i18n("color.custom")); + picker.setRecentColorsText(i18n("color.recent")); picker.getCustomColors().setAll(Arrays.stream(Theme.VALUES).map(Theme::getColor).map(Color::web).collect(Collectors.toList())); picker.setOnAction(e -> { Theme theme = Theme.custom(Theme.getColorDisplayName(picker.getValue())); @@ -216,7 +217,7 @@ public final class SettingsPage extends StackPane implements DecoratorPage { private void initBackgroundItemSubtitle() { switch (Settings.INSTANCE.getBackgroundImageType()) { case DEFAULT: - backgroundItem.setSubtitle(I18n.i18n("launcher.background.default")); + backgroundItem.setSubtitle(i18n("launcher.background.default")); break; case CUSTOM: backgroundItem.setSubtitle(Settings.INSTANCE.getBackgroundImage()); @@ -241,16 +242,16 @@ public final class SettingsPage extends StackPane implements DecoratorPage { btnUpdate.setVisible(Launcher.UPDATE_CHECKER.isOutOfDate()); if (Launcher.UPDATE_CHECKER.isOutOfDate()) { - lblUpdateSub.setText(I18n.i18n("update.newest_version", Launcher.UPDATE_CHECKER.getNewVersion().toString())); + lblUpdateSub.setText(i18n("update.newest_version", Launcher.UPDATE_CHECKER.getNewVersion().toString())); lblUpdateSub.getStyleClass().setAll("update-label"); - lblUpdate.setText(I18n.i18n("update.found")); + lblUpdate.setText(i18n("update.found")); lblUpdate.getStyleClass().setAll("update-label"); } else { - lblUpdateSub.setText(I18n.i18n("update.latest")); + lblUpdateSub.setText(i18n("update.latest")); lblUpdateSub.getStyleClass().setAll("subtitle-label"); - lblUpdate.setText(I18n.i18n("update")); + lblUpdate.setText(i18n("update")); lblUpdate.getStyleClass().setAll(); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionItem.java index 08cd97786..50d20c5bb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionItem.java @@ -36,7 +36,7 @@ import javafx.scene.paint.Color; import javafx.scene.text.TextAlignment; import org.jackhuang.hmcl.setting.Theme; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.Optional; @@ -176,10 +176,10 @@ public final class VersionItem extends StackPane { btnScript.setGraphic(SVG.script(Theme.blackFillBinding(), 15, 15)); JFXUtilities.runInFX(() -> { - FXUtils.installTooltip(btnSettings, I18n.i18n("version.settings")); - FXUtils.installTooltip(btnUpdate, I18n.i18n("version.update")); - FXUtils.installTooltip(btnLaunch, I18n.i18n("version.launch")); - FXUtils.installTooltip(btnScript, I18n.i18n("version.launch_script")); + FXUtils.installTooltip(btnSettings, i18n("version.settings")); + FXUtils.installTooltip(btnUpdate, i18n("version.update")); + FXUtils.installTooltip(btnLaunch, i18n("version.launch")); + FXUtils.installTooltip(btnScript, i18n("version.launch_script")); }); icon.translateYProperty().bind(Bindings.createDoubleBinding(() -> header.getBoundsInParent().getHeight() - icon.getHeight() / 2 - 16, header.boundsInParentProperty(), icon.heightProperty())); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionPage.java index be3369387..ade98dc17 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionPage.java @@ -32,7 +32,7 @@ import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.ui.export.ExportWizardProvider; import org.jackhuang.hmcl.ui.wizard.DecoratorPage; import org.jackhuang.hmcl.util.FileUtils; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.File; @@ -80,17 +80,17 @@ public final class VersionPage extends StackPane implements DecoratorPage { browsePopup = new JFXPopup(browseList); managementPopup = new JFXPopup(managementList); - FXUtils.installTooltip(btnDelete, I18n.i18n("version.manage.remove")); - FXUtils.installTooltip(btnBrowseMenu, I18n.i18n("settings.game.exploration")); - FXUtils.installTooltip(btnManagementMenu, I18n.i18n("settings.game.management")); - FXUtils.installTooltip(btnExport, I18n.i18n("modpack.export")); + FXUtils.installTooltip(btnDelete, i18n("version.manage.remove")); + FXUtils.installTooltip(btnBrowseMenu, i18n("settings.game.exploration")); + FXUtils.installTooltip(btnManagementMenu, i18n("settings.game.management")); + FXUtils.installTooltip(btnExport, i18n("modpack.export")); } public void load(String id, Profile profile) { this.version = id; this.profile = profile; - title.set(I18n.i18n("settings.game") + " - " + id); + title.set(i18n("settings.game") + " - " + id); versionSettingsController.loadVersionSetting(profile, id); modController.setParentTab(tabPane); @@ -186,7 +186,7 @@ public final class VersionPage extends StackPane implements DecoratorPage { } public static void deleteVersion(Profile profile, String version) { - Controllers.confirmDialog(I18n.i18n("version.manage.remove.confirm", version), I18n.i18n("message.confirm"), () -> { + Controllers.confirmDialog(i18n("version.manage.remove.confirm", version), i18n("message.confirm"), () -> { if (profile.getRepository().removeVersionFromDisk(version)) { profile.getRepository().refreshVersionsAsync().start(); Controllers.navigate(null); @@ -195,7 +195,7 @@ public final class VersionPage extends StackPane implements DecoratorPage { } public static void renameVersion(Profile profile, String version) { - Controllers.inputDialog(I18n.i18n("version.manage.rename.message"), res -> { + Controllers.inputDialog(i18n("version.manage.rename.message"), res -> { if (profile.getRepository().renameVersion(version, res)) { profile.getRepository().refreshVersionsAsync().start(); Controllers.navigate(null); @@ -204,6 +204,6 @@ public final class VersionPage extends StackPane implements DecoratorPage { } public static void exportVersion(Profile profile, String version) { - Controllers.getDecorator().startWizard(new ExportWizardProvider(profile, version), I18n.i18n("modpack.wizard")); + Controllers.getDecorator().startWizard(new ExportWizardProvider(profile, version), i18n("modpack.wizard")); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java index a9284458c..5b0faa6e7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/VersionSettingsController.java @@ -39,7 +39,7 @@ import org.jackhuang.hmcl.ui.construct.ComponentList; import org.jackhuang.hmcl.ui.construct.ImagePickerItem; import org.jackhuang.hmcl.ui.construct.MultiFileItem; import org.jackhuang.hmcl.util.*; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.File; import java.io.IOException; @@ -80,7 +80,7 @@ public final class VersionSettingsController { @FXML private void initialize() { - lblPhysicalMemory.setText(I18n.i18n("settings.physical_memory") + ": " + OperatingSystem.TOTAL_MEMORY + "MB"); + lblPhysicalMemory.setText(i18n("settings.physical_memory") + ": " + OperatingSystem.TOTAL_MEMORY + "MB"); FXUtils.smoothScrolling(scroll); @@ -97,13 +97,13 @@ public final class VersionSettingsController { javaItem.getExtensionFilters().add(new FileChooser.ExtensionFilter("Java", "java.exe", "javaw.exe")); gameDirItem.loadChildren(Arrays.asList( - gameDirItem.createChildren(I18n.i18n("settings.advanced.game_dir.default"), EnumGameDirectory.ROOT_FOLDER), - gameDirItem.createChildren(I18n.i18n("settings.advanced.game_dir.independent"), EnumGameDirectory.VERSION_FOLDER) + gameDirItem.createChildren(i18n("settings.advanced.game_dir.default"), EnumGameDirectory.ROOT_FOLDER), + gameDirItem.createChildren(i18n("settings.advanced.game_dir.independent"), EnumGameDirectory.VERSION_FOLDER) )); globalItem.loadChildren(Arrays.asList( - globalItem.createChildren(I18n.i18n("settings.type.global"), true), - globalItem.createChildren(I18n.i18n("settings.type.special"), false) + globalItem.createChildren(i18n("settings.type.global"), true), + globalItem.createChildren(i18n("settings.type.special"), false) )); } @@ -183,7 +183,7 @@ public final class VersionSettingsController { }); versionSetting.usesGlobalProperty().setChangedListenerAndOperate(it -> - globalItem.setSubtitle(I18n.i18n(versionSetting.isUsesGlobal() ? "settings.type.global" : "settings.type.special"))); + globalItem.setSubtitle(i18n(versionSetting.isUsesGlobal() ? "settings.type.global" : "settings.type.special"))); gameDirItem.getGroup().getToggles().stream() .filter(it -> it.getUserData() == versionSetting.getGameDirType()) @@ -239,7 +239,7 @@ public final class VersionSettingsController { @FXML private void onExploreIcon() { FileChooser chooser = new FileChooser(); - chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(I18n.i18n("extension.png"), "*.png")); + chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(i18n("extension.png"), "*.png")); File selectedFile = chooser.showOpenDialog(Controllers.getStage()); if (selectedFile != null) { File iconFile = profile.getRepository().getVersionIcon(versionId); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/FileItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/FileItem.java index d85316d8a..987986087 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/FileItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/FileItem.java @@ -31,7 +31,7 @@ import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.File; @@ -55,7 +55,7 @@ public class FileItem extends BorderPane { right.setGraphic(SVG.pencil(Theme.blackFillBinding(), 15, 15)); right.getStyleClass().add("toggle-icon4"); right.setOnMouseClicked(e -> onExplore()); - FXUtils.installTooltip(right, I18n.i18n("button.edit")); + FXUtils.installTooltip(right, i18n("button.edit")); setRight(right); Tooltip tip = new Tooltip(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/ImagePickerItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/ImagePickerItem.java index 71f767e1a..398a4eff4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/ImagePickerItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/ImagePickerItem.java @@ -16,10 +16,11 @@ import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; + import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; -import org.jackhuang.hmcl.util.i18n.I18n; @DefaultProperty("image") public final class ImagePickerItem extends BorderPane { @@ -42,7 +43,7 @@ public final class ImagePickerItem extends BorderPane { selectButton.onMouseClickedProperty().bind(onSelectButtonClicked); selectButton.getStyleClass().add("toggle-icon4"); - FXUtils.installTooltip(selectButton, I18n.i18n("button.edit")); + FXUtils.installTooltip(selectButton, i18n("button.edit")); HBox hBox = new HBox(); hBox.getChildren().setAll(imageView, selectButton); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageBox.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageBox.java index 5a1b012d8..af8142965 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageBox.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageBox.java @@ -22,16 +22,17 @@ import javafx.scene.control.ButtonType; import javafx.scene.control.TextInputDialog; import org.jackhuang.hmcl.ui.FXUtils; -import org.jackhuang.hmcl.util.i18n.I18n; - import javax.swing.*; + +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; + import java.util.Optional; public final class MessageBox { private MessageBox() { } - private static final String TITLE = I18n.i18n("message.info"); + private static final String TITLE = i18n("message.info"); /** * User Operation: Yes diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java index 69494e115..4473a7c0b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MessageDialogPane.java @@ -27,7 +27,7 @@ import javafx.scene.layout.StackPane; import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.Optional; import java.util.function.Consumer; @@ -92,8 +92,8 @@ public final class MessageDialogPane extends StackPane { Optional.ofNullable(onCancel).ifPresent(Runnable::run); }); - acceptButton.setText(I18n.i18n("button.yes")); - cancelButton.setText(I18n.i18n("button.no")); + acceptButton.setText(i18n("button.yes")); + cancelButton.setText(i18n("button.no")); actions.getChildren().add(cancelButton); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiColorItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiColorItem.java index 2c0155ccb..9def56278 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiColorItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiColorItem.java @@ -15,15 +15,15 @@ import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import org.jackhuang.hmcl.ui.FXUtils; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.Collection; import java.util.Optional; import java.util.function.Consumer; public class MultiColorItem extends ComponentList { - private final StringProperty customTitle = new SimpleStringProperty(this, "customTitle", I18n.i18n("selector.custom")); - private final StringProperty chooserTitle = new SimpleStringProperty(this, "chooserTitle", I18n.i18n("selector.choose_file")); + private final StringProperty customTitle = new SimpleStringProperty(this, "customTitle", i18n("selector.custom")); + private final StringProperty chooserTitle = new SimpleStringProperty(this, "chooserTitle", i18n("selector.choose_file")); private final ToggleGroup group = new ToggleGroup(); private final JFXColorPicker colorPicker = new JFXColorPicker(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiFileItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiFileItem.java index c55e0f124..39d246d01 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiFileItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/MultiFileItem.java @@ -42,15 +42,15 @@ import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.File; import java.util.Collection; import java.util.function.Consumer; public class MultiFileItem extends ComponentList { - private final StringProperty customTitle = new SimpleStringProperty(this, "customTitle", I18n.i18n("selector.custom")); - private final StringProperty chooserTitle = new SimpleStringProperty(this, "chooserTitle", I18n.i18n("selector.choose_file")); + private final StringProperty customTitle = new SimpleStringProperty(this, "customTitle", i18n("selector.custom")); + private final StringProperty chooserTitle = new SimpleStringProperty(this, "chooserTitle", i18n("selector.choose_file")); private final BooleanProperty directory = new SimpleBooleanProperty(this, "directory", false); private final ObservableList extensionFilters = FXCollections.observableArrayList(); @@ -148,7 +148,7 @@ public class MultiFileItem extends ComponentList { public void onExploreJavaDir() { DirectoryChooser chooser = new DirectoryChooser(); - chooser.setTitle(I18n.i18n(getChooserTitle())); + chooser.setTitle(i18n(getChooserTitle())); File selectedDir = chooser.showDialog(Controllers.getStage()); if (selectedDir != null) txtCustom.setText(selectedDir.getAbsolutePath()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java index 8a97c4ff5..e306d1586 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java @@ -26,7 +26,7 @@ import org.jackhuang.hmcl.task.TaskListener; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.wizard.AbstractWizardDisplayer; import org.jackhuang.hmcl.util.StringUtils; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.Map; @@ -39,7 +39,7 @@ public interface TaskExecutorDialogWizardDisplayer extends AbstractWizardDisplay Controllers.navigate(null); }); - pane.setTitle(I18n.i18n("message.doing")); + pane.setTitle(i18n("message.doing")); pane.setProgress(Double.MAX_VALUE); if (settings.containsKey("title")) { Object title = settings.get("title"); @@ -67,7 +67,7 @@ public interface TaskExecutorDialogWizardDisplayer extends AbstractWizardDisplay if (settings.containsKey("success_message") && settings.get("success_message") instanceof String) Controllers.dialog((String) settings.get("success_message"), null, MessageBox.FINE_MESSAGE, () -> Controllers.navigate(null)); else if (!settings.containsKey("forbid_success_message")) - Controllers.dialog(I18n.i18n("message.success"), null, MessageBox.FINE_MESSAGE, () -> Controllers.navigate(null)); + Controllers.dialog(i18n("message.success"), null, MessageBox.FINE_MESSAGE, () -> Controllers.navigate(null)); } else { if (executor.getLastException() == null) return; @@ -75,7 +75,7 @@ public interface TaskExecutorDialogWizardDisplayer extends AbstractWizardDisplay if (settings.containsKey("failure_message") && settings.get("failure_message") instanceof String) Controllers.dialog(appendix, (String) settings.get("failure_message"), MessageBox.ERROR_MESSAGE, () -> Controllers.navigate(null)); else if (!settings.containsKey("forbid_failure_message")) - Controllers.dialog(appendix, I18n.i18n("wizard.failed"), MessageBox.ERROR_MESSAGE, () -> Controllers.navigate(null)); + Controllers.dialog(appendix, i18n("wizard.failed"), MessageBox.ERROR_MESSAGE, () -> Controllers.navigate(null)); } }); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java index c0c5ca83d..5c1fc0845 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java @@ -35,7 +35,7 @@ import org.jackhuang.hmcl.mod.*; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.task.TaskListener; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.HashMap; import java.util.Map; @@ -63,29 +63,29 @@ public final class TaskListPane extends StackPane { return; if (task instanceof GameAssetRefreshTask) { - task.setName(I18n.i18n("assets.download")); + task.setName(i18n("assets.download")); } else if (task instanceof GameAssetDownloadTask) { - task.setName(I18n.i18n("assets.download_all")); + task.setName(i18n("assets.download_all")); } else if (task instanceof ForgeInstallTask) { - task.setName(I18n.i18n("install.installer.install", I18n.i18n("install.installer.forge"))); + task.setName(i18n("install.installer.install", i18n("install.installer.forge"))); } else if (task instanceof LiteLoaderInstallTask) { - task.setName(I18n.i18n("install.installer.install", I18n.i18n("install.installer.liteloader"))); + task.setName(i18n("install.installer.install", i18n("install.installer.liteloader"))); } else if (task instanceof OptiFineInstallTask) { - task.setName(I18n.i18n("install.installer.install", I18n.i18n("install.installer.optifine"))); + task.setName(i18n("install.installer.install", i18n("install.installer.optifine"))); } else if (task instanceof CurseCompletionTask) { - task.setName(I18n.i18n("modpack.type.curse.completion")); + task.setName(i18n("modpack.type.curse.completion")); } else if (task instanceof ModpackInstallTask) { - task.setName(I18n.i18n("modpack.installing")); + task.setName(i18n("modpack.installing")); } else if (task instanceof CurseInstallTask) { - task.setName(I18n.i18n("modpack.install", I18n.i18n("modpack.type.curse"))); + task.setName(i18n("modpack.install", i18n("modpack.type.curse"))); } else if (task instanceof MultiMCModpackInstallTask) { - task.setName(I18n.i18n("modpack.install", I18n.i18n("modpack.type.multimc"))); + task.setName(i18n("modpack.install", i18n("modpack.type.multimc"))); } else if (task instanceof HMCLModpackInstallTask) { - task.setName(I18n.i18n("modpack.install", I18n.i18n("modpack.type.hmcl"))); + task.setName(i18n("modpack.install", i18n("modpack.type.hmcl"))); } else if (task instanceof HMCLModpackExportTask) { - task.setName(I18n.i18n("modpack.export")); + task.setName(i18n("modpack.export")); } else if (task instanceof MinecraftInstanceTask) { - task.setName(I18n.i18n("modpack.scan")); + task.setName(i18n("modpack.scan")); } ProgressListNode node = new ProgressListNode(task); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java index 8001bca32..92366f713 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java @@ -30,7 +30,7 @@ import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; import org.jackhuang.hmcl.util.Lang; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.Map; import java.util.Optional; @@ -71,21 +71,21 @@ class AdditionalInstallersPage extends StackPane implements WizardPage { btnForge.setOnMouseClicked(e -> { controller.getSettings().put(INSTALLER_TYPE, 0); - controller.onNext(new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.forge")), provider.getGameVersion(), downloadProvider, "forge", () -> { + controller.onNext(new VersionsPage(controller, i18n("install.installer.choose", i18n("install.installer.forge")), provider.getGameVersion(), downloadProvider, "forge", () -> { controller.onPrev(false); })); }); btnLiteLoader.setOnMouseClicked(e -> { controller.getSettings().put(INSTALLER_TYPE, 1); - controller.onNext(new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.liteloader")), provider.getGameVersion(), downloadProvider, "liteloader", () -> { + controller.onNext(new VersionsPage(controller, i18n("install.installer.choose", i18n("install.installer.liteloader")), provider.getGameVersion(), downloadProvider, "liteloader", () -> { controller.onPrev(false); })); }); btnOptiFine.setOnMouseClicked(e -> { controller.getSettings().put(INSTALLER_TYPE, 2); - controller.onNext(new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.optifine")), provider.getGameVersion(), downloadProvider, "optifine", () -> { + controller.onNext(new VersionsPage(controller, i18n("install.installer.choose", i18n("install.installer.optifine")), provider.getGameVersion(), downloadProvider, "optifine", () -> { controller.onPrev(false); })); }); @@ -99,7 +99,7 @@ class AdditionalInstallersPage extends StackPane implements WizardPage { @Override public String getTitle() { - return I18n.i18n("settings.tabs.installers"); + return i18n("settings.tabs.installers"); } private String getVersion(String id) { @@ -108,24 +108,24 @@ class AdditionalInstallersPage extends StackPane implements WizardPage { @Override public void onNavigate(Map settings) { - lblGameVersion.setText(I18n.i18n("install.new_game.current_game_version") + ": " + provider.getGameVersion()); + lblGameVersion.setText(i18n("install.new_game.current_game_version") + ": " + provider.getGameVersion()); btnForge.setDisable(provider.getForge() != null); if (provider.getForge() != null || controller.getSettings().containsKey("forge")) - lblForge.setText(I18n.i18n("install.installer.version", I18n.i18n("install.installer.forge")) + ": " + Lang.nonNull(provider.getForge(), getVersion("forge"))); + lblForge.setText(i18n("install.installer.version", i18n("install.installer.forge")) + ": " + Lang.nonNull(provider.getForge(), getVersion("forge"))); else - lblForge.setText(I18n.i18n("install.installer.not_installed", I18n.i18n("install.installer.forge"))); + lblForge.setText(i18n("install.installer.not_installed", i18n("install.installer.forge"))); btnLiteLoader.setDisable(provider.getLiteLoader() != null); if (provider.getLiteLoader() != null || controller.getSettings().containsKey("liteloader")) - lblLiteLoader.setText(I18n.i18n("install.installer.version", I18n.i18n("install.installer.liteloader")) + ": " + Lang.nonNull(provider.getLiteLoader(), getVersion("liteloader"))); + lblLiteLoader.setText(i18n("install.installer.version", i18n("install.installer.liteloader")) + ": " + Lang.nonNull(provider.getLiteLoader(), getVersion("liteloader"))); else - lblLiteLoader.setText(I18n.i18n("install.installer.not_installed", I18n.i18n("install.installer.liteloader"))); + lblLiteLoader.setText(i18n("install.installer.not_installed", i18n("install.installer.liteloader"))); btnOptiFine.setDisable(provider.getOptiFine() != null); if (provider.getOptiFine() != null || controller.getSettings().containsKey("optifine")) - lblOptiFine.setText(I18n.i18n("install.installer.version", I18n.i18n("install.installer.optifine")) + ": " + Lang.nonNull(provider.getOptiFine(), getVersion("optifine"))); + lblOptiFine.setText(i18n("install.installer.version", i18n("install.installer.optifine")) + ": " + Lang.nonNull(provider.getOptiFine(), getVersion("optifine"))); else - lblOptiFine.setText(I18n.i18n("install.installer.not_installed", I18n.i18n("install.installer.optifine"))); + lblOptiFine.setText(i18n("install.installer.not_installed", i18n("install.installer.optifine"))); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadWizardProvider.java index 67eda71f6..2e51232ac 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadWizardProvider.java @@ -30,12 +30,11 @@ import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardProvider; import org.jackhuang.hmcl.util.Lang; -import org.jackhuang.hmcl.util.i18n.I18n; - import java.io.File; import java.util.Map; import static org.jackhuang.hmcl.util.Lang.tryCast; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class DownloadWizardProvider implements WizardProvider { private Profile profile; @@ -78,8 +77,8 @@ public final class DownloadWizardProvider implements WizardProvider { @Override public Object finish(Map settings) { - settings.put("success_message", I18n.i18n("install.success")); - settings.put("failure_message", I18n.i18n("install.failed")); + settings.put("success_message", i18n("install.success")); + settings.put("failure_message", i18n("install.failed")); switch (Lang.parseInt(settings.get(InstallTypePage.INSTALL_TYPE), -1)) { case 0: return finishVersionDownloadingAsync(settings); @@ -98,7 +97,7 @@ public final class DownloadWizardProvider implements WizardProvider { int subStep = Lang.parseInt(settings.get(InstallTypePage.INSTALL_TYPE), -1); switch (subStep) { case 0: - return new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.game")), "", provider, "game", () -> controller.onNext(new InstallersPage(controller, profile.getRepository(), provider))); + return new VersionsPage(controller, i18n("install.installer.choose", i18n("install.installer.game")), "", provider, "game", () -> controller.onNext(new InstallersPage(controller, profile.getRepository(), provider))); case 1: return new ModpackPage(controller); default: diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallTypePage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallTypePage.java index d733bb991..00a119b5f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallTypePage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallTypePage.java @@ -24,7 +24,7 @@ import javafx.scene.layout.StackPane; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.Map; @@ -50,7 +50,7 @@ public final class InstallTypePage extends StackPane implements WizardPage { @Override public String getTitle() { - return I18n.i18n("install.select"); + return i18n("install.select"); } public static final String INSTALL_TYPE = "INSTALL_TYPE"; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallerWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallerWizardProvider.java index ee94a8632..ae6d00066 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallerWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallerWizardProvider.java @@ -26,7 +26,7 @@ import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardProvider; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.Map; @@ -81,8 +81,8 @@ public final class InstallerWizardProvider implements WizardProvider { @Override public Object finish(Map settings) { - settings.put("success_message", I18n.i18n("install.success")); - settings.put("failure_message", I18n.i18n("install.failed")); + settings.put("success_message", i18n("install.success")); + settings.put("failure_message", i18n("install.failed")); Task ret = Task.empty(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java index af204e13c..2898c9418 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java @@ -32,7 +32,7 @@ import org.jackhuang.hmcl.ui.construct.Validator; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; import org.jackhuang.hmcl.util.StringUtils; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.Map; @@ -76,30 +76,30 @@ public class InstallersPage extends StackPane implements WizardPage { String gameVersion = ((RemoteVersion) controller.getSettings().get("game")).getGameVersion(); Validator hasVersion = new Validator(s -> !repository.hasVersion(s) && StringUtils.isNotBlank(s)); - hasVersion.setMessage(I18n.i18n("install.new_game.already_exists")); + hasVersion.setMessage(i18n("install.new_game.already_exists")); txtName.getValidators().add(hasVersion); txtName.textProperty().addListener(e -> btnInstall.setDisable(!txtName.validate())); txtName.setText(gameVersion); btnForge.setOnMouseClicked(e -> { controller.getSettings().put(INSTALLER_TYPE, 0); - controller.onNext(new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.forge")), gameVersion, downloadProvider, "forge", () -> controller.onPrev(false))); + controller.onNext(new VersionsPage(controller, i18n("install.installer.choose", i18n("install.installer.forge")), gameVersion, downloadProvider, "forge", () -> controller.onPrev(false))); }); btnLiteLoader.setOnMouseClicked(e -> { controller.getSettings().put(INSTALLER_TYPE, 1); - controller.onNext(new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.liteloader")), gameVersion, downloadProvider, "liteloader", () -> controller.onPrev(false))); + controller.onNext(new VersionsPage(controller, i18n("install.installer.choose", i18n("install.installer.liteloader")), gameVersion, downloadProvider, "liteloader", () -> controller.onPrev(false))); }); btnOptiFine.setOnMouseClicked(e -> { controller.getSettings().put(INSTALLER_TYPE, 2); - controller.onNext(new VersionsPage(controller, I18n.i18n("install.installer.choose", I18n.i18n("install.installer.optifine")), gameVersion, downloadProvider, "optifine", () -> controller.onPrev(false))); + controller.onNext(new VersionsPage(controller, i18n("install.installer.choose", i18n("install.installer.optifine")), gameVersion, downloadProvider, "optifine", () -> controller.onPrev(false))); }); } @Override public String getTitle() { - return I18n.i18n("install.new_game"); + return i18n("install.new_game"); } private String getVersion(String id) { @@ -108,21 +108,21 @@ public class InstallersPage extends StackPane implements WizardPage { @Override public void onNavigate(Map settings) { - lblGameVersion.setText(I18n.i18n("install.new_game.current_game_version") + ": " + getVersion("game")); + lblGameVersion.setText(i18n("install.new_game.current_game_version") + ": " + getVersion("game")); if (controller.getSettings().containsKey("forge")) - lblForge.setText(I18n.i18n("install.installer.version", I18n.i18n("install.installer.forge")) + ": " + getVersion("forge")); + lblForge.setText(i18n("install.installer.version", i18n("install.installer.forge")) + ": " + getVersion("forge")); else - lblForge.setText(I18n.i18n("install.installer.not_installed", I18n.i18n("install.installer.forge"))); + lblForge.setText(i18n("install.installer.not_installed", i18n("install.installer.forge"))); if (controller.getSettings().containsKey("liteloader")) - lblLiteLoader.setText(I18n.i18n("install.installer.version", I18n.i18n("install.installer.liteloader")) + ": " + getVersion("liteloader")); + lblLiteLoader.setText(i18n("install.installer.version", i18n("install.installer.liteloader")) + ": " + getVersion("liteloader")); else - lblLiteLoader.setText(I18n.i18n("install.installer.not_installed", I18n.i18n("install.installer.liteloader"))); + lblLiteLoader.setText(i18n("install.installer.not_installed", i18n("install.installer.liteloader"))); if (controller.getSettings().containsKey("optifine")) - lblOptiFine.setText(I18n.i18n("install.installer.version", I18n.i18n("install.installer.optifine")) + ": " + getVersion("optifine")); + lblOptiFine.setText(i18n("install.installer.version", i18n("install.installer.optifine")) + ": " + getVersion("optifine")); else - lblOptiFine.setText(I18n.i18n("install.installer.not_installed", I18n.i18n("install.installer.optifine"))); + lblOptiFine.setText(i18n("install.installer.not_installed", i18n("install.installer.optifine"))); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java index 55298f6e6..3c5b435d9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java @@ -37,7 +37,7 @@ import org.jackhuang.hmcl.ui.construct.Validator; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; import org.jackhuang.hmcl.util.StringUtils; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.File; import java.util.Map; @@ -76,16 +76,16 @@ public final class ModpackPage extends StackPane implements WizardPage { Profile profile = (Profile) controller.getSettings().get("PROFILE"); FileChooser chooser = new FileChooser(); - chooser.setTitle(I18n.i18n("modpack.choose")); - chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(I18n.i18n("modpack"), "*.zip")); + chooser.setTitle(i18n("modpack.choose")); + chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(i18n("modpack"), "*.zip")); File selectedFile = chooser.showOpenDialog(Controllers.getStage()); if (selectedFile == null) Platform.runLater(() -> Controllers.navigate(null)); else { controller.getSettings().put(MODPACK_FILE, selectedFile); lblModpackLocation.setText(selectedFile.getAbsolutePath()); txtModpackName.getValidators().addAll( - new Validator(I18n.i18n("install.new_game.already_exists"), str -> !profile.getRepository().hasVersion(str) && StringUtils.isNotBlank(str)), - new Validator(I18n.i18n("version.forbidden_name"), str -> !profile.getRepository().forbidsVersion(str)) + new Validator(i18n("install.new_game.already_exists"), str -> !profile.getRepository().hasVersion(str) && StringUtils.isNotBlank(str)), + new Validator(i18n("version.forbidden_name"), str -> !profile.getRepository().forbidsVersion(str)) ); txtModpackName.textProperty().addListener(e -> btnInstall.setDisable(!txtModpackName.validate())); @@ -97,7 +97,7 @@ public final class ModpackPage extends StackPane implements WizardPage { lblAuthor.setText(manifest.getAuthor()); txtModpackName.setText(manifest.getName() + (StringUtils.isBlank(manifest.getVersion()) ? "" : "-" + manifest.getVersion())); } catch (UnsupportedModpackException e) { - txtModpackName.setText(I18n.i18n("modpack.task.install.error")); + txtModpackName.setText(i18n("modpack.task.install.error")); } } } @@ -119,14 +119,14 @@ public final class ModpackPage extends StackPane implements WizardPage { if (manifest != null) { WebStage stage = new WebStage(); stage.getWebView().getEngine().loadContent(manifest.getDescription()); - stage.setTitle(I18n.i18n("modpack.wizard.step.3")); + stage.setTitle(i18n("modpack.wizard.step.3")); stage.showAndWait(); } } @Override public String getTitle() { - return I18n.i18n("modpack.task.install"); + return i18n("modpack.task.install"); } public static final String MODPACK_FILE = "MODPACK_FILE"; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPageItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPageItem.java index 907afecb2..299a6fc43 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPageItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPageItem.java @@ -29,7 +29,7 @@ import org.jackhuang.hmcl.download.game.GameRemoteVersionTag; import org.jackhuang.hmcl.download.liteloader.LiteLoaderRemoteVersionTag; import org.jackhuang.hmcl.download.optifine.OptiFineRemoteVersion; import org.jackhuang.hmcl.ui.FXUtils; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.util.Objects; @@ -58,15 +58,15 @@ public final class VersionsPageItem extends StackPane { if (remoteVersion.getTag() instanceof GameRemoteVersionTag) { switch (((GameRemoteVersionTag) remoteVersion.getTag()).getType()) { case RELEASE: - lblGameVersion.setText(I18n.i18n("version.game.release")); + lblGameVersion.setText(i18n("version.game.release")); imageView.setImage(new Image("/assets/img/icon.png", 32, 32, false, true)); break; case SNAPSHOT: - lblGameVersion.setText(I18n.i18n("version.game.snapshot")); + lblGameVersion.setText(i18n("version.game.snapshot")); imageView.setImage(new Image("/assets/img/command.png", 32, 32, false, true)); break; default: - lblGameVersion.setText(I18n.i18n("version.game.old")); + lblGameVersion.setText(i18n("version.game.old")); imageView.setImage(new Image("/assets/img/grass.png", 32, 32, false, true)); break; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java index 46503b53a..2d79f7e72 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java @@ -34,8 +34,6 @@ import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; import org.jackhuang.hmcl.util.FileUtils; import org.jackhuang.hmcl.util.StringUtils; -import org.jackhuang.hmcl.util.i18n.I18n; - import java.io.File; import java.util.LinkedList; import java.util.List; @@ -44,6 +42,7 @@ import java.util.Objects; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Pair.pair; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; /** * @author huangyuhui @@ -152,23 +151,23 @@ public final class ModpackFileSelectionPage extends StackPane implements WizardP @Override public String getTitle() { - return I18n.i18n("modpack.wizard.step.2.title"); + return i18n("modpack.wizard.step.2.title"); } public static final String MODPACK_FILE_SELECTION = "modpack.accepted"; private static final Map TRANSLATION = mapOf( - pair("minecraft/servers.dat", I18n.i18n("modpack.files.servers_dat")), - pair("minecraft/saves", I18n.i18n("modpack.files.saves")), - pair("minecraft/mods", I18n.i18n("modpack.files.mods")), - pair("minecraft/config", I18n.i18n("modpack.files.config")), - pair("minecraft/liteconfig", I18n.i18n("modpack.files.liteconfig")), - pair("minecraft/resourcepacks", I18n.i18n("modpack.files.resourcepacks")), - pair("minecraft/resources", I18n.i18n("modpack.files.resourcepacks")), - pair("minecraft/options.txt", I18n.i18n("modpack.files.options_txt")), - pair("minecraft/optionsshaders.txt", I18n.i18n("modpack.files.optionsshaders_txt")), - pair("minecraft/mods/VoxelMods", I18n.i18n("modpack.files.mods.voxelmods")), - pair("minecraft/dumps", I18n.i18n("modpack.files.dumps")), - pair("minecraft/blueprints", I18n.i18n("modpack.files.blueprints")), - pair("minecraft/scripts", I18n.i18n("modpack.files.scripts")) + pair("minecraft/servers.dat", i18n("modpack.files.servers_dat")), + pair("minecraft/saves", i18n("modpack.files.saves")), + pair("minecraft/mods", i18n("modpack.files.mods")), + pair("minecraft/config", i18n("modpack.files.config")), + pair("minecraft/liteconfig", i18n("modpack.files.liteconfig")), + pair("minecraft/resourcepacks", i18n("modpack.files.resourcepacks")), + pair("minecraft/resources", i18n("modpack.files.resourcepacks")), + pair("minecraft/options.txt", i18n("modpack.files.options_txt")), + pair("minecraft/optionsshaders.txt", i18n("modpack.files.optionsshaders_txt")), + pair("minecraft/mods/VoxelMods", i18n("modpack.files.mods.voxelmods")), + pair("minecraft/dumps", i18n("modpack.files.dumps")), + pair("minecraft/blueprints", i18n("modpack.files.blueprints")), + pair("minecraft/scripts", i18n("modpack.files.scripts")) ); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java index 566c9f117..39613db3c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java @@ -33,7 +33,7 @@ import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardPage; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.File; import java.util.List; @@ -82,8 +82,8 @@ public final class ModpackInfoPage extends StackPane implements WizardPage { @FXML private void onNext() { FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle(I18n.i18n("modpack.wizard.step.initialization.save")); - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(I18n.i18n("modpack"), "*.zip")); + fileChooser.setTitle(i18n("modpack.wizard.step.initialization.save")); + fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(i18n("modpack"), "*.zip")); File file = fileChooser.showSaveDialog(Controllers.getStage()); if (file == null) { Controllers.navigate(null); @@ -110,7 +110,7 @@ public final class ModpackInfoPage extends StackPane implements WizardPage { @Override public String getTitle() { - return I18n.i18n("modpack.wizard.step.1.title"); + return i18n("modpack.wizard.step.1.title"); } public static final String MODPACK_NAME = "modpack.name"; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java index 770e0022e..50914c6a8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java @@ -29,7 +29,7 @@ import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.util.*; -import org.jackhuang.hmcl.util.i18n.I18n; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.File; import java.io.FileInputStream; @@ -114,7 +114,7 @@ public class AppDataUpgrader extends IUpgrader { Task task = new AppDataUpgraderJarTask(NetworkUtils.toURL(map.get("jar")), version.toString(), hash); TaskExecutor executor = task.executor(); AtomicReference region = new AtomicReference<>(); - JFXUtilities.runInFX(() -> region.set(Controllers.taskDialog(executor, I18n.i18n("message.downloading"), "", null))); + JFXUtilities.runInFX(() -> region.set(Controllers.taskDialog(executor, i18n("message.downloading"), "", null))); if (executor.test()) { new ProcessBuilder(JavaVersion.fromCurrentEnvironment().getBinary().getAbsolutePath(), "-jar", AppDataUpgraderJarTask.getSelf(version.toString()).getAbsolutePath()) .directory(new File("").getAbsoluteFile()).start(); @@ -132,7 +132,7 @@ public class AppDataUpgrader extends IUpgrader { Task task = new AppDataUpgraderPackGzTask(NetworkUtils.toURL(map.get("pack")), version.toString(), hash); TaskExecutor executor = task.executor(); AtomicReference region = new AtomicReference<>(); - JFXUtilities.runInFX(() -> region.set(Controllers.taskDialog(executor, I18n.i18n("message.downloading"), "", null))); + JFXUtilities.runInFX(() -> region.set(Controllers.taskDialog(executor, i18n("message.downloading"), "", null))); if (executor.test()) { new ProcessBuilder(JavaVersion.fromCurrentEnvironment().getBinary().getAbsolutePath(), "-jar", AppDataUpgraderPackGzTask.getSelf(version.toString()).getAbsolutePath()) .directory(new File("").getAbsoluteFile()).start(); @@ -154,7 +154,7 @@ public class AppDataUpgrader extends IUpgrader { } catch (URISyntaxException | IOException e) { Logging.LOG.log(Level.SEVERE, "Failed to browse uri: " + url, e); OperatingSystem.setClipboard(url); - MessageBox.show(I18n.i18n("update.no_browser")); + MessageBox.show(i18n("update.no_browser")); } } })).start(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java index 2a690f171..a3344021f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/NewFileUpgrader.java @@ -26,8 +26,6 @@ import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.util.Logging; import org.jackhuang.hmcl.util.VersionNumber; -import org.jackhuang.hmcl.util.i18n.I18n; - import java.io.File; import java.io.IOException; import java.net.URL; @@ -36,6 +34,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Level; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; /** * @@ -58,11 +57,11 @@ public class NewFileUpgrader extends IUpgrader { URL url = requestDownloadLink(); if (url == null) return; File newf = new File(url.getFile()); - Controllers.dialog(I18n.i18n("message.downloading")); + Controllers.dialog(i18n("message.downloading")); Task task = new FileDownloadTask(url, newf); TaskExecutor executor = task.executor(); AtomicReference region = new AtomicReference<>(); - JFXUtilities.runInFX(() -> region.set(Controllers.taskDialog(executor, I18n.i18n("message.downloading"), "", null))); + JFXUtilities.runInFX(() -> region.set(Controllers.taskDialog(executor, i18n("message.downloading"), "", null))); if (executor.test()) { try { new ProcessBuilder(newf.getCanonicalPath(), "--removeOldLauncher", getRealPath()) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java index c898bc185..fb44d4f2c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java @@ -29,9 +29,8 @@ import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.NetworkUtils; import org.jackhuang.hmcl.util.VersionNumber; -import org.jackhuang.hmcl.util.i18n.I18n; - import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.IOException; import java.util.Collection; @@ -93,7 +92,7 @@ public final class UpdateChecker { if (value == null) { LOG.warning("Unable to check update..."); if (showMessage) - MessageBox.show(I18n.i18n("update.failed")); + MessageBox.show(i18n("update.failed")); } else if (base.compareTo(value) < 0) outOfDate = true; if (outOfDate) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java index b89ebd3e7..5298829e0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/CrashReporter.java @@ -21,10 +21,9 @@ import javafx.application.Platform; import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.ui.CrashWindow; import org.jackhuang.hmcl.ui.construct.MessageBox; -import org.jackhuang.hmcl.util.i18n.I18n; - import static java.util.Collections.newSetFromMap; import static org.jackhuang.hmcl.util.Logging.LOG; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import java.io.IOException; import java.text.SimpleDateFormat; @@ -42,19 +41,19 @@ public class CrashReporter implements Thread.UncaughtExceptionHandler { private static final Map SOURCE = new HashMap() { { - put("javafx.fxml.LoadException", I18n.i18n("crash.NoClassDefFound")); - put("Location is not set", I18n.i18n("crash.NoClassDefFound")); - put("UnsatisfiedLinkError", I18n.i18n("crash.user_fault")); - put("java.lang.NoClassDefFoundError", I18n.i18n("crash.NoClassDefFound")); - put("java.lang.VerifyError", I18n.i18n("crash.NoClassDefFound")); - put("java.lang.NoSuchMethodError", I18n.i18n("crash.NoClassDefFound")); - put("java.lang.NoSuchFieldError", I18n.i18n("crash.NoClassDefFound")); - put("netscape.javascript.JSException", I18n.i18n("crash.NoClassDefFound")); - put("java.lang.IncompatibleClassChangeError", I18n.i18n("crash.NoClassDefFound")); - put("java.lang.ClassFormatError", I18n.i18n("crash.NoClassDefFound")); + put("javafx.fxml.LoadException", i18n("crash.NoClassDefFound")); + put("Location is not set", i18n("crash.NoClassDefFound")); + put("UnsatisfiedLinkError", i18n("crash.user_fault")); + put("java.lang.NoClassDefFoundError", i18n("crash.NoClassDefFound")); + put("java.lang.VerifyError", i18n("crash.NoClassDefFound")); + put("java.lang.NoSuchMethodError", i18n("crash.NoClassDefFound")); + put("java.lang.NoSuchFieldError", i18n("crash.NoClassDefFound")); + put("netscape.javascript.JSException", i18n("crash.NoClassDefFound")); + put("java.lang.IncompatibleClassChangeError", i18n("crash.NoClassDefFound")); + put("java.lang.ClassFormatError", i18n("crash.NoClassDefFound")); put("java.lang.OutOfMemoryError", "FUCKING MEMORY LIMIT!"); - put("Trampoline", I18n.i18n("launcher.update_java")); - put("com.sun.javafx.css.StyleManager.findMatchingStyles", I18n.i18n("launcher.update_java")); + put("Trampoline", i18n("launcher.update_java")); + put("com.sun.javafx.css.StyleManager.findMatchingStyles", i18n("launcher.update_java")); put("NoSuchAlgorithmException", "Has your operating system been installed completely or is a ghost system?"); } }; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java index b1e8066a7..21411e1f0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java @@ -30,7 +30,7 @@ public final class I18n { private I18n() {} public static String i18n(String key, Object... formatArgs) { - return String.format(I18n.i18n(key), formatArgs); + return String.format(i18n(key), formatArgs); } public static String i18n(String key) { From 13e931cda4b262150d86216fc7694f8205ed2242 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sun, 1 Jul 2018 21:24:46 +0800 Subject: [PATCH 3/5] Fallback to use Locales.DEFAULT when Settings has not been initialized --- .../main/java/org/jackhuang/hmcl/Main.java | 3 ++- .../java/org/jackhuang/hmcl/ui/FXUtils.java | 2 +- .../org/jackhuang/hmcl/util/i18n/I18n.java | 25 +++++++++++++++---- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java index af6c99880..6e8ae0916 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java @@ -17,9 +17,10 @@ */ package org.jackhuang.hmcl; -import javax.swing.*; import java.io.File; +import javax.swing.JOptionPane; + public final class Main { public static void main(String[] args) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java index ca210febc..1e7ffc8ae 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java @@ -203,7 +203,7 @@ public final class FXUtils { } public static void loadFXML(Node node, String absolutePath) { - FXMLLoader loader = new FXMLLoader(node.getClass().getResource(absolutePath), I18n.RESOURCE_BUNDLE); + FXMLLoader loader = new FXMLLoader(node.getClass().getResource(absolutePath), I18n.getResourceBundle()); loader.setRoot(node); loader.setController(node); Lang.invoke((ExceptionalSupplier) loader::load); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java index 21411e1f0..1048f2ffe 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java @@ -17,27 +17,42 @@ */ package org.jackhuang.hmcl.util.i18n; +import static org.jackhuang.hmcl.util.Logging.LOG; + import java.util.ResourceBundle; import java.util.logging.Level; import org.jackhuang.hmcl.setting.Settings; -import org.jackhuang.hmcl.util.Logging; public final class I18n { - public static final ResourceBundle RESOURCE_BUNDLE = Settings.INSTANCE.getLocale().getResourceBundle(); - private I18n() {} + private static ResourceBundle RESOURCE_BUNDLE; + + static { + try { + RESOURCE_BUNDLE = Settings.INSTANCE.getLocale().getResourceBundle(); + } catch (Throwable e) { + LOG.log(Level.SEVERE, "Settings cannot be initialized", e); + // fallback + RESOURCE_BUNDLE = Locales.DEFAULT.getResourceBundle(); + } + } + + public static ResourceBundle getResourceBundle() { + return RESOURCE_BUNDLE; + } + public static String i18n(String key, Object... formatArgs) { return String.format(i18n(key), formatArgs); } public static String i18n(String key) { try { - return RESOURCE_BUNDLE.getString(key); + return getResourceBundle().getString(key); } catch (Exception e) { - Logging.LOG.log(Level.SEVERE, "Cannot find key " + key + " in resource bundle", e); + LOG.log(Level.SEVERE, "Cannot find key " + key + " in resource bundle", e); return key; } } From 7583f4651d371396b8324f8e63f34ea65b3da632 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sun, 1 Jul 2018 21:40:09 +0800 Subject: [PATCH 4/5] Remove I18nException --- .../jackhuang/hmcl/game/LauncherHelper.java | 24 +++++----- .../hmcl/util/i18n/I18nException.java | 46 ------------------- 2 files changed, 11 insertions(+), 59 deletions(-) delete mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18nException.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index af7ec1328..8a066debb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -40,7 +40,6 @@ import org.jackhuang.hmcl.ui.LogWindow; import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.ui.construct.TaskExecutorDialogPane; import org.jackhuang.hmcl.util.*; -import org.jackhuang.hmcl.util.i18n.I18nException; import java.io.File; import java.io.IOException; @@ -182,10 +181,17 @@ public final class LauncherHelper { Exception ex = executor.getLastException(); if (ex != null) { String message; - if (ex instanceof CurseCompletionException) + if (ex instanceof CurseCompletionException) { message = i18n("modpack.type.curse.error"); - else - message = I18nException.getStackTrace(ex); + } else if (ex instanceof PermissionException) { + message = i18n("launch.failed.executable_permission"); + } else if (ex instanceof ProcessCreationException) { + message = i18n("launch.failed.creating_process") + ex.getLocalizedMessage(); + } else if (ex instanceof NotDecompressingNativesException) { + message = i18n("launch.failed.decompressing_natives") + ex.getLocalizedMessage(); + } else { + message = StringUtils.getStackTrace(ex); + } Controllers.dialog(message, scriptFile == null ? i18n("launch.failed") : i18n("version.launch_script.failed"), MessageBox.ERROR_MESSAGE); @@ -298,15 +304,7 @@ public final class LauncherHelper { @Override public void execute() throws Exception { - try { - setResult(supplier.get()); - } catch (PermissionException e) { - throw new I18nException(i18n("launch.failed.executable_permission"), e); - } catch (ProcessCreationException e) { - throw new I18nException(i18n("launch.failed.creating_process") + e.getLocalizedMessage(), e); - } catch (NotDecompressingNativesException e) { - throw new I18nException(i18n("launch.failed.decompressing_natives") + e.getLocalizedMessage(), e); - } + setResult(supplier.get()); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18nException.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18nException.java deleted file mode 100644 index bd1b49884..000000000 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18nException.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Hello Minecraft! Launcher. - * Copyright (C) 2018 huangyuhui - * - * 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 {http://www.gnu.org/licenses/}. - */ -package org.jackhuang.hmcl.util.i18n; - -import org.jackhuang.hmcl.util.StringUtils; - -public class I18nException extends Exception { - private final String localizedMessage; - - public I18nException(String localizedMessage) { - this.localizedMessage = localizedMessage; - } - - public I18nException(String localizedMessage, Throwable suppressed) { - addSuppressed(suppressed); - - this.localizedMessage = localizedMessage; - } - - @Override - public String getLocalizedMessage() { - return localizedMessage; - } - - public static String getStackTrace(Throwable e) { - if (e instanceof I18nException) - return e.getLocalizedMessage(); - else - return StringUtils.getStackTrace(e); - } -} From 764cd16e21eb9b153ada155a6777fbc8fce206cc Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sun, 1 Jul 2018 22:00:22 +0800 Subject: [PATCH 5/5] I18n for missing JavaFX error --- HMCL/src/main/java/org/jackhuang/hmcl/Main.java | 6 +++--- HMCL/src/main/resources/assets/lang/I18N.properties | 2 ++ HMCL/src/main/resources/assets/lang/I18N_zh.properties | 2 ++ HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties | 2 ++ 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java index 6e8ae0916..fe42cd219 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java @@ -17,6 +17,8 @@ */ package org.jackhuang.hmcl; +import static org.jackhuang.hmcl.util.i18n.I18n.i18n; + import java.io.File; import javax.swing.JOptionPane; @@ -42,9 +44,7 @@ public final class Main { try { Class.forName("javafx.application.Application"); } catch (ClassNotFoundException e) { - showErrorAndExit("JavaFX is missing.\n" - + "If you are using Java 11 or above, please downgrade to Java 8 or 10.\n" - + "If you are using OpenJDK, please ensure OpenJFX is included."); + showErrorAndExit(i18n("fatal.missing_javafx")); } } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 9d7320f43..e3f4554d9 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -91,6 +91,8 @@ extension.mod=Mod file extension.png=Image file extension.sh=Bash shell +fatal.missing_javafx=JavaFX is missing.\nIf you are using Java 11 or later, please downgrade to Java 8 or 10.\nIf you are using OpenJDK, please ensure OpenJFX is included. + folder.config=Configs folder.coremod=Core Mod folder.game=Game Dir diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 67989b98b..8306b808d 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -91,6 +91,8 @@ extension.mod=模組文件 extension.png=圖片文件 extension.sh=Bash 腳本 +fatal.missing_javafx=JavaFX 缺失。\n如果您使用的是 Java 11 或更高版本,請降級到 Java 8 或 10。\n如果您使用的是 OpenJDK,請確保其包含 OpenJFX。 + folder.config=配置文件夾 folder.coremod=核心MOD文件夾 folder.game=遊戲文件夾 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 bd90503ff..12d24efd1 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -91,6 +91,8 @@ extension.mod=模组文件 extension.png=图片文件 extension.sh=Bash 脚本 +fatal.missing_javafx=JavaFX 缺失。\n如果您使用的是 Java 11 或更高版本,请降级到 Java 8 或 10。\n如果您使用的是 OpenJDK,请确保其包含 OpenJFX。 + folder.config=配置文件夹 folder.coremod=核心MOD文件夹 folder.game=游戏文件夹