diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java index 22a0b39f9e..6fc255dd9b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountListItem.java @@ -32,17 +32,14 @@ import org.jackhuang.hmcl.auth.CredentialExpiredException; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorAccount; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer; -import org.jackhuang.hmcl.auth.microsoft.MicrosoftAccount; import org.jackhuang.hmcl.auth.offline.OfflineAccount; import org.jackhuang.hmcl.auth.yggdrasil.CompleteGameProfile; import org.jackhuang.hmcl.auth.yggdrasil.TextureType; -import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilAccount; import org.jackhuang.hmcl.setting.Accounts; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.DialogController; -import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.construct.MessageDialogPane.MessageType; import org.jackhuang.hmcl.util.skin.InvalidSkinException; import org.jackhuang.hmcl.util.skin.NormalizedSkin; @@ -128,7 +125,7 @@ public ObservableBooleanValue canUploadSkin() { .orElse(emptySet()); return uploadableTextures.contains(TextureType.SKIN); }, profile); - } else if (account instanceof OfflineAccount || account instanceof MicrosoftAccount) { + } else if (account instanceof OfflineAccount || account.canUploadSkin()) { return createBooleanBinding(() -> true); } else { return createBooleanBinding(() -> false); @@ -144,11 +141,7 @@ public Task uploadSkin() { Controllers.dialog(new OfflineAccountSkinPane((OfflineAccount) account)); return null; } - if (account instanceof MicrosoftAccount) { - FXUtils.openLink("https://www.minecraft.net/msaprofile/mygames/editskin"); - return null; - } - if (!(account instanceof YggdrasilAccount)) { + if (!account.canUploadSkin()) { return null; } @@ -174,7 +167,7 @@ public Task uploadSkin() { NormalizedSkin skin = new NormalizedSkin(skinImg); String model = skin.isSlim() ? "slim" : ""; LOG.info("Uploading skin [" + selectedFile + "], model [" + model + "]"); - ((YggdrasilAccount) account).uploadSkin(model, selectedFile.toPath()); + account.uploadSkin(skin.isSlim(), selectedFile.toPath()); }) .thenComposeAsync(refreshAsync()) .whenComplete(Schedulers.javafx(), e -> { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/CreateAccountPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/CreateAccountPane.java index 9a17ba55cc..28d1df6d0d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/CreateAccountPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/CreateAccountPane.java @@ -65,6 +65,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.UUID; import java.util.concurrent.CountDownLatch; @@ -637,7 +638,7 @@ public DialogCharacterSelector() { StackPane.setAlignment(cancel, Pos.BOTTOM_RIGHT); cancel.setOnAction(e -> latch.countDown()); - listBox.startCategory(i18n("account.choose")); + listBox.startCategory(i18n("account.choose").toUpperCase(Locale.ROOT)); setCenter(listBox); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaDownloadDialog.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaDownloadDialog.java index 7e4e80f66d..231be4b2b5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaDownloadDialog.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaDownloadDialog.java @@ -21,7 +21,6 @@ import javafx.beans.binding.Bindings; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.value.ChangeListener; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.control.Label; @@ -46,7 +45,6 @@ import org.jackhuang.hmcl.ui.construct.DialogPane; import org.jackhuang.hmcl.ui.construct.JFXHyperlink; import org.jackhuang.hmcl.ui.wizard.SinglePageWizardProvider; -import org.jackhuang.hmcl.util.Pair; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.TaskCancellationAction; import org.jackhuang.hmcl.util.gson.JsonUtils; @@ -56,6 +54,7 @@ import java.io.IOException; import java.util.*; import java.util.concurrent.CancellationException; +import java.util.function.Consumer; import static org.jackhuang.hmcl.ui.FXUtils.onEscPressed; import static org.jackhuang.hmcl.util.Lang.resolveException; @@ -118,6 +117,8 @@ private final class DownloadMojangJava extends DialogPane { button.setUserData(version); vbox.getChildren().add(button); toggleGroup.getToggles().add(button); + if (JavaManager.REPOSITORY.isInstalled(platform, version)) + button.setDisable(true); } setBody(vbox); @@ -166,19 +167,6 @@ protected void onAccept() { } private final class DownloadDiscoJava extends JFXDialogLayout { - - private boolean isLTS(int major) { - if (major <= 8) { - return true; - } - - if (major < 21) { - return major == 11 || major == 17; - } - - return major % 4 == 1; - } - private final JFXComboBox distributionBox; private final JFXComboBox remoteVersionBox; private final JFXComboBox packageTypeBox; @@ -189,11 +177,8 @@ private boolean isLTS(int major) { private final DownloadProvider downloadProvider = DownloadProviders.getDownloadProvider(); - private final ObjectProperty currentDiscoJavaVersionList = new SimpleObjectProperty<>(); - - private final Map, DiscoJavaVersionList> javaVersionLists = new HashMap<>(); - - private boolean changingDistribution = false; + private final Map javaVersionLists = new HashMap<>(); + private final ObjectProperty currentJavaVersionList = new SimpleObjectProperty<>(); DownloadDiscoJava() { assert !distributions.isEmpty(); @@ -204,7 +189,7 @@ private boolean isLTS(int major) { this.remoteVersionBox = new JFXComboBox<>(); this.remoteVersionBox.setConverter(FXUtils.stringConverter(JavaRemoteVersion::getDistributionVersion)); - this.packageTypeBox = new JFXComboBox<>(); + this.packageTypeBox = new JFXComboBox<>(FXCollections.observableArrayList()); this.downloadButton = new JFXButton(i18n("download")); downloadButton.setOnAction(e -> onDownload()); @@ -227,66 +212,91 @@ private boolean isLTS(int major) { body.addRow(2, new Label(i18n("java.download.packageType")), packageTypeBox); distributionBox.setItems(FXCollections.observableList(new ArrayList<>(distributions))); - ChangeListener updateStatusListener = (observable, oldValue, newValue) -> updateStatus(newValue); - this.currentDiscoJavaVersionList.addListener((observable, oldValue, newValue) -> { - if (oldValue != null) { - oldValue.status.removeListener(updateStatusListener); + + FXUtils.onChange(packageTypeBox.getSelectionModel().selectedItemProperty(), packageType -> { + ObservableList versions; + if (packageType == null + || currentJavaVersionList.get() == null + || (versions = currentJavaVersionList.get().versions.get(packageType)) == null) { + remoteVersionBox.setItems(null); + return; } - if (newValue != null) { - newValue.status.addListener(updateStatusListener); - updateStatus(newValue.status.get()); - } else { - updateStatus(null); + remoteVersionBox.setItems(versions); + + for (int i = 0; i < versions.size(); i++) { + DiscoJavaRemoteVersion version = versions.get(i); + if (version.getJdkVersion() == GameJavaVersion.LATEST.getMajorVersion()) { + remoteVersionBox.getSelectionModel().select(i); + return; + } } + + for (int i = 0; i < versions.size(); i++) { + DiscoJavaRemoteVersion version = versions.get(i); + if (version.isLTS()) { + remoteVersionBox.getSelectionModel().select(i); + return; + } + } + + remoteVersionBox.getSelectionModel().selectFirst(); }); - packageTypeBox.getSelectionModel().selectedItemProperty().addListener(ignored -> updateVersions()); - FXUtils.onChangeAndOperate(distributionBox.getSelectionModel().selectedItemProperty(), distribution -> { - if (distribution != null) { - changingDistribution = true; - packageTypeBox.setItems(FXCollections.observableList(new ArrayList<>(distribution.getSupportedPackageTypes()))); - packageTypeBox.getSelectionModel().select(0); - changingDistribution = false; - updateVersions(); - packageTypeBox.setDisable(false); - remoteVersionBox.setDisable(false); + Consumer updateListStatus = list -> { + remoteVersionBox.setItems(null); + packageTypeBox.getItems().clear(); + remoteVersionBox.setDisable(true); + packageTypeBox.setDisable(true); + warningLabel.setText(null); + + if (list == null || (list.versions != null && list.versions.isEmpty())) + downloadButtonPane.getChildren().setAll(downloadButton); + else if (list.status == DiscoJavaVersionList.Status.LOADING) + downloadButtonPane.getChildren().setAll(new JFXSpinner()); + else { + downloadButtonPane.getChildren().setAll(downloadButton); + + if (list.status == DiscoJavaVersionList.Status.SUCCESS) { + packageTypeBox.getItems().setAll(list.versions.keySet()); + packageTypeBox.getSelectionModel().selectFirst(); + + remoteVersionBox.setDisable(false); + packageTypeBox.setDisable(false); + } else + warningLabel.setText(i18n("java.download.load_list.failed")); + } + }; + + currentJavaVersionList.addListener((observable, oldValue, newValue) -> { + if (oldValue != null) + oldValue.listener = null; + + if (newValue != null) { + updateListStatus.accept(newValue); + + if (newValue.status == DiscoJavaVersionList.Status.LOADING) + newValue.listener = updateListStatus; } else { - packageTypeBox.setItems(null); - updateVersions(); - remoteVersionBox.setItems(null); - packageTypeBox.setDisable(true); - remoteVersionBox.setDisable(true); + currentJavaVersionList.set(null); + updateListStatus.accept(null); } }); + FXUtils.onChange(distributionBox.getSelectionModel().selectedItemProperty(), + it -> currentJavaVersionList.set(getJavaVersionList(it))); + setHeading(new Label(i18n("java.download"))); setBody(body); setActions(warningLabel, downloadButtonPane, cancelButton); } - private void updateStatus(DiscoJavaVersionList.Status status) { - if (status == DiscoJavaVersionList.Status.LOADING) { - downloadButtonPane.getChildren().setAll(new JFXSpinner()); - remoteVersionBox.setDisable(true); - warningLabel.setText(null); - } else { - downloadButtonPane.getChildren().setAll(downloadButton); - if (status == DiscoJavaVersionList.Status.SUCCESS || status == null) { - remoteVersionBox.setDisable(false); - warningLabel.setText(null); - } else if (status == DiscoJavaVersionList.Status.FAILED) { - remoteVersionBox.setDisable(true); - warningLabel.setText(i18n("java.download.load_list.failed")); - } - } - } - private void onDownload() { fireEvent(new DialogCloseEvent()); DiscoJavaDistribution distribution = distributionBox.getSelectionModel().getSelectedItem(); DiscoJavaRemoteVersion version = remoteVersionBox.getSelectionModel().getSelectedItem(); + JavaPackageType packageType = packageTypeBox.getSelectionModel().getSelectedItem(); if (version == null) return; @@ -312,8 +322,15 @@ private void onDownload() { getIntegrityCheck = Task.completed(new FileDownloadTask.IntegrityCheck(fileInfo.getChecksumType(), fileInfo.getChecksum())); else if (StringUtils.isNotBlank(fileInfo.getChecksumUri())) getIntegrityCheck = new GetTask(downloadProvider.injectURLWithCandidates(fileInfo.getChecksumUri())) - .thenApplyAsync(checksum -> - new FileDownloadTask.IntegrityCheck(fileInfo.getChecksumType(), checksum.trim())); + .thenApplyAsync(checksum -> { + checksum = checksum.trim(); + + int idx = checksum.indexOf(' '); + if (idx > 0) + checksum = checksum.substring(0, idx); + + return new FileDownloadTask.IntegrityCheck(fileInfo.getChecksumType(), checksum); + }); else throw new IOException("Unable to get checksum for file"); @@ -336,7 +353,7 @@ else if (StringUtils.isNotBlank(fileInfo.getChecksumUri())) if (idx > 0) { javaVersion = javaVersion.substring(0, idx); } - String defaultName = distribution.getApiParameter() + "-" + javaVersion; + String defaultName = distribution.getApiParameter() + "-" + javaVersion + "-" + packageType.name().toLowerCase(Locale.ROOT); Controllers.getDecorator().startWizard(new SinglePageWizardProvider(controller -> new JavaInstallPage(controller::onFinish, info, version, updateInfo, defaultName, result))); } else { @@ -350,65 +367,39 @@ else if (StringUtils.isNotBlank(fileInfo.getChecksumUri())) } - private void updateVersions() { - if (changingDistribution) return; - - DiscoJavaDistribution distribution = distributionBox.getSelectionModel().getSelectedItem(); - if (distribution == null) { - this.currentDiscoJavaVersionList.set(null); - return; - } - - JavaPackageType packageType = packageTypeBox.getSelectionModel().getSelectedItem(); - - DiscoJavaVersionList list = javaVersionLists.computeIfAbsent(Pair.pair(distribution, packageType), pair -> { - DiscoJavaVersionList res = new DiscoJavaVersionList(); - new DiscoFetchJavaListTask(downloadProvider, distribution, platform, packageType).setExecutor(Schedulers.io()).thenApplyAsync(versions -> { - if (versions.isEmpty()) return Collections.emptyList(); - - int lastLTS = -1; - for (int v : versions.keySet()) { - if (isLTS(v)) { - lastLTS = v; - } - } - - ArrayList remoteVersions = new ArrayList<>(); - for (Map.Entry entry : versions.entrySet()) { - int v = entry.getKey(); - if (v >= lastLTS || isLTS(v) || v == 16) { - remoteVersions.add(entry.getValue()); - } - } - Collections.reverse(remoteVersions); - return remoteVersions; + private DiscoJavaVersionList getJavaVersionList(DiscoJavaDistribution distribution) { + if (distribution == null) + return null; + return javaVersionLists.computeIfAbsent(distribution, it -> { + DiscoJavaVersionList versionList = new DiscoJavaVersionList(it); + new DiscoFetchJavaListTask(downloadProvider, it, platform).setExecutor(Schedulers.io()).thenApplyAsync(versions -> { + EnumMap> result = new EnumMap<>(JavaPackageType.class); + if (versions.isEmpty()) + return result; + + for (Map.Entry> entry : versions.entrySet()) + for (DiscoJavaRemoteVersion version : entry.getValue().values()) + if (version.isLTS() + || version.getJdkVersion() == entry.getValue().lastKey() // latest version + || version.getJdkVersion() == 16) + result.computeIfAbsent(entry.getKey(), ignored -> FXCollections.observableArrayList()) + .add(version); + + for (List l : result.values()) + Collections.reverse(l); + return result; }).whenComplete(Schedulers.javafx(), ((result, exception) -> { if (exception == null) { - res.status.set(DiscoJavaVersionList.Status.SUCCESS); - res.versions.setAll(result); - selectLTS(res); + versionList.status = DiscoJavaVersionList.Status.SUCCESS; + versionList.versions = result; } else { LOG.warning("Failed to load java list", exception); - res.status.set(DiscoJavaVersionList.Status.FAILED); + versionList.status = DiscoJavaVersionList.Status.FAILED; } + versionList.invalidate(); })).start(); - return res; + return versionList; }); - this.currentDiscoJavaVersionList.set(list); - this.remoteVersionBox.setItems(list.versions); - selectLTS(list); - } - - private void selectLTS(DiscoJavaVersionList list) { - if (remoteVersionBox.getItems() == list.versions) { - for (int i = 0; i < list.versions.size(); i++) { - JavaRemoteVersion item = list.versions.get(i); - if (item.getJdkVersion() == GameJavaVersion.LATEST.getMajorVersion()) { - remoteVersionBox.getSelectionModel().select(i); - break; - } - } - } } } @@ -417,7 +408,19 @@ enum Status { LOADING, SUCCESS, FAILED } - final ObservableList versions = FXCollections.observableArrayList(); - final ObjectProperty status = new SimpleObjectProperty<>(Status.LOADING); + final DiscoJavaDistribution distribution; + + Status status = Status.LOADING; + EnumMap> versions; + Consumer listener; + + DiscoJavaVersionList(DiscoJavaDistribution distribution) { + this.distribution = distribution; + } + + void invalidate() { + if (listener != null) + listener.accept(this); + } } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java index 86d3a0c2ea..6eb9c2d450 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/JavaManagementPage.java @@ -50,7 +50,6 @@ import org.jackhuang.hmcl.util.platform.Architecture; import org.jackhuang.hmcl.util.platform.OperatingSystem; import org.jackhuang.hmcl.util.platform.Platform; -import org.jackhuang.hmcl.util.tree.TarFileTree; import java.io.*; import java.nio.file.Files; @@ -151,7 +150,7 @@ private void onAddJavaHome(Path file) { private void onInstallArchive(Path file) { Task.supplyAsync(() -> { - try (ArchiveFileTree tree = TarFileTree.open(file)) { + try (ArchiveFileTree tree = ArchiveFileTree.open(file)) { JavaInfo info = JavaInfo.fromArchive(tree); if (!JavaManager.isCompatible(info.getPlatform())) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java index d16124206f..f7fbc807c8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java @@ -388,15 +388,15 @@ private static final class ModItem extends StackPane { switch (dataItem.getVersionType()) { case Alpha: - content.getTags().add(i18n("version.game.snapshot")); + content.getTags().add(i18n("mods.channel.alpha")); graphicPane.getChildren().setAll(SVG.ALPHA_CIRCLE_OUTLINE.createIcon(Theme.blackFill(), 24, 24)); break; case Beta: - content.getTags().add(i18n("version.game.snapshot")); + content.getTags().add(i18n("mods.channel.beta")); graphicPane.getChildren().setAll(SVG.BETA_CIRCLE_OUTLINE.createIcon(Theme.blackFill(), 24, 24)); break; case Release: - content.getTags().add(i18n("version.game.release")); + content.getTags().add(i18n("mods.channel.release")); graphicPane.getChildren().setAll(SVG.RELEASE_CIRCLE_OUTLINE.createIcon(Theme.blackFill(), 24, 24)); break; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldInfoPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldInfoPage.java index d7ab4e1863..a8d7e2c5bd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldInfoPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldInfoPage.java @@ -1,3 +1,20 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2024 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.jackhuang.hmcl.ui.versions; import com.github.steveice10.opennbt.tag.builtin.*; @@ -10,11 +27,14 @@ import javafx.collections.ObservableList; import javafx.geometry.Pos; import javafx.scene.control.Label; +import javafx.scene.control.ProgressIndicator; import javafx.scene.control.ScrollPane; import javafx.scene.layout.BorderPane; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import org.jackhuang.hmcl.game.World; +import org.jackhuang.hmcl.task.Schedulers; +import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.construct.ComponentList; import org.jackhuang.hmcl.ui.construct.DoubleValidator; @@ -32,22 +52,36 @@ import static org.jackhuang.hmcl.util.i18n.I18n.formatDateTime; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; +/** + * @author Glavo + */ public final class WorldInfoPage extends StackPane implements DecoratorPage { private final World world; - private final CompoundTag levelDat; - private final CompoundTag dataTag; + private CompoundTag levelDat; - private final ObjectProperty stateProperty = new SimpleObjectProperty<>(); + private final ObjectProperty stateProperty; - public WorldInfoPage(World world) throws IOException { + public WorldInfoPage(World world) { this.world = world; - this.levelDat = world.readLevelDat(); - this.dataTag = levelDat.get("Data"); + this.stateProperty = new SimpleObjectProperty<>(State.fromTitle(i18n("world.info.title", world.getWorldName()))); + + this.getChildren().add(new ProgressIndicator()); + Task.supplyAsync(world::readLevelDat) + .whenComplete(Schedulers.javafx(), ((result, exception) -> { + if (exception == null) { + this.levelDat = result; + loadWorldInfo(); + } else { + LOG.warning("Failed to load level.dat", exception); + this.getChildren().setAll(new Label(i18n("world.info.failed"))); + } + })).start(); + } + private void loadWorldInfo() { + CompoundTag dataTag = levelDat.get("Data"); CompoundTag worldGenSettings = dataTag.get("WorldGenSettings"); - stateProperty.set(State.fromTitle(i18n("world.info.title", world.getWorldName()))); - ScrollPane scrollPane = new ScrollPane(); scrollPane.setFitToHeight(true); scrollPane.setFitToWidth(true); @@ -483,7 +517,6 @@ String formatPosition(Tag tag) { Tag z = listTag.get(2); if (x instanceof DoubleTag && y instanceof DoubleTag && z instanceof DoubleTag) { - //noinspection MalformedFormatString return this == OVERWORLD ? String.format("(%.2f, %.2f, %.2f)", x.getValue(), y.getValue(), z.getValue()) : String.format("%s (%.2f, %.2f, %.2f)", name, x.getValue(), y.getValue(), z.getValue()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItem.java index 5f98c22554..933bb0887e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItem.java @@ -102,10 +102,6 @@ public void manageDatapacks() { } public void showInfo() { - try { - Controllers.navigate(new WorldInfoPage(world)); - } catch (Exception e) { - // TODO - } + Controllers.navigate(new WorldInfoPage(world)); } } diff --git a/HMCL/src/main/java11/org/jackhuang/hmcl/util/logging/CallerFinder.java b/HMCL/src/main/java11/org/jackhuang/hmcl/util/logging/CallerFinder.java index 89547137f8..8c934cdaab 100644 --- a/HMCL/src/main/java11/org/jackhuang/hmcl/util/logging/CallerFinder.java +++ b/HMCL/src/main/java11/org/jackhuang/hmcl/util/logging/CallerFinder.java @@ -9,13 +9,13 @@ * @author Glavo */ final class CallerFinder { - private static final StackWalker WALKER = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); private static final String PACKAGE_PREFIX = CallerFinder.class.getPackageName() + "."; private static final Predicate PREDICATE = stackFrame -> !stackFrame.getClassName().startsWith(PACKAGE_PREFIX); private static final Function, Optional> FUNCTION = stream -> stream.filter(PREDICATE).findFirst(); + private static final Function FRAME_MAPPING = frame -> frame.getClassName() + "." + frame.getMethodName(); static String getCaller() { - return WALKER.walk(FUNCTION).map(it -> it.getClassName() + "." + it.getMethodName()).orElse(null); + return StackWalker.getInstance().walk(FUNCTION).map(FRAME_MAPPING).orElse(null); } private CallerFinder() { diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 583a671b3d..e0c30fb510 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -930,6 +930,9 @@ mods.add.success=%s was added successfully. mods.broken_dependency.title=Broken dependency mods.broken_dependency.desc=This dependency existed before. However, it doesn't exist now. Try using another download source. mods.category=Category +mods.channel.alpha=Alpha +mods.channel.beta=Beta +mods.channel.release=Release mods.check_updates=Check for Updates mods.check_updates.current_version=Current Version mods.check_updates.empty=All mods are up-to-date @@ -1007,6 +1010,7 @@ world.info.difficulty.peaceful=Peaceful world.info.difficulty.easy=Easy world.info.difficulty.normal=Normal world.info.difficulty.hard=Hard +world.info.failed=Failed to read the world info world.info.game_version=Game Version world.info.last_played=Last Played world.info.generate_features=Generate Structures diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 9325ce6dd4..f453d0f9b9 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -19,151 +19,143 @@ # Contributors: pan93412 about=關於 about.copyright=著作權 -about.copyright.statement=著作權所有 © 2024 huangyuhui。 +about.copyright.statement=著作權所有 © 2024 huangyuhui about.author=作者 -about.author.statement=bilibili: @huanghongxun -about.claim=用戶協議 +about.author.statement=bilibili @huanghongxun +about.claim=使用者協議 about.claim.statement=點擊連結以查看全文 about.dependency=相依元件 -about.legal=法律聲明 +about.legal=法律宣告 about.thanks_to=鳴謝 -about.thanks_to.bangbang93.statement=提供 BMCLAPI 下載地點。請贊助支持 BMCLAPI! -about.thanks_to.burningtnt.statement=為 HMCL 貢獻許多技術支持 -about.thanks_to.contributors=所有通過 Issues、Pull Requests 等管道參與本項目的貢獻者 -about.thanks_to.contributors.statement=沒有開源社區的支持,Hello Minecraft! Launcher 無法走到今天 +about.thanks_to.bangbang93.statement=提供 BMCLAPI 下載來源。請贊助支援 BMCLAPI! +about.thanks_to.burningtnt.statement=為 HMCL 貢獻許多技術支援 +about.thanks_to.contributors=所有透過 Issue、Pull Request 等管道參與本項目的貢獻者 +about.thanks_to.contributors.statement=沒有開源社群的支援,HMCL 無法走到今天 about.thanks_to.gamerteam.statement=提供預設背景圖 about.thanks_to.glavo.statement=負責 HMCL 的日常維護 -about.thanks_to.zekerzhayard.statement=為 HMCL 貢獻許多技術支持 -about.thanks_to.zkitefly.statement=負責維護 HMCL 的文檔 -about.thanks_to.mcbbs=MCBBS 我的世界中文論壇 +about.thanks_to.zekerzhayard.statement=為 HMCL 貢獻許多技術支援 +about.thanks_to.zkitefly.statement=負責維護 HMCL 的文件 +about.thanks_to.mcbbs=MCBBS (我的世界中文論壇) about.thanks_to.mcbbs.statement=提供 MCBBS 下載源 (現已停止服務) -about.thanks_to.mcmod=MC 百科 -about.thanks_to.mcmod.statement=提供 Mod 中文名映射表與 Mod 百科 +about.thanks_to.mcmod=MC 百科 (mcmod.cn) +about.thanks_to.mcmod.statement=提供模組簡體中文名映射表與模組百科 about.thanks_to.red_lnn.statement=提供預設背景圖 -about.thanks_to.shulkersakura.statement=提供 HMCL 的圖標 -about.thanks_to.users=HMCL 用戶群成員 -about.thanks_to.users.statement=感謝用戶群成員贊助充電、積極催更、迴響問題、出謀劃策 -about.thanks_to.yushijinhun.statement=authlib-injector 相关支援 +about.thanks_to.shulkersakura.statement=提供 HMCL 的標誌 +about.thanks_to.users=HMCL 使用者群組成員 +about.thanks_to.users.statement=感謝使用者群組成員贊助充電、積極催更、回報問題、出謀劃策 +about.thanks_to.yushijinhun.statement=提供 authlib-injector 相關支援 about.open_source=開放原始碼 about.open_source.statement=GPL v3 (https://github.com/HMCL-dev/HMCL/) account=帳戶 account.cape=披風 account.character=角色 -account.choose=請選擇角色 +account.choose=請選取角色 account.create=建立帳戶 -account.create.microsoft=添加微軟帳戶 -account.create.offline=添加離線模式帳戶 -account.create.authlibInjector=添加外置登入帳戶 (authlib-injector) +account.create.microsoft=加入 Microsoft 帳戶 +account.create.offline=加入離線模式帳戶 +account.create.authlibInjector=加入 authlib-injector 帳戶 account.email=電子信箱 -account.failed=帳戶刷新失敗 +account.failed=帳戶重新整理失敗 account.failed.character_deleted=已刪除此角色 -account.failed.connect_authentication_server=無法連線至認證伺服器,可能是網路問題,請檢查設備能否正常上網或使用代理服務 -account.failed.connect_injector_server=無法連線至認證伺服器,可能是網路故障,請檢查設備能否正常上網、檢查網址是否輸入錯誤或使用代理服務 -account.failed.injector_download_failure=無法下載 authlib-injector,請檢查網路或嘗試切換下載來源 -account.failed.invalid_credentials=您的使用者名稱或密碼錯誤,或者登入次數過多被暫時禁止登入,請稍後再試 +account.failed.connect_authentication_server=無法連線至認證伺服器,可能是網路問題,請檢查裝置能否正常上網或使用代理服務。 +account.failed.connect_injector_server=無法連線至認證伺服器,可能是網路故障,請檢查裝置能否正常上網、檢查網址是否輸入錯誤或使用代理服務。 +account.failed.injector_download_failure=無法下載 authlib-injector,請檢查網路或嘗試切換下載來源。 +account.failed.invalid_credentials=你的使用者名稱或密碼錯誤,或者登入次數過多被暫時禁止登入,請稍後再試。 account.failed.invalid_password=密碼無效 -account.failed.invalid_token=請嘗試登出並重新輸入密碼登入 -account.failed.migration=你的帳號需要被遷移至微軟帳號。如果你已經遷移,你需要使用微軟登錄方式登錄遷移後的微軟帳號 -account.failed.no_character=該帳戶沒有角色 -account.failed.server_disconnected=無法訪問登錄伺服器,賬戶信息刷新失敗。\n\ - 您可以選擇“再次刷新賬戶”重新嘗試。\n\ - 您也可以選擇“跳過賬戶刷新”繼續啟動遊戲,但可能會使賬戶信息不是最新的。\n\ - 若最近沒有刷新賬戶信息,則可能導致賬戶信息過期失效,\n\ - 若為 微軟賬戶 啟動遊戲,賬戶信息過期失效可能將無法進入需賬戶驗證的伺服器。\n\ - 若嘗試多次無法成功刷新,可嘗試重新添加該賬戶嘗試解決該問題。 -account.failed.server_response_malformed=無法解析認證伺服器回應,可能是伺服器故障 -account.failed.ssl=連接服務器時發生了 SSL 錯誤,可能網站證書已過期或你使用的 Java 版本過低,請嘗試更新 Java -account.failed.wrong_account=登錄了錯誤的帳號 -account.hmcl.hint=你需要點擊“登入”按鈕,並在打開的網頁中完成登入 +account.failed.invalid_token=請嘗試登出並重新輸入密碼登入。 +account.failed.migration=你的帳戶需要遷移至 Microsoft 帳戶。如果你已經遷移,你需要使用 Microsoft 方式登入遷移後的帳戶。 +account.failed.no_character=該帳戶沒有角色。 +account.failed.server_disconnected=無法訪問登入伺服器,帳戶資訊重新整理失敗。\n\ + 你可以選取「再次重新整理帳戶」重新嘗試。\n\ + 你也可以選取「跳過帳戶重新整理」繼續啟動遊戲,但可能會導致帳戶資訊未同步更新。\n\ + 若最近沒有重新整理帳戶資訊,則可能導致帳戶資訊過期失效。\n\ + 若使用 Microsoft/authlib-injector 帳戶啟動遊戲,帳戶資訊過期失效可能將無法進入需線上驗證的伺服器。\n\ + 若嘗試多次無法重新整理,可嘗試重新加入該帳戶,或許可以解決該問題。 +account.failed.server_response_malformed=無法解析認證伺服器回應,可能是伺服器故障。 +account.failed.ssl=連線伺服器時發生了 SSL 錯誤,可能網站證書已過期或你使用的 Java 版本過低,請嘗試更新 Java。 +account.failed.wrong_account=登入了錯誤的帳戶 +account.hmcl.hint=你需要點擊「登入」按鈕,並在打開的網頁中完成登入 account.injector.add=新增認證伺服器 account.injector.empty=無 (按一下右側 + 加入) -account.injector.http=警告: 此伺服器使用不安全的 HTTP 協定,您的密碼在登入時會被明文傳輸。 +account.injector.http=警告: 此伺服器使用不安全的 HTTP 協定,你的密碼在登入時會被明文傳輸。 account.injector.link.homepage=首頁 account.injector.link.register=註冊 account.injector.server=認證伺服器 account.injector.server_url=伺服器位址 account.injector.server_name=伺服器名稱 account.login=登入 -account.login.hint=我們不會保存你的密碼 -account.login.skip=跳過刷新帳戶 -account.login.retry=再次刷新帳戶 -account.login.refresh=重新登錄 -account.login.refresh.microsoft.hint=因為賬戶授權失效,你需要重新添加微軟賬戶 +account.login.hint=我們不會儲存你的密碼 +account.login.skip=跳過重新整理帳戶 +account.login.retry=再次重新整理帳戶 +account.login.refresh=重新登入 +account.login.refresh.microsoft.hint=由於帳戶授權失效,你需要重新加入 Microsoft 帳戶 account.logout=登出 account.register=註冊 -account.manage=帳戶列表 -account.copy_uuid=複製該賬戶的 UUID。 +account.manage=帳戶清單 +account.copy_uuid=複製該帳戶的 UUID account.methods=登入方式 account.methods.authlib_injector=authlib-injector 登入 -account.methods.microsoft=微軟帳戶 +account.methods.microsoft=Microsoft 帳戶 account.methods.microsoft.birth=如何修改帳戶出生日期 account.methods.microsoft.deauthorize=解除帳戶授權 -account.methods.microsoft.close_page=已完成微軟帳號授權,接下來啟動器還需要完成剩餘登入步驟。你已經可以關閉本頁面了。 -account.methods.microsoft.error.add_family=由於你未滿 18 歲,你的帳戶必須被加入到家庭中才能登錄遊戲。你也可以點擊上方連結更改你的帳戶的出生日期,使年齡滿 18 歲以上以繼續登錄。 -account.methods.microsoft.error.add_family_probably=請檢查你的帳戶設置,如果你未滿 18 歲,你的帳戶必須被加入到家庭中才能登錄遊戲。你也可以點擊上方連結更改你的帳戶的出生日期,使年齡滿 18 歲以上以繼續登錄。 -account.methods.microsoft.error.country_unavailable=你所在的國家或地區不受 XBox Live 的支援。 -account.methods.microsoft.error.missing_xbox_account=你的微軟帳號尚未關聯 XBox 帳號,你必須先創建 XBox 帳號,才能登入遊戲。 -account.methods.microsoft.error.no_character=該帳戶未包含 Minecraft Java 版購買記錄\n可能未創建遊戲檔案,請點擊上方鏈接創建 +account.methods.microsoft.close_page=已完成 Microsoft 帳戶授權,接下來啟動器還需要完成其餘登入步驟。你現在可以關閉本頁面了。 +account.methods.microsoft.error.add_family=由於你未滿 18 歲,你的帳戶必須被加入到家庭中才能登入遊戲。你也可以點擊上方連結更改你的帳戶的出生日期,使年齡滿 18 歲以上以繼續登入。 +account.methods.microsoft.error.add_family_probably=請檢查你的帳戶設定,如果你未滿 18 歲,你的帳戶必須被加入到家庭中才能登入遊戲。你也可以點擊上方連結更改你的帳戶的出生日期,使年齡滿 18 歲以上以繼續登入。 +account.methods.microsoft.error.country_unavailable=你所在的國家或地區不受 Xbox Live 的支援。 +account.methods.microsoft.error.missing_xbox_account=你的 Microsoft 帳戶尚未關聯 Xbox 帳戶,你必須先建立 Xbox 帳戶,才能登入遊戲。 +account.methods.microsoft.error.no_character=該帳戶未包含 Minecraft: Java 版購買記錄。\n若已購買,則可能未建立遊戲檔案,請點擊上方連結建立。 account.methods.microsoft.error.unknown=登入失敗,錯誤碼:%d -account.methods.microsoft.error.wrong_verify_method=請在 Microsoft 帳號登陸頁面使用帳號 + 密碼登入。請不要使用驗證碼登入。 -account.methods.microsoft.logging_in=登入中... -account.methods.microsoft.makegameidsettings=創建檔案/編輯檔案名稱 -account.methods.microsoft.hint=你需要按照以下步驟添加賬戶:\n\ - 1.點擊“登入”按鈕\n\ - 2.在網頁瀏覽器顯示的網站中輸入 HMCL 顯示的代碼(自動拷貝,直接粘貼即可),並點擊“下一步”\n\ - 3.按照網站的提示登入\n\ - 4.當網站顯示“ 是否允許此應用訪問你的信息?”的標識時,請點擊“是”\n\ - 5.在網站提示“大功告成”後,只需等待帳戶完成添加即可\n\ - 若網站提示“出现错误”的標識,請嘗試重新按照以上步驟登入\n\ - -若賬戶添加失敗,請嘗試重新按照以上步驟登入\n\ - -若登入微軟賬號的 Token 洩露,可點擊下方“解除帳戶授權”解除登入授權,然後等待 Token 過期\n\ +account.methods.microsoft.error.wrong_verify_method=請在 Microsoft 帳戶登入頁面使用密碼登入,不要使用驗證碼登入。 +account.methods.microsoft.logging_in=登入中…… +account.methods.microsoft.makegameidsettings=建立檔案 / 編輯檔案名稱 +account.methods.microsoft.hint=請點擊「登入」按鈕,稍後複製此處顯示的代碼,在打開的登入網頁中完成登入過程。\n\ + \n\ + 如果登入 Microsoft 帳戶的令牌洩露,可點擊下方連結解除授權,然後等待令牌過期。\n\ + \n\ 如遇到問題,你可以點擊右上角幫助按鈕進行求助。 -account.methods.microsoft.manual=你需要按照以下步驟添加账户:\n\ - 1.點擊“登入”按鈕\n\ - 2.在網頁瀏覽器顯示的網站中輸入該代碼:%1$s(已自動拷貝,請點此處再次拷貝),並點擊“下一步”\n\ - 3.按照網站的提示登入\n\ - 4.當網站顯示“ 是否允許此應用訪問你的信息?”的標識時,請點擊“是”\n\ - 5.在網站提示“大功告成”後,只需等待帳戶完成添加即可\n\ - -若網站提示“出现错误”的標識或賬戶添加失敗時,請嘗試重新按照以上步驟登入\n\ - -若網站未能打開,請手動在網頁瀏覽器中打開:%2$s\n\ - -若登入微軟賬號的 Token 洩露,可點擊下方“解除帳戶授權”解除登入授權,然後等待 Token 過期\n\ +account.methods.microsoft.manual=你的代碼為 %1$s,請點擊此處複製。\n\ + \n\ + 點擊「登入」按鈕後,你應該在打開的登入網頁中完成登入過程。如果網頁沒有打開,你可以自行在瀏覽器中訪問 %2$s\n\ + \n\ + 如果登入 Microsoft 帳戶的令牌洩露,可點擊下方連結解除授權,然後等待令牌過期。\n\ + \n\ 如遇到問題,你可以點擊右上角幫助按鈕進行求助。 -account.methods.microsoft.profile=帳戶設置頁 +account.methods.microsoft.profile=帳戶設定頁 account.methods.microsoft.purchase=購買 Minecraft account.methods.forgot_password=忘記密碼 -account.methods.microsoft.snapshot=你正在使用非官方構建的 HMCL,請下載官方構建進行微軟登入。 +account.methods.microsoft.snapshot=你正在使用第三方提供的 HMCL,請下載官方版本進行登入。 account.methods.microsoft.snapshot.website=官方網站 account.methods.offline=離線模式 -account.methods.offline.name.special_characters=建議使用英文字符、數字以及下劃線命名 -account.methods.offline.name.invalid=正常情況下,遊戲用戶名只能包括英文字符、數字以及下劃線,且長度不能超過 16 個字符。\n\ - 一些合法的用戶名:HuangYu,huang_Yu,Huang_Yu_123;\n\ - 一些不合法的用戶名:黃魚,Huang Yu,Huang-Yu_%%%,Huang_Yu_hello_world_hello_world。\n\ - 如果你相信服務器端有相應的 Mod 或插件來解除此限制,你可以忽略本警告。 +account.methods.offline.name.special_characters=建議使用英文字母、數字以及底線命名 +account.methods.offline.name.invalid=遊戲使用者名稱通常僅允許使用英文字母、數字及底線,且長度不能超過 16 個字元。\n\ + \ · 一些有效的使用者名稱:HuangYu、huang_Yu、Huang_Yu_123;\n\ + \ · 一些無效的使用者名稱:黃魚,Huang Yu、Huang-Yu_%%%、Huang_Yu_hello_world_hello_world。\n\ + 如果你相信伺服器端有相應的模組或插件來解除此限制,你可以忽略本警告。 account.methods.offline.uuid=UUID -account.methods.offline.uuid.hint=UUID 是 Minecraft 對玩家角色的唯一標識符,每個啟動器生成 UUID 的方式可能不同。通過修改 UUID 選項至原啟動器所生成的 UUID,你可以保證在切換啟動器後,遊戲還能將你的遊戲角色識別為給定 UUID 所對應的角色,從而保留原來角色的背包物品。UUID 選項為高級選項,除非你知道你在做什麼,否則你不需要調整該選項。 +account.methods.offline.uuid.hint=UUID 是 Minecraft 玩家的唯一標識符,每個啟動器生成 UUID 的方式可能不同。\n透過修改 UUID 選項至原啟動器所生成的 UUID,你可以保證在切換啟動器後,遊戲還能將你的遊戲角色識別為給定 UUID 所對應的角色,從而保留原來角色的背包物品。\nUUID 選項為進階選項,除非你知道你在做什麼,否則你不需要調整該選項。 account.methods.offline.uuid.malformed=格式錯誤 account.missing=沒有遊戲帳戶 account.missing.add=按一下此處加入帳戶 -account.move_to_global=轉換為全域帳戶 -account.move_to_portable=轉換為便攜帳戶 +account.move_to_global=轉換為全域帳戶\n該帳戶的資訊會儲存至系統目前使用者目錄的配置檔案中 +account.move_to_portable=轉換為可攜式帳戶\n該帳戶的資訊會儲存至與 HMCL 同目錄的配置檔案中 account.not_logged_in=未登入 account.password=密碼 -account.portable=便攜帳戶 -account.skin=皮膚 -account.skin.file=皮膚圖片檔案 +account.portable=可攜式帳戶 +account.skin=外觀 +account.skin.file=外觀圖片檔案 account.skin.model=模型 -account.skin.model.default=經典 -account.skin.model.slim=苗條 +account.skin.model.default=寬型 +account.skin.model.slim=纖細 account.skin.type.csl_api=Blessing Skin 伺服器 account.skin.type.csl_api.location=伺服器位址 account.skin.type.csl_api.location.hint=CustomSkinAPI 位址 account.skin.type.little_skin=LittleSkin 皮膚站 -account.skin.type.little_skin.hint=你需要在皮膚站中創建並使用和該離線帳戶角色同名角色,此時離線帳戶皮膚將為皮膚站上角色所設定的皮膚。 -account.skin.type.local_file=本地皮膚圖片檔案 -account.skin.upload=上傳皮膚 -account.skin.upload.failed=皮膚上傳失敗 -account.skin.invalid_skin=無法識別的皮膚檔案 +account.skin.type.little_skin.hint=你需要在皮膚站中建立並使用和該離線帳戶同名角色,此時離線帳戶外觀將為皮膚站上角色所設定的外觀。 +account.skin.type.local_file=本機外觀圖片檔案 +account.skin.upload=上傳/編輯外觀 +account.skin.upload.failed=外觀上傳失敗 +account.skin.invalid_skin=無法識別的外觀檔案 account.username=使用者名稱 archive.author=作者 @@ -173,7 +165,7 @@ archive.version=版本 assets.download=下載資源 assets.download_all=驗證資源檔案完整性 -assets.index.malformed=資源檔案的索引檔案損壞,您可以在遊戲 [設定] 頁面右上角的設定按鈕中選擇 [更新遊戲資源檔案],以修復該問題 +assets.index.malformed=資源檔案的索引檔案損壞,你可以在相應實例的「實例設定」頁面中,點擊設定頁面左下角的「設定」按鈕並選取「更新遊戲資源檔案」,以修復該問題。 button.cancel=取消 button.change_source=切換下載源 @@ -187,10 +179,10 @@ button.no=否 button.ok=確定 button.refresh=重新整理 button.remove=刪除 -button.remove.confirm=您確認要刪除嗎?該操作無法撤銷! +button.remove.confirm=你確認要刪除嗎?該操作無法復原! button.retry=重試 button.save=儲存 -button.save_as=另存為 +button.save_as=另存新檔 button.select_all=全選 button.view=查看 button.yes=是 @@ -200,15 +192,15 @@ chat=官方群組 color.recent=建議 color.custom=自訂顏色 -crash.NoClassDefFound=請確認 Hello Minecraft! Launcher 本體是否完整,或更新您的 Java。 -crash.user_fault=您的系統或 Java 環境可能安裝不當導致本軟體當機,請檢查您的 Java 環境或您的電腦! 可以嘗試重新安裝 Java。 +crash.NoClassDefFound=請確認 Hello Minecraft! Launcher 本體是否完整,或更新你的 Java。 +crash.user_fault=你的系統或 Java 環境可能安裝不當導致本軟體當機,請檢查你的 Java 環境或你的電腦!可以嘗試重新安裝 Java。 curse.category.0=全部 # https://addons-ecs.forgesvc.net/api/v2/category/section/4471 curse.category.4474=科幻 curse.category.4481=輕量模組包 -curse.category.4483=戰鬥 PVP +curse.category.4483=戰鬥 PvP curse.category.4477=小遊戲 curse.category.4478=任務 curse.category.4484=多人 @@ -228,15 +220,15 @@ curse.category.7418=恐怖 curse.category.5299=教育 curse.category.5232=額外行星 curse.category.5129=原版增強 -curse.category.5189=實用與QOL +curse.category.5189=實用與 QOL curse.category.6814=性能 -curse.category.6954=動態聯合/集成動力 (Integrated Dynamics) +curse.category.6954=動態聯合/整合動力 (Integrated Dynamics) curse.category.6484=機械動力 (Create) curse.category.6821=錯誤修復 curse.category.6145=空島 -curse.category.5190=QoL -curse.category.5191=實用與QoL -curse.category.5192=夢幻菜單 +curse.category.5190=QOL +curse.category.5191=實用與 QOL +curse.category.5192=夢幻選單 curse.category.423=訊息展示 curse.category.426=模組擴展 curse.category.434=裝備武器 @@ -265,7 +257,7 @@ curse.category.433=林業 (Forestry) curse.category.425=其他 curse.category.4545=應用能源 2 (Applied Energistics 2) curse.category.416=農業 -curse.category.421=支持庫 +curse.category.421=支援庫 curse.category.4780=Fabric curse.category.424=裝飾 curse.category.406=世界生成 @@ -293,7 +285,7 @@ curse.category.393=16x curse.category.403=傳統 curse.category.394=32x curse.category.404=動態效果 -curse.category.4465=模組支持 +curse.category.4465=模組支援 curse.category.402=中世紀風格 curse.category.401=現代風格 @@ -317,88 +309,88 @@ curse.category.4549=指引書 curse.category.4547=配置 curse.category.4550=任務 curse.category.4555=世界生成 -curse.category.4552=腳本 +curse.category.4552=指令碼 curse.sort.author=作者 -curse.sort.date_created=創建日期 +curse.sort.date_created=建立日期 curse.sort.last_updated=最近更新 curse.sort.name=名稱 curse.sort.popularity=熱度 curse.sort.total_downloads=下載量 download=下載 -download.hint=安裝遊戲和整合包或下載模組、資源包和地圖 -download.code.404=遠端伺服器沒有需要下載的檔案: %s +download.hint=安裝遊戲和模組包或下載模組、資源包和地圖 +download.code.404=遠端伺服器沒有需要下載的檔案:%s download.content=遊戲內容 -download.curseforge.unavailable=HMCL 預覽版暫不支持訪問 CurseForge,請使用穩定版或測試版進行下載。 -download.existing=檔案已存在,無法保存。你可以選擇另存為將檔案保存至其他地方。 +download.curseforge.unavailable=HMCL 快照版暫不支援訪問 CurseForge,請使用穩定版或測試版進行下載。 +download.existing=檔案已存在,無法儲存。你可以將檔案儲存至其他地方。 download.external_link=打開下載網站 -download.failed=下載失敗: %1$s,錯誤碼:%2$d -download.failed.empty=沒有能安裝的版本,按一下此處返回。 -download.failed.no_code=下載失敗: %s -download.failed.refresh=載入版本列表失敗,按一下此處重試。 +download.failed=下載失敗:%1$s\n錯誤碼:%2$d +download.failed.empty=沒有可供安裝的版本,按一下此處返回。 +download.failed.no_code=下載失敗:%s +download.failed.refresh=載入版本清單失敗,按一下此處重試。 download.game=新遊戲 download.provider.bmclapi=BMCLAPI (bangbang93,https://bmclapi2.bangbang93.com/) -download.provider.mojang=官方伺服器 (OptiFine 自動安裝的下載來源是 BMCLAPI) -download.provider.official=儘量使用官方源(最新,但可能加載慢) -download.provider.balanced=選擇加載速度快的下載源(平衡,但可能不是最新) -download.provider.mirror=儘量使用鏡像源(加載快,但可能不是最新) +download.provider.mojang=官方伺服器 (OptiFine 由 BMCLAPI 提供) +download.provider.official=盡量使用官方源 (最新,但可能載入慢) +download.provider.balanced=選取載入速度快的下載源 (平衡,但可能不是最新) +download.provider.mirror=盡量使用鏡像源 (載入快,但可能不是最新) download.java=下載 Java download.java.override=此 Java 版本已經存在,是否移除並重新安裝? -download.javafx=正在下載必要的運行時組件 -download.javafx.notes=正在通過網絡下載 HMCL 必要的運行時組件。\n點擊“切換下載源”按鈕查看詳情以及選擇下載源,點擊“取消”按鈕停止並退出。\n注意:如果下載速度過慢,請嘗試切换下載源。 -download.javafx.component=正在下載模塊 %s +download.javafx=正在下載必要的執行時元件 +download.javafx.notes=正在透過網路下載 HMCL 必要的執行時元件。\n點擊「切換下載源」按鈕查看詳情以及選取下載源,點擊「取消」按鈕停止並退出。\n注意:如果下載速度過慢,請嘗試切換下載源。 +download.javafx.component=正在下載元件「%s」 download.javafx.prepare=準備開始下載 -exception.access_denied=因為無法存取檔案 %s,HMCL 沒有對該文件的訪問權限,或者該文件被其他程序打開。\n\ - 請你檢查當前操作系統帳戶是否能訪存取檔案,比如非管理員用戶可能不能訪問其他帳戶的個人資料夾內的文件。\n\ - 對於 Windows 用戶,你還可以嘗試通過資源監視器查看是否有程序占用了該文件,如果是,你可以關閉占用此文件相關程序,或者重啟電腦再試。 -exception.artifact_malformed=下載的文件正確,無法通過校驗。 -exception.ssl_handshake=無法建立 SSL 連接,因為當前 Java 虛擬機缺少相關的 SSL 證書。你可以嘗試使用其他的 Java 虛擬機或關閉網絡代理啟動 HMCL 再試。 +exception.access_denied=無法存取檔案「%s」,因為 HMCL 沒有對該檔案的訪問權限,或者該檔案已被其他程式打開。\n\ + 請你檢查目前作業系統帳戶是否能訪存取檔案,比如非管理員使用者可能不能訪問其他帳戶的個人目錄內的檔案。\n\ + 對於 Windows 使用者,你還可以嘗試透過資源監視器查看是否有程式占用了該檔案,如果是,你可以關閉占用此檔案的程式,或者重啟電腦再試。 +exception.artifact_malformed=下載的檔案正確,但無法透過校驗。 +exception.ssl_handshake=無法建立 SSL 連線,因為目前 Java 虛擬機缺少相關的 SSL 證書。你可以嘗試使用其他的 Java 虛擬機或關閉網路代理啟動 HMCL 再試。 -extension.bat=Windows 指令碼 +extension.bat=Windows 批次檔 extension.mod=模組檔案 extension.png=圖片檔案 extension.ps1=PowerShell 指令碼 extension.sh=Bash 指令碼 -fatal.javafx.incompatible=缺少 JavaFX 運行環境。\nHMCL 無法在低於 Java 11 的 Java 環境上自行補全 JavaFX 運行環境,請更新到 Java 11 或更高版本。 -fatal.javafx.incomplete=JavaFX 運行環境不完整,請嘗試更換你的 Java 或者重新安裝 OpenJFX。 -fatal.javafx.missing=缺少 JavaFX 運行環境,請使用包含 OpenJFX 的 Java 運行環境啟動 Hello Minecraft! Launcher。\n你可以訪問 https://docs.hmcl.net/help.html 頁面尋求幫助。 +fatal.javafx.incompatible=缺少 JavaFX 執行環境。\nHMCL 無法在低於 Java 11 的 Java 環境上自行補全 JavaFX 執行環境,請更新到 Java 11 或更高版本。 +fatal.javafx.incomplete=JavaFX 執行環境不完整,請嘗試更換你的 Java 或者重新安裝 OpenJFX。 +fatal.javafx.missing=缺少 JavaFX 執行環境,請使用包含 OpenJFX 的 Java 執行環境啟動 Hello Minecraft! Launcher。 fatal.config_change_owner_root=你正在使用 root 帳戶啟動 Hello Minecraft! Launcher,這可能導致你未來無法使用其他帳戶正常啟動 Hello Minecraft! Launcher。\n是否繼續啟動? -fatal.config_in_temp_dir=你正在臨時資料夾中啟動 Hello Minecraft! Launcher,你的設定和遊戲數據可能會遺失,建議將 HMCL 移動至其他位置再啟動。\n是否繼續啟動? -fatal.config_loading_failure=Hello Minecraft! Launcher 無法載入設定檔案。\n請確保 Hello Minecraft! Launcher 對 "%s" 目錄及該目錄下的檔案擁有讀寫權限。 -fatal.config_loading_failure.unix=Hello Minecraft! Launcher 無法載入設定檔案,因為設定檔案是由用戶 %1$s 創建的。\n請使用 root 帳戶啟動 HMCL (不推薦),或在終端中執行以下命令將設定檔案的所有權變更為當前用戶:\n%2$s -fatal.mac_app_translocation=由於 macOS 的安全機制,Hello Minecraft! Launcher 被系統隔離至臨時資料夾中。\n請將Hello Minecraft! Launcher 移動到其他資料夾後再嘗試啟動,否則你的設定和遊戲數據可能會在重啟後遺失。\n是否繼續啟動? +fatal.config_in_temp_dir=你正在暫存目錄中啟動 Hello Minecraft! Launcher,你的設定和遊戲資料可能會遺失,建議將 Hello Minecraft! Launcher 移動至其他位置再啟動。\n是否繼續啟動? +fatal.config_loading_failure=Hello Minecraft! Launcher 無法載入設定檔案。\n請確保 Hello Minecraft! Launcher 對「%s」目錄及該目錄下的檔案擁有讀寫權限。 +fatal.config_loading_failure.unix=Hello Minecraft! Launcher 無法載入設定檔案,因為設定檔案是由使用者「%1$s」建立的。\n請使用 root 帳戶啟動 HMCL (不推薦),或在終端中執行以下指令將設定檔案的所有權變更為目前使用者:\n%2$s +fatal.mac_app_translocation=由於 macOS 的安全機制,Hello Minecraft! Launcher 被系統隔離至暫存目錄中。\n請將 Hello Minecraft! Launcher 移動到其他目錄後再嘗試啟動,否則你的設定和遊戲資料可能會在重啟後遺失。\n是否繼續啟動? fatal.migration_requires_manual_reboot=Hello Minecraft! Launcher 即將升級完成,請重新開啟 Hello Minecraft! Launcher。 -fatal.apply_update_failure=我們很抱歉 Hello Minecraft! Launcher 無法自動完成升級程式,因為出現了一些問題。\n但你依然可以從 %s 處手動下載 Hello Minecraft! Launcher 來完成升級。\n你可以訪問 https://docs.hmcl.net/help.html 網頁進行迴響。 +fatal.apply_update_failure=我們很抱歉 Hello Minecraft! Launcher 無法自動完成升級程式,因為出現了一些問題。\n但你依然可以從 %s 處手動下載 Hello Minecraft! Launcher 來完成升級。 fatal.apply_update_need_win7=Hello Minecraft! Launcher 無法在 Windows XP/Vista 上進行自動更新,請從 %s 處手動下載 Hello Minecraft! Launcher 來完成升級。 -fatal.samba=如果您正在通過 Samba 共亯的資料夾中運行 Hello Minecraft! Launcher,啟動器可能無法正常工作,請嘗試更新您的 Java 或在本地資料夾內運行 HMCL。 -fatal.illegal_char=由於您的用戶資料夾路徑中存在非法字元‘=’,您將無法使用外置登入帳戶以及離線登入更換皮膚功能。 -fatal.unsupported_platform=Minecraft 尚未你您的平臺提供完善支持,所以可能影響遊戲體驗或無法啟動遊戲。\n若無法啟動 Minecraft 1.17 及以上版本,可以嘗試在版本設定中打開“使用 OpenGL 軟渲染器”選項,使用 CPU 渲染以獲得更好的相容性。 +fatal.samba=如果您正在透過 Samba 共亯的目錄中執行 Hello Minecraft! Launcher,啟動器可能無法正常工作,請嘗試更新您的 Java 或在本機目錄內執行 HMCL。 +fatal.illegal_char=由於您的使用者目錄路徑中存在無效字元『=』,您將無法使用外部登入帳戶以及離線登入更換外觀功能。 +fatal.unsupported_platform=Minecraft 尚未你您的平臺提供完善支援,所以可能影響遊戲體驗或無法啟動遊戲。\n若無法啟動 Minecraft 1.17 及更高版本,可以嘗試在「(全域/實例特定) 遊戲設定 → 進階設定 → 除錯選項」中將「繪製器」切換為「軟繪製器」,以獲得更好的相容性。 fatal.unsupported_platform.loongarch=Hello Minecraft! Launcher 已為龍芯提供支援。\n如果遇到問題,你可以點擊右上角幫助按鈕進行求助。 fatal.unsupported_platform.osx_arm64=Hello Minecraft! Launcher 已為 Apple Silicon 平臺提供支援,使用 ARM 原生 Java 啟動遊戲以獲得更流暢的遊戲體驗。\n如果你在遊戲中遭遇問題,使用 x86-64 架構的 Java 啟動遊戲可能有更好的相容性。 -fatal.unsupported_platform.windows_arm64=Hello Minecraft! Launcher 已為 Windows on Arm 平臺提供原生支持。如果你在遊戲中遭遇問題,請嘗試使用 x86 架構的 Java 啟動遊戲。\n\n如果你正在使用高通平臺,你可能需要安裝 OpenGL 相容包後才能進行遊戲。點擊連結前往 Microsoft Store 安裝相容包。 +fatal.unsupported_platform.windows_arm64=Hello Minecraft! Launcher 已為 Windows on ARM 平臺提供原生支援。如果你在遊戲中遭遇問題,請嘗試使用 x86 架構的 Java 啟動遊戲。\n\n如果你正在使用高通平臺,你可能需要安裝 OpenGL 相容包後才能進行遊戲。點擊連結前往 Microsoft Store 安裝相容包。 -feedback=反饋 -feedback.channel=反饋渠道 +feedback=回報 +feedback.channel=回報管道 feedback.discord=Discord -feedback.discord.statement=歡迎加入 Discord 討論區,加入後請遵守討論區規定。 -feedback.github=GitHub Issue -feedback.github.statement=打開一個 GitHub Issue。 -feedback.qq_group=HMCL 用戶群 -feedback.qq_group.statement=歡迎加入 HMCL 用戶群,加入後請遵守群規。 +feedback.discord.statement=歡迎加入 Discord 討論區,加入後請遵守討論區規定 +feedback.github=GitHub Issues +feedback.github.statement=提交一個 GitHub Issue +feedback.qq_group=HMCL 使用者群組 +feedback.qq_group.statement=歡迎加入 HMCL 使用者群組,加入後請遵守群規 file=檔案 -folder.config=設定資料夾 -folder.game=遊戲資料夾 -folder.logs=日誌文件夾 -folder.mod=MOD 模組資料夾 -folder.resourcepacks=資源包資料夾 -folder.shaderpacks=著色器包文件夾 -folder.saves=遊戲存檔資料夾 -folder.screenshots=截圖資料夾 +folder.config=模組設定目錄 +folder.game=實例執行目錄 +folder.logs=日誌目錄 +folder.mod=模組目錄 +folder.resourcepacks=資源包目錄 +folder.shaderpacks=著色器包目錄 +folder.saves=遊戲存檔目錄 +folder.screenshots=截圖目錄 game=遊戲 game.crash.feedback=請不要將本界面截圖給他人! 如果你要求助他人,請你點擊左下角 導出遊戲崩潰信息 後將導出的文件發送給他人以供分析。\n你可以點擊下方的 幫助 前往社區尋求幫助。 @@ -728,7 +720,7 @@ modpack.wizard.step.initialization.exported_version=要匯出的遊戲版本 modpack.wizard.step.initialization.force_update=強制升級模組包至最新版本(需要自建伺服器) modpack.wizard.step.initialization.include_launcher=包含啟動器 modpack.wizard.step.initialization.save=選擇要匯出到的遊戲模組包位置 -modpack.wizard.step.initialization.warning=在製作模組包前,請您確認您選擇的版本可以正常啟動,\n並保證您的 Minecraft 是正式版而非快照版,\n而且不應將不允許非官方途徑傳播的 Mod 模組、材質包等納入模組包。\n模組包會儲存您目前的下載來源設定 +modpack.wizard.step.initialization.warning=在製作模組包前,請您確認您選擇的版本可以正常啟動,\n並保證您的 Minecraft 是正式版而非快照,\n而且不應將不允許非官方途徑傳播的 Mod 模組、材質包等納入模組包。\n模組包會儲存您目前的下載來源設定 modpack.wizard.step.initialization.server=點選此處查看有關伺服器自動更新模組包的製作教學 modrinth.category.adventure=冒險 @@ -794,28 +786,31 @@ modrinth.category.folia=Folia mods=模組 mods.add=新增模組 -mods.add.failed=新增模組 %s 失敗。 -mods.add.success=成功新增模組 %s。 -mods.broken_dependency.title=損壞的前置模組 -mods.broken_dependency.desc=該前置模組曾經在該模組倉庫上存在過,但現在被刪除了,換個下載源試試吧。 +mods.add.failed=新增模組「%s」失敗。 +mods.add.success=成功新增模組「%s」。 +mods.broken_dependency.title=損壞的相依模組 +mods.broken_dependency.desc=該相依模組曾經在該平臺上存在過,但現在被刪除了,換個下載源試試吧。 mods.category=類別 +mods.channel.alpha=Alpha +mods.channel.beta=Beta +mods.channel.release=Release mods.check_updates=檢查模組更新 -mods.check_updates.current_version=當前版本 +mods.check_updates.current_version=目前版本 mods.check_updates.empty=沒有需要更新的模組 mods.check_updates.failed=部分檔案下載失敗 mods.check_updates.file=檔案 mods.check_updates.source=來源 mods.check_updates.target_version=目標版本 mods.check_updates.update=更新 -mods.choose_mod=選擇模組 +mods.choose_mod=選取模組 mods.curseforge=CurseForge -mods.dependency.embedded=內置前端模組(作者已經打包在模組檔中,無需額外下載) -mods.dependency.optional=可選的前模組(如果缺少遊戲,遊戲可以運行,但模組功能可能缺失) -mods.dependency.required=必需的預模式(必須單獨下載,缺少可能會導致遊戲無法啟動) -mods.dependency.tool=前端庫(必須單獨下載,缺少可能會導致遊戲無法啟動) -mods.dependency.include=內置前綴模組(作者已經打包在模組檔中,無需額外下載) -mods.dependency.incompatible=模組不相容(同時安裝模組和模組都下載會導致遊戲無法啟動) -mods.dependency.broken=損壞的前綴(這個前綴曾經存在於 mod 倉庫中,但現在已被刪除)。嘗試其他下載源。 +mods.dependency.embedded=內建相依模組 (作者已經打包在模組檔中,無需單獨下載) +mods.dependency.optional=可選相依模組 (如果不安裝,遊戲可以執行,但模組功能可能缺失) +mods.dependency.required=必需相依模組 (必須單獨下載,缺少可能會導致遊戲無法啟動) +mods.dependency.tool=相依庫 (必須單獨下載,缺少可能會導致遊戲無法啟動) +mods.dependency.include=內建相依模組 (作者已經打包在模組檔中,無需單獨下載) +mods.dependency.incompatible=不相容模組 (同時安裝此模組和正在下載的模組會導致遊戲無法啟動) +mods.dependency.broken=損壞的相依模組 (這個模組曾經存在於平臺中,但現在已被刪除,請嘗試其他下載源) mods.disable=停用 mods.download=模組下載 mods.download.title=模組下載 - %1s @@ -825,26 +820,26 @@ mods.manage=模組管理 mods.mcbbs=MCBBS mods.mcmod=MC 百科 mods.mcmod.page=MC 百科頁面 -mods.mcmod.search=MC 百科蒐索 +mods.mcmod.search=MC 百科檢索 mods.modrinth=Modrinth mods.name=名稱 -mods.not_modded=你需要先在自動安裝頁面安裝 Fabric、Forge、Quilt 或 LiteLoader 才能進行模組管理。 +mods.not_modded=你需要先在「自動安裝」頁面安裝 Forge、NeoForge、Fabric、Quilt 或 LiteLoader 才能管理模組。 mods.restore=回退 mods.url=官方頁面 -mods.update_modpack_mod.warning=更新模組包中的 Mod 可能導致綜合包損壞,使模組包無法正常啟動。該操作不可逆,確定要更新嗎? -mods.install=安裝到當前實例 -mods.save_as=下載到本地目錄 +mods.update_modpack_mod.warning=更新模組包中的模組可能導致模組包損壞,使模組包無法正常啟動。該操作不可逆,確定要更新嗎? +mods.install=安裝到目前實例 +mods.save_as=下載到本機目錄 nbt.entries=%s 個條目 nbt.open.failed=打開檔案失敗 -nbt.save.failed=保存檔案失敗 +nbt.save.failed=儲存檔案失敗 nbt.title=查看檔案 - %s datapack=資料包 datapack.add=加入資料包 -datapack.choose_datapack=選擇要匯入的資料包壓縮檔 +datapack.choose_datapack=選取要匯入的資料包壓縮檔 datapack.extension=資料包 -datapack.title=世界 %s - 資料包 +datapack.title=世界 [%s] - 資料包 web.failed=加載頁面失敗 web.open_in_browser=是否要在瀏覽器中打開此連結:\n%s @@ -854,27 +849,28 @@ world=世界 world.add=加入世界 world.datapack=管理資料包 world.datapack.1_13=僅 Minecraft 1.13 及之後的版本支援資料包 -world.description=%s. 上一次遊戲時間: %s. 遊戲版本: %s +world.description=%s | 上一次遊戲時間: %s | 遊戲版本: %s world.download=存檔下載 world.export=匯出此世界 -world.export.title=選擇該世界的儲存位置 +world.export.title=選取該世界的儲存位置 world.export.location=儲存到 -world.export.wizard=匯出世界 %s +world.export.wizard=匯出世界「%s」 world.extension=存檔壓縮檔 world.import.already_exists=此世界已經存在 -world.import.choose=選擇要匯入的存檔壓縮檔 +world.import.choose=選取要匯入的存檔壓縮檔 world.import.failed=無法匯入此世界: %s -world.import.invalid=無法識別的存檔壓縮包 -world.info.title=世界 %s - 世界資訊 +world.import.invalid=無法識別的存檔壓縮檔 +world.info.title=世界 [%s] - 世界資訊 world.info.basic=基本資訊 -world.info.allow_cheats=允許作弊 -world.info.dimension.the_nether=下界 +world.info.allow_cheats=允許指令 +world.info.dimension.the_nether=地獄 world.info.dimension.the_end=末地 -world.info.difficulty=難度 +world.info.difficulty=難易度 world.info.difficulty.peaceful=和平 world.info.difficulty.easy=簡單 world.info.difficulty.normal=普通 world.info.difficulty.hard=困難 +world.info.failed=讀取世界資訊失敗 world.info.game_version=遊戲版本 world.info.last_played=上一次遊戲時間 world.info.generate_features=生成建築 @@ -883,42 +879,42 @@ world.info.player.food_level=饑餓值 world.info.player.game_type=遊戲模式 world.info.player.game_type.adventure=冒險 world.info.player.game_type.creative=創造 -world.info.player.game_type.spectator=旁觀 +world.info.player.game_type.spectator=旁觀者 world.info.player.game_type.survival=生存 world.info.player.health=生命值 world.info.player.last_death_location=上次死亡位置 world.info.player.location=位置 world.info.player.spawn=床/重生錨位置 world.info.player.xp_level=經驗等級 -world.info.random_seed=種子 +world.info.random_seed=種子碼 world.info.time=遊戲內時間 world.info.time.format=%s 天 world.game_version=遊戲版本 world.manage=世界/資料包 world.name=世界名稱 world.name.enter=輸入世界名稱 -world.reveal=開啟資料夾 +world.reveal=開啟目錄 world.show_all=全部顯示 -world.time=yyyy年MM月dd日 HH:mm:ss +world.time=yyyy/M/d HH:mm:ss profile=遊戲目錄 profile.already_exists=該名稱已存在 profile.default=目前目錄 profile.home=官方啟動器目錄 -profile.instance_directory=遊戲路徑 -profile.instance_directory.choose=選擇遊戲路徑 -profile.manage=遊戲目錄列表 +profile.instance_directory=遊戲目錄路徑 +profile.instance_directory.choose=選取遊戲目錄路徑 +profile.manage=遊戲目錄清單 profile.name=名稱 -profile.new=建立設定 +profile.new=建立新目錄 profile.title=遊戲目錄 profile.selected=已選取 -profile.use_relative_path=如可行,則在遊戲目錄使用相對路徑 +profile.use_relative_path=如可行,則對於遊戲目錄使用相對路徑 -repositories.custom=自定義 Maven 倉庫(%s) -repositories.maven_central=全球(Maven Central) -repositories.tencentcloud_mirror=中國大陸(騰訊雲 Maven 倉庫) -repositories.chooser=缺少 JavaFX 運行環境,HMCL 需要 JavaFX 才能正常運行。\n點擊“確認”從指定下載源下載 JavaFX 運行時組件並啟動 HMCL,點擊“取消”退出程式。\n選擇下載源: -repositories.chooser.title=選擇下載源下載JavaFX +repositories.custom=自訂 Maven 倉庫 (%s) +repositories.maven_central=全球 (Maven Central) +repositories.tencentcloud_mirror=中國大陸 (騰訊雲 Maven 倉庫) +repositories.chooser=缺少 JavaFX 執行環境,HMCL 需要 JavaFX 才能正常執行。\n點擊「確認」從指定下載源下載 JavaFX 執行時元件並啟動 HMCL,點擊「取消」退出程式。\n選取下載源: +repositories.chooser.title=選取 JavaFX 下載源 resourcepack=資源包 @@ -933,41 +929,41 @@ search.next_page=下一頁 search.last_page=最後一頁 search.page_n=%d / %s -selector.choose=選擇 -selector.choose_file=選擇檔案 +selector.choose=選取 +selector.choose_file=選取檔案 selector.custom=自訂 -settings=遊戲設定 +settings=設定 settings.advanced=進階設定 -settings.advanced.modify=修改進階設定 +settings.advanced.modify=編輯進階設定 settings.advanced.title=進階設定 - %s -settings.advanced.custom_commands=自訂命令 -settings.advanced.custom_commands.hint=自訂命令被調用時將包含如下的環境變數:\n\ - \ - $INST_NAME: 版本名稱\n\ - \ - $INST_ID: 版本名稱\n\ - \ - $INST_DIR: 版本資料夾\n\ - \ - $INST_MC_DIR: 遊戲運行路徑\n\ - \ - $INST_JAVA: 遊戲運行使用的 Java 路徑\n\ - \ - $INST_FORGE: 若安裝了 Forge,將會存在本環境變數\n\ - \ - $INST_NEOFORGE: 若安裝了 NeoForge,將會存在本環境變數\n\ - \ - $INST_LITELOADER: 若安裝了 LiteLoader,將會存在本環境變數\n\ - \ - $INST_OPTIFINE: 若安裝了 OptiFine,將會存在本環境變數\n\ - \ - $INST_FABRIC: 若安裝了 Fabric,將會存在本環境變數\n\ - \ - $INST_QUILT: 若安裝了 Quilt,將會存在本環境變數 +settings.advanced.custom_commands=自訂指令 +settings.advanced.custom_commands.hint=自訂指令被呼叫時將包含如下的環境變數:\n\ + \ · $INST_NAME: 實例名稱;\n\ + \ · $INST_ID: 實例名稱;\n\ + \ · $INST_DIR: 目前實例執行路徑;\n\ + \ · $INST_MC_DIR: 目前遊戲目錄路徑;\n\ + \ · $INST_JAVA: 遊戲執行使用的 Java 路徑;\n\ + \ · $INST_FORGE: 若安裝了 Forge,將會存在本環境變數;\n\ + \ · $INST_NEOFORGE: 若安裝了 NeoForge,將會存在本環境變數;\n\ + \ · $INST_LITELOADER: 若安裝了 LiteLoader,將會存在本環境變數;\n\ + \ · $INST_OPTIFINE: 若安裝了 OptiFine,將會存在本環境變數;\n\ + \ · $INST_FABRIC: 若安裝了 Fabric,將會存在本環境變數;\n\ + \ · $INST_QUILT: 若安裝了 Quilt,將會存在本環境變數。 settings.advanced.dont_check_game_completeness=不檢查遊戲完整性 settings.advanced.dont_check_jvm_validity=不檢查 JVM 與遊戲的相容性 -settings.advanced.dont_patch_natives=不嘗試自動替換本機庫 +settings.advanced.dont_patch_natives=不嘗試自動取代本機庫 settings.advanced.environment_variables=環境變數 -settings.advanced.game_dir.default=預設(.minecraft/) -settings.advanced.game_dir.independent=各版本獨立(.minecraft/versions/<版本名>/,除 assets、libraries) +settings.advanced.game_dir.default=預設 (".minecraft/") +settings.advanced.game_dir.independent=各實例獨立 (".minecraft/versions/<實例名>/",除 assets、libraries 外) settings.advanced.java_permanent_generation_space=記憶體永久儲存區域 -settings.advanced.java_permanent_generation_space.prompt=格式: MB +settings.advanced.java_permanent_generation_space.prompt=單位 MB settings.advanced.jvm=Java 虛擬機設定 settings.advanced.jvm_args=Java 虛擬機參數 -settings.advanced.jvm_args.prompt=- 若在“Java 虛擬機參數”中輸入的參數與默認參數相同,則不會添加\n\ -- 在“Java 虛擬機參數”輸入任何 GC 參數,默認參數的 G1 參數會禁用\n\ -- 點擊下方“不添加默認的 JVM 參數”可在啟動遊戲時不添加默認參數 +settings.advanced.jvm_args.prompt=\ · 若在「Java 虛擬機參數」中輸入的參數與預設參數相同,則不會加入;\n\ + \ · 在「Java 虛擬機參數」輸入任何 GC 參數,預設參數的 G1 參數會禁用;\n\ + \ · 點擊下方「不使用預設的 JVM 參數」可在啟動遊戲時不加入預設參數。 settings.advanced.launcher_visibility.close=遊戲啟動後結束啟動器 settings.advanced.launcher_visibility.hide=遊戲啟動後隱藏啟動器 settings.advanced.launcher_visibility.hide_and_reopen=隱藏啟動器並在遊戲結束後重新開啟 @@ -975,27 +971,27 @@ settings.advanced.launcher_visibility.keep=不隱藏啟動器 settings.advanced.launcher_visible=啟動器可見性 settings.advanced.minecraft_arguments=Minecraft 額外參數 settings.advanced.minecraft_arguments.prompt=預設 -settings.advanced.natives_directory=本地庫路徑(LWJGL) -settings.advanced.natives_directory.choose=選擇本地庫路徑 -settings.advanced.natives_directory.custom=自訂(由你提供遊戲需要的本地庫) -settings.advanced.natives_directory.default=預設(由啟動器提供遊戲本地庫) -settings.advanced.natives_directory.hint=本選項提供給 Apple M1 等未受遊戲官方支持的平台來自訂遊戲本地庫,如果你不知道本選項的含義,請你不要修改本選項,否則會導致遊戲無法啟動。\n如果你要修改本選項,你需要保證自訂目錄下有遊戲所需的本地庫文件,如 lwjgl.dll(liblwjgl.so), openal.dll(libopenal.so) 等文件。啟動器不會幫你補全缺少的本地庫文件。\n注意:建議指定的本地庫文件路徑使用全英文字符,否則可能導致遊戲啟動失敗。 +settings.advanced.natives_directory=本機庫路徑 (LWJGL) +settings.advanced.natives_directory.choose=選取本機庫路徑 +settings.advanced.natives_directory.custom=自訂 (由你提供遊戲需要的本機庫) +settings.advanced.natives_directory.default=預設 (由啟動器提供遊戲本機庫) +settings.advanced.natives_directory.hint=本選項提供給 Apple M1 等未受遊戲官方支援的平台來自訂遊戲本機庫,如果你不知道本選項的含義,請你不要修改本選項,否則會導致遊戲無法啟動。\n如果你要修改本選項,你需要保證自訂目錄下有遊戲所需的本機庫檔案,如 lwjgl.dll (liblwjgl.so), openal.dll (libopenal.so) 等檔案。啟動器不會幫你補全缺少的本機庫檔案。\n注意:建議指定的本機庫檔案路徑使用全英文字元,否則可能導致遊戲啟動失敗。 settings.advanced.no_jvm_args=不使用預設的 JVM 參數 settings.advanced.precall_command=遊戲啟動前執行指令 settings.advanced.precall_command.prompt=將在遊戲啟動前呼叫使用 -settings.advanced.process_priority=進程優先度 -settings.advanced.process_priority.low=低(節省遊戲占用資源,可能會造成遊戲卡頓) -settings.advanced.process_priority.below_normal=較低(節省遊戲占用資源,可能會造成遊戲卡頓) -settings.advanced.process_priority.normal=中(平衡) -settings.advanced.process_priority.above_normal=較高(優先保證遊戲運行,但可能會導致其他程式卡頓) -settings.advanced.process_priority.high=高(優先保證遊戲運行,但可能會導致其他程式卡頓) -settings.advanced.post_exit_command=遊戲結束後執行命令 +settings.advanced.process_priority=處理程序優先度 +settings.advanced.process_priority.low=低 (節省遊戲占用資源,可能會造成遊戲卡頓) +settings.advanced.process_priority.below_normal=較低 (節省遊戲占用資源,可能會造成遊戲卡頓) +settings.advanced.process_priority.normal=中 (平衡) +settings.advanced.process_priority.above_normal=較高 (優先保證遊戲執行,但可能會導致其他程式卡頓) +settings.advanced.process_priority.high=高 (優先保證遊戲執行,但可能會導致其他程式卡頓) +settings.advanced.post_exit_command=遊戲結束後執行指令 settings.advanced.post_exit_command.prompt=將在遊戲結束後呼叫使用 -settings.advanced.renderer=渲染器 -settings.advanced.renderer.default=OpenGL(默認) -settings.advanced.renderer.d3d12=DirectX 12(效能與相容性較差,用於調試) -settings.advanced.renderer.llvmpipe=軟渲染器(效能較差,相容性最好) -settings.advanced.renderer.zink=Vulkan(效能最好,相容性較差) +settings.advanced.renderer=繪製器 +settings.advanced.renderer.default=OpenGL (預設) +settings.advanced.renderer.d3d12=DirectX 12 (效能與相容性較差,用於除錯) +settings.advanced.renderer.llvmpipe=軟繪製器 (效能較差,相容性最好) +settings.advanced.renderer.zink=Vulkan (效能最好,相容性較差) settings.advanced.server_ip=伺服器位址 settings.advanced.server_ip.prompt=預設,啟動遊戲後直接進入對應伺服器 settings.advanced.use_native_glfw=使用系統 GLFW @@ -1003,7 +999,7 @@ settings.advanced.use_native_openal=使用系統 OpenAL settings.advanced.workaround=除錯選項 settings.advanced.workaround.warning=除錯選項僅提供給專業玩家使用。修改除錯選項可能會導致遊戲無法啟動。除非你知道你在做什麼,否則請不要修改這些選項。 settings.advanced.wrapper_launcher=前置指令 -settings.advanced.wrapper_launcher.prompt=如填寫 optirun 後,啟動命令將從 "java ..." 變為 "optirun java ..." +settings.advanced.wrapper_launcher.prompt=如填寫「optirun」後,啟動指令將從「java ...」變為「optirun java ...」 settings.custom=自訂 @@ -1012,45 +1008,45 @@ settings.game.current=遊戲 settings.game.dimension=遊戲介面解析度大小 settings.game.exploration=瀏覽 settings.game.fullscreen=全螢幕 -settings.game.java_directory=Java 路徑 -settings.game.java_directory.auto=自動選擇合適的 Java +settings.game.java_directory=遊戲 Java +settings.game.java_directory.auto=自動選取合適的 Java settings.game.java_directory.auto.not_found=沒有合適的 Java settings.game.java_directory.bit=%s 位 -settings.game.java_directory.choose=選擇 Java 路徑 +settings.game.java_directory.choose=選取 Java settings.game.java_directory.invalid=Java 路徑不正確 settings.game.java_directory.version=指定 Java 版本 -settings.game.java_directory.template=%s(%s) +settings.game.java_directory.template=%s (%s) settings.game.management=管理 -settings.game.working_directory=執行路徑(版本隔離,修改後請自行移動相關遊戲檔案,如存檔模組設定等) -settings.game.working_directory.choose=選擇執行路徑 -settings.game.working_directory.hint=在“運行路徑(版本隔離)”選項中開啟“各版本獨立”使當前版本獨立存放設定、存檔、模組等數據,使用模組時建議開啟此選項以避免不同版本模組衝突。修改此選項後請自行移動存檔等檔案。 +settings.game.working_directory=執行路徑 (修改後請自行移動相關遊戲檔案,如存檔、模組設定等) +settings.game.working_directory.choose=選取執行目錄 +settings.game.working_directory.hint=在「執行路徑」選項中選取「各實例獨立」使目前實例獨立存放設定、存檔、模組等資料,使用模組時建議開啟此選項以避免不同版本模組衝突。修改此選項後需自行移動存檔等檔案。 settings.icon=遊戲圖示 settings.launcher=啟動器設定 settings.launcher.appearance=外觀 -settings.launcher.common_path.tooltip=啟動器將所有遊戲資源及相依元件庫檔案放於此集中管理,如果遊戲資料夾內有現成的將不會使用公共庫檔案 +settings.launcher.common_path.tooltip=啟動器將所有遊戲資源及相依元件庫檔案放於此集中管理,如果遊戲目錄內有現成的將不會使用公共庫檔案。 settings.launcher.debug=除錯 settings.launcher.download=下載 -settings.launcher.download.threads=並發數 -settings.launcher.download.threads.auto=自動選擇並發數 -settings.launcher.download.threads.hint=並發數過大可能導致系統卡頓。你的下載速度會受到寬頻運營商、伺服器等方面的影響,調大下載並發數不一定能大幅提升總下載速度。 +settings.launcher.download.threads=執行緒數 +settings.launcher.download.threads.auto=自動選取執行緒數 +settings.launcher.download.threads.hint=執行緒數過高可能導致系統卡頓。你的下載速度會受到網際網路運營商、下載來源伺服器等方面的影響,調高下載執行緒數不一定能大幅提升總下載速度。 settings.launcher.download_source=下載來源 -settings.launcher.download_source.auto=自動選擇下載來源 -settings.launcher.enable_game_list=在首頁內顯示遊戲列表 +settings.launcher.download_source.auto=自動選取下載來源 +settings.launcher.enable_game_list=在首頁內顯示遊戲清單 settings.launcher.font=字體 -settings.launcher.general=通用 +settings.launcher.general=一般 settings.launcher.language=語言 (重啟後生效) settings.launcher.launcher_log.export=匯出啟動器日誌 settings.launcher.launcher_log.reveal=打開日誌目錄 -settings.launcher.launcher_log.export.failed=無法匯出日誌 -settings.launcher.launcher_log.export.success=日誌已儲存到 %s -settings.launcher.log=記錄 -settings.launcher.log.font=記錄字體 +settings.launcher.launcher_log.export.failed=無法匯出日誌。 +settings.launcher.launcher_log.export.success=日誌已儲存到「%s」。 +settings.launcher.log=日誌 +settings.launcher.log.font=日誌字體 settings.launcher.proxy=代理 settings.launcher.proxy.authentication=身份驗證 settings.launcher.proxy.disable=使用系統代理 -settings.launcher.proxy.host=主機 +settings.launcher.proxy.host=IP 位址 settings.launcher.proxy.http=HTTP settings.launcher.proxy.none=不使用代理 settings.launcher.proxy.password=密碼 @@ -1060,7 +1056,7 @@ settings.launcher.proxy.username=帳戶 settings.launcher.theme=主題 settings.launcher.title_transparent=標題欄透明 settings.launcher.turn_off_animations=關閉動畫 (重啟後生效) -settings.launcher.version_list_source=版本列表來源 +settings.launcher.version_list_source=版本清單來源 settings.memory=遊戲記憶體 settings.memory.allocate.auto=最低分配 %1$.1f GB / 實際分配 %2$.1f GB @@ -1071,91 +1067,96 @@ settings.memory.auto_allocate=自動分配 settings.memory.lower_bound=最低分配 settings.memory.used_per_total=已使用 %1$.1f GB / 總記憶體 %2$.1f GB settings.physical_memory=實體記憶體大小 -settings.show_log=查看記錄 -settings.skin=現已支持離線帳戶更換皮膚,你可以到帳戶頁面更改離線帳戶的皮膚和披風(多人遊戲下其他玩家無法看到你的皮膚) +settings.show_log=查看日誌 +settings.skin=現已支援離線帳戶更換外觀,你可以到帳戶頁面更改離線帳戶的外觀和披風 (多人遊戲下其他玩家無法看到你的外觀)。 settings.tabs.installers=自動安裝 settings.take_effect_after_restart=重啟後生效 -settings.type=版本設定類型 -settings.type.global=全域版本設定(使用該設定的版本共用一套設定) +settings.type=實例遊戲設定類型 +settings.type.global=全域遊戲設定 (未啟用「實例特定遊戲設定」的實例共用一套設定) settings.type.global.manage=全域遊戲設定 settings.type.global.edit=編輯全域遊戲設定 -settings.type.special.enable=啟用遊戲特別設定(不影響其他遊戲版本) -settings.type.special.edit=編輯遊戲特定設置 -settings.type.special.edit.hint=當前遊戲版本 %s 啟動了遊戲特定設置,本頁面選項不對當前遊戲生效。點擊連結以修改當前遊戲設置。 +settings.type.special.enable=啟用實例特定遊戲設定 (不影響其他實例) +settings.type.special.edit=編輯實例特定遊戲設定 +settings.type.special.edit.hint=目前實例「%s」啟用了「實例特定遊戲設定」設定,本頁面選項不對目前實例生效。點擊連結以修改目前實例設定。 sponsor=贊助 -sponsor.bmclapi=大中華區下載源由 BMCLAPI 提供高速下載服務 -sponsor.hmcl=Hello Minecraft! Launcher 是一個免費、開源的 Minecraft 啟動器,允許玩家方便快捷地安裝、管理、執行遊戲。點選此處查閱更多詳細訊息。 +sponsor.bmclapi=中國大陸下載源由 BMCLAPI 提供高速下載服務。 +sponsor.hmcl=Hello Minecraft! Launcher 是一個自由、開源的 Minecraft 啟動器,允許玩家方便快捷地安裝、管理、執行遊戲。點選此處查閱更多詳細訊息。 system.architecture=架構 -system.operating_system=操作系統 +system.operating_system=作業系統 -unofficial.hint=你正在使用非官方構建的 HMCL,我們無法保證其安全性,請注意甄別。 +unofficial.hint=你正在使用第三方提供的 HMCL,我們無法保證其安全性,請注意甄別。 update=啟動器更新 update.accept=更新 update.changelog=更新日誌 update.channel.dev=測試版 -update.channel.dev.hint=你正在使用測試版。測試版包含一些未在正式版中包含的測試性功能,僅用於體驗新功能。\n\ - 測試版功能未受充分驗證,使用起來可能不穩定!\n\ - 如果你遇到了使用問題,可以在設置的 回饋頁面 中進行回饋,或加入回饋頁面中提供的 DiscordQQ 群以回饋問題。\n\n\ - 點擊此處為當前版本隱藏該提示。 +update.channel.dev.hint=你正在使用 HMCL 測試版。測試版包含一些未在正式版中包含的測試性功能,僅用於體驗新功能。測試版功能未受充分驗證,使用起來可能不穩定!\n\ + \n\ + 如果你遇到了使用問題,可以透過「設定 → 回報」頁面或下方提供的管道進行回報。\n\ + \n\ + Discord QQ 群 GitHub\n\ + \n\ + 為目前版本隱藏該提示。 update.channel.dev.title=測試版提示 update.channel.nightly=預覽版 -update.channel.nightly.hint=你正在使用預覽版。預覽版可能會每天更新一次,包含一些未在正式版和測試版中包含的測試性功能,僅用於體驗新功能\n\ - 測試版功能未受充分驗證,使用起來可能不穩定!\n\ - 如果你遇到了使用問題,可以在設置的 回饋頁面 中進行回饋,或加入 DiscordQQ 群以回饋問題。 +update.channel.nightly.hint=你正在使用 HMCL 預覽版。預覽版更新較為頻繁,包含一些未在正式版和測試版中包含的測試性功能,僅用於體驗新功能。預覽版功能未受充分驗證,使用起來可能不穩定!\n\ + \n\ + 如果你遇到了使用問題,可以透過「設定 → 回報」頁面或下方提供的管道進行回報。\n\ + \n\ + Discord QQ 群 GitHub update.channel.nightly.title=預覽版提示 update.channel.stable=建議版本 update.checking=正在檢查更新 update.failed=更新失敗 update.found=發現到更新 -update.newest_version=最新版本為: %s -update.bubble.title=發現更新: %s +update.newest_version=最新版本為:%s +update.bubble.title=發現更新:%s update.bubble.subtitle=點選此處進行升級 -update.note=測試版與開發版包含更多的功能以及錯誤修復,但也可能會包含其他的問題。 +update.note=測試版與預覽版包含更多的功能以及錯誤修復,但也可能會包含其他的問題。 update.latest=目前版本為最新版本 -update.no_browser=無法開啟瀏覽器,網址已經複製到剪貼簿了,您可以手動複製網址開啟頁面 +update.no_browser=無法開啟瀏覽器,網址已經複製到剪貼簿了,你可以手動複製網址開啟頁面。 update.tooltip=更新 version=遊戲 -version.name=遊戲版本名稱 +version.name=遊戲實例名稱 version.cannot_read=讀取遊戲版本失敗,無法進行自動安裝 version.empty=沒有遊戲版本 version.empty.add=進入下載頁安裝遊戲 version.empty.launch=沒有可啟動的遊戲,你可以點擊左側邊欄內的下載按鈕安裝遊戲 version.empty.hint=沒有已安裝的遊戲,你可以切換其他遊戲目錄,或者點擊此處進入遊戲下載頁面 -version.game.old=老舊版本 -version.game.release=穩定版本 -version.game.releases=穩定版本 -version.game.snapshot=測試版本 -version.game.snapshots=測試版本 +version.game.old=歷史版本 +version.game.release=正式版 +version.game.releases=正式版 +version.game.snapshot=快照 +version.game.snapshots=快照 version.launch=啟動遊戲 version.launch.test=測試遊戲 -version.switch=切換版本 +version.switch=切換實例 version.launch_script=生成啟動指令碼 version.launch_script.failed=生成啟動指令碼失敗 version.launch_script.save=儲存啟動指令碼 version.launch_script.success=啟動指令碼已生成完畢: %s -version.manage=遊戲列表 +version.manage=實例清單 version.manage.clean=清理遊戲目錄 -version.manage.clean.tooltip=清理 logs, crash-reports +version.manage.clean.tooltip=清理「logs」與「crash-reports」目錄 version.manage.duplicate=複製遊戲實例 version.manage.duplicate.duplicate_save=複製存檔 version.manage.duplicate.prompt=請輸入新遊戲實例名稱 -version.manage.duplicate.confirm=將鎖定複製產生的新遊戲實例:強制版本隔離、遊戲設置獨立。 -version.manage.manage=遊戲管理 -version.manage.manage.title=遊戲管理 - %1s +version.manage.duplicate.confirm=新的遊戲將複製該實例目錄 (".minecraft/versions/<實例名>") 下的檔案,並帶有獨立的執行目錄和設定。 +version.manage.manage=實例設定 +version.manage.manage.title=實例設定 - %1s version.manage.redownload_assets_index=更新遊戲資源檔案 version.manage.remove=刪除該版本 -version.manage.remove.confirm=真的要刪除版本 %s 嗎? 你將無法找回被刪除的檔案! -version.manage.remove.confirm.trash=真的要刪除版本 %s 嗎? 你可以在系統的資源回收桶 (或垃圾桶) 中還原資料夾 %s 來找回該版本。 -version.manage.remove.confirm.independent=由於該遊戲使用了版本隔離,所以刪除該版本將導致該遊戲的存檔等資料一同被刪除,真的要刪除版本 %s 嗎? +version.manage.remove.confirm=真的要刪除實例「%s」嗎? 你將無法找回被刪除的檔案!!! +version.manage.remove.confirm.trash=真的要刪除實例「%s」嗎? 你可以在系統的資源回收筒 (或垃圾桶) 中還原目錄「%s」來找回該實例。 +version.manage.remove.confirm.independent=由於該實例啟用了「(全域/實例特定) 遊戲設定 → 執行路徑 → 各實例獨立」設定,所以刪除該實例將導致該遊戲的存檔等資料一同被刪除,真的要刪除實例「%s」嗎? version.manage.remove_assets=刪除所有遊戲資源檔案 -version.manage.remove_libraries=刪除所有函式庫檔案 +version.manage.remove_libraries=刪除所有支援庫檔案 version.manage.rename=重新命名該版本 version.manage.rename.message=請輸入新名稱 -version.manage.rename.fail=重新命名版本失敗,可能檔案被佔用或者名稱有特殊字元 +version.manage.rename.fail=重新命名版本失敗,可能檔案被佔用或者名稱有特殊字元。 version.settings=遊戲設定 version.update=更新模組包 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 6de8c08119..5ec07672d7 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -19,9 +19,9 @@ # Contributors: huangyuhui about=关于 about.copyright=版权 -about.copyright.statement=版权所有 © 2024 huangyuhui. +about.copyright.statement=版权所有 © 2024 huangyuhui about.author=作者 -about.author.statement=bilibili ID: @huanghongxun +about.author.statement=bilibili @huanghongxun about.claim=用户协议 about.claim.statement=点击链接以查看全文 about.dependency=依赖 @@ -29,21 +29,21 @@ about.legal=法律声明 about.thanks_to=鸣谢 about.thanks_to.bangbang93.statement=提供 BMCLAPI 下载源。请赞助支持 BMCLAPI! about.thanks_to.burningtnt.statement=为 HMCL 贡献许多技术支持 -about.thanks_to.contributors=所有通过 Issues、Pull Requests 等方式参与本项目的贡献者 -about.thanks_to.contributors.statement=没有开源社区的支持,Hello Minecraft! Launcher 就无法走到今天 +about.thanks_to.contributors=所有通过 Issue、Pull Request 等方式参与本项目的贡献者 +about.thanks_to.contributors.statement=没有开源社区的支持,HMCL 就无法走到今天 about.thanks_to.gamerteam.statement=提供默认背景图 about.thanks_to.glavo.statement=负责 HMCL 的日常维护 about.thanks_to.zekerzhayard.statement=为 HMCL 贡献许多技术支持 about.thanks_to.zkitefly.statement=负责维护 HMCL 的文档 -about.thanks_to.mcbbs=MCBBS 我的世界中文论坛 +about.thanks_to.mcbbs=MCBBS (我的世界中文论坛) about.thanks_to.mcbbs.statement=提供 MCBBS 下载源 (现已停止服务) -about.thanks_to.mcmod=MC 百科 -about.thanks_to.mcmod.statement=提供模组中文名映射表与 Mod 百科 +about.thanks_to.mcmod=MC 百科 (mcmod.cn) +about.thanks_to.mcmod.statement=提供模组简体中文名映射表与模组百科 about.thanks_to.red_lnn.statement=提供默认背景图 -about.thanks_to.shulkersakura.statement=提供 HMCL 的图标 +about.thanks_to.shulkersakura.statement=提供 HMCL 的徽标 about.thanks_to.users=HMCL 用户群成员 about.thanks_to.users.statement=感谢用户群成员赞助充电、积极催更、反馈问题、出谋划策 -about.thanks_to.yushijinhun.statement=authlib-injector 相关支持 +about.thanks_to.yushijinhun.statement=提供 authlib-injector 相关支持 about.open_source=开源 about.open_source.statement=GPL v3 (https://github.com/HMCL-dev/HMCL) @@ -58,28 +58,28 @@ account.create.authlibInjector=添加外置登录账户 (authlib-injector) account.email=邮箱 account.failed=账户刷新失败 account.failed.character_deleted=此角色已被删除 -account.failed.connect_authentication_server=无法连接认证服务器,可能是网络问题,请检查设备能否正常上网或使用代理服务\n你可以点击右上角帮助按钮进行求助。 -account.failed.connect_injector_server=无法连接认证服务器,可能是网络问题,请检查设备是否能正常上网,检查 URL 是否输入错误,或使用代理服务\n你可以点击右上角帮助按钮进行求助。 -account.failed.injector_download_failure=无法下载 authlib-injector,可能是网络问题,请检查设备是否能正常上网、尝试切换下载源或使用代理服务\n你可以点击右上角帮助按钮进行求助。 -account.failed.invalid_credentials=你的用户名或密码错误,或登录次数过多被暂时禁止登录,请稍后再试 +account.failed.connect_authentication_server=无法连接认证服务器,可能是网络问题,请检查设备能否正常上网或使用代理服务。\n你可以点击右上角帮助按钮进行求助。 +account.failed.connect_injector_server=无法连接认证服务器,可能是网络问题,请检查设备是否能正常上网、URL 是否输入错误,或使用代理服务。\n你可以点击右上角帮助按钮进行求助。 +account.failed.injector_download_failure=无法下载 authlib-injector,可能是网络问题,请检查设备是否能正常上网、尝试切换下载源或使用代理服务。\n你可以点击右上角帮助按钮进行求助。 +account.failed.invalid_credentials=你的用户名或密码错误,或登录次数过多被暂时禁止登录,请稍后再试。 account.failed.invalid_password=无效的密码 account.failed.invalid_token=请尝试登出并重新输入密码登录 -account.failed.migration=你的账户需要被迁移至微软账户。如果你已经迁移,你需要使用微软登录方式登录迁移后的微软账户 +account.failed.migration=你的账户需要迁移至微软账户。如果你已经迁移,你需要使用微软账户登录迁移后的账户。 account.failed.no_character=该账户没有角色 account.failed.server_disconnected=无法访问登录服务器,账户信息刷新失败。\n\ 你可以选择“再次刷新账户”重新尝试。\n\ - 你也可以选择“跳过账户刷新”继续启动游戏,但可能会使账户信息不是最新的。\n\ - 若最近没有刷新账户信息,则可能导致账户信息过期失效,\n\ - 若为 微软账户 启动游戏,账户信息过期失效可能将无法进入需账户验证的服务器。\n\ - 若尝试多次无法成功刷新,可尝试重新添加该账户尝试解决该问题。\n\ + 你也可以选择“跳过账户刷新”继续启动游戏,但可能会导致账户信息未同步更新。\n\ + 若最近没有刷新账户信息,则可能导致账户信息过期失效。\n\ + 若使用微软账户或外置登录账户启动游戏,账户信息过期失效可能将无法进入需在线验证的服务器。\n\ + 若尝试多次无法成功刷新,可尝试重新添加该账户,或许会解决该问题。\n\ 你可以点击右上角帮助按钮进行求助。 -account.failed.server_response_malformed=无法解析认证服务器响应,可能是服务器故障 +account.failed.server_response_malformed=无法解析认证服务器响应,可能是服务器故障。 account.failed.ssl=连接服务器时发生了 SSL 错误,可能网站证书已过期或你使用的 Java 版本过低,请尝试更新 Java,或关闭网络代理后再试。\n你可以点击右上角帮助按钮进行求助。 account.failed.wrong_account=登录了错误的账户 -account.hmcl.hint=你需要点击“登录”按钮,并在打开的网页中完成登录 +account.hmcl.hint=你需要点击“登录”按钮,并在弹出的网页中完成登录。 account.injector.add=添加认证服务器 -account.injector.empty=无(点击右侧加号添加) -account.injector.http=警告:此服务器使用不安全的 HTTP 协议,您的密码在登录时会被明文传输。 +account.injector.empty=无 (点击右侧加号添加) +account.injector.http=警告:此服务器使用不安全的 HTTP 协议,你的密码在登录时会被明文传输。 account.injector.link.homepage=主页 account.injector.link.register=注册 account.injector.server=认证服务器 @@ -90,79 +90,79 @@ account.login.hint=我们不会保存你的密码 account.login.skip=跳过账户刷新 account.login.retry=再次刷新账户 account.login.refresh=重新登录 -account.login.refresh.microsoft.hint=因为账户授权失效,你需要重新添加微软账户 +account.login.refresh.microsoft.hint=由于账户授权失效,你需要重新添加微软账户。 account.logout=登出 account.register=注册 account.manage=账户列表 -account.copy_uuid=复制该账户的 UUID。 +account.copy_uuid=复制该账户的 UUID account.methods=登录方式 account.methods.authlib_injector=外置登录 (authlib-injector) account.methods.microsoft=微软账户 account.methods.microsoft.birth=如何修改账户出生日期 -account.methods.microsoft.close_page=已完成微软账户授权,接下来启动器还需要完成剩余登录步骤。你已经可以关闭本页面了。 +account.methods.microsoft.close_page=已完成微软账户授权,接下来启动器还需要完成其余登录步骤。你现在可以关闭本页面了。 account.methods.microsoft.deauthorize=解除账户授权 -account.methods.microsoft.error.add_family=请点击上方【账户设置页】更改你的账户的出生日期,使年龄满 18 岁以上。或将账户加入到家庭中。\n你可以点击右上角帮助按钮进行求助。 -account.methods.microsoft.error.add_family_probably=请点击上方【账户设置页】更改你的账户的出生日期,使年龄满 18 岁以上。或将账户加入到家庭中。\n你可以点击右上角帮助按钮进行求助。 -account.methods.microsoft.error.country_unavailable=你所在的国家或地区不受 XBox Live 的支持。 -account.methods.microsoft.error.missing_xbox_account=请点击上方【创建档案】关联 XBox 账户。\n你可以点击右上角帮助按钮进行求助。 -account.methods.microsoft.error.no_character=请确认你购买了 Minecraft: Java 版。若已购买,该账户未包含 Minecraft Java 版购买记录\n请点击【创建档案】创建游戏档案。\n你可以点击右上角帮助按钮进行求助。 +account.methods.microsoft.error.add_family=请点击上方“账户设置页”更改你的账户出生日期,使年龄满 18 岁以上,或将账户加入到家庭中。\n你可以点击右上角帮助按钮进行求助。 +account.methods.microsoft.error.add_family_probably=请点击上方“账户设置页”更改你的账户出生日期,使年龄满 18 岁以上,或将账户加入到家庭中。\n你可以点击右上角帮助按钮进行求助。 +account.methods.microsoft.error.country_unavailable=你所在的国家或地区不受 Xbox Live 的支持。 +account.methods.microsoft.error.missing_xbox_account=请点击上方“创建档案”关联 Xbox 账户。\n你可以点击右上角帮助按钮进行求助。 +account.methods.microsoft.error.no_character=请确认你已经购买了 Minecraft: Java 版。\n若已购买,则可能未创建游戏档案,请点击上方“创建档案”以创建游戏档案。\n你可以点击右上角帮助按钮进行求助。 account.methods.microsoft.error.unknown=未知问题。错误码:%d。\n你可以点击右上角帮助按钮进行求助。 -account.methods.microsoft.error.wrong_verify_method=请在 Microsoft 账户登陆页面使用账户 + 密码登录。请不要使用验证码登录。\n你可以点击右上角帮助按钮进行求助。 +account.methods.microsoft.error.wrong_verify_method=请在微软账户登录页面使用密码登录,不要使用验证码登录。\n你可以点击右上角帮助按钮进行求助。 account.methods.microsoft.logging_in=登录中…… -account.methods.microsoft.makegameidsettings=创建档案/编辑档案名称 +account.methods.microsoft.makegameidsettings=创建档案 / 编辑档案名称 account.methods.microsoft.hint=你需要按照以下步骤添加账户:\n\ - 1.点击“登录”按钮\n\ - 2.在网页浏览器显示的网站中输入 HMCL 显示的代码(自动拷贝,直接粘贴即可),并点击“下一步”\n\ - 3.按照网站的提示登录\n\ - 4.当网站提示“是否允许此应用访问你的信息?”的标识时,请点击“是”\n\ - 5.在网站提示“大功告成”后,只需等待账户完成添加即可\n\ - -若网站提示“出现错误”的标识或账户添加失败时,请重新按照以上步骤重新添加\n\ - -若设备网络环境不佳,可能登录网站加载很慢甚至无法加载,此时请使用网络代理并重试\n\ + \ 1.点击“登录”按钮;\n\ + \ 2.在弹出的网页中输入 HMCL 显示的代码,并点击“下一步”;\n\ + \ 3.按照网站的提示登录;\n\ + \ 4.当网站提示“是否允许此应用访问你的信息?”的标识时,请点击“是”;\n\ + \ 5.在网站提示“大功告成”后,只需等待账户完成添加即可。\n\ + 若网站提示“出现错误”的标识或账户添加失败时,请重新按照以上步骤重新添加。\n\ + 若设备网络环境不佳,可能登录网站加载很慢甚至无法加载,此时请使用网络代理并重试。\n\ 如遇到问题,你可以点击右上角帮助按钮进行求助。 account.methods.microsoft.manual=你需要按照以下步骤添加:\n\ - 1.点击“登录”按钮\n\ - 2.在网页浏览器显示的网站中输入:%1$s(已自动拷贝,点此再次拷贝),并点击“下一步”\n\ - 3.按照网站的提示登录\n\ - 4.当网站提示“是否允许此应用访问你的信息?”的标识时,请点击“是”\n\ - 5.在网站提示“大功告成”后,只需等待账户完成添加即可\n\ - -若网站提示“出现错误”的标识或账户添加失败时,请重新按照以上步骤重新添加\n\ - -若网站未能显示,请手动在网页浏览器中打开:%2$s\n\ - -若设备网络环境不佳,可能登录网站加载很慢甚至无法加载,此时请使用网络代理并重试\n\ + \ 1.点击“登录”按钮;\n\ + \ 2.在弹出的网页中输入:%1$s (已自动复制,点此再次复制),并点击“下一步”;\n\ + \ 3.按照网站的提示登录;\n\ + \ 4.当网站提示“是否允许此应用访问你的信息?”的标识时,请点击“是”;\n\ + \ 5.在网站提示“大功告成”后,只需等待账户完成添加即可。\n\ + 若网站未能显示,请手动在浏览器中打开:%2$s\n\ + 若网站提示“出现错误”的标识或账户添加失败时,请重新按照以上步骤重新添加。\n\ + 若设备网络环境不佳,可能登录网站加载很慢甚至无法加载,此时请使用网络代理并重试。\n\ 如遇到问题,你可以点击右上角帮助按钮进行求助。 account.methods.microsoft.profile=账户设置页 account.methods.microsoft.purchase=购买 Minecraft account.methods.forgot_password=忘记密码 -account.methods.microsoft.snapshot=你正在使用非官方构建的 HMCL,请下载官方构建进行微软登录。 +account.methods.microsoft.snapshot=你正在使用第三方提供的 HMCL,请下载官方版本来登录微软账户。 account.methods.microsoft.snapshot.website=官方网站 account.methods.offline=离线模式 account.methods.offline.name.special_characters=建议使用英文字符、数字以及下划线命名 -account.methods.offline.name.invalid=正常情况下,游戏用户名只能包括英文字符、数字以及下划线,且长度不能超过 16 个字符。\n\ - 一些合法的用户名:HuangYu,huang_Yu,Huang_Yu_123;\n\ - 一些不合法的用户名:黄鱼,Huang Yu,Huang-Yu_%%%,Huang_Yu_hello_world_hello_world。\n\ - 如果你相信服务器端有相应的模组或插件来解除此限制,你可以忽略本警告。\n\ +account.methods.offline.name.invalid=游戏用户名通常仅允许使用英文字母、数字及下划线,且长度不能超过 16 个字符。\n\ + \ · 一些合法用户名:HuangYu、huang_Yu、Huang_Yu_123;\n\ + \ · 一些非法用户名:黄鱼、Huang Yu、Huang-Yu_%%%、Huang_Yu_hello_world_hello_world。\n\ + 如果你相信服务端有相应模组或插件解除此限制,可以忽略本警告。\n\ 如遇到问题,你可以点击右上角帮助按钮进行求助。 account.methods.offline.uuid=UUID -account.methods.offline.uuid.hint=UUID 是 Minecraft 对玩家角色的唯一标识符,每个启动器生成 UUID 的方式可能不同。通过修改 UUID 选项至原启动器所生成的 UUID,你可以保证在切换启动器后,游戏还能将你的游戏角色识别为给定 UUID 所对应的角色,从而保留原来角色的背包物品。UUID 选项为高级选项,除非你知道你在做什么,否则你不需要调整该选项。 +account.methods.offline.uuid.hint=UUID 是 Minecraft 玩家的唯一标识符,每个启动器生成 UUID 的方式可能不同。通过将 UUID 修改为原启动器所生成的 UUID,你可以保证在切换启动器后,游戏还能将你的游戏角色识别为给定 UUID 所对应的角色,从而保留原角色的背包物品。UUID 选项为高级选项,除非你知道你在做什么,否则你不需要调整该选项。 account.methods.offline.uuid.malformed=格式错误 account.missing=没有游戏账户 account.missing.add=点击此处添加账户 -account.move_to_global=转换为全局账户\n该账户的信息会保存至用户目录的配置文件中 -account.move_to_portable=转换为便携账户\n该账户的信息会保存至 HMCL 同目录的配置文件中 +account.move_to_global=转换为全局账户\n该账户的信息会保存至系统当前用户文件夹的配置文件中 +account.move_to_portable=转换为便携账户\n该账户的信息会保存至与 HMCL 同文件夹的配置文件中 account.not_logged_in=未登录 account.password=密码 account.portable=便携账户 account.skin=皮肤 account.skin.file=皮肤图片文件 account.skin.model=模型 -account.skin.model.default=经典 -account.skin.model.slim=苗条 +account.skin.model.default=宽型 +account.skin.model.slim=纤细 account.skin.type.csl_api=Blessing Skin 服务器 account.skin.type.csl_api.location=服务器地址 account.skin.type.csl_api.location.hint=CustomSkinAPI 地址 account.skin.type.little_skin=LittleSkin 皮肤站 -account.skin.type.little_skin.hint=你需要在皮肤站中创建并使用和该离线账户角色同名角色,此时离线账户皮肤将为皮肤站上角色所设定的皮肤。\n你可以点击右上角帮助按钮进行求助。 +account.skin.type.little_skin.hint=你需要在皮肤站中创建并使用和该离线账户同名的角色,此时离线账户皮肤将显示为皮肤站上对应角色所设置的皮肤。\n你可以点击右上角帮助按钮进行求助。 account.skin.type.local_file=本地皮肤图片文件 -account.skin.upload=上传皮肤 +account.skin.upload=上传/编辑皮肤 account.skin.upload.failed=皮肤上传失败 account.skin.invalid_skin=无法识别的皮肤文件 account.username=用户名 @@ -174,7 +174,7 @@ archive.version=版本 assets.download=下载资源 assets.download_all=检查资源文件完整性 -assets.index.malformed=资源文件的索引文件损坏,您可以在相应的游戏管理,点击左下角的管理按钮选择【更新游戏资源文件】以修复该问题\n你可以点击右上角帮助按钮进行求助。 +assets.index.malformed=资源文件的索引文件损坏,你可以在相应版本的“版本管理”页面中,点击左下角“管理 → 更新游戏资源文件”以修复该问题。\n你可以点击右上角帮助按钮进行求助。 button.cancel=取消 button.change_source=切换下载源 @@ -188,7 +188,7 @@ button.no=否 button.ok=确定 button.refresh=刷新 button.remove=删除 -button.remove.confirm=您确定要删除吗?此操作无法撤销! +button.remove.confirm=你确定要删除吗?此操作无法撤销! button.retry=重试 button.save=保存 button.save_as=另存为 @@ -201,15 +201,15 @@ chat=官方群组 color.recent=推荐 color.custom=自定义颜色 -crash.NoClassDefFound=请确认 Hello Minecraft! Launcher 本体是否完整,\n或更新您的 Java。\n你可以访问\n https://docs.hmcl.net/help.html\n页面寻求帮助。 -crash.user_fault=您的系统或 Java 环境可能安装不当导致本软件崩溃,\n请检查您的 Java 环境或您的电脑。\n你可以访问\n https://docs.hmcl.net/help.html\n页面寻求帮助。 +crash.NoClassDefFound=请确认 Hello Minecraft! Launcher 本体是否完整,或更新你的 Java。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 +crash.user_fault=你的系统或 Java 环境可能安装不当导致本软件崩溃,请检查你的 Java 环境或你的电脑。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 curse.category.0=全部 # https://addons-ecs.forgesvc.net/api/v2/category/section/4471 curse.category.4474=科幻 curse.category.4481=轻量整合包 -curse.category.4483=战斗 PVP +curse.category.4483=战斗 PvP curse.category.4477=小游戏 curse.category.4478=任务 curse.category.4484=多人 @@ -229,9 +229,9 @@ curse.category.7418=恐怖 curse.category.5299=教育 curse.category.5232=额外行星 curse.category.5129=原版增强 -curse.category.5189=实用与QOL -curse.category.5190=QoL -curse.category.5191=实用与QoL +curse.category.5189=实用与 QOL +curse.category.5190=QOL +curse.category.5191=实用与 QOL curse.category.5192=梦幻菜单 curse.category.6145=空岛 curse.category.6814=性能 @@ -329,34 +329,34 @@ curse.sort.total_downloads=下载量 download=下载 download.hint=安装游戏和整合包或下载模组、资源包和地图 -download.code.404=远程服务器不包含需要下载的文件: %s +download.code.404=远程服务器不包含需要下载的文件: %s\n你可以点击右上角帮助按钮进行求助。 download.content=游戏内容 -download.curseforge.unavailable=HMCL 预览版暂不支持访问 CurseForge,请使用稳定版或测试版进行下载。 -download.existing=文件已存在,无法保存。你可以在模组选择栏中的右侧按钮另存为将文件保存至其他地方。 +download.curseforge.unavailable=HMCL 预览版暂不支持访问 CurseForge,请使用稳定版或开发版进行下载。 +download.existing=文件已存在,无法保存。你可以将文件保存至其他地方。 download.external_link=打开下载网站 -download.failed=下载失败: %1$s,错误码:%2$d -download.failed.empty=[没有可供安装的版本,点击此处返回] +download.failed=下载失败: %1$s,\n错误码:%2$d\n你可以点击右上角帮助按钮进行求助。 +download.failed.empty=[没有可供安装的版本,点击此处返回]\n(你可以点击右上角帮助按钮进行求助) download.failed.no_code=下载失败: %s -download.failed.refresh=[加载版本列表失败,点击此处重试] +download.failed.refresh=[加载版本列表失败,点击此处重试]\n(你可以点击右上角帮助按钮进行求助) download.game=新游戏 -download.provider.bmclapi=BMCLAPI(bangbang93,https://bmclapi2.bangbang93.com) -download.provider.mojang=官方(OptiFine 自动安装使用 BMCLAPI 下载源) -download.provider.official=尽量使用官方源(最新,但可能加载慢) -download.provider.balanced=选择加载速度快的下载源(平衡,但可能不是最新) -download.provider.mirror=尽量使用镜像源(加载快,但可能不是最新) +download.provider.bmclapi=BMCLAPI (bangbang93,https://bmclapi2.bangbang93.com) +download.provider.mojang=官方 (OptiFine 自动安装使用 BMCLAPI 下载源) +download.provider.official=尽量使用官方源 (最新,但可能加载慢) +download.provider.balanced=选择加载速度快的下载源 (平衡,但可能不是最新) +download.provider.mirror=尽量使用镜像源 (加载快,但可能不是最新) download.java=下载 Java download.java.override=此 Java 版本已经存在,是否卸载并重新安装? download.javafx=正在下载必要的运行时组件…… -download.javafx.notes=正在通过网络下载 HMCL 必要的运行时组件。\n点击“切换下载源”按钮查看详情以及选择下载源,点击“取消”按钮停止并退出。\n注意:若下载速度过慢,请尝试切换下载源 -download.javafx.component=正在下载模块 %s +download.javafx.notes=正在通过网络下载 HMCL 必要的运行时组件。\n点击“切换下载源”按钮查看详情以及选择下载源,点击“取消”按钮停止并退出。\n注意:若下载速度过慢,请尝试切换下载源。 +download.javafx.component=正在下载模块“%s” download.javafx.prepare=准备开始下载 -exception.access_denied=因为无法访问文件 %s,HMCL 没有对该文件的访问权限,或者该文件被其他程序打开。\n\ - 请你检查当前操作系统账户是否能访问该文件,比如非管理员用户可能不能访问其他账户的个人文件夹内的文件。\n\ - 对于 Windows 用户,你还可以尝试通过资源监视器查看是否有程序占用了该文件,如果是,请关闭占用此文件相关程序,或者重启电脑再试。\n\ +exception.access_denied=无法访问文件“%s”,因为 HMCL 没有对该文件的访问权限,或者该文件已被其他程序打开。\n\ + 请你检查当前操作系统账户是否能访问该文件,比如非管理员用户可能无法访问其他账户的个人文件夹内的文件。\n\ + 对于 Windows 用户,你还可以尝试通过资源监视器查看是否有程序占用了该文件,如果是,请关闭占用该文件的程序,或者重启电脑再试。\n\ 如遇到问题,你可以点击右上角帮助按钮进行求助。 exception.artifact_malformed=下载的文件无法通过校验。\n你可以点击右上角帮助按钮进行求助。 -exception.ssl_handshake=无法建立 SSL 连接,因为当前 Java 虚拟机缺少相关的 SSL 证书。你可以尝试使用其他的 Java 虚拟机启动 HMCL 再试。\n你可以点击右上角帮助按钮进行求助。 +exception.ssl_handshake=无法建立 SSL 连接,因为当前 Java 虚拟机缺少相关的 SSL 证书。你可以尝试使用其他 Java 虚拟机启动 HMCL 再试。\n你可以点击右上角帮助按钮进行求助。 extension.bat=Windows 脚本 extension.mod=模组文件 @@ -367,29 +367,29 @@ extension.sh=Bash 脚本 fatal.javafx.incompatible=缺少 JavaFX 运行环境。\nHello Minecraft! Launcher 无法在低于 Java 11 的 Java 环境上自行补全 JavaFX 运行环境,请更新到 Java 11 或更高版本。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 fatal.javafx.incomplete=JavaFX 运行环境不完整,请尝试更换你的 Java 或者重新安装 OpenJFX。 fatal.javafx.missing=缺少 JavaFX 运行环境,请使用包含 OpenJFX 的 Java 运行环境启动 Hello Minecraft! Launcher。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 -fatal.config_change_owner_root=你正在使用 root 账户启动 Hello Minecraft! Launcher, 这可能导致你未来无法正常使用其他账户正常启动 Hello Minecraft! Launcher。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。\n是否继续启动? +fatal.config_change_owner_root=你正在使用 root 账户启动 Hello Minecraft! Launcher, 这可能导致你未来无法正常使用其他账户正常启动 HMCL。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。\n是否继续启动? fatal.config_in_temp_dir=你正在临时文件夹中启动 Hello Minecraft! Launcher, 你的设置和游戏数据可能会丢失,建议将 HMCL 移动至其他位置再启动。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。\n是否继续启动? -fatal.config_loading_failure=Hello Minecraft! Launcher 无法加载配置文件\n请确保 Hello Minecraft! Launcher 对 "%s" 目录及该目录下的文件拥有读写权限。\n对于 macOS,尝试将 HMCL 放在除「桌面」「下载」「文稿」之外的有权限的地方再试。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 -fatal.config_loading_failure.unix=Hello Minecraft! Launcher 无法加载配置文件,因为配置文件是由用户 %1$s 创建的。\n请使用 root 账户启动 HMCL (不推荐),或在终端中执行以下命令将配置文件的所有权变更为当前用户:\n%2$s\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 -fatal.mac_app_translocation=由于 macOS 的安全机制,Hello Minecraft! Launcher 被系统隔离至临时文件夹中。\n请将 Hello Minecraft! Launcher 移动到其他文件夹后再尝试启动,否则你的设置和游戏数据可能会在重启后丢失。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。\n是否继续启动? -fatal.migration_requires_manual_reboot=Hello Minecraft! Launcher 即将完成升级,请重新打开 Hello Minecraft! Launcher。\n如遇到问题,你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 -fatal.apply_update_failure=我们很抱歉 Hello Minecraft! Launcher 无法自动完成升级,因为出现了一些问题。\n但你依可以从 %s 处手动下载 Hello Minecraft! Launcher 来完成升级\n你可以访问 https://docs.hmcl.net/help.html 网页进行反馈。 -fatal.apply_update_need_win7=Hello Minecraft! Launcher 无法在 Windows XP/Vista 上进行自动更新,请从 %s 处手动下载 Hello Minecraft! Launcher 来完成升级。 -fatal.samba=如果你正在通过 Samba 共享的文件夹中运行 Hello Minecraft! Launcher,启动器可能无法正常工作。请尝试更新你的 Java 或在本地文件夹内运行 Hello Minecraft! Launcher。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 -fatal.illegal_char=由于你的用户文件夹路径中存在非法字符‘=’,你将无法使用外置登录账户以及离线登录更换皮肤功能。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 -fatal.unsupported_platform=Minecraft 尚未为您的平台提供完善支持,所以可能影响游戏体验或无法启动游戏。\n若无法启动 Minecraft 1.17 及以上版本,可以尝试在版本设置中打开“使用 OpenGL 软渲染器”选项,使用 CPU 渲染以获得更好的兼容性。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 +fatal.config_loading_failure=Hello Minecraft! Launcher 无法加载配置文件。\n请确保 HMCL 对“%s”文件夹及该文件夹下的文件拥有读写权限。\n对于 macOS,尝试将 HMCL 放在除“桌面”“下载”“文稿”之外的有权限的地方再试。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 +fatal.config_loading_failure.unix=Hello Minecraft! Launcher 无法加载配置文件,因为配置文件是由用户“%1$s”创建的。\n请使用 root 账户启动 HMCL (不推荐),或在终端中执行以下命令将配置文件的所有权变更为当前用户:\n%2$s\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 +fatal.mac_app_translocation=由于 macOS 的安全机制,Hello Minecraft! Launcher 被系统隔离至临时文件夹中。\n请将 HMCL 移动到其他文件夹后再尝试启动,否则你的设置和游戏数据可能会在重启后丢失。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。\n是否继续启动? +fatal.migration_requires_manual_reboot=Hello Minecraft! Launcher 即将完成升级,请重新打开 HMCL。\n如遇到问题,你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 +fatal.apply_update_failure=我们很抱歉 Hello Minecraft! Launcher 无法自动完成升级,因为出现了一些问题。\n但你依可以从 %s 手动下载 HMCL 来完成升级。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 +fatal.apply_update_need_win7=Hello Minecraft! Launcher 无法在 Windows XP/Vista 上进行自动更新,请从 %s 手动下载 HMCL 来完成升级。 +fatal.samba=如果你正在通过 Samba 共享的文件夹中运行 Hello Minecraft! Launcher,启动器可能无法正常工作。请尝试更新你的 Java 或在本地文件夹内运行 HMCL。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 +fatal.illegal_char=由于你的用户文件夹路径中存在非法字符“=”,你将无法使用外置登录账户以及离线登录更换皮肤功能。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 +fatal.unsupported_platform=Minecraft 尚未对你的平台提供完善支持,所以可能影响游戏体验或无法启动游戏。\n若无法启动 Minecraft 1.17 及更高版本,可以尝试在“(全局/版本特定) 游戏设置 → 高级设置 → 调试选项”中将“渲染器”切换为“软渲染器”,以获得更好的兼容性。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 fatal.unsupported_platform.loongarch=Hello Minecraft! Launcher 已为龙芯提供支持。\n如果遇到问题,你可以点击右上角帮助按钮进行求助。 -fatal.unsupported_platform.osx_arm64=Hello Minecraft! Launcher 已为 Apple Silicon 平台提供支持,使用 ARM 原生 Java 启动游戏以获得更流畅的游戏体验。\n如果你在游戏中遭遇问题,使用 x86-64 架构的 Java 启动游戏可能有更好的兼容性。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 -fatal.unsupported_platform.windows_arm64=Hello Minecraft! Launcher 已为 Windows on Arm 平台提供原生支持。如果你在游戏中遭遇问题,请尝试使用 x86 架构的 Java 启动游戏。\n\n如果你正在使用高通平台,你可能需要安装 OpenGL 兼容包后才能进行游戏。点击链接前往 Microsoft Store 安装兼容包。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 +fatal.unsupported_platform.osx_arm64=Hello Minecraft! Launcher 已为 Apple Silicon 平台提供支持,使用 ARM 原生 Java 启动游戏以获得更流畅的游戏体验。\n如果你在游戏中遇到问题,使用 x86-64 架构的 Java 启动游戏可能有更好的兼容性。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 +fatal.unsupported_platform.windows_arm64=Hello Minecraft! Launcher 已为 Windows on Arm 平台提供原生支持。如果你在游戏中遇到问题,请尝试使用 x86 架构的 Java 启动游戏。\n如果你正在使用 高通 平台,你可能需要安装 OpenGL 兼容包 后才能进行游戏。点击链接前往 Microsoft Store 安装兼容包。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 feedback=反馈 feedback.channel=反馈渠道 feedback.discord=Discord -feedback.discord.statement=欢迎加入 Discord 讨论区,加入后请遵守讨论区规定。 +feedback.discord.statement=欢迎加入 Discord 讨论区,加入后请遵守讨论区规定 feedback.github=GitHub Issue -feedback.github.statement=打开一个 GitHub Issue。 +feedback.github.statement=提交一个 GitHub Issue feedback.qq_group=HMCL 用户群 -feedback.qq_group.statement=欢迎加入 HMCL 用户群,加入后请遵守群规。 +feedback.qq_group.statement=欢迎加入 HMCL 用户群,加入后请遵守群规 file=文件 @@ -403,84 +403,81 @@ folder.saves=存档文件夹 folder.screenshots=截图文件夹 game=游戏 -game.crash.feedback=请不要将本界面截图给他人!如果你要求助他人,请你点击左下角 导出游戏崩溃信息 后将导出的文件发送给他人以供分析。\n你可以点击下方的 帮助 前往交流群寻求帮助。 +game.crash.feedback=请不要将本界面截图给他人!如果你要向他人求助,请你点击左下角“导出游戏崩溃信息”后将导出的文件发送给他人以供分析。\n你可以点击下方的“帮助”前往交流群寻求帮助。 game.crash.info=游戏信息 game.crash.reason=崩溃原因 game.crash.reason.analyzing=分析中…… -game.crash.reason.block=当前游戏因为某个方块不能正常工作,无法继续运行。\n你可以尝试通过 MCEdit 工具编辑存档删除该方块,或者直接删除相应的模组。\n方块类型:%1$s\n方块坐标:%2$s -game.crash.reason.bootstrap_failed=当前游戏因为模组 %1$s 错误,无法继续运行。\n你可以尝试删除或更新该模组以解决问题。 -game.crash.reason.mixin_apply_mod_failed=当前游戏因为 Mixin 无法应用 %1$s 模组,无法继续运行。\n你可以尝试删除或更新该 Mod 以解决问题。 -game.crash.reason.config=当前游戏因为无法解析模组配置文件,无法继续运行\n模组 %1$s 的配置文件 %2$s 无法被解析。 +game.crash.reason.block=当前游戏由于某个方块不能正常工作,无法继续运行。\n你可以尝试通过 MCEdit 工具编辑存档删除该方块,或者直接删除相应的模组。\n方块类型:%1$s\n方块坐标:%2$s +game.crash.reason.bootstrap_failed=当前游戏由于模组“%1$s”出现问题,无法继续运行。\n你可以尝试删除或更新该模组以解决问题。 +game.crash.reason.mixin_apply_mod_failed=当前游戏由于 Mixin 无法应用于“%1$s”模组,无法继续运行。\n你可以尝试删除或更新该模组以解决问题。 +game.crash.reason.config=当前游戏由于无法解析模组配置文件,无法继续运行。\n无法解析模组“%1$s”的配置文件“%2$s”。 game.crash.reason.multiple=检测到多个原因:\n\n -game.crash.reason.debug_crash=当前游戏因为手动触发崩溃,无法继续运行。\n事实上游戏并没有问题,问题都是你造成的! -game.crash.reason.duplicated_mod=当前游戏因为模组 %1$s 重复安装,无法继续运行。\n%2$s\n每种模组只能安装一个,请你删除多余的模组再试。 -game.crash.reason.entity=当前游戏因为某个实体不能正常工作,无法继续运行。\n你可以尝试通过 MCEdit 工具编辑存档删除该实体,或者直接删除相应的模组。\n实体类型:%1$s\n实体坐标:%2$s -game.crash.reason.fabric_version_0_12=Fabric 0.12 及以上版本与当前已经安装的模组可能不兼容,你需要将 Fabric 降级至 0.11.7。 +game.crash.reason.debug_crash=当前游戏由于手动触发崩溃,无法继续运行。\n事实上游戏并没有问题,问题都是你造成的! +game.crash.reason.duplicated_mod=当前游戏由于模组“%1$s”重复安装,无法继续运行。\n%2$s\n每种模组只能安装一个,请你删除多余的模组再试。 +game.crash.reason.entity=当前游戏由于某个实体不能正常工作,无法继续运行。\n你可以尝试通过 MCEdit 工具编辑存档删除该实体,或者直接删除相应的模组。\n实体类型:%1$s\n实体坐标:%2$s +game.crash.reason.fabric_version_0_12=Fabric Loader 0.12 及更高版本与当前已经安装的模组可能不兼容,你需要将 Fabric Loader 降级至 0.11.7。 game.crash.reason.fabric_warnings=Fabric 提供了一些警告信息:\n%1$s -game.crash.reason.file_already_exists=当前游戏因为文件 %1$s 已经存在,无法继续运行。\n如果你认为这个文件可以删除,你可以在备份这个文件后尝试删除它,并重新启动游戏。 -game.crash.reason.file_changed=当前游戏因为文件校验失败,无法继续运行。\n如果你手动修改了 Minecraft.jar 文件,你需要回退修改,或者重新下载游戏。 -game.crash.reason.gl_operation_failure=当前游戏因为你使用的某些模组、光影包、材质包,无法继续运行。\n请先尝试禁用你所使用的模组/光影包/材质包再试。 -game.crash.reason.graphics_driver=当前游戏因为显卡驱动问题而崩溃,请尝试以下操作:\n\ - - 如果你的电脑存在独立显卡,请尝试使用 独立显卡 而非 Intel 核显启动 HMCL 与游戏 详情 ;\n\ - - 尝试升级你的 显卡驱动 到最新版本,或回退到出厂版本;\n\ - - 如果你确实需要使用核芯显卡,请检查你的电脑的 CPU 是否是 Intel(R) Core(TM) 3000 系列或更旧的处理器,如果是,对于 Minecraft 1.16.5 及更旧版本,请你将游戏所使用的 Java 版本降级至 1.8.0_51 及以下版本 Java 1.8.0 历史版本 ,否则请跳过;\n\ - - 在全局(特定)游戏设置,高级设置中打开“使用 OpenGL 软渲染器”(开启此选项后帧数会显著降低,仅推荐在以调试为目的或应急时开启)。\n\ +game.crash.reason.file_already_exists=当前游戏由于文件“%1$s”已经存在,无法继续运行。\n如果你认为这个文件可以删除,你可以在备份这个文件后尝试删除它,并重新启动游戏。 +game.crash.reason.file_changed=当前游戏由于文件校验失败,无法继续运行。\n如果你手动修改了 Minecraft.jar 文件,你需要回退修改,或者重新下载游戏。 +game.crash.reason.gl_operation_failure=当前游戏由于你使用的某些模组/光影包/资源包有问题,导致无法继续运行。\n请先尝试禁用你所使用的模组/光影包/资源包再试。 +game.crash.reason.graphics_driver=当前游戏由于显卡驱动问题而崩溃,请尝试以下操作:\n\ + \ · 如果你的电脑存在独立显卡,请尝试使用独立显卡而非 Intel 核显启动 HMCL 与游戏;详情\n\ + \ · 尝试升级你的显卡驱动到最新版本,或回退到出厂版本;\n\ + \ · 如果你确实需要使用核芯显卡,请检查你电脑的 CPU 是否为 Intel(R) Core(TM) 3000 系列或更旧的处理器。如果是,对于 Minecraft 1.16.5 及更旧版本,请你将游戏所使用的 Java 降级至 1.8.0_51 及更低版本,否则请跳过;Java 1.8.0 历史版本\n\ 如果仍有问题,你可能需要考虑换一张新显卡或一台新电脑。 -game.crash.reason.macos_failed_to_find_service_port_for_display=当前游戏因为 Apple silicon 平台下初始化 OpenGL 窗口失败,无法继续运行。\n对于该问题,HMCL 暂无直接性的解决方案。请您尝试任意打开一个浏览器并全屏,然后再回到 HMCL 启动游戏,在弹出游戏窗口前迅速切回浏览器页面,等待游戏窗口出现后再切回游戏窗口。 -game.crash.reason.illegal_access_error=当前游戏因为某些模组的问题,无法继续运行。\n如果你认识:%1$s,你可以更新或删除对应模组再试。 -game.crash.reason.install_mixinbootstrap=当前游戏因为缺失 MixinBootstrap,无法继续运行。\n你可以尝试安装 MixinBootstrap 解决该问题。若安装后崩溃,尝试在该模组的文件名前加入英文“!”尝试解决。 -game.crash.reason.need_jdk11=当前游戏因为 Java 虚拟机版本不合适,无法继续运行。\n你需要下载安装 Java 11,并在全局(特定)游戏设置中将 Java 设置为 11 开头的版本。 -game.crash.reason.jdk_9=当前游戏因为 Java 版本过高,无法继续运行。\n你需要下载安装 Java 8,并在全局(特定)游戏设置中将 Java 设置为 1.8 的版本。 -game.crash.reason.jvm_32bit=当前游戏因为内存分配过大,超过了 32 位 Java 内存限制,无法继续运行。\n如果你的电脑是 64 位系统,请下载安装并更换 64 位 Java。下载 Java\n如果你的电脑是 32 位系统,你或许可以重新安装 64 位系统,或换一台新电脑。\n或者,你可以关闭游戏内存的自动分配,并且把内存限制调节为 1024 MB 或以下。 -game.crash.reason.loading_crashed_forge=当前游戏因为模组 %1$s (%2$s) 错误,无法继续运行。\n你可以尝试删除或更新该模组以解决问题。 -game.crash.reason.loading_crashed_fabric=当前游戏因为模组 %1$s 错误,无法继续运行。\n你可以尝试删除或更新该模组以解决问题。 -game.crash.reason.memory_exceeded=当前游戏因为分配的内存过大,无法继续运行。\n该问题是由于系统页面文件太小导致的。\n你需要在全局(特定)游戏设置中关闭游戏内存的自动分配,并将游戏内存调低至游戏能正常启动为止。\n你还可以尝试将 虚拟内存 设置调整至「自动管理所有驱动器分页文件大小」,详情。 -game.crash.reason.mac_jdk_8u261=当前游戏因为你所使用的 Forge 或 OptiFine 与 Java 冲突崩溃。\n请尝试更新 Forge 和 OptiFine,或使用 Java 8u251 及更早版本启动。 -game.crash.reason.mod=当前游戏因为 %1$s 的问题,无法继续运行。\n你可以更新或删除已经安装的 %1$s 再试。 -game.crash.reason.mod_resolution=当前游戏因为 Mod 依赖问题,无法继续运行。Fabric 提供了如下信息:\n%1$s -game.crash.reason.mod_resolution_collection=当前游戏因为前置 Mod 版本不匹配,无法继续运行。\n%1$s 需要前置 Mod:%2$s 才能继续运行。\n这表示你需要更新或降级前置。你可以到下载页的模组下载,或到网上下载 %3$s。 -game.crash.reason.mod_resolution_conflict=当前游戏因为 Mod 冲突,无法继续运行。\n%1$s 与 %2$s 不能兼容。 -game.crash.reason.mod_resolution_missing=当前游戏因为缺少 Mod 前置,无法继续运行。\n%1$s 需要前置 Mod:%2$s 才能继续运行。\n这表示你少安装了 Mod,或该 Mod 版本不够。你可以到下载页的模组下载,或到网上下载 %3$s。 -game.crash.reason.mod_resolution_missing_minecraft=当前游戏因为 Mod 和 Minecraft 游戏版本不匹配,无法继续运行。\n%1$s 需要 Minecraft %2$s 才能运行。\n如果你要继续使用你已经安装的 Mod,你可以选择安装对应的 Minecraft 版本;如果你要继续使用当前 Minecraft 版本,你需要安装对应版本的 Mod。 +game.crash.reason.macos_failed_to_find_service_port_for_display=当前游戏由于 Apple Silicon 平台下初始化 OpenGL 窗口失败,无法继续运行。\n对于该问题,HMCL 暂无直接性的解决方案。请你尝试任意打开一个浏览器并全屏,然后再回到 HMCL 启动游戏,在弹出游戏窗口前迅速切回浏览器页面,等待游戏窗口出现后再切回游戏窗口。 +game.crash.reason.illegal_access_error=当前游戏由于某些模组的问题,无法继续运行。\n如果你认识“%1$s”,你可以更新或删除对应模组再试。 +game.crash.reason.install_mixinbootstrap=当前游戏由于缺失 MixinBootstrap,无法继续运行。\n你可以尝试安装 MixinBootstrap 解决该问题。若安装后崩溃,尝试在该模组的文件名前加入半角感叹号 (!) 尝试解决。 +game.crash.reason.need_jdk11=当前游戏由于 Java 虚拟机版本不合适,无法继续运行。\n你需要下载安装 Java 11,并在“(全局/版本特定) 游戏设置 → 游戏 Java”中将 Java 设置为 11 开头的版本。 +game.crash.reason.jdk_9=当前游戏由于 Java 版本过高,无法继续运行。\n你需要下载安装 Java 8,并在“(全局/版本特定) 游戏设置 → 游戏 Java”中将 Java 设置为 1.8 的版本。 +game.crash.reason.jvm_32bit=当前游戏由于内存分配过大,超过了 32 位 Java 内存限制,无法继续运行。\n如果你的电脑是 64 位系统,请下载安装并更换 64 位 Java。下载 Java\n如果你的电脑是 32 位系统,你或许可以重新安装 64 位系统,或换一台新电脑。\n或者,你可以在“(全局/版本特定) 游戏设置 → 游戏内存”中关闭“自动分配内存”,并且把内存限制调节为 1024 MB 或以下。 +game.crash.reason.loading_crashed_forge=当前游戏由于模组“%1$s (%2$s)”错误,无法继续运行。\n你可以尝试删除或更新该模组以解决问题。 +game.crash.reason.loading_crashed_fabric=当前游戏由于模组“%1$s”错误,无法继续运行。\n你可以尝试删除或更新该模组以解决问题。 +game.crash.reason.memory_exceeded=当前游戏由于分配的内存过大,无法继续运行。\n该问题是由于系统页面文件太小导致的。\n你需要在全局(特定)游戏设置中关闭游戏内存的自动分配,并将游戏内存调低至游戏能正常启动为止。\n你还可以尝试将 虚拟内存 设置调整至「自动管理所有驱动器分页文件大小」,详情。 +game.crash.reason.mac_jdk_8u261=当前游戏由于你所使用的 Forge/OptiFine 与 Java 冲突而崩溃。\n请尝试更新 Forge/OptiFine,或使用 Java 8u251 及更早版本启动。 +game.crash.reason.mod=当前游戏由于“%1$s”的问题,无法继续运行。\n你可以更新或删除已经安装的“%1$s”再试。 +game.crash.reason.mod_resolution=当前游戏由于模组依赖问题,无法继续运行。Fabric 提供了如下信息:\n%1$s +game.crash.reason.mod_resolution_collection=当前游戏由于前置模组版本不匹配,无法继续运行。\n“%1$s”需要前置模组“%2$s”才能继续运行。\n这表示你需要更新或降级前置。你可以前往“下载 → 模组”页面下载,或到网上下载“%3$s”。 +game.crash.reason.mod_resolution_conflict=当前游戏由于模组冲突,无法继续运行。\n“%1$s”与“%2$s”不兼容。 +game.crash.reason.mod_resolution_missing=当前游戏由于缺少前置模组,无法继续运行。\n“%1$s”需要前置模组“%2$s”才能继续运行。\n这表示你少安装了模组,或该模组版本不够。你可以前往“下载 → 模组”页面下载,或到网上下载“%3$s”。 +game.crash.reason.mod_resolution_missing_minecraft=当前游戏由于模组和 Minecraft 游戏版本不匹配,无法继续运行。\n“%1$s”需要 Minecraft %2$s 才能运行。\n如果你要继续使用你已经安装的模组,你可以选择安装对应的 Minecraft 版本;如果你要继续使用当前 Minecraft 版本,你需要安装对应版本的模组。 game.crash.reason.mod_resolution_mod_version=%1$s (版本号 %2$s) game.crash.reason.mod_resolution_mod_version.any=%1$s (任意版本) -game.crash.reason.forge_repeat_installation=当前游戏因为 Forge 重复安装,无法继续运行。此为已知问题\n建议将日志上传反馈至 GitHub ,以便我们找到更多线索并修复此问题。\n目前你可以到 自动安装 里头卸载 Forge 并重新安装。 -game.crash.reason.optifine_repeat_installation=当前游戏因为 Optifine 重复安装,无法继续运行。\n请删除 Mod 文件夹下的 Optifine 或前往 游戏管理-自动安装 卸载自动安装的 Optifine。 -game.crash.reason.forgemod_resolution=当前游戏因为模组依赖问题,无法继续运行。Forge 提供了如下信息:\n%1$s -game.crash.reason.forge_found_duplicate_mods=当前游戏因为模组重复问题,无法继续运行。Forge 提供了如下信息:\n%1$s -game.crash.reason.modmixin_failure=当前游戏因为某些 Mod 注入失败,无法继续运行。\n这一般代表着该 Mod 存在 Bug,或与当前环境不兼容。\n你可以查看日志寻找出错模组。 -game.crash.reason.night_config_fixes=当前游戏因为 Night Config 库的一些问题,无法继续运行。\n你可以尝试安装 Night Config Fixes 模组,这或许能帮助你解决这个问题。\n了解更多,可访问该模组的 GitHub 仓库。 -game.crash.reason.forge_error=Forge 可能已经提供了错误信息。\n你可以查看日志,并根据错误报告中的日志信息进行对应处。\n如果没有看到报错信息,可以查看错误报告了解错误具体是如何发生的。\n%1$s -game.crash.reason.mod_resolution0=当前游戏因为一些模组出现问题,无法继续运行。\n你可以查看日志寻找出错模组。 -game.crash.reason.fabric_reports_an_error_and_gives_a_solution=Fabric 可能已经提供了错误信息。\n你可以查看日志,并根据错误报告中的日志信息进行对应处。\n如果没有看到报错信息,可以查看错误报告了解错误具体是如何发生的。 -game.crash.reason.java_version_is_too_high=当前游戏因为 Java 虚拟机版本过高,无法继续运行。\n请在全局(特定)游戏设置的 Java 路径选项卡中改用较低版本的 Java,然后再启动游戏。\n如果没有,可以从 java.com(Java8)BellSoft Liberica Full JRE(Java17) 等平台下载、安装一个(安装完后需重启启动器)。 -game.crash.reason.mod_name=当前游戏因为模组文件名称问题,无法继续运行。\n模组文件名称应只使用英文全半角的大小写字母(Aa~Zz)、数字(0~9)、横线(-)、下划线(_)和点(.)。\n请到模组文件夹中将所有不合规的模组文件名称添加一个上述的合规的字符。 -game.crash.reason.incomplete_forge_installation=当前游戏因为 Forge / NeoForge 安装不完整,无法继续运行。\n请在 版本设置 - 自动安装 中卸载 Forge 并重新安装。 -game.crash.reason.optifine_is_not_compatible_with_forge=当前游戏因为 OptiFine 与当前版本的 Forge 不兼容,导致了游戏崩溃。\n点击 此处 查看 OptiFine 所兼容的 Forge 版本,并严格按照对应版本重新安装游戏或在 版本设置 - 自动安装 中更换版本。\n经测试,Forge 版本过高或过低都可能导致崩溃。 -game.crash.reason.mod_files_are_decompressed=当前游戏因为模组文件被解压了,无法继续运行。\n请直接把整个模组文件放进模组文件夹中即可。\n解压模组会导致游戏出错,请删除模组文件夹中已被解压的模组,然后再启动游戏。 -game.crash.reason.shaders_mod=当前游戏因为同时安装了 OptiFine 和 Shaders 模组,无法继续运行。\n因为 OptiFine 已集成 Shaders 模组的功能,只需删除 Shaders 模组即可。 -game.crash.reason.rtss_forest_sodium=当前游戏因为 RivaTuner Statistics Server (RTSS) 与 Sodium 不兼容,导致了游戏崩溃。\n点击 此处 查看详情。 -game.crash.reason.too_many_mods_lead_to_exceeding_the_id_limit=当前游戏因为您所安装的模组过多,超出了游戏的 ID 限制,无法继续运行。\n请尝试安装 JEID 等修复模组,或删除部分大型模组。 -game.crash.reason.optifine_causes_the_world_to_fail_to_load=当前游戏可能因为 OptiFine ,无法继续运行。\n该问题只在特定 OptiFine 版本中出现,你可以尝试在 版本设置 - 自动安装 中更换 OptiFine 的版本。 -game.crash.reason.modlauncher_8=当前游戏因为您所使用的 Forge 版本与当前使用的 Java 冲突崩溃,请尝试更新 Forge 到 36.2.26 或更高版本或换用版本低于 1.8.0.320 的 Java,Liberica JDK 8u312+7。 -game.crash.reason.no_class_def_found_error=当前游戏因为代码不完整,无法继续运行。\n你的游戏可能缺失了某个模组,或者某些模组文件不完整,或者模组与游戏的版本不匹配。\n你可能需要重新安装游戏和模组,或请求他人帮助。\n缺失:\n%1$s -game.crash.reason.no_such_method_error=当前游戏因为代码不完整,无法继续运行。\n你的游戏可能缺失了某个模组,或者某些模组文件不完整,或者模组与游戏的版本不匹配。\n你可能需要重新安装游戏和模组,或请求他人帮助。 -game.crash.reason.opengl_not_supported=当前游戏因为你的显卡驱动存在问题,无法继续运行。\n原因是 OpenGL 不受支持,你现在是否在远程桌面或者串流模式下?如果是,请直接使用原电脑启动游戏。\n或者尝试升级你的显卡驱动到最新版本后再尝试启动游戏。如果你的电脑存在独立显卡,你需要检查游戏是否使用集成/核心显卡启动,如果是,请尝试使用独立显卡启动 HMCL 与游戏。如果仍有问题,你可能需要考虑换一个新显卡或新电脑。 -game.crash.reason.openj9=当前游戏无法运行在 OpenJ9 虚拟机上,请你在全局(特定)游戏设置中更换 Hotspot Java 虚拟机,并重新启动游戏。如果没有下载安装,你可以在网上自行下载。 -game.crash.reason.out_of_memory=当前游戏因为内存不足,无法继续运行。\n这可能是内存分配太小,或者模组数量过多导致的。\n你可以在全局(特定)游戏设置中调大游戏内存分配值以允许游戏在更大的内存下运行。\n如果仍然出现该错误,你可能需要换一台更好的电脑。 -game.crash.reason.resolution_too_high=当前游戏因为材质包分辨率过高,无法继续运行\n你可以更换一个分辨率更低的材质,或者更换一个显存更大的显卡。 +game.crash.reason.forge_repeat_installation=当前游戏由于 Forge 重复安装,无法继续运行。此为已知问题\n建议将日志上传并反馈至 GitHub,以便我们找到更多线索并修复此问题。\n目前你可以在“版本管理 → 自动安装”中卸载 Forge 并重新安装。 +game.crash.reason.optifine_repeat_installation=当前游戏由于 OptiFine 重复安装,无法继续运行。\n请删除模组文件夹下的 OptiFine 或前往“版本管理 → 自动安装”卸载安装的 OptiFine。 +game.crash.reason.forgemod_resolution=当前游戏由于模组依赖问题,无法继续运行。Forge/NeoForge 提供了如下信息:\n%1$s +game.crash.reason.forge_found_duplicate_mods=当前游戏由于模组重复安装,无法继续运行。Forge/NeoForge 提供了如下信息:\n%1$s +game.crash.reason.modmixin_failure=当前游戏由于某些模组注入失败,无法继续运行。\n这一般代表着该模组存在问题,或与当前环境不兼容。\n你可以查看日志寻找出错模组。 +game.crash.reason.night_config_fixes=当前游戏由于 Night Config 库的一些问题,无法继续运行。\n你可以尝试安装 Night Config Fixes 模组,这或许能帮助你解决这个问题。\n更多详情,可访问该模组的 GitHub 仓库。 +game.crash.reason.forge_error=Forge/NeoForge 可能已经提供了错误信息。\n你可以查看日志,并根据错误报告中的日志信息进行对应处理。\n如果没有看到报错信息,可以查看错误报告了解错误具体是如何发生的。\n%1$s +game.crash.reason.mod_resolution0=当前游戏由于一些模组出现问题,无法继续运行。\n你可以查看日志寻找出错模组。 +game.crash.reason.java_version_is_too_high=当前游戏由于 Java 虚拟机版本过高,无法继续运行。\n请在“(全局/版本特定) 游戏设置 → 游戏 Java”中改用较低版本的 Java,然后再启动游戏。\n如果没有,可以从 java.com (Java 8)BellSoft Liberica Full JRE (Java 17) 等平台下载、安装一个 (安装完后需重启启动器)。 +game.crash.reason.mod_name=当前游戏由于模组文件名称问题,无法继续运行。\n模组文件名称应只使用半角的大小写字母 (Aa~Zz)、数字 (0~9)、横线 (-)、下划线 (_)和点 (.)。\n请到模组文件夹中将所有不合规的模组文件名修改为上述合规字符。 +game.crash.reason.incomplete_forge_installation=当前游戏由于 Forge/NeoForge 安装不完整,无法继续运行。\n请在“版本管理 → 自动安装”中卸载 Forge 并重新安装。 +game.crash.reason.optifine_is_not_compatible_with_forge=当前游戏由于 OptiFine 与当前版本的 Forge 不兼容,导致游戏崩溃。\n点击 此处 查看 OptiFine 所兼容的 Forge 版本,并严格按照对应版本重新安装游戏或在“版本管理 → 自动安装”中更换版本。\n经测试,Forge 版本过高或过低都可能导致崩溃。 +game.crash.reason.mod_files_are_decompressed=当前游戏由于模组文件被解压了,无法继续运行。\n请直接把整个模组文件放进模组文件夹中即可。\n解压模组会导致游戏出错,请删除模组文件夹中已被解压的模组,然后再启动游戏。 +game.crash.reason.shaders_mod=当前游戏由于同时安装了 OptiFine 和 Shaders 模组,无法继续运行。\n由于 OptiFine 已集成 Shaders 模组的功能,所以只需删除 Shaders 模组即可。 +game.crash.reason.rtss_forest_sodium=当前游戏由于 RivaTuner Statistics Server (RTSS) 与 Sodium 不兼容,导致游戏崩溃。\n点击 此处 查看详情。 +game.crash.reason.too_many_mods_lead_to_exceeding_the_id_limit=当前游戏由于你所安装的模组过多,超出了游戏的 ID 限制,无法继续运行。\n请尝试安装 JEID 等修复模组,或删除部分大型模组。 +game.crash.reason.optifine_causes_the_world_to_fail_to_load=当前游戏可能由于 OptiFine 而无法继续运行。\n该问题只在特定 OptiFine 版本中出现,你可以尝试在“版本管理 → 自动安装”中更换 OptiFine 的版本。 +game.crash.reason.modlauncher_8=当前游戏由于你所使用的 Forge 版本与当前使用的 Java 冲突而崩溃,请尝试更新 Forge 到 36.2.26 或更高版本或换用版本低于 1.8.0.320 的 Java。Liberica JDK 8u312+7 +game.crash.reason.no_class_def_found_error=当前游戏由于代码不完整,无法继续运行。\n你的游戏可能缺失了某个模组,或者某些模组文件不完整,或者模组与游戏的版本不匹配。\n你可能需要重新安装游戏和模组,或寻求他人帮助。\n缺失:\n%1$s +game.crash.reason.no_such_method_error=当前游戏由于代码不完整,无法继续运行。\n你的游戏可能缺失了某个模组,或者某些模组文件不完整,或者模组与游戏的版本不匹配。\n你可能需要重新安装游戏和模组,或寻求他人帮助。 +game.crash.reason.opengl_not_supported=当前游戏由于你的显卡驱动存在问题,无法继续运行。\n原因是 OpenGL 不受支持,你现在是否在远程桌面或者串流模式下?如果是,请直接使用原电脑启动游戏。\n或者尝试升级你的显卡驱动到最新版本后再尝试启动游戏。如果你的电脑存在独立显卡,你需要检查游戏是否使用集成/核心显卡启动,如果是,请尝试使用独立显卡启动 HMCL 与游戏。如果仍有问题,你可能需要考虑换一个新显卡或新电脑。 +game.crash.reason.openj9=当前游戏无法在 OpenJ9 虚拟机上运行,请你在“(全局/版本特定) 游戏设置 → 游戏 Java”中更换 Hotspot Java 虚拟机,并重新启动游戏。如果没有下载安装,你可以在网上自行下载。 +game.crash.reason.out_of_memory=当前游戏由于内存不足,无法继续运行。\n这可能是内存分配太小,或者模组数量过多导致的。\n你可以在全局(特定)游戏设置中调大游戏内存分配值以允许游戏在更大的内存下运行。\n如果仍然出现该错误,你可能需要换一台更好的电脑。 +game.crash.reason.resolution_too_high=当前游戏由于材质包分辨率过高,无法继续运行\n你可以更换一个分辨率更低的材质,或者更换一个显存更大的显卡。 game.crash.reason.stacktrace=原因未知,请点击日志按钮查看详细信息。\n下面是一些关键词,其中可能包含模组名称,你可以通过搜索的方式查找有关信息。\n%s -game.crash.reason.too_old_java=当前游戏因为 Java 虚拟机版本过低,无法继续运行。\n你需要在全局(特定)游戏设置中更换 Java %1$s 或更新版本的 Java 虚拟机,并重新启动游戏。如果没有下载安装,你可以点击 此处 下载 Liberica JDK。 +game.crash.reason.too_old_java=当前游戏由于 Java 虚拟机版本过低,无法继续运行。\n你需要在“(全局/版本特定) 游戏设置 → 游戏 Java”中更换 Java %1$s 或更新版本的 Java 虚拟机,并重新启动游戏。如果没有下载安装,你可以点击 此处 下载 Microsoft JDK。 game.crash.reason.unknown=原因未知,请点击日志按钮查看详细信息。 -game.crash.reason.unsatisfied_link_error=当前游戏因为缺少本地库,无法继续运行。\n这些本地库缺失:%1$s。\n如果你在全局(特定)游戏设置中修改了本地库路径选项,请你修改回预设模式。\n如果你正在使用预设模式,请检查游戏路径是否只包含英文大小写字母,数字,下划线,\n如果是,那么请检查是否是由于模组或者 HMCL 导致了本地库缺失的问题。如果你确定是 HMCL 引起的,建议你向我们反馈。\n你可以尝试在控制在 控制面板 时钟和区域 区域 管理 更改系统区域设置 中将 当前系统区域设置选项卡修改为:中文(简体,中国),并且把 使用Unicode UTF-8提供全球语言支持 关闭;\n或将游戏路径中的所有 非英文字符的名称 修改为 英文字符(例如中文,空格等)\n如果你确实需要自定义本地库路径,你需要保证其中包含缺失的本地库! -game.crash.reason.failed_to_load_a_library=当前游戏因为加载本地库失败,无法继续运行。\n如果你在全局(特定)游戏设置中修改了本地库路径选项,请你修改回预设模式。\n如果已经在预设模式下,请检查本地库缺失是否是 Mod 引起的,或由 HMCL 引起的。如果你确定是 HMCL 引起的,建议你向我们反馈。\n你可以尝试在控制在 控制面板 时钟和区域 区域 管理 更改系统区域设置 中将 当前系统区域设置选项卡修改为:中文(简体,中国),并且把 使用Unicode UTF-8提供全球语言支持 关闭;\n或将游戏路径中的所有 非英文字符的名称 修改为 英文字符(例如中文,空格等)\n如果你确实需要自定义本地库路径,你需要保证其中包含缺失的本地库! +game.crash.reason.unsatisfied_link_error=当前游戏由于缺少本地库,无法继续运行。\n这些本地库缺失:%1$s。\n如果你在“(全局/版本特定) 游戏设置 → 高级设置”中修改了本地库路径选项,请你修改回默认模式。\n如果你正在使用默认模式,请检查游戏文件夹路径是否只包含英文字母、数字和下划线,\n如果是,那么请检查是否为模组或 HMCL 导致了本地库缺失的问题。如果你确定是 HMCL 引起的,建议你向我们反馈。\n对于 Windows 用户,你还可以尝试在“控制面板 → 时钟和区域 → 区域 → 管理 → 更改系统区域设置”中将“当前系统区域设置”修改为“中文(简体,中国大陆)”,并关闭“Beta 版:使用 Unicode UTF-8 提供全球语言支持”选项;\n或将游戏文件夹路径中的所有非英文字符的名称 (例如中文、空格等) 修改为英文字符。\n如果你确实需要自定义本地库路径,你需要保证其中包含缺失的本地库! game.crash.title=游戏意外退出 -game.directory=游戏路径 +game.directory=游戏文件夹路径 game.version=游戏版本 help=帮助 help.doc=Hello Minecraft! Launcher 帮助文档 -help.detail=可查阅数据包、整合包制作指南等内容。 +help.detail=可查阅数据包、整合包制作指南等内容 input.email=用户名必须是邮箱 input.number=必须是数字 @@ -495,35 +492,35 @@ install.failed.downloading=安装失败,部分文件未能完成下载 install.failed.downloading.detail=未能下载文件:%s install.failed.downloading.timeout=下载超时:%s install.failed.install_online=无法识别要安装的组件。如果你要安装模组,你需要在模组管理页面安装模组。 -install.failed.malformed=下载的文件格式损坏。您可以在设置-下载中切换到其他下载源来尝试解决此问题。 -install.failed.optifine_conflict=暂不支持 OptiFine, Fabric 或 OptiFine , Forge 同时安装在 Minecraft 1.13 及以上版本 -install.failed.optifine_forge_1.17=Minecraft 1.17.1 下,仅 OptiFine H1 Pre2 及以上版本能兼容 Forge。你可以从 OptiFine 测试版中选择最新版本。 +install.failed.malformed=下载的文件已损坏。你可以在“设置 → 下载 → 下载源”中切换其他下载源来尝试解决此问题。 +install.failed.optifine_conflict=暂不支持在 Minecraft 1.13 及更高版本同时安装 OptiFine 与 Fabric。 +install.failed.optifine_forge_1.17=对于 Minecraft 1.17.1 版本,仅 OptiFine H1 pre2 及更高版本与 Forge 兼容。你可以在 OptiFine 预览版 (Preview versions) 中选择最新版本。 install.failed.version_mismatch=该组件需要的游戏版本为 %s,但实际的游戏版本为 %s。 install.installer.change_version=%s 与当前游戏不兼容,请更换版本 install.installer.choose=选择 %s 版本 install.installer.depend=需要先安装 %s install.installer.fabric=Fabric install.installer.fabric-api=Fabric API -install.installer.fabric-api.warning=警告:Fabric API 是一个模组,将会被安装到新游戏的模组文件夹,请你在安装游戏后不要修改当前游戏的版本隔离/游戏运行路径设置,如果你在之后修改了相关设置,Fabric API 需要被重新安装。 +install.installer.fabric-api.warning=警告:Fabric API 是一个模组,将会被安装到新游戏的模组文件夹,请你在安装游戏后不要修改当前游戏的“运行路径”设置,如果你在之后修改了相关设置,则需要重新安装 Fabric API。 install.installer.forge=Forge install.installer.neoforge=NeoForge install.installer.game=Minecraft install.installer.incompatible=与 %s 不兼容 install.installer.install=安装 %s install.installer.install_offline=从本地文件安装/升级 -install.installer.install_offline.extension=Forge/OptiFine 安装器 -install.installer.install_offline.tooltip=支持导入已经下载好的 Forge/OptiFine 安装器 +install.installer.install_offline.extension=(Neo)Forge/OptiFine 安装器 +install.installer.install_offline.tooltip=支持导入已经下载好的 (Neo)Forge/OptiFine 安装器 install.installer.install_online=在线安装 -install.installer.install_online.tooltip=支持安装 Fabric、Forge、OptiFine、LiteLoader +install.installer.install_online.tooltip=支持安装 Forge、NeoForge、Fabric、Quilt、LiteLoader 和 OptiFine install.installer.liteloader=LiteLoader install.installer.not_installed=不安装 install.installer.optifine=OptiFine install.installer.quilt=Quilt install.installer.quilt-api=QSL/QFAPI install.installer.version=%s -install.installer.external_version=%s 由外部安装的版本,无法卸载或更换 +install.installer.external_version=%s (由外部安装的版本,无法卸载或更换) install.modpack=安装整合包 -install.new_game=安装新游戏版本 +install.new_game=安装新游戏 install.new_game.already_exists=此版本已经存在,请换一个名字 install.new_game.current_game_version=当前游戏版本 install.new_game.malformed=名字不合法 @@ -533,7 +530,7 @@ install.success=安装成功 java.add=添加 Java java.add.failed=Java 无效或与当前平台不兼容。 java.disable=禁用此 Java -java.disable.confirm=您确定要禁用此 Java 吗? +java.disable.confirm=你确定要禁用此 Java 吗? java.disabled.management=管理已禁用的 Java java.disabled.management.remove=从列表中移除此 Java java.disabled.management.restore=重新启用此 Java @@ -556,48 +553,48 @@ java.install.failed.invalid=该压缩包不是合法的 Java 安装包,无法 java.install.failed.unsupported_platform=此 Java 与当前平台不兼容,无法安装。 java.install.name=名称 java.install.warning.invalid_character=名称中包含非法字符 -java.reveal=浏览 Java 目录 +java.reveal=浏览 Java 文件夹 java.uninstall=卸载此 Java -java.uninstall.confirm=您确定要卸载此 Java 吗?此操作无法撤销! +java.uninstall.confirm=你确定要卸载此 Java 吗?此操作无法撤销! -lang=简体中文 +lang=简体中文 (中国大陆) lang.default=跟随系统语言 -launch.advice=%s是否继续启动? +launch.advice==%s 是否继续启动? launch.advice.multi=检测到以下问题:\n\n%s\n\n这些问题可能导致游戏无法正常启动或影响游戏体验,是否继续启动?\n你可以点击右上角帮助按钮进行求助。 -launch.advice.java.auto=当前选择的 Java 虚拟机版本不满足游戏要求\n点击“是”即可由 HMCL 来自动选取合适的 Java 虚拟机版本\n或者你可以到全局(特定)游戏设置中选择一个合适的 Java 虚拟机版本。 -launch.advice.java.modded_java_7=Minecraft 1.7.2 及以下版本需要 Java 7 及以下版本。 -launch.advice.corrected=我们已经修复了 Java 虚拟机版本问题。如果您确实希望使用您自定义的 Java 虚拟机,您可以在全局(特定)游戏设置往下滑,关闭 Java 虚拟机兼容性检查。 -launch.advice.uncorrected=如果您确实希望使用您自定义的 Java 虚拟机,您可以在全局(特定)游戏设置往下滑,关闭 Java 虚拟机兼容性检查 +launch.advice.java.auto=当前选择的 Java 虚拟机版本不满足游戏要求。\n点击“是”即可由 HMCL 来自动选取合适的 Java 虚拟机版本。\n或者你可以在“(全局/版本特定) 游戏设置 → 游戏 Java”中选择一个合适的 Java 虚拟机版本。 +launch.advice.java.modded_java_7=Minecraft 1.7.2 及更低版本需要 Java 7 及更低版本。 +launch.advice.corrected=我们已经修复了 Java 虚拟机版本问题。如果你确实希望使用你自定义的 Java 虚拟机,你可以在“(全局/版本特定) 游戏设置 → 高级设置”中往下滑,启用“不检查 JVM 与游戏的兼容性”。 +launch.advice.uncorrected=如果你确实希望使用你自定义的 Java 虚拟机,你可以在“(全局/版本特定) 游戏设置 → 高级设置”中往下滑,启用“不检查 JVM 与游戏的兼容性”。 launch.advice.different_platform=你正在使用 32 位 Java 启动游戏,建议更换至 64 位 Java。 -launch.advice.forge2760_liteloader=Forge 2760 与 LiteLoader 不兼容,请更新 Forge 至 2773 或更新的版本。 -launch.advice.forge28_2_2_optifine=Forge 28.2.2 或更高版本与 OptiFine 不兼容。请将 Forge 降级至 28.2.1 或更低版本。 -launch.advice.forge37_0_60=Forge 低于 37.0.60 的版本不兼容 Java 17。请更新 Forge 到 37.0.60 或更高版本,或者使用 Java 16 启动游戏。 -launch.advice.java8_1_13=Minecraft 1.13 及以上版本只能运行在 Java 8 或更高版本上,请使用 Java 8 或最新版本。 +launch.advice.forge2760_liteloader=Forge 14.23.5.2760 与 LiteLoader 不兼容,请更新 Forge 至 14.23.5.2773 或更高版本。 +launch.advice.forge28_2_2_optifine=Forge 28.2.2 及更高版本与 OptiFine 不兼容。请降级 Forge 至 28.2.1 或更低版本。 +launch.advice.forge37_0_60=Forge 37.0.59 及更低版本与 Java 17 不兼容。请更新 Forge 至 37.0.60 或更高版本,或使用 Java 16 启动游戏。 +launch.advice.java8_1_13=Minecraft 1.13 及更高版本只能在 Java 8 或更高版本上运行,请使用 Java 8 或最新版本。 launch.advice.java8_51_1_13=低于 1.8.0_51 的 Java 版本可能会导致 Minecraft 1.13 崩溃,建议更新 Java 至 1.8.0_51 或更高版本后再次启动。 -launch.advice.java9=低于 1.13 的有安装模组的 Minecraft 版本不支持 Java 9 或更高版本,请使用 Java 8。 +launch.advice.java9=低于 1.13 的有安装模组的 Minecraft 版本与 Java 9 或更高版本不兼容,请使用 Java 8。 launch.advice.modded_java=部分模组可能与高版本 Java 不兼容,建议使用 Java %s 启动 Minecraft %s。 -launch.advice.modlauncher8=您所使用的 Forge 版本与当前使用的 Java 不兼容,请更新 Forge。 +launch.advice.modlauncher8=你所使用的 Forge 版本与当前使用的 Java 不兼容,请更新 Forge。 launch.advice.newer_java=检测到你正在使用旧版本 Java 启动游戏,这可能导致部分模组引发游戏崩溃,建议更新至 Java 8 后再次启动。 -launch.advice.not_enough_space=你设置的内存大小过大,超过了系统内存容量 %dMB,可能导致游戏无法启动。 +launch.advice.not_enough_space=你设置的内存大小过大,超过了系统内存容量 %d MB,可能导致游戏无法启动。 launch.advice.require_newer_java_version=当前游戏版本需要 Java %s,但 HMCL 未能找到该 Java 版本,你可以点击“是”,HMCL 会自动下载他,是否下载?\n如遇到问题,你可以点击右上角帮助按钮进行求助。 -launch.advice.too_large_memory_for_32bit=您设置的内存大小过大,由于可能超过了 32 位 Java 的内存分配限制,所以可能无法启动游戏,请将内存调至 1024MB 或更小。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 -launch.advice.vanilla_linux_java_8=对于 Linux x86-64 平台,Minecraft 1.12.2 及以下版本与 Java 9+ 不兼容,请使用 Java 8 启动游戏。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 -launch.advice.vanilla_x86.translation=Minecraft 尚未为您的平台提供完善支持,所以可能影响游戏体验或无法启动游戏。\n你可以在 这里 下载 X86-64 架构的 Java 以获得更完整的体验。 +launch.advice.too_large_memory_for_32bit=你设置的内存大小过大,由于可能超过了 32 位 Java 的内存分配限制,所以可能无法启动游戏,请将内存调至 1024 MB 或更小。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 +launch.advice.vanilla_linux_java_8=对于 Linux x86-64 平台,Minecraft 1.12.2 及更低版本与 Java 9+ 不兼容,请使用 Java 8 启动游戏。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 +launch.advice.vanilla_x86.translation=Minecraft 尚未为你的平台提供完善支持,所以可能影响游戏体验或无法启动游戏。\n你可以在 这里 下载 x86-64 架构的 Java 以获得更完整的体验。 launch.advice.unknown=由于以下原因,无法继续启动游戏: launch.failed=启动失败 -launch.failed.cannot_create_jvm=截获到无法创建 Java 虚拟机,可能是 Java 参数有问题,可以在设置中开启无参数模式启动。 +launch.failed.cannot_create_jvm=无法创建 Java 虚拟机,可能是 Java 参数有问题,你可以在“(全局/版本特定) 游戏设置 → 高级设置 → Java 虚拟机设置”中移除所有 Java 虚拟机参数后,尝试再次启动游戏。 launch.failed.creating_process=启动失败,在创建新进程时发生错误,可能是 Java 路径错误。 -launch.failed.command_too_long=命令长度超过限制,无法创建 bat 脚本,请导出为 PowerShell 脚本。 +launch.failed.command_too_long=命令长度超过限制,无法创建批处理脚本,请导出为 PowerShell 脚本。 launch.failed.decompressing_natives=未能解压游戏本地库。 -launch.failed.download_library=未能下载游戏依赖 %s +launch.failed.download_library=未能下载游戏依赖“%s” launch.failed.executable_permission=未能为启动文件添加执行权限。 launch.failed.execution_policy=设置执行策略 launch.failed.execution_policy.failed_to_set=设置执行策略失败 -launch.failed.execution_policy.hint=当前执行策略阻止您执行 PowerShell 脚本。\n点击“确定”允许当前用户执行本地 PowerShell 脚本,或点击“取消”保持现状。 +launch.failed.execution_policy.hint=当前执行策略阻止你执行 PowerShell 脚本。\n点击“确定”允许当前用户执行本地 PowerShell 脚本,或点击“取消”保持现状。 launch.failed.exited_abnormally=游戏非正常退出,请查看日志文件,或联系他人寻求帮助。 launch.failed.java_version_too_low=你所指定的 Java 版本过低,请重新设置 Java 版本。 -launch.failed.no_accepted_java=找不到适合当前游戏使用的 Java,是否使用默认 Java 启动游戏?点击“是”使用默认 Java 继续启动游戏,\n或者请到全局(特定)游戏设置中选择一个合适的 Java 虚拟机版本。\n你可以点击右上角帮助按钮进行求助。 +launch.failed.no_accepted_java=找不到适合当前游戏使用的 Java,是否使用默认 Java 启动游戏?点击“是”使用默认 Java 继续启动游戏,\n或者在“(全局/版本特定) 游戏设置 → 游戏 Java”中选择一个合适的 Java 虚拟机版本。\n你可以点击右上角帮助按钮进行求助。 launch.failed.sigkill=游戏被用户或系统强制终止。 launch.state.dependencies=处理游戏依赖 launch.state.done=启动完成 @@ -612,26 +609,26 @@ launcher.agreement=用户协议与免责声明 launcher.agreement.accept=同意 launcher.agreement.decline=拒绝 launcher.agreement.hint=同意本软件的用户协议与免责声明以使用本软件。 -launcher.background=背景地址 -launcher.background.choose=选择背景路径 +launcher.background=背景图片 +launcher.background.choose=选择背景图片 launcher.background.classic=经典 -launcher.background.default=默认(自动检索启动器同目录下的 background.png/jpg/gif 及 bg 文件夹内的图片) +launcher.background.default=默认 (自动检索启动器同文件夹下的“background.png/.jpg/.gif”及“bg”文件夹内的图片) launcher.background.network=网络 launcher.background.translucent=半透明 -launcher.cache_directory=文件下载缓存目录 +launcher.cache_directory=文件下载缓存文件夹 launcher.cache_directory.clean=清理缓存 -launcher.cache_directory.choose=选择文件下载缓存目录 -launcher.cache_directory.default=默认(%AppData%/.minecraft 或者 ~/.minecraft) -launcher.cache_directory.disabled=禁用(总是使用游戏路径) -launcher.cache_directory.invalid=无法创建自定义的缓存目录,恢复默认设置 +launcher.cache_directory.choose=选择文件下载缓存文件夹 +launcher.cache_directory.default=默认 ("%AppData%/.minecraft" 或 "~/.minecraft") +launcher.cache_directory.disabled=禁用 (总是使用游戏文件夹路径) +launcher.cache_directory.invalid=无法创建自定义的缓存文件夹,恢复默认设置 launcher.contact=联系我们 -launcher.crash=Hello Minecraft! Launcher 遇到了无法处理的错误,请复制下列内容并点击右下角的按钮反馈 bug。 +launcher.crash=Hello Minecraft! Launcher 遇到了无法处理的错误,请复制下列内容并点击右下角的按钮反馈问题。 launcher.crash.java_internal_error=Hello Minecraft! Launcher 由于当前 Java 损坏而无法继续运行,请卸载当前 Java,点击 此处 安装合适的 Java 版本。 -launcher.crash.hmcl_out_dated=Hello Minecraft! Launcher 遇到了无法处理的错误,已检测到您的启动器不是最新版本,请更新后再试。 -launcher.update_java=请更新您的 Java \n你可以访问\n https://docs.hmcl.net/help.html \n页面寻求帮助。 +launcher.crash.hmcl_out_dated=Hello Minecraft! Launcher 遇到了无法处理的错误,已检测到你的启动器不是最新版本,请更新后再试。 +launcher.update_java=请更新你的 Java。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 login.empty_username=你还未设置用户名! -login.enter_password=请输入您的密码 +login.enter_password=请输入你的密码 logwindow.show_lines=显示行数 logwindow.terminate_game=结束游戏进程 @@ -640,20 +637,20 @@ logwindow.help=你可以前往 HMCL 社区,寻找他人帮助 logwindow.autoscroll=自动滚动 logwindow.export_game_crash_logs=导出游戏崩溃信息 logwindow.export_dump=导出游戏运行栈 -logwindow.export_dump.no_dependency=你的 Java 不包含用于创建游戏运行栈的依赖。请前往 HMCL QQ 群或 Discord 频道寻求帮助。 +logwindow.export_dump.no_dependency=你的 Java 不包含用于创建游戏运行栈的依赖。请前往 HMCL QQ 群或 Discord 寻求帮助。 main_page=主页 message.cancelled=操作被取消 message.confirm=提示 -message.copied=已拷贝至剪贴板 +message.copied=已复制到剪贴板 message.default=默认 message.doing=请耐心等待 message.downloading=正在下载 message.error=错误 message.failed=操作失败 message.info=提示 -message.success=已完成 +message.success=完成 message.unknown=未知 message.warning=警告 @@ -663,27 +660,27 @@ modpack.choose.local=导入本地整合包文件 modpack.choose.local.detail=你可以直接将整合包文件拖入本页面以安装 modpack.choose.remote=从互联网下载整合包 modpack.choose.remote.detail=需要提供整合包的下载链接 -modpack.choose.repository=从 Curseforge / Modrinth 下载整合包 +modpack.choose.repository=从 CurseForge/Modrinth 下载整合包 modpack.choose.repository.detail=下载后记得回到这个界面,把整合包拖进来哦 modpack.choose.remote.tooltip=要下载的整合包的链接 modpack.completion=下载整合包相关文件 -modpack.desc=描述你要制作的整合包,比如整合包注意事项和更新记录,支持 HTML(图片请用网络图) +modpack.desc=描述你要制作的整合包,比如整合包注意事项和更新记录,支持 Markdown (图片请用网络链接) modpack.description=整合包描述 modpack.download=下载整合包 modpack.enter_name=给游戏起个你喜欢的名字 modpack.export=导出整合包 -modpack.export.as=请选择整合包类型 (若无法决定,请选择我的世界中文论坛整合包标准) +modpack.export.as=请选择整合包类型 (若无法决定,请选择“我的世界中文论坛整合包标准”) modpack.file_api=整合包下载链接前缀 modpack.files.blueprints=BuildCraft 蓝图 modpack.files.config=模组配置文件 modpack.files.dumps=NEI 调试输出 modpack.files.hmclversion_cfg=启动器配置文件 -modpack.files.liteconfig=模组配置文件 +modpack.files.liteconfig=LiteLoader 相关文件 modpack.files.mods=模组 modpack.files.mods.voxelmods=VoxelMods 配置,如小地图 -modpack.files.options_txt=游戏设定 -modpack.files.optionsshaders_txt=光影设定 -modpack.files.resourcepacks=资源包(材质包) +modpack.files.options_txt=游戏设置 +modpack.files.optionsshaders_txt=光影设置 +modpack.files.resourcepacks=资源包 (纹理包) modpack.files.saves=游戏存档 modpack.files.scripts=MineTweaker 配置 modpack.files.servers_dat=多人游戏服务器列表 @@ -691,19 +688,18 @@ modpack.install=安装 %s 整合包 modpack.installing=正在安装整合包 modpack.introduction=支持 Curse、Modrinth、MultiMC、MCBBS 整合包。 modpack.invalid=无效的整合包升级文件,可能是下载时出现问题。 -modpack.mismatched_type=整合包类型不匹配,当前游戏是 %s 整合包,但是提供的整合包更新文件是 %s 整合包。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 +modpack.mismatched_type=整合包类型不匹配,当前游戏为“%s”整合包,但是提供的整合包更新文件为“%s”整合包。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 modpack.name=整合包名称 modpack.not_a_valid_name=不是一个有效的整合包名称 modpack.origin=来源 modpack.origin.url=官方网站 modpack.origin.mcbbs=MCBBS -modpack.origin.mcbbs.prompt=贴子 id +modpack.origin.mcbbs.prompt=帖子 ID modpack.scan=解析整合包 modpack.task.install=导入整合包 modpack.task.install.error=无法识别该整合包,目前仅支持导入 Curse、Modrinth、MultiMC、MCBBS 整合包。\n你可以点击右上角帮助按钮进行求助。 modpack.type.curse=Curse -modpack.type.curse.tolerable_error=但未能完成该整合包所需的依赖下载,您可以在启动该游戏版本时继续该整合包文件的下载。由于网络问题,您可能需要重试多次。\n你可以点击右上角帮助按钮进行求助。 -modpack.type.curse.error=未能完成该整合包所需的依赖下载,请多次重试或设置代理。\n你可以点击右上角帮助按钮进行求助。 +modpack.type.curse.error=未能完成该整合包所需的依赖下载,请再次尝试或设置代理。\n你可以点击右上角帮助按钮进行求助。 modpack.type.curse.not_found=部分必需文件已经在网络中被删除并且再也无法下载,请尝试该整合包的最新版本或者安装其他整合包。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 modpack.type.manual.warning=该整合包由发布者手动打包,其中可能已经包含启动器,建议尝试解压后使用其自带的启动器运行游戏。\n如遇到问题,你可以点击右上角帮助按钮进行求助。\nHMCL 可以尝试导入该整合包,但不保证可用性,是否继续? modpack.type.mcbbs=我的世界中文论坛整合包标准 @@ -713,21 +709,21 @@ modpack.type.multimc=MultiMC modpack.type.multimc.export=可以被 Hello Minecraft! Launcher 和 MultiMC 导入 modpack.type.server=服务器自动更新整合包 modpack.type.server.export=允许服务器管理员远程更新游戏客户端 -modpack.type.server.malformed=服务器整合包配置格式错误,请联系服务器管理员解决此问题\n如遇到问题,你可以点击右上角帮助按钮进行求助。 +modpack.type.server.malformed=服务器整合包配置格式错误,请联系服务器管理员解决此问题。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 modpack.unsupported=Hello Minecraft! Launcher 不支持该整合包格式 modpack.update=正在升级整合包 modpack.wizard=导出整合包向导 modpack.wizard.step.1=基本设置 modpack.wizard.step.1.title=设置整合包的主要信息 modpack.wizard.step.2=文件选择 -modpack.wizard.step.2.title=选中你想加到整合包中的文件或文件夹 +modpack.wizard.step.2.title=选中你想添加到整合包中的文件或文件夹 modpack.wizard.step.3=整合包类型 modpack.wizard.step.3.title=选择整合包导出类型 modpack.wizard.step.initialization.exported_version=要导出的游戏版本 -modpack.wizard.step.initialization.force_update=强制升级整合包至最新版本(需要自建服务器) +modpack.wizard.step.initialization.force_update=强制升级整合包至最新版本 (需要自建服务器) modpack.wizard.step.initialization.include_launcher=包含启动器 modpack.wizard.step.initialization.save=选择要导出到的游戏整合包位置 -modpack.wizard.step.initialization.warning=在制作整合包前,请您确认您选择的版本可以正常启动,\n并保证您的 Minecraft 是正式版而非快照版,\n而且不应当将不允许非官方途径传播的模组、材质包等纳入整合包。\n整合包会保存您目前的下载源设置\n如遇到问题,你可以点击右上角帮助按钮进行求助。 +modpack.wizard.step.initialization.warning=在制作整合包前,请你确认你选择的版本可以正常启动,\n并保证你的 Minecraft 是正式版而非快照,\n而且不应当将不允许非官方途径传播的模组、资源 (纹理) 包等纳入整合包。\n整合包会保存你目前的下载源设置。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 modpack.wizard.step.initialization.server=点击此处查看有关服务器自动更新整合包的制作教程 modrinth.category.adventure=冒险 @@ -793,11 +789,14 @@ modrinth.category.folia=Folia mods=模组 mods.add=添加模组 -mods.add.failed=添加模组 %s 失败。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 +mods.add.failed=添加模组“%s”失败。\n如遇到问题,你可以点击右上角帮助按钮进行求助。 mods.add.success=成功添加模组 %s。 mods.broken_dependency.title=损坏的前置模组 mods.broken_dependency.desc=该前置模组曾经在该模组仓库上存在过,但现在被删除了。换个下载源试试吧。 mods.category=类别 +mods.channel.alpha=快照版本 +mods.channel.beta=测试版本 +mods.channel.release=稳定版本 mods.check_updates=检查模组更新 mods.check_updates.current_version=当前版本 mods.check_updates.empty=没有需要更新的模组 @@ -808,13 +807,13 @@ mods.check_updates.target_version=目标版本 mods.check_updates.update=更新 mods.choose_mod=选择模组 mods.curseforge=CurseForge -mods.dependency.embedded=内置的前置模组(已经由作者打包在模组文件中,无需另外下载) -mods.dependency.optional=可选的前置模组(若缺失游戏能够正常运行,但模组功能可能缺失) -mods.dependency.required=必须的前置模组(必须另外下载,缺失可能会导致游戏无法启动) -mods.dependency.tool=前置库(必须另外下载,缺失可能会导致游戏无法启动) -mods.dependency.include=内置的前置模组(已经由作者打包在模组文件中,无需另外下载) -mods.dependency.incompatible=不兼容的模组(同时安装该模组和正在下载的模组会导致游戏无法启动) -mods.dependency.broken=损坏的前置模组(该前置模组曾经在该模组仓库上存在过,但现在被删除了。换个下载源试试吧。) +mods.dependency.embedded=内置的前置模组 (已经由作者打包在模组文件中,无需另外下载) +mods.dependency.optional=可选的前置模组 (若缺失游戏能够正常运行,但模组功能可能缺失) +mods.dependency.required=必须的前置模组 (必须另外下载,缺失可能会导致游戏无法启动) +mods.dependency.tool=前置库 (必须另外下载,缺失可能会导致游戏无法启动) +mods.dependency.include=内置的前置模组 (已经由作者打包在模组文件中,无需另外下载) +mods.dependency.incompatible=不兼容的模组 (同时安装该模组和正在下载的模组会导致游戏无法启动) +mods.dependency.broken=损坏的前置模组 (该前置模组曾经在该模组仓库上存在过,但现在被删除了,换个下载源试试吧) mods.disable=禁用 mods.download=模组下载 mods.download.title=模组下载 - %1s @@ -827,12 +826,12 @@ mods.mcmod.page=MC 百科页面 mods.mcmod.search=MC 百科搜索 mods.modrinth=Modrinth mods.name=名称 -mods.not_modded=你需要先在自动安装页面安装 Fabric、Forge 或 LiteLoader 才能进行模组管理。 +mods.not_modded=你需要先在“自动安装”页面安装 Forge、NeoForge、Fabric、Quilt 或 LiteLoader 才能管理模组。 mods.restore=回退 mods.url=官方页面 mods.update_modpack_mod.warning=更新整合包中的模组可能导致整合包损坏,使整合包无法正常启动。该操作不可逆,确定要更新吗? mods.install=安装到当前版本 -mods.save_as=下载到本地目录 +mods.save_as=下载到本地文件夹 nbt.entries=%s 个条目 nbt.open.failed=打开文件失败 @@ -843,7 +842,7 @@ datapack=数据包 datapack.add=添加数据包 datapack.choose_datapack=选择要导入的数据包压缩包 datapack.extension=数据包 -datapack.title=世界 %s - 数据包 +datapack.title=世界 [%s] - 数据包 web.failed=加载页面失败 web.open_in_browser=是否要在浏览器中打开此链接:\n%s @@ -853,19 +852,19 @@ world=世界 world.add=添加世界 world.datapack=管理数据包 world.datapack.1_13=仅 Minecraft 1.13 及之后的版本支持数据包 -world.description=%s。上一次游戏时间: %s。游戏版本: %s。 +world.description=%s | 上一次游戏时间: %s | 游戏版本: %s world.download=存档下载 world.export=导出此世界 world.export.title=选择该世界的存储位置 world.export.location=保存到 -world.export.wizard=导出世界 %s +world.export.wizard=导出世界“%s” world.extension=世界压缩包 world.game_version=游戏版本 world.import.already_exists=此世界已经存在 world.import.choose=选择要导入的存档压缩包 world.import.failed=无法导入此世界:%s world.import.invalid=无法识别该存档压缩包 -world.info.title=世界 %s - 世界信息 +world.info.title=世界 [%s] - 世界信息 world.info.basic=基本信息 world.info.allow_cheats=允许作弊 world.info.dimension.the_nether=下界 @@ -875,6 +874,7 @@ world.info.difficulty.peaceful=和平 world.info.difficulty.easy=简单 world.info.difficulty.normal=普通 world.info.difficulty.hard=困难 +world.info.failed=读取世界信息失败 world.info.game_version=游戏版本 world.info.last_played=上一次游戏时间 world.info.generate_features=生成建筑 @@ -883,7 +883,7 @@ world.info.player.food_level=饥饿值 world.info.player.game_type=游戏模式 world.info.player.game_type.adventure=冒险 world.info.player.game_type.creative=创造 -world.info.player.game_type.spectator=旁观 +world.info.player.game_type.spectator=旁观者 world.info.player.game_type.survival=生存 world.info.player.health=生命值 world.info.player.last_death_location=上次死亡位置 @@ -898,26 +898,26 @@ world.name=世界名称 world.name.enter=输入世界名称 world.reveal=打开文件夹 world.show_all=显示全部 -world.time=yyyy 年 MM 月 dd 日 HH:mm:ss +world.time=yyyy 年 MM 月 dd 日, HH:mm:ss -profile=游戏目录 +profile=游戏文件夹 profile.already_exists=该名称已存在 -profile.default=当前目录 -profile.home=官方启动器目录 -profile.instance_directory=游戏路径 -profile.instance_directory.choose=选择游戏路径 -profile.manage=游戏目录列表 +profile.default=当前文件夹 +profile.home=官方启动器文件夹 +profile.instance_directory=游戏文件夹路径 +profile.instance_directory.choose=选择游戏文件夹路径 +profile.manage=游戏文件夹列表 profile.name=名称 -profile.new=添加游戏目录 -profile.title=游戏目录 +profile.new=添加游戏文件夹 +profile.title=游戏文件夹 profile.selected=已选中 -profile.use_relative_path=若可能,游戏目录使用相对路径 +profile.use_relative_path=若可能,游戏文件夹使用相对路径 -repositories.custom=自定义 Maven 仓库(%s) -repositories.maven_central=全球(Maven Central) -repositories.tencentcloud_mirror=中国大陆(腾讯云镜像源 Maven 仓库) +repositories.custom=自定义 Maven 仓库 (%s) +repositories.maven_central=全球 (Maven Central) +repositories.tencentcloud_mirror=中国大陆 (腾讯云镜像源 Maven 仓库) repositories.chooser=缺少 JavaFX 运行环境,HMCL 需要 JavaFX 才能正常运行。\n点击“确认”从指定下载源下载 JavaFX 运行时组件并启动 HMCL,点击“取消”退出程序。\n选择下载源: -repositories.chooser.title=选择下载源下载 JavaFX +repositories.chooser.title=选择 JavaFX 下载源 resourcepack=资源包 @@ -939,34 +939,34 @@ selector.custom=自定义 settings=设置 settings.advanced=高级设置 -settings.advanced.modify=修改高级设置 +settings.advanced.modify=编辑高级设置 settings.advanced.title=高级设置 - %s settings.advanced.custom_commands=自定义命令 settings.advanced.custom_commands.hint=自定义命令被调用时将包含如下的环境变量:\n\ - \ - $INST_NAME: 版本名称\n\ - \ - $INST_ID: 版本名称\n\ - \ - $INST_DIR: 版本文件夹\n\ - \ - $INST_MC_DIR: 游戏运行路径\n\ - \ - $INST_JAVA: 游戏运行使用的 Java 路径\n\ - \ - $INST_FORGE: 若安装了 Forge,将会存在本环境变量\n\ - \ - $INST_NEOFORGE: 若安装了 NeoForge,将会存在本环境变量\n\ - \ - $INST_LITELOADER: 若安装了 LiteLoader,将会存在本环境变量\n\ - \ - $INST_OPTIFINE: 若安装了 OptiFine,将会存在本环境变量\n\ - \ - $INST_FABRIC: 若安装了 Fabric,将会存在本环境变量\n\ - \ - $INST_QUILT: 若安装了 Quilt,将会存在本环境变量 + \ · $INST_NAME:版本名称;\n\ + \ · $INST_ID:版本名称;\n\ + \ · $INST_DIR:当前版本运行路径;\n\ + \ · $INST_MC_DIR:当前游戏文件夹路径;\n\ + \ · $INST_JAVA:游戏运行使用的 Java 路径;\n\ + \ · $INST_FORGE:若安装了 Forge,将会存在本环境变量;\n\ + \ · $INST_NEOFORGE:若安装了 NeoForge,将会存在本环境变量;\n\ + \ · $INST_LITELOADER:若安装了 LiteLoader,将会存在本环境变量;\n\ + \ · $INST_OPTIFINE:若安装了 OptiFine,将会存在本环境变量;\n\ + \ · $INST_FABRIC:若安装了 Fabric,将会存在本环境变量;\n\ + \ · $INST_QUILT:若安装了 Quilt,将会存在本环境变量。 settings.advanced.dont_check_game_completeness=不检查游戏完整性 settings.advanced.dont_check_jvm_validity=不检查 JVM 与游戏的兼容性 settings.advanced.dont_patch_natives=不尝试自动替换本地库 settings.advanced.environment_variables=环境变量 -settings.advanced.game_dir.default=默认(.minecraft/) -settings.advanced.game_dir.independent=各版本独立(存放在 .minecraft/versions/<版本名>/,除 assets、libraries 外) +settings.advanced.game_dir.default=默认 (".minecraft/") +settings.advanced.game_dir.independent=各版本独立 (存放在 ".minecraft/versions/<版本名>/",除 assets、libraries 外) settings.advanced.java_permanent_generation_space=内存永久保存区域 settings.advanced.java_permanent_generation_space.prompt=单位 MB settings.advanced.jvm=Java 虚拟机设置 settings.advanced.jvm_args=Java 虚拟机参数 -settings.advanced.jvm_args.prompt=- 若在“Java 虚拟机参数”输入的参数与默认参数相同,则不会添加\n\ -- 在“Java 虚拟机参数”输入任何 GC 参数,默认参数的 G1 参数会禁用\n\ -- 点击下方“不添加默认的 JVM 参数”可在启动游戏时不添加默认参数 +settings.advanced.jvm_args.prompt=\ · 若在“Java 虚拟机参数”输入的参数与默认参数相同,则不会添加;\n\ + \ · 在“Java 虚拟机参数”输入任何 GC 参数,默认参数的 G1 参数会禁用;\n\ + \ · 点击下方“不添加默认的 JVM 参数”可在启动游戏时不添加默认参数。 settings.advanced.launcher_visibility.close=游戏启动后结束启动器 settings.advanced.launcher_visibility.hide=游戏启动后隐藏启动器 settings.advanced.launcher_visibility.hide_and_reopen=隐藏启动器并在游戏结束后重新打开 @@ -974,27 +974,27 @@ settings.advanced.launcher_visibility.keep=保持启动器可见 settings.advanced.launcher_visible=启动器可见性 settings.advanced.minecraft_arguments=游戏参数 settings.advanced.minecraft_arguments.prompt=默认 -settings.advanced.natives_directory=本地库路径(LWJGL) +settings.advanced.natives_directory=本地库路径 (LWJGL) settings.advanced.natives_directory.choose=选择本地库路径 -settings.advanced.natives_directory.custom=自定义(由你提供游戏需要的本地库) -settings.advanced.natives_directory.default=预设(由启动器提供游戏本地库) -settings.advanced.natives_directory.hint=本选项提供给 Apple M1 等未受游戏官方支持的平台来自定义游戏本地库,如果你不知道本选项的含义,请你不要修改本选项,否则会导致游戏无法启动!\n如果你要修改本选项,你需要保证自定义目录下有游戏所需的本地库文件,如 lwjgl.dll(liblwjgl.so), openal.dll(libopenal.so) 等文件。启动器不会帮你补全缺少的本地库文件!\n注意:指定的本地库文件路径建议只包含英文大小写字母,数字,下划线,否则可能会导致启动游戏失败。 +settings.advanced.natives_directory.custom=自定义 (由你提供游戏需要的本地库) +settings.advanced.natives_directory.default=默认 (由启动器提供游戏本地库) +settings.advanced.natives_directory.hint=本选项提供给 Apple M1 等未受游戏官方支持的平台来自定义游戏本地库,如果你不知道本选项的含义,请不要修改本选项,否则会导致游戏无法启动!\n如果你要修改本选项,你需要保证自定义文件夹下有游戏所需的本地库文件,如 lwjgl.dll (liblwjgl.so)、openal.dll (libopenal.so) 等文件。启动器不会帮你补全缺少的本地库文件!\n注意:指定的本地库文件路径建议只包含英文大小写字母、数字和下划线,否则可能会导致启动游戏失败。 settings.advanced.no_jvm_args=不添加默认的 JVM 参数 settings.advanced.precall_command=游戏启动前执行命令 settings.advanced.precall_command.prompt=将在游戏启动前调用 settings.advanced.process_priority=进程优先级 -settings.advanced.process_priority.low=低(节省游戏占用资源,可能会造成游戏卡顿) -settings.advanced.process_priority.below_normal=较低(节省游戏占用资源,可能会造成游戏卡顿) -settings.advanced.process_priority.normal=中(平衡) -settings.advanced.process_priority.above_normal=较高(优先保证游戏运行,但可能会导致其他程序卡顿) -settings.advanced.process_priority.high=高(优先保证游戏运行,但可能会导致其他程序卡顿) +settings.advanced.process_priority.low=低 (节省游戏占用资源,可能会造成游戏卡顿) +settings.advanced.process_priority.below_normal=较低 (节省游戏占用资源,可能会造成游戏卡顿) +settings.advanced.process_priority.normal=中 (平衡) +settings.advanced.process_priority.above_normal=较高 (优先保证游戏运行,但可能会导致其他程序卡顿) +settings.advanced.process_priority.high=高 (优先保证游戏运行,但可能会导致其他程序卡顿) settings.advanced.post_exit_command=游戏结束后执行命令 settings.advanced.post_exit_command.prompt=将在游戏结束后调用 settings.advanced.renderer=渲染器 -settings.advanced.renderer.default=OpenGL(默认) -settings.advanced.renderer.d3d12=DirectX 12(性能与兼容性较差,用于调试) -settings.advanced.renderer.llvmpipe=软渲染器(性能较差,兼容性最好) -settings.advanced.renderer.zink=Vulkan(性能最好,兼容性较差) +settings.advanced.renderer.default=OpenGL (默认) +settings.advanced.renderer.d3d12=DirectX 12 (性能与兼容性较差,用于调试) +settings.advanced.renderer.llvmpipe=软渲染器 (性能较差,兼容性最好) +settings.advanced.renderer.zink=Vulkan (性能最好,兼容性较差) settings.advanced.server_ip=服务器地址 settings.advanced.server_ip.prompt=默认,启动游戏后可以直接进入对应服务器 settings.advanced.use_native_glfw=使用系统 GLFW @@ -1002,7 +1002,7 @@ settings.advanced.use_native_openal=使用系统 OpenAL settings.advanced.workaround=调试选项 settings.advanced.workaround.warning=调试选项仅提供给专业玩家使用。调试选项可能会导致游戏无法启动。除非你知道你在做什么,否则请不要修改这些选项! settings.advanced.wrapper_launcher=包装命令 -settings.advanced.wrapper_launcher.prompt=如填写 optirun 后,启动命令将从 "java ..." 变为 "optirun java ..." +settings.advanced.wrapper_launcher.prompt=如填写“optirun”后,启动命令将从“java ...”变为“optirun java ...” settings.custom=自定义 @@ -1011,29 +1011,29 @@ settings.game.current=游戏 settings.game.dimension=游戏窗口分辨率 settings.game.exploration=浏览 settings.game.fullscreen=全屏 -settings.game.java_directory=Java 路径 +settings.game.java_directory=游戏 Java settings.game.java_directory.auto=自动选择合适的 Java settings.game.java_directory.auto.not_found=没有合适的 Java settings.game.java_directory.bit=%s 位 -settings.game.java_directory.choose=选择 Java 路径 +settings.game.java_directory.choose=选择 Java settings.game.java_directory.invalid=Java 路径不正确 settings.game.java_directory.version=指定 Java 版本 -settings.game.java_directory.template=%s(%s) +settings.game.java_directory.template=%s (%s) settings.game.management=管理 -settings.game.working_directory=版本隔离(建议使用模组时开启“各版本隔离”,改后需移动存档模组等相关游戏文件) -settings.game.working_directory.choose=选择运行路径 -settings.game.working_directory.hint=在“运行路径(版本隔离)”选项中开启“各版本独立”使当前版本独立存放设置、存档、模组等数据,使用模组时建议开启此选项以避免不同版本模组冲突。修改此选项后请自行移动存档等文件。 +settings.game.working_directory=版本隔离 (建议使用模组时选择“各版本独立”,改后需移动存档、模组等相关游戏文件) +settings.game.working_directory.choose=选择运行文件夹 +settings.game.working_directory.hint=在“版本隔离”中选择“各版本独立”使当前版本独立存放设置、存档、模组等数据,使用模组时建议启用此选项以避免不同版本模组冲突。修改此选项后需自行移动存档等文件。 settings.icon=游戏图标 settings.launcher=启动器设置 settings.launcher.appearance=外观 -settings.launcher.common_path.tooltip=启动器将所有游戏资源及依赖库文件放于此集中管理,如果游戏文件夹内有现成的将不会使用公共库文件 +settings.launcher.common_path.tooltip=启动器将所有游戏资源及依赖库文件存放于此集中管理,如果游戏文件夹内有现成的将不会使用公共库文件。 settings.launcher.debug=调试 settings.launcher.download=下载 -settings.launcher.download.threads=并发数 -settings.launcher.download.threads.auto=自动选择并发数 -settings.launcher.download.threads.hint=并发数过大可能导致系统卡顿。你的下载速度会受到宽带运营商、服务器等方面的影响,调大下载并发数不一定能大幅提升总下载速度。 +settings.launcher.download.threads=线程数 +settings.launcher.download.threads.auto=自动选择线程数 +settings.launcher.download.threads.hint=线程数过高可能导致系统卡顿。你的下载速度会受到互联网运营商、下载源服务器等方面的影响,调高下载线程数不一定能大幅提升总下载速度。 settings.launcher.download_source=下载源 settings.launcher.download_source.auto=自动选择下载源 settings.launcher.enable_game_list=在主页内显示版本列表 @@ -1041,9 +1041,9 @@ settings.launcher.font=字体 settings.launcher.general=通用 settings.launcher.language=语言 (重启后生效) settings.launcher.launcher_log.export=导出启动器日志 -settings.launcher.launcher_log.reveal=打开日志目录 +settings.launcher.launcher_log.reveal=打开日志文件夹 settings.launcher.launcher_log.export.failed=无法导出日志 -settings.launcher.launcher_log.export.success=日志已保存到 %s +settings.launcher.launcher_log.export.success=日志已保存到“%s” settings.launcher.log=日志 settings.launcher.log.font=日志字体 settings.launcher.proxy=代理 @@ -1071,19 +1071,19 @@ settings.memory.lower_bound=最低内存分配 settings.memory.used_per_total=设备中已使用 %1$.1f GB / 设备总内存 %2$.1f GB settings.physical_memory=物理内存大小 settings.show_log=查看日志 -settings.skin=现已支持离线账户更换皮肤,你可以到账户页面更改离线账户的皮肤和披风(多人游戏下其他玩家无法看到你的皮肤) +settings.skin=现已支持离线账户更换皮肤,你可以到账户页面更改离线账户的皮肤和披风 (多人游戏下其他玩家无法看到你的皮肤)。 settings.tabs.installers=自动安装 settings.take_effect_after_restart=重启后生效 -settings.type=版本设置类型 -settings.type.global=全局版本设置(未启用游戏特定设置的共用此设定) +settings.type=版本游戏设置类型 +settings.type.global=全局游戏设置 (未启用“版本特定游戏设置”的版本共用此设置) settings.type.global.manage=全局游戏设置 -settings.type.global.edit=编辑全局版本设置 -settings.type.special.enable=启用游戏特定设置(不影响其他游戏版本) -settings.type.special.edit=编辑游戏特定设置 -settings.type.special.edit.hint=当前游戏版本 %s 启用了游戏特定设置,因此本页面选项不对该游戏生效。点击链接前往该游戏版本的游戏特定设置页 +settings.type.global.edit=编辑全局游戏设置 +settings.type.special.enable=启用版本特定游戏设置 (不影响其他游戏版本) +settings.type.special.edit=编辑版本特定游戏设置 +settings.type.special.edit.hint=当前游戏版本“%s”启用了“版本特定游戏设置”,因此本页面选项不对该版本生效。点击链接前往该版本的“游戏设置”页。 sponsor=赞助 -sponsor.bmclapi=国内下载源由 BMCLAPI 提供高速下载服务。BMCLAPI 为公益服务,赞助 BMCLAPI 可以帮助作者更好的提供稳定高速的下载服务,[点击此处查阅详细信息] +sponsor.bmclapi=国内下载源由 BMCLAPI 提供高速下载服务。BMCLAPI 为公益服务,赞助 BMCLAPI 可以帮助作者更好的提供稳定高速的下载服务。[点击此处查阅详细信息] sponsor.hmcl=Hello Minecraft! Launcher 是一个免费、自由、开放源代码的 Minecraft 启动器。[点击此处查阅更多详细信息] system.architecture=架构 @@ -1094,27 +1094,30 @@ unofficial.hint=你正在使用非官方构建的 HMCL,我们无法保证其 update=启动器更新 update.accept=更新 update.changelog=更新日志 -update.channel.dev=测试版 -update.channel.dev.hint=你正在使用测试版。测试版包含一些未在正式版中包含的测试性功能,仅用于体验新功能。\n\ - 测试版功能未受充分验证,使用起来可能不稳定!下载稳定版\n\ - 如果你遇到了使用问题,可以在设置的 反馈页面 中进行反馈,或加入反馈页面中提供的 DiscordQQ 群以反馈问题。欢迎关注 B 站账号 huanghongxun 以关注 HMCL 的开发进展。\n\n\ - 点击此处为当前版本隐藏该提示。 -update.channel.dev.title=测试版提示 +update.channel.dev=开发版 +update.channel.dev.hint=你正在使用 HMCL 开发版。开发版包含一些未在稳定版中包含的测试性功能,仅用于体验新功能。\n\ + 开发版功能未受充分验证,使用起来可能不稳定!下载稳定版\n\ + \n\ + 如果你使用时遇到了问题,可以通过设置中 反馈页面 提供的渠道进行反馈。欢迎关注 B 站账号 @huanghongxun 以关注 HMCL 的开发进展。\n\ + \n\ + 为当前版本隐藏该提示。 +update.channel.dev.title=开发版提示 update.channel.nightly=预览版 -update.channel.nightly.hint=你正在使用预览版。预览版可能会每天更新一次,包含一些未在正式版和测试版中包含的测试性功能,仅用于体验新功能。\n\ - 测试版功能未受充分验证,使用起来可能不稳定!下载稳定版\n\ - 如果你遇到了使用问题,可以在设置的 反馈页面 中进行反馈,或加入反馈页面中提供的 DiscordQQ 群以反馈问题。欢迎关注 B 站账号 huanghongxun 以关注 HMCL 的开发进展。 +update.channel.nightly.hint=你正在使用 HMCL 预览版。预览版更新较为频繁,包含一些未在稳定版和开发版中包含的测试性功能,仅用于体验新功能。\n\ + 预览版功能未受充分验证,使用起来可能不稳定!下载稳定版\n\ + \n\ + 如果你使用时遇到了问题,可以通过设置中 反馈页面 提供的渠道进行反馈。欢迎关注 B 站账号 @huanghongxun 以关注 HMCL 的开发进展。 update.channel.nightly.title=预览版提示 -update.channel.stable=推荐版本 +update.channel.stable=稳定版 update.checking=正在检查更新 update.failed=更新失败 update.found=发现更新 update.newest_version=最新版本为:%s update.bubble.title=发现更新:%s update.bubble.subtitle=点击此处进行升级 -update.note=测试版与开发版包含更多的功能以及错误修复,但也可能会包含其他的问题。 +update.note=开发版与预览版包含更多的功能以及错误修复,但也可能会包含其他的问题。 update.latest=当前版本为最新版本 -update.no_browser=无法打开浏览器,网址已经复制到剪贴板了,您可以手动粘贴网址打开页面 +update.no_browser=无法打开浏览器,网址已经复制到剪贴板,你可以手动粘贴网址打开页面。 update.tooltip=更新 version=游戏 @@ -1123,12 +1126,12 @@ version.cannot_read=读取游戏版本失败,无法进行自动安装 version.empty=没有游戏版本 version.empty.add=进入下载页安装游戏 version.empty.launch=没有可启动的游戏,你可以点击左侧边栏内的下载按钮安装游戏 -version.empty.hint=没有已安装的游戏,你可以切换其他游戏目录,或者点击此处进入游戏下载页面 +version.empty.hint=没有已安装的游戏,你可以切换其他游戏文件夹,或者点击此处进入游戏下载页面 version.game.old=远古版 version.game.release=正式版 version.game.releases=正式版 -version.game.snapshot=测试版 -version.game.snapshots=测试版 +version.game.snapshot=快照 +version.game.snapshots=快照 version.launch=启动游戏 version.launch.test=测试游戏 version.switch=切换版本 @@ -1137,24 +1140,24 @@ version.launch_script.failed=生成启动脚本失败 version.launch_script.save=保存启动脚本 version.launch_script.success=启动脚本已生成完毕:%s version.manage=版本列表 -version.manage.clean=清理游戏目录 -version.manage.clean.tooltip=清理 logs, crash-reports -version.manage.duplicate=复制游戏实例 +version.manage.clean=清理游戏文件夹 +version.manage.clean.tooltip=清理“logs”和“crash-reports”文件夹 +version.manage.duplicate=复制游戏版本 version.manage.duplicate.duplicate_save=复制存档 -version.manage.duplicate.prompt=请输入新游戏实例名称 -version.manage.duplicate.confirm=将锁定复制产生的新游戏实例:开启版本隔离、游戏设置并复制该版本产生的文件 -version.manage.manage=游戏管理 -version.manage.manage.title=游戏管理 - %1s +version.manage.duplicate.prompt=请输入新游戏名称 +version.manage.duplicate.confirm=新的游戏版本将复制该版本文件夹 (".minecraft/versions/<版本名>") 下的文件,并带有独立的运行文件夹和设置。 +version.manage.manage=版本管理 +version.manage.manage.title=版本管理 - %1s version.manage.redownload_assets_index=更新游戏资源文件 version.manage.remove=删除该版本 -version.manage.remove.confirm=真的要删除版本 %s 吗?你将无法找回被删除的文件!!! -version.manage.remove.confirm.trash=真的要删除版本 %s 吗?你可以在系统的回收站中恢复文件夹 %s 来找回该版本。 -version.manage.remove.confirm.independent=由于该游戏使用了版本隔离,所以删除该版本将导致该游戏的存档等数据一同被删除!真的要删除版本 %s 吗? +version.manage.remove.confirm=真的要删除版本“%s”吗?你将无法找回被删除的文件!!! +version.manage.remove.confirm.trash=真的要删除版本“%s”吗?你可以在系统的回收站中还原“%s”文件夹来找回该版本。 +version.manage.remove.confirm.independent=由于该游戏启用了“(全局/版本特定) 游戏设置 → 版本隔离 → 各版本独立”选项,所以删除该版本将导致该游戏的存档等数据一同被删除!真的要删除版本“%s”吗? version.manage.remove_assets=删除所有游戏资源文件 version.manage.remove_libraries=删除所有库文件 version.manage.rename=重命名该版本 version.manage.rename.message=请输入要修改的名称 -version.manage.rename.fail=重命名版本失败,可能文件被占用或者名字有特殊字符 +version.manage.rename.fail=重命名版本失败,可能文件被占用或者名字有特殊字符。 version.settings=游戏设置 version.update=更新整合包 diff --git a/HMCL/src/main/resources/assets/openjfx-dependencies.json b/HMCL/src/main/resources/assets/openjfx-dependencies.json index 728d293332..cebc7ca4d6 100644 --- a/HMCL/src/main/resources/assets/openjfx-dependencies.json +++ b/HMCL/src/main/resources/assets/openjfx-dependencies.json @@ -30,25 +30,25 @@ "module": "javafx.base", "groupId": "org.openjfx", "artifactId": "javafx-base", - "version": "19.0.2.1", + "version": "17.0.13", "classifier": "win", - "sha1": "f33d0776b2b027c2ea9267c184f9048ef94c4deb" + "sha1": "ae86377359860449040372d3693bccf046148513" }, { "module": "javafx.graphics", "groupId": "org.openjfx", "artifactId": "javafx-graphics", - "version": "19.0.2.1", + "version": "17.0.13", "classifier": "win", - "sha1": "951ca77bd50ef4fd44f4b7fb1e38301088fde4e2" + "sha1": "bc0055a059b201d6c0be2293ccf72b6d2874fd1c" }, { "module": "javafx.controls", "groupId": "org.openjfx", "artifactId": "javafx-controls", - "version": "19.0.2.1", + "version": "17.0.13", "classifier": "win", - "sha1": "78ac7de48d0aac48e7d5282efc81bab7f337b587" + "sha1": "bcd765dca36fa9e5fb4c997491a2d908947603f5" } ], "windows-arm64": [ @@ -82,25 +82,25 @@ "module": "javafx.base", "groupId": "org.openjfx", "artifactId": "javafx-base", - "version": "19.0.2.1", + "version": "17.0.13", "classifier": "mac", - "sha1": "73e422d8426aaa23e8c712b9f4d9bebf70d3bfb9" + "sha1": "e1744403a6691aaa6b65a7e9b4ff9aad98831bb1" }, { "module": "javafx.graphics", "groupId": "org.openjfx", "artifactId": "javafx-graphics", - "version": "19.0.2.1", + "version": "17.0.13", "classifier": "mac", - "sha1": "6ab6f3e23421fcfa04e692d9d26a8f55a830c114" + "sha1": "dbe733470094abee56560067d0fea3ad24991d2b" }, { "module": "javafx.controls", "groupId": "org.openjfx", "artifactId": "javafx-controls", - "version": "19.0.2.1", + "version": "17.0.13", "classifier": "mac", - "sha1": "b7786b1b63e741c0e234829825fae5fef9d96c31" + "sha1": "0d43a776d6c9e2622e3581ed04501e2cadcd6e65" } ], "osx-arm64": [ @@ -108,25 +108,25 @@ "module": "javafx.base", "groupId": "org.openjfx", "artifactId": "javafx-base", - "version": "19.0.2.1", + "version": "17.0.13", "classifier": "mac-aarch64", - "sha1": "1d0d887c492330ed527b0614d115a4f32d2d05a4" + "sha1": "d4dc7d2864c07b56a27e39fa5691856ddccf0ba4" }, { "module": "javafx.graphics", "groupId": "org.openjfx", "artifactId": "javafx-graphics", - "version": "19.0.2.1", + "version": "17.0.13", "classifier": "mac-aarch64", - "sha1": "64db28799e61e0f8f51e471c732599b2a6961803" + "sha1": "d6a49f19e90db56c134757d1bbab4935de075d45" }, { "module": "javafx.controls", "groupId": "org.openjfx", "artifactId": "javafx-controls", - "version": "19.0.2.1", + "version": "17.0.13", "classifier": "mac-aarch64", - "sha1": "3a14bd5f3ebe45d344c1f2bade0fe074e6ea2a83" + "sha1": "ad564497edc49f7a6135c3b52d360962e19a2539" } ], "linux-x86_64": [ @@ -134,25 +134,25 @@ "module": "javafx.base", "groupId": "org.openjfx", "artifactId": "javafx-base", - "version": "19.0.2.1", + "version": "17.0.13", "classifier": "linux", - "sha1": "9e4ca5ce2b87c479d2cc445ff411a48aeae76936" + "sha1": "875f02b498b00c9692f6ed0af3da373b1d07bf03" }, { "module": "javafx.graphics", "groupId": "org.openjfx", "artifactId": "javafx-graphics", - "version": "19.0.2.1", + "version": "17.0.13", "classifier": "linux", - "sha1": "27c64e4e1569ddf198f28eda84cf8d014ab80693" + "sha1": "103f3bba5a177ba8912a92ef2ee0855de7ba050c" }, { "module": "javafx.controls", "groupId": "org.openjfx", "artifactId": "javafx-controls", - "version": "19.0.2.1", + "version": "17.0.13", "classifier": "linux", - "sha1": "b5b2a8ead40bd43476740aa51697bb1cac23de5c" + "sha1": "940e9e05a974a3e484d5ec241d88a0c77ad013f2" } ], "linux-arm32": [ diff --git a/HMCLCore/build.gradle.kts b/HMCLCore/build.gradle.kts index abe7e5a211..53ae7fcb0b 100644 --- a/HMCLCore/build.gradle.kts +++ b/HMCLCore/build.gradle.kts @@ -11,7 +11,7 @@ dependencies { api("org.jenkins-ci:constant-pool-scanner:1.2") api("com.github.steveice10:opennbt:1.5") api("org.nanohttpd:nanohttpd:2.3.1") - api("org.apache.commons:commons-compress:1.27.1") + api("org.apache.commons:commons-compress:1.25.0") api("org.jsoup:jsoup:1.18.1") compileOnlyApi("org.jetbrains:annotations:24.1.0") diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/Account.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/Account.java index 8ac98a2a98..3d40c983fe 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/Account.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/Account.java @@ -30,6 +30,7 @@ import org.jackhuang.hmcl.util.ToStringBuilder; import org.jackhuang.hmcl.util.javafx.ObservableHelper; +import java.nio.file.Path; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -69,6 +70,14 @@ public abstract class Account implements Observable { */ public abstract AuthInfo playOffline() throws AuthenticationException; + public boolean canUploadSkin() { + return false; + } + + public void uploadSkin(boolean isSlim, Path file) throws AuthenticationException, UnsupportedOperationException { + throw new UnsupportedOperationException("Unsupported Operation"); + } + public abstract Map toStorage(); public void clearCache() { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftAccount.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftAccount.java index 774178a725..ef9401630d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftAccount.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftAccount.java @@ -24,6 +24,7 @@ import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilService; import org.jackhuang.hmcl.util.javafx.BindingMapping; +import java.nio.file.Path; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -32,7 +33,7 @@ import static java.util.Objects.requireNonNull; import static org.jackhuang.hmcl.util.logging.Logger.LOG; -public class MicrosoftAccount extends OAuthAccount { +public final class MicrosoftAccount extends OAuthAccount { protected final MicrosoftService service; protected UUID characterUUID; @@ -125,6 +126,16 @@ public AuthInfo playOffline() { return session.toAuthInfo(); } + @Override + public boolean canUploadSkin() { + return true; + } + + @Override + public void uploadSkin(boolean isSlim, Path file) throws AuthenticationException, UnsupportedOperationException { + service.uploadSkin(session.getAccessToken(), isSlim, file); + } + @Override public Map toStorage() { return session.toStorage(); @@ -150,6 +161,7 @@ public ObjectBinding>> getTextures() { @Override public void clearCache() { authenticated = false; + service.getProfileRepository().invalidate(characterUUID); } @Override diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftService.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftService.java index 214f062de0..335e074d00 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftService.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftService.java @@ -25,19 +25,18 @@ import org.jackhuang.hmcl.auth.OAuth; import org.jackhuang.hmcl.auth.ServerDisconnectException; import org.jackhuang.hmcl.auth.ServerResponseMalformedException; -import org.jackhuang.hmcl.auth.yggdrasil.CompleteGameProfile; -import org.jackhuang.hmcl.auth.yggdrasil.RemoteAuthenticationException; -import org.jackhuang.hmcl.auth.yggdrasil.Texture; -import org.jackhuang.hmcl.auth.yggdrasil.TextureType; +import org.jackhuang.hmcl.auth.yggdrasil.*; +import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.*; -import org.jackhuang.hmcl.util.io.HttpRequest; -import org.jackhuang.hmcl.util.io.NetworkUtils; -import org.jackhuang.hmcl.util.io.ResponseCodeException; +import org.jackhuang.hmcl.util.io.*; import org.jackhuang.hmcl.util.javafx.ObservableOptionalCache; import java.io.IOException; +import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.*; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -261,6 +260,33 @@ public Optional getCompleteGameProfile(UUID uuid) throws Au return Optional.ofNullable(GSON.fromJson(request(NetworkUtils.toURL("https://sessionserver.mojang.com/session/minecraft/profile/" + UUIDTypeAdapter.fromUUID(uuid)), null), CompleteGameProfile.class)); } + public void uploadSkin(String accessToken, boolean isSlim, Path file) throws AuthenticationException, UnsupportedOperationException { + try { + HttpURLConnection con = NetworkUtils.createHttpConnection(NetworkUtils.toURL("https://api.minecraftservices.com/minecraft/profile/skins")); + con.setRequestMethod("POST"); + con.setRequestProperty("Authorization", "Bearer " + accessToken); + con.setDoOutput(true); + try (HttpMultipartRequest request = new HttpMultipartRequest(con)) { + request.param("variant", isSlim ? "slim" : "classic"); + try (InputStream fis = Files.newInputStream(file)) { + request.file("file", FileUtils.getName(file), "image/" + FileUtils.getExtension(file), fis); + } + } + + String response = NetworkUtils.readData(con); + if (StringUtils.isBlank(response)) { + if (con.getResponseCode() / 100 != 2) + throw new ResponseCodeException(con.getURL(), con.getResponseCode()); + } else { + MinecraftErrorResponse profileResponse = GSON.fromJson(response, MinecraftErrorResponse.class); + if (StringUtils.isNotBlank(profileResponse.errorMessage) || con.getResponseCode() / 100 != 2) + throw new AuthenticationException("Failed to upload skin, response code: " + con.getResponseCode() + ", response: " + response); + } + } catch (IOException | JsonParseException e) { + throw new AuthenticationException(e); + } + } + private static String request(URL url, Object payload) throws AuthenticationException { try { if (payload == null) @@ -272,14 +298,6 @@ private static String request(URL url, Object payload) throws AuthenticationExce } } - private static T fromJson(String text, Class typeOfT) throws ServerResponseMalformedException { - try { - return GSON.fromJson(text, typeOfT); - } catch (JsonParseException e) { - throw new ServerResponseMalformedException(text, e); - } - } - public static class XboxAuthorizationException extends AuthenticationException { private final long errorCode; private final String redirect; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java index db0f06fdeb..f253eb40b3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilAccount.java @@ -203,8 +203,14 @@ public ObjectBinding>> getTextures() { } - public void uploadSkin(String model, Path file) throws AuthenticationException, UnsupportedOperationException { - service.uploadSkin(characterUUID, session.getAccessToken(), model, file); + @Override + public boolean canUploadSkin() { + return true; + } + + @Override + public void uploadSkin(boolean isSlim, Path file) throws AuthenticationException, UnsupportedOperationException { + service.uploadSkin(characterUUID, session.getAccessToken(), isSlim, file); } private static String randomClientToken() { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java index 3e3b71e5ee..ef3b695626 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/YggdrasilService.java @@ -148,14 +148,14 @@ public void invalidate(String accessToken, String clientToken) throws Authentica requireEmpty(request(provider.getInvalidationURL(), createRequestWithCredentials(accessToken, clientToken))); } - public void uploadSkin(UUID uuid, String accessToken, String model, Path file) throws AuthenticationException, UnsupportedOperationException { + public void uploadSkin(UUID uuid, String accessToken, boolean isSlim, Path file) throws AuthenticationException, UnsupportedOperationException { try { HttpURLConnection con = NetworkUtils.createHttpConnection(provider.getSkinUploadURL(uuid)); con.setRequestMethod("PUT"); con.setRequestProperty("Authorization", "Bearer " + accessToken); con.setDoOutput(true); try (HttpMultipartRequest request = new HttpMultipartRequest(con)) { - request.param("model", model); + request.param("model", isSlim ? "slim" : ""); try (InputStream fis = Files.newInputStream(file)) { request.file("file", FileUtils.getName(file), "image/" + FileUtils.getExtension(file), fis); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaDistribution.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaDistribution.java index f4032bebb7..96d02c95cc 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaDistribution.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaDistribution.java @@ -17,12 +17,7 @@ */ package org.jackhuang.hmcl.download.java; -import org.jackhuang.hmcl.download.DownloadProvider; -import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.platform.Platform; - import java.util.Set; -import java.util.TreeMap; /** * @author Glavo @@ -31,6 +26,4 @@ public interface JavaDistribution { String getDisplayName(); Set getSupportedPackageTypes(); - - Task> getFetchJavaVersionsTask(DownloadProvider provider, Platform platform, JavaPackageType packageType); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaPackageType.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaPackageType.java index 42cc195d8f..8fcf4d3739 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaPackageType.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaPackageType.java @@ -21,10 +21,10 @@ * @author Glavo */ public enum JavaPackageType { - JDK(true, false), JRE(false, false), - JDKFX(true, true), - JREFX(false, true); + JDK(true, false), + JREFX(false, true), + JDKFX(true, true); private final boolean jdk; private final boolean javafx; @@ -34,6 +34,13 @@ public enum JavaPackageType { this.javafx = javafx; } + public static JavaPackageType of(boolean jdk, boolean javafx) { + if (jdk) + return javafx ? JDKFX : JDK; + else + return javafx ? JREFX : JRE; + } + public boolean isJDK() { return jdk; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/disco/DiscoFetchJavaListTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/disco/DiscoFetchJavaListTask.java index d4f333b34e..df178fe576 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/disco/DiscoFetchJavaListTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/disco/DiscoFetchJavaListTask.java @@ -33,7 +33,7 @@ /** * @author Glavo */ -public final class DiscoFetchJavaListTask extends Task> { +public final class DiscoFetchJavaListTask extends Task>> { public static final String API_ROOT = System.getProperty("hmcl.discoapi.override", "https://api.foojay.io/disco/v3.0"); @@ -46,22 +46,21 @@ private static String getArchitectureName(Architecture arch) { } private final DiscoJavaDistribution distribution; + private final String archiveType; private final Task fetchPackagesTask; - public DiscoFetchJavaListTask(DownloadProvider downloadProvider, DiscoJavaDistribution distribution, Platform platform, JavaPackageType packageType) { + public DiscoFetchJavaListTask(DownloadProvider downloadProvider, DiscoJavaDistribution distribution, Platform platform) { this.distribution = distribution; + this.archiveType = platform.getOperatingSystem() == OperatingSystem.WINDOWS ? "zip" : "tar.gz"; HashMap params = new HashMap<>(); params.put("distribution", distribution.getApiParameter()); - params.put("package", packageType.isJDK() ? "jdk" : "jre"); - params.put("javafx_bundled", Boolean.toString(packageType.isJavaFXBundled())); params.put("operating_system", getOperatingSystemName(platform.getOperatingSystem())); params.put("architecture", getArchitectureName(platform.getArchitecture())); - params.put("archive_type", platform.getOperatingSystem() == OperatingSystem.WINDOWS ? "zip" : "tar.gz"); + params.put("archive_type", archiveType); params.put("directly_downloadable", "true"); - if (platform.getOperatingSystem() == OperatingSystem.LINUX) { + if (platform.getOperatingSystem() == OperatingSystem.LINUX) params.put("lib_c_type", "glibc"); - } this.fetchPackagesTask = new GetTask(downloadProvider.injectURLWithCandidates(NetworkUtils.withQuery(API_ROOT + "/packages", params))); } @@ -74,22 +73,28 @@ public Collection> getDependents() { @Override public void execute() throws Exception { String json = fetchPackagesTask.getResult(); - List result = JsonUtils.fromNonNullJson(json, DiscoResult.typeOf(DiscoJavaRemoteVersion.class)).getResult(); + List list = JsonUtils.fromNonNullJson(json, DiscoResult.typeOf(DiscoJavaRemoteVersion.class)).getResult(); + EnumMap> result = new EnumMap<>(JavaPackageType.class); - TreeMap map = new TreeMap<>(); + for (DiscoJavaRemoteVersion version : list) { + if (!distribution.getApiParameter().equals(version.getDistribution()) + || !version.isDirectlyDownloadable() + || !archiveType.equals(version.getArchiveType())) + continue; - for (DiscoJavaRemoteVersion version : result) { if (!distribution.testVersion(version)) continue; + JavaPackageType packageType = JavaPackageType.of("jdk".equals(version.getPackageType()), version.isJavaFXBundled()); + TreeMap map = result.computeIfAbsent(packageType, ignored -> new TreeMap<>()); + int jdkVersion = version.getJdkVersion(); DiscoJavaRemoteVersion oldVersion = map.get(jdkVersion); - if (oldVersion == null || VersionNumber.compare(version.getDistributionVersion(), oldVersion.getDistributionVersion()) > 0) { + if (oldVersion == null || VersionNumber.compare(version.getDistributionVersion(), oldVersion.getDistributionVersion()) > 0) map.put(jdkVersion, version); - } } - setResult(map); + setResult(result); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/disco/DiscoJavaDistribution.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/disco/DiscoJavaDistribution.java index 7cc6c3e20a..5a9c696beb 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/disco/DiscoJavaDistribution.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/disco/DiscoJavaDistribution.java @@ -17,10 +17,8 @@ */ package org.jackhuang.hmcl.download.java.disco; -import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.java.JavaDistribution; import org.jackhuang.hmcl.download.java.JavaPackageType; -import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.Pair; import org.jackhuang.hmcl.util.platform.Architecture; import org.jackhuang.hmcl.util.platform.OperatingSystem; @@ -35,6 +33,7 @@ /** * @author Glavo + * @see discoapi */ public enum DiscoJavaDistribution implements JavaDistribution { TEMURIN("Eclipse Temurin", "temurin", "Adoptium", @@ -42,7 +41,7 @@ public enum DiscoJavaDistribution implements JavaDistribution> getFetchJavaVersionsTask(DownloadProvider provider, Platform platform, JavaPackageType packageType) { - return new DiscoFetchJavaListTask(provider, this, platform, packageType); - } - public boolean testVersion(DiscoJavaRemoteVersion version) { return this.getApiParameter().equals(version.getDistribution()); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/disco/DiscoJavaRemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/disco/DiscoJavaRemoteVersion.java index 3698183d86..ca65643db7 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/disco/DiscoJavaRemoteVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/disco/DiscoJavaRemoteVersion.java @@ -171,6 +171,10 @@ public String getTermOfSupport() { return termOfSupport; } + public boolean isLTS() { + return "lts".equals(termOfSupport); + } + public String getOperatingSystem() { return operatingSystem; } @@ -191,7 +195,7 @@ public String getPackageType() { return packageType; } - public boolean isJavafxBundled() { + public boolean isJavaFXBundled() { return javafxBundled; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaDistribution.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaDistribution.java index b8de72f728..3f257264fd 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaDistribution.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaDistribution.java @@ -17,16 +17,12 @@ */ package org.jackhuang.hmcl.download.java.mojang; -import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.java.JavaDistribution; import org.jackhuang.hmcl.download.java.JavaPackageType; import org.jackhuang.hmcl.download.java.JavaRemoteVersion; -import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.platform.Platform; import java.util.Collections; import java.util.Set; -import java.util.TreeMap; /** * @author Glavo @@ -47,9 +43,4 @@ public String getDisplayName() { public Set getSupportedPackageTypes() { return Collections.singleton(JavaPackageType.JRE); } - - @Override - public Task> getFetchJavaVersionsTask(DownloadProvider provider, Platform platform, JavaPackageType packageType) { - return null; - } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/java/JavaInfo.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/java/JavaInfo.java index dc4be6700b..d23f5a46a9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/java/JavaInfo.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/java/JavaInfo.java @@ -126,6 +126,7 @@ public static String normalizeVendor(String vendor) { return "Azul"; case "IBM Corporation": case "International Business Machines Corporation": + case "Eclipse OpenJ9": return "IBM"; case "Eclipse Adoptium": return "Adoptium"; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/FXThread.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/FXThread.java new file mode 100644 index 0000000000..53974cb0a2 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/FXThread.java @@ -0,0 +1,32 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2024 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.jackhuang.hmcl.util; + +import java.lang.annotation.*; + +/** + * Mark a method that can only be called on the JavaFX Application Thread, + * or mark a field that can only be read/modified on the JavaFX Application Thread. + * + * @author Glavo + */ +@Documented +@Target({ElementType.METHOD, ElementType.FIELD}) +@Retention(RetentionPolicy.SOURCE) +public @interface FXThread { +} diff --git a/HMCLCore/src/main/resources/assets/game/versions.txt b/HMCLCore/src/main/resources/assets/game/versions.txt index 82cef053a6..2d8fdada50 100644 --- a/HMCLCore/src/main/resources/assets/game/versions.txt +++ b/HMCLCore/src/main/resources/assets/game/versions.txt @@ -767,4 +767,23 @@ 1.21-pre3 1.21-pre4 1.21-rc1 -1.21 \ No newline at end of file +1.21 +1.21.1-rc1 +1.21.1 +24w33a +24w34a +24w35a +24w36a +24w37a +24w38a +24w39a +24w40a +1.21.2-pre1 +1.21.2-pre2 +1.21.2-pre3 +1.21.2-pre4 +1.21.2-pre5 +1.21.2-rc1 +1.21.2-rc2 +1.21.2 +1.21.3 \ No newline at end of file diff --git a/README.md b/README.md index 0afa0119df..b0118ea253 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # ⛏ Hello Minecraft! Launcher 💎 [![Build Status](https://ci.huangyuhui.net/job/HMCL/badge/icon?.svg)](https://ci.huangyuhui.net/job/HMCL) -![Downloads](https://img.shields.io/github/downloads/huanghongxun/HMCL/total?style=flat) -![Stars](https://img.shields.io/github/stars/huanghongxun/HMCL?style=flat) +![Downloads](https://img.shields.io/github/downloads/HMCL-dev/HMCL/total?style=flat) +![Stars](https://img.shields.io/github/stars/HMCL-dev/HMCL?style=flat) [![Discord](https://img.shields.io/discord/995291757799538688.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/jVvC7HfM6U) [![QQ Group](https://img.shields.io/badge/QQ-HMCL-bright?label=&logo=tencentqq&logoColor=ffffff&color=1EBAFC&labelColor=1DB0EF&logoSize=auto)](https://docs.hmcl.net/groups.html) @@ -10,9 +10,9 @@ ## Introduction -HMCL is a cross-platform Minecraft launcher which supports Mod Management, Game Customizing, ModLoader Installing (Forge, NeoForge, Fabric, Quilt, LiteLoader and OptiFine), Modpack Creating, UI Customization, and more. +HMCL is an open-source, cross-platform Minecraft launcher that supports Mod Management, Game Customizing, ModLoader Installing (Forge, NeoForge, Fabric, Quilt, LiteLoader and OptiFine), Modpack Creating, UI Customization, and more. -HMCL has amazing cross-platform capabilities. It can not only run on different operating systems such as Windows, Linux, and macOS, but also supports multiple CPU architectures such as x86, ARM, MIPS, and LoongArch. You can easily play Minecraft on different platforms through HMCL. +HMCL has amazing cross-platform capabilities. Not only does it run on different operating systems like Windows, Linux, and macOS, but it also supports various CPU architectures such as x86, ARM, MIPS, and LoongArch. You can easily enjoy Minecraft across different platforms through HMCL. For systems and CPU architectures supported by HMCL, see [this table](PLATFORM.md). @@ -20,13 +20,13 @@ For systems and CPU architectures supported by HMCL, see [this table](PLATFORM.m Download the latest version from [the official website](https://hmcl.huangyuhui.net/download). -You can also download the latest version of HMCL in [GitHub Releases](https://github.com/HMCL-dev/HMCL/releases). +You can also find the latest version of HMCL in [GitHub Releases](https://github.com/HMCL-dev/HMCL/releases). -Although not necessary, it is recommended to download the ones from the official website. +Although not necessary, it is recommended only to download releases from the official websites listed above. ## License -The software is distributed under [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html) with additional terms. +The software is distributed under [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html) license with the following additional terms: ### Additional terms under GPLv3 Section 7 @@ -38,7 +38,7 @@ The software is distributed under [GPLv3](https://www.gnu.org/licenses/gpl-3.0.h ## Contribution -If you want to submit a pull request, there are some requirements: +If you want to submit a pull request, here are some requirements: * IDE: IntelliJ IDEA * Compiler: Java 1.8 or Java 11+ @@ -52,7 +52,7 @@ Simply execute the following command in project root directory: ./gradlew clean build ``` -Make sure you have Java installed with JavaFX 8 at least. Liberica Full JDK 8 or later is recommended. +Make sure you have at least JavaFX 8 installed. Liberica Full JDK 8 or later is recommended. ## JVM Options (for debugging) @@ -68,4 +68,4 @@ Make sure you have Java installed with JavaFX 8 at least. Liberica Full JDK 8 or | `-Dhmcl.openjfx.repo=` | Add custom Maven repository for download OpenJFX | | `-Dhmcl.native.encoding=` | Override the native encoding | | `-Dhmcl.microsoft.auth.id=` | Override Microsoft OAuth App ID | -| `-Dhmcl.microsoft.auth.secret=` | Override Microsoft OAuth App secret | \ No newline at end of file +| `-Dhmcl.microsoft.auth.secret=` | Override Microsoft OAuth App secret | diff --git a/README_cn.md b/README_cn.md index c94c7e5b62..2d8d7d0d40 100644 --- a/README_cn.md +++ b/README_cn.md @@ -1,8 +1,8 @@ # ⛏ Hello Minecraft! Launcher 💎 [![Build Status](https://ci.huangyuhui.net/job/HMCL/badge/icon?.svg)](https://ci.huangyuhui.net/job/HMCL) -![Downloads](https://img.shields.io/github/downloads/huanghongxun/HMCL/total?style=flat) -![Stars](https://img.shields.io/github/stars/huanghongxun/HMCL?style=flat) +![Downloads](https://img.shields.io/github/downloads/HMCL-dev/HMCL/total?style=flat) +![Stars](https://img.shields.io/github/stars/HMCL-dev/HMCL?style=flat) [![Discord](https://img.shields.io/discord/995291757799538688.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/jVvC7HfM6U) [![QQ Group](https://img.shields.io/badge/QQ-HMCL-bright?label=&logo=tencentqq&logoColor=ffffff&color=1EBAFC&labelColor=1DB0EF&logoSize=auto)](https://docs.hmcl.net/groups.html) @@ -10,7 +10,7 @@ ## 简介 -HMCL 是一款跨平台 Minecraft 启动器,支持模组管理、游戏自定义、游戏自动安装 (Forge、NeoForge、Fabric、Quilt、LiteLoader 和 OptiFine)、整合包创建、界面自定义等功能。 +HMCL 是一款开源、跨平台的 Minecraft 启动器,支持模组管理、游戏自定义、游戏自动安装 (Forge、NeoForge、Fabric、Quilt、LiteLoader 和 OptiFine)、整合包创建、界面自定义等功能。 HMCL 有着强大的跨平台能力。它不仅支持 Windows、Linux、macOS 等常见的操作系统,同时也支持 x86、ARM、MIPS 和 LoongArch 等不同的 CPU 架构。你可以使用 HMCL 在不同平台上轻松地游玩 Minecraft。 @@ -26,7 +26,7 @@ HMCL 有着强大的跨平台能力。它不仅支持 Windows、Linux、macOS ## 开源协议 -该程序在 [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html) 开源协议下发布,同时附有附加条款。 +该程序在 [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html) 开源协议下发布,同时附有以下附加条款。 ### 附加条款 (依据 GPLv3 开源协议第七条) @@ -46,7 +46,7 @@ HMCL 有着强大的跨平台能力。它不仅支持 Windows、Linux、macOS ### 编译 -于项目根目录执行以下命令: +于项目根文件夹执行以下命令: ```bash ./gradlew clean build diff --git a/README_tw.md b/README_tw.md index 3441b4ccb2..4fcebadbfb 100644 --- a/README_tw.md +++ b/README_tw.md @@ -1,8 +1,8 @@ # ⛏ Hello Minecraft! Launcher 💎 [![Build Status](https://ci.huangyuhui.net/job/HMCL/badge/icon?.svg)](https://ci.huangyuhui.net/job/HMCL) -![Downloads](https://img.shields.io/github/downloads/huanghongxun/HMCL/total?style=flat) -![Stars](https://img.shields.io/github/stars/huanghongxun/HMCL?style=flat) +![Downloads](https://img.shields.io/github/downloads/HMCL-dev/HMCL/total?style=flat) +![Stars](https://img.shields.io/github/stars/HMCL-dev/HMCL?style=flat) [![Discord](https://img.shields.io/discord/995291757799538688.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/jVvC7HfM6U) [![QQ Group](https://img.shields.io/badge/QQ-HMCL-bright?label=&logo=tencentqq&logoColor=ffffff&color=1EBAFC&labelColor=1DB0EF&logoSize=auto)](https://docs.hmcl.net/groups.html) @@ -10,7 +10,7 @@ ## 簡介 -HMCL 是一款跨平臺 Minecraft 啟動器,支援模組管理、遊戲自訂、遊戲自動安裝 (Forge、NeoForge、Fabric、Quilt、LiteLoader 和 OptiFine)、模組包建立、介面自訂等功能。 +HMCL 是一款開源、跨平臺的 Minecraft 啟動器,支援模組管理、遊戲自訂、遊戲自動安裝 (Forge、NeoForge、Fabric、Quilt、LiteLoader 和 OptiFine)、模組包建立、介面自訂等功能。 HMCL 有著強大的跨平臺能力。它不僅支援 Windows、Linux、macOS 等常見的作業系統,同時也支援 x86、ARM、MIPS 和 LoongArch 等不同的 CPU 架構。你可以使用 HMCL 在不同平臺上輕鬆地遊玩 Minecraft。 @@ -26,7 +26,7 @@ HMCL 有著強大的跨平臺能力。它不僅支援 Windows、Linux、macOS ## 開源協議 -該程式在 [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html) 開源協議下發布,同時附有附加條款。 +該程式在 [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html) 開源協議下發布,同時附有以下附加條款。 ### 附加條款 (依據 GPLv3 開源協議第七條) @@ -58,12 +58,12 @@ HMCL 有著強大的跨平臺能力。它不僅支援 Windows、Linux、macOS | 參數 | 簡介 | | -------------------------------------------- | -------------------------------------------------------------------- | -| `-Dhmcl.home=` | 覆蓋 HMCL 使用者資料夾 | +| `-Dhmcl.home=` | 覆蓋 HMCL 使用者目錄 | | `-Dhmcl.self_integrity_check.disable=true` | 檢查更新時繞過本體完整性檢查 | | `-Dhmcl.bmclapi.override=` | 覆蓋 BMCLAPI 的 API Root,預設值為 `https://bmclapi2.bangbang93.com` | | `-Dhmcl.font.override=` | 覆蓋字族 | | `-Dhmcl.version.override=` | 覆蓋版本號 | -| `-Dhmcl.update_source.override=` | 覆蓋 HMCL 更新源 | +| `-Dhmcl.update_source.override=` | 覆蓋 HMCL 更新來源 | | `-Dhmcl.authlibinjector.location=` | 使用指定的 authlib-injector (而非下載一個) | | `-Dhmcl.openjfx.repo=` | 添加用於下載 OpenJFX 的自訂 Maven 倉庫 | | `-Dhmcl.native.encoding=` | 覆蓋原生編碼 | diff --git a/javafx.gradle.kts b/javafx.gradle.kts index ac94aca785..aaa266e241 100644 --- a/javafx.gradle.kts +++ b/javafx.gradle.kts @@ -4,11 +4,12 @@ buildscript { } dependencies { - classpath("com.google.code.gson:gson:2.10.1") + classpath("com.google.code.gson:gson:2.11.0") } } -val jfxVersion = "19.0.2.1" +val jfxVersion = "17.0.13" +val oldJfxVersion = "19.0.2.1" data class Platform( val name: String, @@ -29,14 +30,14 @@ val jfxModules = listOf("base", "graphics", "controls") val jfxMirrorRepos = listOf("https://mirrors.cloud.tencent.com/nexus/repository/maven-public") val jfxDependenciesFile = project.file("HMCL/src/main/resources/assets/openjfx-dependencies.json") val jfxPlatforms = listOf( - Platform("windows-x86", "win-x86"), + Platform("windows-x86", "win-x86", version = oldJfxVersion), Platform("windows-x86_64", "win"), Platform("windows-arm64", "win", groupId = "org.glavo.hmcl.openjfx", version = "18.0.2+1-arm64"), Platform("osx-x86_64", "mac"), Platform("osx-arm64", "mac-aarch64"), Platform("linux-x86_64", "linux"), - Platform("linux-arm32", "linux-arm32-monocle"), - Platform("linux-arm64", "linux-aarch64"), + Platform("linux-arm32", "linux-arm32-monocle", version = oldJfxVersion), + Platform("linux-arm64", "linux-aarch64", version = oldJfxVersion), Platform("linux-loongarch64", "linux", groupId = "org.glavo.hmcl.openjfx", version = "17.0.8-loongarch64"), Platform("linux-loongarch64_ow", "linux", groupId = "org.glavo.hmcl.openjfx", version = "19-ea+10-loongson64"), Platform("linux-riscv64", "linux", groupId = "org.glavo.hmcl.openjfx", version = "19.0.2.1-riscv64"),