From f2032ab7a8a64c6382f8724e96893963f87cdcd3 Mon Sep 17 00:00:00 2001 From: Glavo Date: Wed, 22 Oct 2025 20:35:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20Translator=20=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96=E4=B8=8B=E8=BD=BD=E9=80=9F=E5=BA=A6=20(#4709?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/construct/TaskExecutorDialogPane.java | 14 ++---------- .../org/jackhuang/hmcl/util/i18n/I18n.java | 4 ++++ .../hmcl/util/i18n/translator/Translator.java | 9 ++++++++ .../i18n/translator/Translator_en_Qabs.java | 22 ++++++++++--------- .../resources/assets/lang/I18N.properties | 3 +++ .../resources/assets/lang/I18N_ru.properties | 3 +++ .../resources/assets/lang/I18N_uk.properties | 4 ++++ .../resources/assets/lang/I18N_zh.properties | 3 +++ .../assets/lang/I18N_zh_CN.properties | 3 +++ 9 files changed, 43 insertions(+), 22 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogPane.java index eaf3a103e..b3031f80d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogPane.java @@ -28,6 +28,7 @@ import javafx.scene.layout.VBox; import org.jackhuang.hmcl.task.*; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.util.TaskCancellationAction; +import org.jackhuang.hmcl.util.i18n.I18n; import org.jetbrains.annotations.NotNull; import java.util.Optional; @@ -86,18 +87,7 @@ public class TaskExecutorDialogPane extends BorderPane { }); speedEventHandler = FetchTask.SPEED_EVENT.registerWeak(speedEvent -> { - String unit = "B/s"; - double speed = speedEvent.getSpeed(); - if (speed > 1024) { - speed /= 1024; - unit = "KiB/s"; - } - if (speed > 1024) { - speed /= 1024; - unit = "MiB/s"; - } - - String message = String.format("%.1f %s", speed, unit); + String message = I18n.formatSpeed(speedEvent.getSpeed()); Platform.runLater(() -> lblProgress.setText(message)); }); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java index 8a07cdbeb..a3d4c32ab 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java @@ -71,6 +71,10 @@ public final class I18n { return getTranslator().formatDateTime(time); } + public static String formatSpeed(long bytes) { + return getTranslator().formatSpeed(bytes); + } + public static String getDisplaySelfVersion(RemoteVersion version) { return getTranslator().getDisplayVersion(version); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/translator/Translator.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/translator/Translator.java index 026928919..3441797cb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/translator/Translator.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/translator/Translator.java @@ -59,4 +59,13 @@ public class Translator { return formatter.format(time); } + public String formatSpeed(long bytes) { + if (bytes < 1024) { + return supportedLocale.i18n("download.speed.byte_per_second", bytes); + } else if (bytes < 1024 * 1024) { + return supportedLocale.i18n("download.speed.kibibyte_per_second", (double) bytes / 1024); + } else { + return supportedLocale.i18n("download.speed.megabyte_per_second", (double) bytes / (1024 * 1024)); + } + } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/translator/Translator_en_Qabs.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/translator/Translator_en_Qabs.java index 24bf7edfe..f593daf5f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/translator/Translator_en_Qabs.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/translator/Translator_en_Qabs.java @@ -23,25 +23,20 @@ import org.jackhuang.hmcl.util.i18n.SupportedLocale; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; import java.util.Collections; import java.util.LinkedHashMap; +import java.util.Locale; import java.util.Map; import static org.jackhuang.hmcl.util.logging.Logger.LOG; /// @author Glavo public class Translator_en_Qabs extends Translator { - private static final DateTimeFormatter BASE_FORMATTER = DateTimeFormatter.ofPattern("MMM d, yyyy, h:mm:ss a") - .withZone(ZoneId.systemDefault()); + private static final Map MAPPER; - private static final Map MAPPER = loadMap(); - - private static Map loadMap() { + static { var map = new LinkedHashMap(); - InputStream inputStream = Translator_en_Qabs.class.getResourceAsStream("/assets/lang/upside_down.txt"); if (inputStream != null) { try (inputStream) { @@ -62,7 +57,7 @@ public class Translator_en_Qabs extends Translator { } else { LOG.warning("upside_down.txt not found"); } - return Collections.unmodifiableMap(map); + MAPPER = Collections.unmodifiableMap(map); } public static String translate(String str) { @@ -71,6 +66,8 @@ public class Translator_en_Qabs extends Translator { return builder.reverse().toString(); } + private final SupportedLocale originalLocale = SupportedLocale.getLocale(Locale.ENGLISH); + public Translator_en_Qabs(SupportedLocale locale) { super(locale); } @@ -82,6 +79,11 @@ public class Translator_en_Qabs extends Translator { @Override public String formatDateTime(TemporalAccessor time) { - return translate(BASE_FORMATTER.format(time)); + return translate(originalLocale.getTranslator().formatDateTime(time)); + } + + @Override + public String formatSpeed(long bytes) { + return translate(originalLocale.getTranslator().formatSpeed(bytes)); } } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index b59ab34f7..5c3592c8b 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -359,6 +359,9 @@ download.javafx.notes=We are currently downloading dependencies for HMCL from th Note: If your download speed is too slow, you can try switching to another mirror. download.javafx.component=Downloading module "%s" download.javafx.prepare=Preparing to download +download.speed.byte_per_second=%d B/s +download.speed.kibibyte_per_second=%.1f KiB/s +download.speed.megabyte_per_second=%.1f MiB/s exception.access_denied=HMCL is unable to access the file "%s". It may be locked by another process.\n\ \n\ diff --git a/HMCL/src/main/resources/assets/lang/I18N_ru.properties b/HMCL/src/main/resources/assets/lang/I18N_ru.properties index 0cab29cef..7c78c3879 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ru.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ru.properties @@ -360,6 +360,9 @@ download.javafx.notes=Скачивание зависимостей для ла Примечание: Если ваша скорость скачивания слишком низкая, вы можете попробовать переключиться на другое зеркало. download.javafx.component=Скачивание модуля «%s» download.javafx.prepare=Подготовка к скачиванию +download.speed.byte_per_second=%d Б/сек +download.speed.kibibyte_per_second=%.1f КиБ/сек +download.speed.megabyte_per_second=%.1f МиБ/сек exception.access_denied=Лаунчер не может получить доступ к файлу «%s», возможно он занят другим процессом.\n\ \n\ diff --git a/HMCL/src/main/resources/assets/lang/I18N_uk.properties b/HMCL/src/main/resources/assets/lang/I18N_uk.properties index 6e727b8e6..f5bd555d1 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_uk.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_uk.properties @@ -356,6 +356,10 @@ download.javafx.notes=Ми зараз завантажуємо залежнос Примітка: Якщо ваша швидкість завантаження занадто повільна, ви можете спробувати переключитися на інше дзеркало. download.javafx.component=Завантаження модуля "%s" download.javafx.prepare=Підготовка до завантаження +download.speed.byte_per_second=%d Б/сек +download.speed.kibibyte_per_second=%.1f КiБ/сек +download.speed.megabyte_per_second=%.1f МiБ/сек + exception.access_denied=HMCL не може отримати доступ до файлу "%s". Можливо, він заблокований іншим процесом.\n\ \n\ Для користувачів Windows ви можете відкрити "Монітор ресурсів", щоб перевірити, чи не використовується він іншим процесом. Якщо так, ви можете спробувати знову після завершення цього процесу.\n\ diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index c97225c87..a60729d6f 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -358,6 +358,9 @@ download.javafx=正在下載必要的執行時元件 download.javafx.notes=正在透過網路下載 HMCL 必要的執行時元件。\n點擊「切換下載源」按鈕查看詳情以及選取下載源。點擊「取消」按鈕停止並退出。\n注意:如果下載速度過慢,請嘗試切換下載源。 download.javafx.component=正在下載元件「%s」 download.javafx.prepare=準備開始下載 +download.speed.byte_per_second=%d B/s +download.speed.kibibyte_per_second=%.1f KiB/s +download.speed.megabyte_per_second=%.1f MiB/s exception.access_denied=無法存取檔案「%s」。因為 HMCL 沒有對該檔案的訪問權限,或者該檔案已被其他程式開啟。\n\ 請你檢查目前作業系統帳戶是否能訪存取檔案,比如非管理員使用者可能不能訪問其他帳戶的個人目錄內的檔案。\n\ 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 f05ee9608..295199da3 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -366,6 +366,9 @@ download.javafx=正在下载必要的运行时组件…… download.javafx.notes=正在通过网络下载 HMCL 必要的运行时组件。\n点击“切换下载源”按钮查看详情以及选择下载源。点击“取消”按钮停止并退出。\n注意:若下载速度过慢,请尝试切换下载源。 download.javafx.component=正在下载模块“%s” download.javafx.prepare=准备开始下载 +download.speed.byte_per_second=%d B/s +download.speed.kibibyte_per_second=%.1f KiB/s +download.speed.megabyte_per_second=%.1f MiB/s exception.access_denied=无法访问文件“%s”。HMCL 没有对该文件的访问权限,或者该文件已被其他程序打开。\n\ 请你检查当前操作系统账户是否能访问该文件,比如非管理员用户可能无法访问其他账户的个人文件夹内的文件。\n\