修复路由冲突和补充多语言

This commit is contained in:
Rust 2025-10-17 22:00:46 +08:00
parent 885cd752ed
commit 75836c9c6b
11 changed files with 343 additions and 39 deletions

View File

@ -116,7 +116,10 @@
}, },
"switchSubscription": "Switch Subscription", "switchSubscription": "Switch Subscription",
"resetTrafficTitle": "Reset Traffic", "resetTrafficTitle": "Reset Traffic",
"resetTrafficMessage": "Monthly plan traffic reset example: Reset the next cycle's traffic on a monthly basis, and the subscription validity period will be advanced from {currentTime} to {newTime}" "resetTrafficMessage": "Monthly plan traffic reset example: Reset the next cycle's traffic on a monthly basis, and the subscription validity period will be advanced from {currentTime} to {newTime}",
"loginRegister": "Login/Register",
"guestId": "Guest ID: {id}",
"deviceManagement": "Device Management"
}, },
"setting": { "setting": {
"title": "Settings", "title": "Settings",
@ -316,7 +319,35 @@
"confirm": "Confirm", "confirm": "Confirm",
"cancel": "Cancel", "cancel": "Cancel",
"ok": "OK", "ok": "OK",
"iKnow": "I Know" "iKnow": "I Know",
"tip": "Tip",
"delete": "Delete",
"error": "Error",
"success": "Success",
"deviceLoginBindingTitle": "Tip",
"deviceLoginBindingMessage": "You need to login to purchase a subscription"
},
"deviceManagement": {
"title": "Device Management",
"deleteConfirmTitle": "Confirm Delete",
"deleteCurrentDeviceMessage": "Are you sure you want to delete this device? You will be automatically re-logged in using device login.",
"deleteOtherDeviceMessage": "Are you sure you want to delete this device? It will be forced offline.",
"deleteSuccess": "Device deleted",
"deleteFailed": "Delete failed: {error}",
"loadDeviceListFailed": "Failed to load device list",
"deviceLoginDisabled": "Device login is not enabled, please login manually",
"reloginSuccess": "Automatically re-logged in",
"reloginFailed": "Auto login failed: {error}, please login manually",
"reloginFailedGeneric": "Auto login failed, please login manually",
"deviceTypes": {
"unknown": "Unknown Device",
"android": "Android Device",
"ios": "iOS Device",
"ipad": "iPad",
"macos": "macOS",
"windows": "Windows",
"linux": "Linux"
}
}, },
"splash": { "splash": {
"appName": "BearVPN", "appName": "BearVPN",

View File

@ -114,6 +114,9 @@
"switchSubscription": "Cambiar Suscripción", "switchSubscription": "Cambiar Suscripción",
"resetTrafficTitle": "Restablecer Tráfico", "resetTrafficTitle": "Restablecer Tráfico",
"resetTrafficMessage": "Ejemplo de restablecimiento de tráfico del plan mensual: restablecer el tráfico del siguiente ciclo mensualmente, y el período de validez de la suscripción se adelantará de {currentTime} a {newTime}", "resetTrafficMessage": "Ejemplo de restablecimiento de tráfico del plan mensual: restablecer el tráfico del siguiente ciclo mensualmente, y el período de validez de la suscripción se adelantará de {currentTime} a {newTime}",
"loginRegister": "Iniciar sesión/Registrarse",
"guestId": "ID de Invitado: {id}",
"deviceManagement": "Administración de Dispositivos",
"trialStatus": "Estado de prueba", "trialStatus": "Estado de prueba",
"trialing": "En período de prueba", "trialing": "En período de prueba",
"trialEndMessage": "No podrá continuar usando después de que expire el período de prueba", "trialEndMessage": "No podrá continuar usando después de que expire el período de prueba",
@ -322,7 +325,35 @@
"confirm": "Confirmar", "confirm": "Confirmar",
"cancel": "Cancelar", "cancel": "Cancelar",
"ok": "OK", "ok": "OK",
"iKnow": "Lo entiendo" "iKnow": "Lo entiendo",
"tip": "Aviso",
"delete": "Eliminar",
"error": "Error",
"success": "Éxito",
"deviceLoginBindingTitle": "Aviso",
"deviceLoginBindingMessage": "Necesita iniciar sesión para comprar una suscripción"
},
"deviceManagement": {
"title": "Administración de Dispositivos",
"deleteConfirmTitle": "Confirmar Eliminación",
"deleteCurrentDeviceMessage": "¿Está seguro de que desea eliminar este dispositivo? Se volverá a iniciar sesión automáticamente usando el inicio de sesión del dispositivo.",
"deleteOtherDeviceMessage": "¿Está seguro de que desea eliminar este dispositivo? Se forzará a desconectarse.",
"deleteSuccess": "Dispositivo eliminado",
"deleteFailed": "Error al eliminar: {error}",
"loadDeviceListFailed": "Error al cargar la lista de dispositivos",
"deviceLoginDisabled": "El inicio de sesión del dispositivo no está habilitado, inicie sesión manualmente",
"reloginSuccess": "Sesión reiniciada automáticamente",
"reloginFailed": "Error al reiniciar sesión: {error}, inicie sesión manualmente",
"reloginFailedGeneric": "Error al reiniciar sesión, inicie sesión manualmente",
"deviceTypes": {
"unknown": "Dispositivo Desconocido",
"android": "Dispositivo Android",
"ios": "Dispositivo iOS",
"ipad": "iPad",
"macos": "macOS",
"windows": "Windows",
"linux": "Linux"
}
}, },
"splash": { "splash": {
"appName": "BearVPN", "appName": "BearVPN",

View File

@ -112,6 +112,9 @@
"unlimited": "Piiramatu liiklus", "unlimited": "Piiramatu liiklus",
"limited": "Kasutatud liiklus" "limited": "Kasutatud liiklus"
}, },
"loginRegister": "Logi sisse/Registreeru",
"guestId": "Külalise ID: {id}",
"deviceManagement": "Seadmete haldus",
"copySuccess": "Kopeeritud", "copySuccess": "Kopeeritud",
"notAvailable": "Pole saadaval", "notAvailable": "Pole saadaval",
"willBeDeleted": "kustutatakse", "willBeDeleted": "kustutatakse",
@ -312,7 +315,36 @@
"dialog": { "dialog": {
"confirm": "Kinnita", "confirm": "Kinnita",
"cancel": "Tühista", "cancel": "Tühista",
"ok": "OK" "ok": "OK",
"iKnow": "Sain aru",
"tip": "Nõuanne",
"delete": "Kustuta",
"error": "Viga",
"success": "Edukas",
"deviceLoginBindingTitle": "Nõuanne",
"deviceLoginBindingMessage": "Tellimuse ostmiseks peate sisse logima"
},
"deviceManagement": {
"title": "Seadmete haldus",
"deleteConfirmTitle": "Kinnita kustutamine",
"deleteCurrentDeviceMessage": "Kas olete kindel, et soovite selle seadme kustutada? Logitakse automaatselt tagasi sisse seadme sisselogimist kasutades.",
"deleteOtherDeviceMessage": "Kas olete kindel, et soovite selle seadme kustutada? See sunnitakse ühendust katkestama.",
"deleteSuccess": "Seade kustutatud",
"deleteFailed": "Kustutamine ebaõnnestus: {error}",
"loadDeviceListFailed": "Seadmete loendi laadimine ebaõnnestus",
"deviceLoginDisabled": "Seadme sisselogimine pole lubatud, logige käsitsi sisse",
"reloginSuccess": "Automaatselt tagasi sisse logitud",
"reloginFailed": "Automaatne sisselogimine ebaõnnestus: {error}, logige käsitsi sisse",
"reloginFailedGeneric": "Automaatne sisselogimine ebaõnnestus, logige käsitsi sisse",
"deviceTypes": {
"unknown": "Tundmatu seade",
"android": "Android seade",
"ios": "iOS seade",
"ipad": "iPad",
"macos": "macOS",
"windows": "Windows",
"linux": "Linux"
}
}, },
"splash": { "splash": {
"appName": "BearVPN", "appName": "BearVPN",

View File

@ -117,6 +117,9 @@
"switchSubscription": "サブスクリプションの切り替え", "switchSubscription": "サブスクリプションの切り替え",
"resetTrafficTitle": "トラフィックリセット", "resetTrafficTitle": "トラフィックリセット",
"resetTrafficMessage": "月間プランのトラフィックリセット例:次のサイクルのトラフィックを月次でリセットし、サブスクリプションの有効期限が{currentTime}から{newTime}に繰り上げられます", "resetTrafficMessage": "月間プランのトラフィックリセット例:次のサイクルのトラフィックを月次でリセットし、サブスクリプションの有効期限が{currentTime}から{newTime}に繰り上げられます",
"loginRegister": "ログイン/登録",
"guestId": "ゲストID{id}",
"deviceManagement": "デバイス管理",
"trialStatus": "トライアル状態", "trialStatus": "トライアル状態",
"trialing": "トライアル中", "trialing": "トライアル中",
"trialEndMessage": "トライアル期間終了後は使用できなくなります", "trialEndMessage": "トライアル期間終了後は使用できなくなります",
@ -330,7 +333,35 @@
"confirm": "確認", "confirm": "確認",
"cancel": "キャンセル", "cancel": "キャンセル",
"ok": "OK", "ok": "OK",
"iKnow": "分かりました" "iKnow": "分かりました",
"tip": "ヒント",
"delete": "削除",
"error": "エラー",
"success": "成功",
"deviceLoginBindingTitle": "ヒント",
"deviceLoginBindingMessage": "サブスクリプションを購入するにはログインする必要があります"
},
"deviceManagement": {
"title": "デバイス管理",
"deleteConfirmTitle": "削除の確認",
"deleteCurrentDeviceMessage": "このデバイスを削除してもよろしいですか?デバイスログインを使用して自動的に再ログインされます。",
"deleteOtherDeviceMessage": "このデバイスを削除してもよろしいですか?強制的にオフラインになります。",
"deleteSuccess": "デバイスを削除しました",
"deleteFailed": "削除に失敗しました:{error}",
"loadDeviceListFailed": "デバイスリストの読み込みに失敗しました",
"deviceLoginDisabled": "デバイスログインが有効になっていません。手動でログインしてください",
"reloginSuccess": "自動的に再ログインしました",
"reloginFailed": "自動ログインに失敗しました:{error}、手動でログインしてください",
"reloginFailedGeneric": "自動ログインに失敗しました。手動でログインしてください",
"deviceTypes": {
"unknown": "不明なデバイス",
"android": "Androidデバイス",
"ios": "iOSデバイス",
"ipad": "iPad",
"macos": "macOS",
"windows": "Windows",
"linux": "Linux"
}
}, },
"splash": { "splash": {
"appName": "BearVPN", "appName": "BearVPN",

View File

@ -104,6 +104,9 @@
"switchSubscription": "Сменить подписку", "switchSubscription": "Сменить подписку",
"resetTrafficTitle": "Сброс трафика", "resetTrafficTitle": "Сброс трафика",
"resetTrafficMessage": "Пример сброса трафика месячного плана: сброс трафика следующего цикла ежемесячно, и срок действия подписки будет перенесен с {currentTime} на {newTime}", "resetTrafficMessage": "Пример сброса трафика месячного плана: сброс трафика следующего цикла ежемесячно, и срок действия подписки будет перенесен с {currentTime} на {newTime}",
"loginRegister": "Вход/Регистрация",
"guestId": "ID гостя: {id}",
"deviceManagement": "Управление устройствами",
"reset": "Сбросить", "reset": "Сбросить",
"trafficUsage": "Использовано: {used} / {total}", "trafficUsage": "Использовано: {used} / {total}",
"trafficProgress": { "trafficProgress": {
@ -331,7 +334,35 @@
"confirm": "Подтвердить", "confirm": "Подтвердить",
"cancel": "Отмена", "cancel": "Отмена",
"ok": "OK", "ok": "OK",
"iKnow": "Я понял" "iKnow": "Я понял",
"tip": "Совет",
"delete": "Удалить",
"error": "Ошибка",
"success": "Успех",
"deviceLoginBindingTitle": "Совет",
"deviceLoginBindingMessage": "Для покупки подписки необходимо войти в систему"
},
"deviceManagement": {
"title": "Управление устройствами",
"deleteConfirmTitle": "Подтвердить удаление",
"deleteCurrentDeviceMessage": "Вы уверены, что хотите удалить это устройство? Вы будете автоматически переавторизованы с помощью входа на устройство.",
"deleteOtherDeviceMessage": "Вы уверены, что хотите удалить это устройство? Оно будет принудительно отключено.",
"deleteSuccess": "Устройство удалено",
"deleteFailed": "Ошибка удаления: {error}",
"loadDeviceListFailed": "Не удалось загрузить список устройств",
"deviceLoginDisabled": "Вход на устройство не включен, войдите вручную",
"reloginSuccess": "Автоматически переавторизован",
"reloginFailed": "Ошибка автоматического входа: {error}, войдите вручную",
"reloginFailedGeneric": "Ошибка автоматического входа, войдите вручную",
"deviceTypes": {
"unknown": "Неизвестное устройство",
"android": "Android устройство",
"ios": "iOS устройство",
"ipad": "iPad",
"macos": "macOS",
"windows": "Windows",
"linux": "Linux"
}
}, },
"update": { "update": {
"title": "Доступна новая версия", "title": "Доступна новая версия",

View File

@ -164,6 +164,9 @@
"switchSubscription": "切换订阅", "switchSubscription": "切换订阅",
"resetTrafficTitle": "重置流量", "resetTrafficTitle": "重置流量",
"resetTrafficMessage": "月付套餐流量重置示例:将下一个周期的流量按月重置,订阅有效期将从{currentTime}提前至{newTime}", "resetTrafficMessage": "月付套餐流量重置示例:将下一个周期的流量按月重置,订阅有效期将从{currentTime}提前至{newTime}",
"loginRegister": "登录/注册",
"guestId": "游客ID{id}",
"deviceManagement": "设备管理",
"trialStatus": "试用状态", "trialStatus": "试用状态",
"trialing": "试用中", "trialing": "试用中",
"trialEndMessage": "试用结束后将无法继续使用", "trialEndMessage": "试用结束后将无法继续使用",
@ -332,7 +335,35 @@
"confirm": "确认", "confirm": "确认",
"cancel": "取消", "cancel": "取消",
"ok": "确定", "ok": "确定",
"iKnow": "我知道了" "iKnow": "我知道了",
"tip": "提示",
"delete": "删除",
"error": "错误",
"success": "成功",
"deviceLoginBindingTitle": "提示",
"deviceLoginBindingMessage": "购买套餐需要登录绑定用户"
},
"deviceManagement": {
"title": "设备管理",
"deleteConfirmTitle": "确认删除",
"deleteCurrentDeviceMessage": "确定要删除本机设备吗?删除后将使用设备登录自动重新登录。",
"deleteOtherDeviceMessage": "确定要删除此设备吗?删除后该设备将被强制下线。",
"deleteSuccess": "设备已删除",
"deleteFailed": "删除失败:{error}",
"loadDeviceListFailed": "加载设备列表失败",
"deviceLoginDisabled": "设备登录未启用,请手动登录",
"reloginSuccess": "已自动重新登录",
"reloginFailed": "自动登录失败:{error},请手动登录",
"reloginFailedGeneric": "自动登录失败,请手动登录",
"deviceTypes": {
"unknown": "未知设备",
"android": "安卓设备",
"ios": "iOS 设备",
"ipad": "iPad",
"macos": "macOS",
"windows": "Windows",
"linux": "Linux"
}
}, },
"splash": { "splash": {
"appName": "BearVPN", "appName": "BearVPN",

View File

@ -116,7 +116,10 @@
"unlimited": "不限流量", "unlimited": "不限流量",
"limited": "已用流量" "limited": "已用流量"
}, },
"deviceLimit": "設備限制: {count}" "deviceLimit": "設備限制: {count}",
"loginRegister": "登錄/註冊",
"guestId": "遊客ID{id}",
"deviceManagement": "設備管理"
}, },
"setting": { "setting": {
"title": "設置", "title": "設置",
@ -280,7 +283,35 @@
"dialog": { "dialog": {
"confirm": "確認", "confirm": "確認",
"cancel": "取消", "cancel": "取消",
"ok": "我知道了" "ok": "我知道了",
"tip": "提示",
"delete": "刪除",
"error": "錯誤",
"success": "成功",
"deviceLoginBindingTitle": "提示",
"deviceLoginBindingMessage": "購買套餐需要登錄綁定用戶"
},
"deviceManagement": {
"title": "設備管理",
"deleteConfirmTitle": "確認刪除",
"deleteCurrentDeviceMessage": "確定要刪除本機設備嗎?刪除後將使用設備登錄自動重新登錄。",
"deleteOtherDeviceMessage": "確定要刪除此設備嗎?刪除後該設備將被強制下線。",
"deleteSuccess": "設備已刪除",
"deleteFailed": "刪除失敗:{error}",
"loadDeviceListFailed": "加載設備列表失敗",
"deviceLoginDisabled": "設備登錄未啟用,請手動登錄",
"reloginSuccess": "已自動重新登錄",
"reloginFailed": "自動登錄失敗:{error},請手動登錄",
"reloginFailedGeneric": "自動登錄失敗,請手動登錄",
"deviceTypes": {
"unknown": "未知設備",
"android": "安卓設備",
"ios": "iOS 設備",
"ipad": "iPad",
"macos": "macOS",
"windows": "Windows",
"linux": "Linux"
}
}, },
"update": { "update": {
"title": "發現新版本", "title": "發現新版本",

View File

@ -60,6 +60,10 @@ class AppTranslations {
/// ///
static final AppTranslationsTray kr_tray = AppTranslationsTray(); static final AppTranslationsTray kr_tray = AppTranslationsTray();
///
static final AppTranslationsDeviceManagement kr_deviceManagement =
AppTranslationsDeviceManagement();
/// ///
static void kr_initTranslations() { static void kr_initTranslations() {
// Get.addTranslations({ // Get.addTranslations({
@ -429,6 +433,15 @@ class AppTranslationsUserInfo {
final String download = '下载'; final String download = '下载';
final String upload = '上传'; final String upload = '上传';
/// /
String get loginRegister => 'userInfo.loginRegister'.tr;
/// ID
String guestId(int id) => 'userInfo.guestId'.trParams({'id': id.toString()});
///
String get deviceManagement => 'userInfo.deviceManagement'.tr;
} }
class AppTranslationsSetting { class AppTranslationsSetting {
@ -817,6 +830,24 @@ class AppTranslationsDialog {
/// ///
String get kr_iKnow => 'dialog.iKnow'.tr; String get kr_iKnow => 'dialog.iKnow'.tr;
///
String get tip => 'dialog.tip'.tr;
///
String get delete => 'dialog.delete'.tr;
///
String get error => 'dialog.error'.tr;
///
String get success => 'dialog.success'.tr;
///
String get deviceLoginBindingTitle => 'dialog.deviceLoginBindingTitle'.tr;
///
String get deviceLoginBindingMessage => 'dialog.deviceLoginBindingMessage'.tr;
} }
/// ///
@ -932,3 +963,54 @@ class AppTranslationsTray {
/// 退 /// 退
String get exitApp => 'tray.exit_app'.tr; String get exitApp => 'tray.exit_app'.tr;
} }
///
class AppTranslationsDeviceManagement {
///
String get title => 'deviceManagement.title'.tr;
///
String get deleteConfirmTitle => 'deviceManagement.deleteConfirmTitle'.tr;
///
String get deleteCurrentDeviceMessage =>
'deviceManagement.deleteCurrentDeviceMessage'.tr;
///
String get deleteOtherDeviceMessage =>
'deviceManagement.deleteOtherDeviceMessage'.tr;
///
String get deleteSuccess => 'deviceManagement.deleteSuccess'.tr;
///
String deleteFailed(String error) =>
'deviceManagement.deleteFailed'.trParams({'error': error});
///
String get loadDeviceListFailed =>
'deviceManagement.loadDeviceListFailed'.tr;
///
String get deviceLoginDisabled => 'deviceManagement.deviceLoginDisabled'.tr;
///
String get reloginSuccess => 'deviceManagement.reloginSuccess'.tr;
///
String reloginFailed(String error) =>
'deviceManagement.reloginFailed'.trParams({'error': error});
///
String get reloginFailedGeneric =>
'deviceManagement.reloginFailedGeneric'.tr;
///
String get deviceTypeUnknown => 'deviceManagement.deviceTypes.unknown'.tr;
String get deviceTypeAndroid => 'deviceManagement.deviceTypes.android'.tr;
String get deviceTypeIos => 'deviceManagement.deviceTypes.ios'.tr;
String get deviceTypeIpad => 'deviceManagement.deviceTypes.ipad'.tr;
String get deviceTypeMacos => 'deviceManagement.deviceTypes.macos'.tr;
String get deviceTypeWindows => 'deviceManagement.deviceTypes.windows'.tr;
String get deviceTypeLinux => 'deviceManagement.deviceTypes.linux'.tr;
}

View File

@ -10,6 +10,7 @@ import 'package:kaer_with_panels/app/services/kr_site_config_service.dart';
import 'package:kaer_with_panels/app/services/kr_device_info_service.dart'; import 'package:kaer_with_panels/app/services/kr_device_info_service.dart';
import 'package:kaer_with_panels/app/services/kr_subscribe_service.dart'; import 'package:kaer_with_panels/app/services/kr_subscribe_service.dart';
import 'package:kaer_with_panels/app/model/enum/kr_request_type.dart'; import 'package:kaer_with_panels/app/model/enum/kr_request_type.dart';
import 'package:kaer_with_panels/app/localization/app_translations.dart';
import 'dart:io'; import 'dart:io';
import 'dart:math'; import 'dart:math';
@ -52,7 +53,7 @@ class KRDeviceManagementController extends GetxController {
result.fold( result.fold(
(error) { (error) {
KRLogUtil.kr_e('加载设备列表失败: ${error.msg}', tag: 'DeviceManagement'); KRLogUtil.kr_e('加载设备列表失败: ${error.msg}', tag: 'DeviceManagement');
Get.snackbar('错误', error.msg); Get.snackbar(AppTranslations.kr_dialog.error, error.msg);
}, },
(deviceList) { (deviceList) {
KRLogUtil.kr_i('获取到 ${deviceList.length} 个设备', tag: 'DeviceManagement'); KRLogUtil.kr_i('获取到 ${deviceList.length} 个设备', tag: 'DeviceManagement');
@ -78,7 +79,7 @@ class KRDeviceManagementController extends GetxController {
} catch (e, stackTrace) { } catch (e, stackTrace) {
KRLogUtil.kr_e('加载设备列表异常: $e', tag: 'DeviceManagement'); KRLogUtil.kr_e('加载设备列表异常: $e', tag: 'DeviceManagement');
KRLogUtil.kr_e('堆栈跟踪: $stackTrace', tag: 'DeviceManagement'); KRLogUtil.kr_e('堆栈跟踪: $stackTrace', tag: 'DeviceManagement');
Get.snackbar('错误', '加载设备列表失败'); Get.snackbar(AppTranslations.kr_dialog.error, AppTranslations.kr_deviceManagement.loadDeviceListFailed);
} finally { } finally {
isLoading.value = false; isLoading.value = false;
} }
@ -102,10 +103,10 @@ class KRDeviceManagementController extends GetxController {
// //
await KRDialog.show( await KRDialog.show(
title: '确认删除', title: AppTranslations.kr_deviceManagement.deleteConfirmTitle,
message: isCurrent message: isCurrent
? '确定要删除本机设备吗?删除后将使用设备登录自动重新登录。' ? AppTranslations.kr_deviceManagement.deleteCurrentDeviceMessage
: '确定要删除此设备吗?删除后该设备将被强制下线。', : AppTranslations.kr_deviceManagement.deleteOtherDeviceMessage,
icon: Container( icon: Container(
width: 56, width: 56,
height: 56, height: 56,
@ -119,8 +120,8 @@ class KRDeviceManagementController extends GetxController {
size: 32, size: 32,
), ),
), ),
confirmText: '删除', confirmText: AppTranslations.kr_dialog.delete,
cancelText: '取消', cancelText: AppTranslations.kr_dialog.kr_cancel,
onConfirm: () { onConfirm: () {
confirmed = true; confirmed = true;
}, },
@ -139,7 +140,7 @@ class KRDeviceManagementController extends GetxController {
result.fold( result.fold(
(error) { (error) {
KRLogUtil.kr_e('删除设备失败: ${error.msg}', tag: 'DeviceManagement'); KRLogUtil.kr_e('删除设备失败: ${error.msg}', tag: 'DeviceManagement');
Get.snackbar('错误', '删除失败:${error.msg}'); Get.snackbar(AppTranslations.kr_dialog.error, AppTranslations.kr_deviceManagement.deleteFailed(error.msg));
}, },
(_) async { (_) async {
KRLogUtil.kr_i('设备删除成功', tag: 'DeviceManagement'); KRLogUtil.kr_i('设备删除成功', tag: 'DeviceManagement');
@ -156,14 +157,14 @@ class KRDeviceManagementController extends GetxController {
} else { } else {
// //
devices.removeWhere((device) => device['id'] == id); devices.removeWhere((device) => device['id'] == id);
Get.snackbar('成功', '设备已删除'); Get.snackbar(AppTranslations.kr_dialog.success, AppTranslations.kr_deviceManagement.deleteSuccess);
} }
}, },
); );
} catch (e, stackTrace) { } catch (e, stackTrace) {
KRLogUtil.kr_e('删除设备异常: $e', tag: 'DeviceManagement'); KRLogUtil.kr_e('删除设备异常: $e', tag: 'DeviceManagement');
KRLogUtil.kr_e('堆栈跟踪: $stackTrace', tag: 'DeviceManagement'); KRLogUtil.kr_e('堆栈跟踪: $stackTrace', tag: 'DeviceManagement');
Get.snackbar('错误', '删除失败:$e'); Get.snackbar(AppTranslations.kr_dialog.error, AppTranslations.kr_deviceManagement.deleteFailed(e.toString()));
} }
} }
@ -187,7 +188,7 @@ class KRDeviceManagementController extends GetxController {
if (!isDeviceLoginEnabled) { if (!isDeviceLoginEnabled) {
KRLogUtil.kr_w('设备登录未启用,执行完整退出登录', tag: 'DeviceManagement'); KRLogUtil.kr_w('设备登录未启用,执行完整退出登录', tag: 'DeviceManagement');
Get.snackbar('提示', '设备登录未启用,请手动登录'); Get.snackbar(AppTranslations.kr_dialog.tip, AppTranslations.kr_deviceManagement.deviceLoginDisabled);
await appRunData.kr_loginOut(); await appRunData.kr_loginOut();
return; return;
} }
@ -205,7 +206,7 @@ class KRDeviceManagementController extends GetxController {
(error) { (error) {
// //
KRLogUtil.kr_e('设备登录失败: ${error.msg}', tag: 'DeviceManagement'); KRLogUtil.kr_e('设备登录失败: ${error.msg}', tag: 'DeviceManagement');
Get.snackbar('错误', '自动登录失败:${error.msg},请手动登录'); Get.snackbar(AppTranslations.kr_dialog.error, AppTranslations.kr_deviceManagement.reloginFailed(error.msg));
// 退 // 退
appRunData.kr_loginOut(); appRunData.kr_loginOut();
@ -238,13 +239,13 @@ class KRDeviceManagementController extends GetxController {
KRLogUtil.kr_e('订阅信息刷新失败: $e', tag: 'DeviceManagement'); KRLogUtil.kr_e('订阅信息刷新失败: $e', tag: 'DeviceManagement');
} }
Get.snackbar('成功', '已自动重新登录'); Get.snackbar(AppTranslations.kr_dialog.success, AppTranslations.kr_deviceManagement.reloginSuccess);
}, },
); );
} catch (e, stackTrace) { } catch (e, stackTrace) {
KRLogUtil.kr_e('设备重新登录异常: $e', tag: 'DeviceManagement'); KRLogUtil.kr_e('设备重新登录异常: $e', tag: 'DeviceManagement');
KRLogUtil.kr_e('堆栈跟踪: $stackTrace', tag: 'DeviceManagement'); KRLogUtil.kr_e('堆栈跟踪: $stackTrace', tag: 'DeviceManagement');
Get.snackbar('错误', '自动登录失败,请手动登录'); Get.snackbar(AppTranslations.kr_dialog.error, AppTranslations.kr_deviceManagement.reloginFailedGeneric);
// 退 // 退
await KRAppRunData.getInstance().kr_loginOut(); await KRAppRunData.getInstance().kr_loginOut();
@ -253,26 +254,26 @@ class KRDeviceManagementController extends GetxController {
/// ///
Map<String, dynamic> getDeviceTypeInfo(String userAgent) { Map<String, dynamic> getDeviceTypeInfo(String userAgent) {
String deviceType = '未知设备'; String deviceType = AppTranslations.kr_deviceManagement.deviceTypeUnknown;
String iconName = 'devices'; String iconName = 'devices';
if (userAgent.contains('Android') || userAgent.toLowerCase().contains('android')) { if (userAgent.contains('Android') || userAgent.toLowerCase().contains('android')) {
deviceType = '安卓设备'; deviceType = AppTranslations.kr_deviceManagement.deviceTypeAndroid;
iconName = 'phone_android'; iconName = 'phone_android';
} else if (userAgent.contains('iOS') || userAgent.contains('iPhone') || userAgent.toLowerCase().contains('ios')) { } else if (userAgent.contains('iOS') || userAgent.contains('iPhone') || userAgent.toLowerCase().contains('ios')) {
deviceType = 'iOS 设备'; deviceType = AppTranslations.kr_deviceManagement.deviceTypeIos;
iconName = 'phone_iphone'; iconName = 'phone_iphone';
} else if (userAgent.contains('iPad')) { } else if (userAgent.contains('iPad')) {
deviceType = 'iPad'; deviceType = AppTranslations.kr_deviceManagement.deviceTypeIpad;
iconName = 'tablet'; iconName = 'tablet';
} else if (userAgent.contains('macOS') || userAgent.contains('Mac') || userAgent.toLowerCase().contains('mac')) { } else if (userAgent.contains('macOS') || userAgent.contains('Mac') || userAgent.toLowerCase().contains('mac')) {
deviceType = 'macOS'; deviceType = AppTranslations.kr_deviceManagement.deviceTypeMacos;
iconName = 'desktop_mac'; iconName = 'desktop_mac';
} else if (userAgent.contains('Windows') || userAgent.toLowerCase().contains('windows')) { } else if (userAgent.contains('Windows') || userAgent.toLowerCase().contains('windows')) {
deviceType = 'Windows'; deviceType = AppTranslations.kr_deviceManagement.deviceTypeWindows;
iconName = 'computer'; iconName = 'computer';
} else if (userAgent.contains('Linux') || userAgent.toLowerCase().contains('linux')) { } else if (userAgent.contains('Linux') || userAgent.toLowerCase().contains('linux')) {
deviceType = 'Linux'; deviceType = AppTranslations.kr_deviceManagement.deviceTypeLinux;
iconName = 'computer'; iconName = 'computer';
} }

View File

@ -119,7 +119,7 @@ class KRUserInfoView extends GetView<KRUserInfoController> {
shouldShowLoginPrompt = false; shouldShowLoginPrompt = false;
} else if (isDeviceLogin) { } else if (isDeviceLogin) {
// //
displayText = "登录/注册"; displayText = AppTranslations.kr_userInfo.loginRegister;
displayColor = const Color(0xFF1797FF); // 使 displayColor = const Color(0xFF1797FF); // 使
displayIcon = Icons.touch_app; displayIcon = Icons.touch_app;
shouldShowLoginPrompt = true; shouldShowLoginPrompt = true;
@ -195,7 +195,7 @@ class KRUserInfoView extends GetView<KRUserInfoController> {
SizedBox(width: 8.w), SizedBox(width: 8.w),
Text( Text(
appRunData.isDeviceLogin() appRunData.isDeviceLogin()
? "游客ID${(appRunData.kr_userId.value ?? 0) + 10000}" ? AppTranslations.kr_userInfo.guestId((appRunData.kr_userId.value ?? 0) + 10000)
: "${AppTranslations.kr_userInfo.balance} ${controller.kr_balance.value.toString()}", : "${AppTranslations.kr_userInfo.balance} ${controller.kr_balance.value.toString()}",
style: KrAppTextStyle( style: KrAppTextStyle(
fontSize: 12, fontSize: 12,
@ -667,7 +667,7 @@ class KRUserInfoView extends GetView<KRUserInfoController> {
if (showDeviceManagement) if (showDeviceManagement)
_kr_buildShortcutContainer( _kr_buildShortcutContainer(
icon: "my_dns", icon: "my_dns",
title: "设备管理", title: AppTranslations.kr_userInfo.deviceManagement,
onTap: () { onTap: () {
Get.toNamed(Routes.KR_DEVICE_MANAGEMENT); Get.toNamed(Routes.KR_DEVICE_MANAGEMENT);
}, },

View File

@ -3,6 +3,7 @@ import 'package:kaer_with_panels/app/common/app_run_data.dart';
import 'package:kaer_with_panels/app/widgets/dialogs/kr_dialog.dart'; import 'package:kaer_with_panels/app/widgets/dialogs/kr_dialog.dart';
import 'package:kaer_with_panels/app/routes/app_pages.dart'; import 'package:kaer_with_panels/app/routes/app_pages.dart';
import 'package:kaer_with_panels/app/utils/kr_log_util.dart'; import 'package:kaer_with_panels/app/utils/kr_log_util.dart';
import 'package:kaer_with_panels/app/localization/app_translations.dart';
/// ///
/// ///
@ -25,14 +26,16 @@ class KRSubscribeNavigationUtil {
// //
KRLogUtil.kr_i('检测到设备登录,显示绑定提示', tag: tag); KRLogUtil.kr_i('检测到设备登录,显示绑定提示', tag: tag);
KRDialog.show( KRDialog.show(
title: '提示', title: AppTranslations.kr_dialog.deviceLoginBindingTitle,
message: '购买套餐需要登录绑定用户', message: AppTranslations.kr_dialog.deviceLoginBindingMessage,
confirmText: '确定', confirmText: AppTranslations.kr_dialog.kr_ok,
cancelText: '取消', cancelText: AppTranslations.kr_dialog.kr_cancel,
onConfirm: () { onConfirm: () {
Get.back(); // Get.back(); //
// //
Get.toNamed(Routes.MR_LOGIN); Future.delayed(const Duration(milliseconds: 300), () {
Get.toNamed(Routes.MR_LOGIN);
});
}, },
onCancel: () => Get.back(), onCancel: () => Get.back(),
); );