使用 Translator 格式化下载速度 (#4709)

This commit is contained in:
Glavo
2025-10-22 20:35:42 +08:00
committed by GitHub
parent d7c6a23dbe
commit f2032ab7a8
9 changed files with 43 additions and 22 deletions

View File

@@ -28,6 +28,7 @@ import javafx.scene.layout.VBox;
import org.jackhuang.hmcl.task.*; import org.jackhuang.hmcl.task.*;
import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.FXUtils;
import org.jackhuang.hmcl.util.TaskCancellationAction; import org.jackhuang.hmcl.util.TaskCancellationAction;
import org.jackhuang.hmcl.util.i18n.I18n;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Optional; import java.util.Optional;
@@ -86,18 +87,7 @@ public class TaskExecutorDialogPane extends BorderPane {
}); });
speedEventHandler = FetchTask.SPEED_EVENT.registerWeak(speedEvent -> { speedEventHandler = FetchTask.SPEED_EVENT.registerWeak(speedEvent -> {
String unit = "B/s"; String message = I18n.formatSpeed(speedEvent.getSpeed());
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);
Platform.runLater(() -> lblProgress.setText(message)); Platform.runLater(() -> lblProgress.setText(message));
}); });

View File

@@ -71,6 +71,10 @@ public final class I18n {
return getTranslator().formatDateTime(time); return getTranslator().formatDateTime(time);
} }
public static String formatSpeed(long bytes) {
return getTranslator().formatSpeed(bytes);
}
public static String getDisplaySelfVersion(RemoteVersion version) { public static String getDisplaySelfVersion(RemoteVersion version) {
return getTranslator().getDisplayVersion(version); return getTranslator().getDisplayVersion(version);
} }

View File

@@ -59,4 +59,13 @@ public class Translator {
return formatter.format(time); 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));
}
}
} }

View File

@@ -23,25 +23,20 @@ import org.jackhuang.hmcl.util.i18n.SupportedLocale;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalAccessor;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.logging.Logger.LOG;
/// @author Glavo /// @author Glavo
public class Translator_en_Qabs extends Translator { public class Translator_en_Qabs extends Translator {
private static final DateTimeFormatter BASE_FORMATTER = DateTimeFormatter.ofPattern("MMM d, yyyy, h:mm:ss a") private static final Map<Integer, Integer> MAPPER;
.withZone(ZoneId.systemDefault());
private static final Map<Integer, Integer> MAPPER = loadMap(); static {
private static Map<Integer, Integer> loadMap() {
var map = new LinkedHashMap<Integer, Integer>(); var map = new LinkedHashMap<Integer, Integer>();
InputStream inputStream = Translator_en_Qabs.class.getResourceAsStream("/assets/lang/upside_down.txt"); InputStream inputStream = Translator_en_Qabs.class.getResourceAsStream("/assets/lang/upside_down.txt");
if (inputStream != null) { if (inputStream != null) {
try (inputStream) { try (inputStream) {
@@ -62,7 +57,7 @@ public class Translator_en_Qabs extends Translator {
} else { } else {
LOG.warning("upside_down.txt not found"); LOG.warning("upside_down.txt not found");
} }
return Collections.unmodifiableMap(map); MAPPER = Collections.unmodifiableMap(map);
} }
public static String translate(String str) { public static String translate(String str) {
@@ -71,6 +66,8 @@ public class Translator_en_Qabs extends Translator {
return builder.reverse().toString(); return builder.reverse().toString();
} }
private final SupportedLocale originalLocale = SupportedLocale.getLocale(Locale.ENGLISH);
public Translator_en_Qabs(SupportedLocale locale) { public Translator_en_Qabs(SupportedLocale locale) {
super(locale); super(locale);
} }
@@ -82,6 +79,11 @@ public class Translator_en_Qabs extends Translator {
@Override @Override
public String formatDateTime(TemporalAccessor time) { 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));
} }
} }

View File

@@ -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. Note: If your download speed is too slow, you can try switching to another mirror.
download.javafx.component=Downloading module "%s" download.javafx.component=Downloading module "%s"
download.javafx.prepare=Preparing to download 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\ exception.access_denied=HMCL is unable to access the file "%s". It may be locked by another process.\n\
\n\ \n\

View File

@@ -360,6 +360,9 @@ download.javafx.notes=Скачивание зависимостей для ла
Примечание: Если ваша скорость скачивания слишком низкая, вы можете попробовать переключиться на другое зеркало. Примечание: Если ваша скорость скачивания слишком низкая, вы можете попробовать переключиться на другое зеркало.
download.javafx.component=Скачивание модуля «%s» download.javafx.component=Скачивание модуля «%s»
download.javafx.prepare=Подготовка к скачиванию 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\ exception.access_denied=Лаунчер не может получить доступ к файлу «%s», возможно он занят другим процессом.\n\
\n\ \n\

View File

@@ -356,6 +356,10 @@ download.javafx.notes=Ми зараз завантажуємо залежнос
Примітка: Якщо ваша швидкість завантаження занадто повільна, ви можете спробувати переключитися на інше дзеркало. Примітка: Якщо ваша швидкість завантаження занадто повільна, ви можете спробувати переключитися на інше дзеркало.
download.javafx.component=Завантаження модуля "%s" download.javafx.component=Завантаження модуля "%s"
download.javafx.prepare=Підготовка до завантаження 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\ exception.access_denied=HMCL не може отримати доступ до файлу "%s". Можливо, він заблокований іншим процесом.\n\
\n\ \n\
Для користувачів Windows ви можете відкрити "Монітор ресурсів", щоб перевірити, чи не використовується він іншим процесом. Якщо так, ви можете спробувати знову після завершення цього процесу.\n\ Для користувачів Windows ви можете відкрити "Монітор ресурсів", щоб перевірити, чи не використовується він іншим процесом. Якщо так, ви можете спробувати знову після завершення цього процесу.\n\

View File

@@ -358,6 +358,9 @@ download.javafx=正在下載必要的執行時元件
download.javafx.notes=正在透過網路下載 HMCL 必要的執行時元件。\n點擊「切換下載源」按鈕查看詳情以及選取下載源。點擊「取消」按鈕停止並退出。\n注意如果下載速度過慢請嘗試切換下載源。 download.javafx.notes=正在透過網路下載 HMCL 必要的執行時元件。\n點擊「切換下載源」按鈕查看詳情以及選取下載源。點擊「取消」按鈕停止並退出。\n注意如果下載速度過慢請嘗試切換下載源。
download.javafx.component=正在下載元件「%s」 download.javafx.component=正在下載元件「%s」
download.javafx.prepare=準備開始下載 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\ exception.access_denied=無法存取檔案「%s」。因為 HMCL 沒有對該檔案的訪問權限,或者該檔案已被其他程式開啟。\n\
請你檢查目前作業系統帳戶是否能訪存取檔案,比如非管理員使用者可能不能訪問其他帳戶的個人目錄內的檔案。\n\ 請你檢查目前作業系統帳戶是否能訪存取檔案,比如非管理員使用者可能不能訪問其他帳戶的個人目錄內的檔案。\n\

View File

@@ -366,6 +366,9 @@ download.javafx=正在下载必要的运行时组件……
download.javafx.notes=正在通过网络下载 HMCL 必要的运行时组件。\n点击“切换下载源”按钮查看详情以及选择下载源。点击“取消”按钮停止并退出。\n注意若下载速度过慢请尝试切换下载源。 download.javafx.notes=正在通过网络下载 HMCL 必要的运行时组件。\n点击“切换下载源”按钮查看详情以及选择下载源。点击“取消”按钮停止并退出。\n注意若下载速度过慢请尝试切换下载源。
download.javafx.component=正在下载模块“%s” download.javafx.component=正在下载模块“%s”
download.javafx.prepare=准备开始下载 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\ exception.access_denied=无法访问文件“%s”。HMCL 没有对该文件的访问权限,或者该文件已被其他程序打开。\n\
请你检查当前操作系统账户是否能访问该文件,比如非管理员用户可能无法访问其他账户的个人文件夹内的文件。\n\ 请你检查当前操作系统账户是否能访问该文件,比如非管理员用户可能无法访问其他账户的个人文件夹内的文件。\n\