From dc37b42977fbb4daf32205c94a25a60fe99eb3fe Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 3 Mar 2025 18:29:37 +0800 Subject: [PATCH 001/135] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=85=BC=E5=AE=B932bit=E5=B9=BF=E6=92=AD=E4=BF=A1=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/blue/blue_manage.dart | 70 ++++++++++-- lib/blue/io_type.dart | 8 +- .../addLock/nearbyLock/nearbyLock_logic.dart | 105 ++++++++++++++++-- .../addLock/nearbyLock/nearbyLock_page.dart | 34 +++--- 4 files changed, 179 insertions(+), 38 deletions(-) diff --git a/lib/blue/blue_manage.dart b/lib/blue/blue_manage.dart index 97873775..9aa7e77d 100755 --- a/lib/blue/blue_manage.dart +++ b/lib/blue/blue_manage.dart @@ -253,14 +253,20 @@ class BlueManage { FlutterBluePlus.scanResults.listen((List results) { scanDevices.clear(); for (final ScanResult scanResult in results) { - // AppLog.log('扫描到的设备:${scanResult.device.platformName} ${scanResult.advertisementData.advName} ${scanResult.rssi}'); + if (scanResult.advertisementData.serviceUuids.isNotEmpty) { + // AppLog.log( + // '扫描到的设备:${scanResult.advertisementData.serviceUuids[0].toString()}'); + } else { + continue; + } + + final isMatch = _isMatch( + scanResult.advertisementData.serviceUuids + .map((e) => e.uuid) + .toList(), + deviceType); // 判断名字为空的直接剔除 - if (((scanResult.advertisementData.serviceUuids.isNotEmpty - ? scanResult.advertisementData.serviceUuids[0] - : '') - .toString() - .contains(getDeviceType(deviceType))) && - (scanResult.rssi >= -100)) { + if (isMatch && (scanResult.rssi >= -100)) { // 查询id相同的元素 final int knownDeviceIndex = scanDevices.indexWhere( (ScanResult d) => @@ -300,6 +306,23 @@ class BlueManage { }); } + /// 判断是否包含指定的uuid + bool _isMatch(List serviceUuids, DeviceType deviceType) { + // 获取设备类型数组 + List deviceTypeList = getDeviceType(deviceType); + + // 检查 serviceUuids 是否包含 deviceTypeList 中的任意一个值 + if (serviceUuids != null && serviceUuids.isNotEmpty) { + return serviceUuids.any((uuid) { + return deviceTypeList + .any((type) => uuid.toLowerCase().contains(type.toLowerCase())); + }); + } + + // 如果 serviceUuids 为空,则返回 false + return false; + } + /// 调用发送数据 List senderData, Future blueSendData( String deviceName, ConnectStateCallBack stateCallBack, @@ -499,8 +522,39 @@ class BlueManage { } AppLog.log('调用了停止扫描的方法'); await stopScan(); + if (scanResult.advertisementData.serviceUuids[0].toString().length >= 5 && + (scanResult.advertisementData.serviceUuids[0].toString()[5] == '0') && + isAddEquipment == false) { + // 添加这个判断是因为有些苹果设备或者安卓等性能比较好的设备时,添加完锁之后,锁板未改变为已添加状态之前,就进行了蓝牙连接,导致添加完锁就失败,这里进行了判断,如果第一次连接失败,就清除缓存重新扫描连接 + if (isReconnect == true) { + AppLog.log('该锁已被重置, 重新发送扫描命令'); - if ((scanResult.advertisementData.serviceUuids[0].toString()[31] == '0') && + BuglyTool.uploadException( + message: '该锁已被重置, 重新发送扫描命令startScanSingle 上传记录当前方法是:_connectDevice', + detail: + '添加这个判断是因为有些苹果设备或者安卓等性能比较好的设备时,添加完锁之后,锁板未改变为已添加状态之前,就进行了蓝牙连接,导致添加完锁就失败,这里进行了判断,如果第一次连接失败,就清除缓存重新扫描连接 该锁已被重置, 重新发送扫描命令 serviceUuids:${scanResult.advertisementData.serviceUuids[0].toString()}', + upload: false); + + scanDevices.clear(); + startScanSingle(deviceName, 15, (List scanDevices) { + _connectDevice(scanDevices, deviceName, connectStateCallBack, + isAddEquipment: isAddEquipment, isReconnect: false); + }); + } else { + connectStateCallBack(BluetoothConnectionState.disconnected); + EasyLoading.showToast('该锁已被重置'.tr, duration: 2000.milliseconds); + scanDevices.clear(); + + BuglyTool.uploadException( + message: '提示该锁已被重置, 回调断开连接, 清除缓存,上传记录当前方法是:_connectDevice', + detail: + 'isReconnect:$isReconnect serviceUuids:${scanResult.advertisementData.serviceUuids[0].toString()}', + upload: false); + } + return; + } + if (scanResult.advertisementData.serviceUuids[0].toString().length >= 30 && + (scanResult.advertisementData.serviceUuids[0].toString()[31] == '0') && isAddEquipment == false) { // 添加这个判断是因为有些苹果设备或者安卓等性能比较好的设备时,添加完锁之后,锁板未改变为已添加状态之前,就进行了蓝牙连接,导致添加完锁就失败,这里进行了判断,如果第一次连接失败,就清除缓存重新扫描连接 if (isReconnect == true) { diff --git a/lib/blue/io_type.dart b/lib/blue/io_type.dart index 828176c6..ee785811 100755 --- a/lib/blue/io_type.dart +++ b/lib/blue/io_type.dart @@ -5,14 +5,14 @@ enum DeviceType { gateway // 758825 } -String getDeviceType(DeviceType deviceType) { - String t = '758824'; +List getDeviceType(DeviceType deviceType) { + List t = ['758824']; switch (deviceType) { case DeviceType.blue: - t = '758824'; + t = ['758824', '75']; break; case DeviceType.gateway: - t = '758825'; + t = ['758825']; break; } return t; diff --git a/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart b/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart index 808ed7de..b607e6d1 100755 --- a/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart +++ b/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart @@ -51,9 +51,9 @@ class NearbyLockLogic extends BaseGetXController { }); BlueManage().blueSendData(deviceName, (BluetoothConnectionState state) async { - // AppLog.log('点击要添加的设备了'); + AppLog.log('点击要添加的设备了'); if (state == BluetoothConnectionState.connected) { - // AppLog.log('开始获取公钥'); + AppLog.log('开始获取公钥'); IoSenderManage.getPublicKey(lockId: deviceName); } else if (state == BluetoothConnectionState.disconnected) { dismissEasyLoading(); @@ -395,19 +395,104 @@ class NearbyLockLogic extends BaseGetXController { void startScanBlueList() { BlueManage().startScan(2000, DeviceType.blue, (List list) { state.devices.clear(); - for (int i = 0; i < list.length; i++) { - final ScanResult device = list[i]; - if ((device.advertisementData.serviceUuids.isNotEmpty - ? device.advertisementData.serviceUuids[0] - : '') - .toString()[31] != - '1') { - state.devices.add(list[i]); + + for (final device in list) { + final String? serviceUuid = + device.advertisementData.serviceUuids.isNotEmpty + ? device.advertisementData.serviceUuids[0].toString() + : null; + + if (serviceUuid != null && !isPaired(serviceUuid)) { + state.devices.add(device); } } }); } + /// 判断是否已配对(支持 128-bit 和 32-bit) + bool isPaired(String serviceUuid) { + if (serviceUuid.length < 6) return false; // 最短需要 6 个字符才能判断 + + try { + if (serviceUuid.length >= 32) { + // 128-bit UUID:检查第 31 和 32 位 + String status = serviceUuid.substring(30, 32); + return status == '01'; // '01' 表示已配对 + } else if (serviceUuid.length >= 5) { + // 32-bit UUID:检查第 4 和 5 位 + String status = serviceUuid.substring(4, 6); + return status == '01'; // '01' 表示已配对 + } + return false; // 如果长度不足,则返回 false + } catch (e) { + return false; // 如果索引越界或其他错误,返回 false + } + } + + /// 判断是否休眠(支持 128-bit 和 32-bit) + bool isSleeping(String serviceUuid) { + if (serviceUuid.length < 8) return false; // 最短需要 8 个字符才能判断 + + try { + if (serviceUuid.length >= 34) { + // 128-bit UUID:检查第 33 和 34 位 + String status = serviceUuid.substring(32, 34); + return status == '00'; // '00' 表示休眠 + } else if (serviceUuid.length >= 7) { + // 32-bit UUID:检查第 6 和 7 位 + String status = serviceUuid.substring(6, 8); + return status == '00'; // '00' 表示休眠 + } + return false; // 如果长度不足,则返回 false + } catch (e) { + return false; // 如果索引越界或其他错误,返回 false + } + } + + /// 判断 128-bit UUID 是否已配对 + bool isPaired128Bit(String serviceUuid) { + if (serviceUuid.length != 36) return false; // 确保是 128-bit UUID + try { + String status = serviceUuid.substring(30, 32); // 获取第 31 和 32 位 + return status == '01'; // '01' 表示已配对 + } catch (e) { + return false; // 如果索引越界或其他错误,返回 false + } + } + + /// 判断 128-bit UUID 是否休眠 + bool isSleeping128Bit(String serviceUuid) { + if (serviceUuid.length != 36) return false; // 确保是 128-bit UUID + try { + String status = serviceUuid.substring(32, 34); // 获取第 33 和 34 位 + return status == '00'; // '00' 表示休眠 + } catch (e) { + return false; // 如果索引越界或其他错误,返回 false + } + } + + /// 判断 32-bit UUID 是否已配对 + bool isPaired32Bit(String serviceUuid) { + if (serviceUuid.length != 8) return false; // 确保是 32-bit UUID + try { + String status = serviceUuid.substring(3, 5); // 获取第 4 和 5 位 + return status == '01'; // '01' 表示已配对 + } catch (e) { + return false; // 如果索引越界或其他错误,返回 false + } + } + + /// 判断 32-bit UUID 是否休眠 + bool isSleeping32Bit(String serviceUuid) { + if (serviceUuid.length != 8) return false; // 确保是 32-bit UUID + try { + String status = serviceUuid.substring(5, 7); // 获取第 6 和 7 位 + return status == '00'; // '00' 表示休眠 + } catch (e) { + return false; // 如果索引越界或其他错误,返回 false + } + } + void stopScanBlueList() { BlueManage().disconnect(); BlueManage().stopScan(); diff --git a/lib/mine/addLock/nearbyLock/nearbyLock_page.dart b/lib/mine/addLock/nearbyLock/nearbyLock_page.dart index 97275540..25413554 100755 --- a/lib/mine/addLock/nearbyLock/nearbyLock_page.dart +++ b/lib/mine/addLock/nearbyLock/nearbyLock_page.dart @@ -106,13 +106,18 @@ class _NearbyLockPageState extends State with RouteAware { Widget nearbyLockItem( String lockTypeIcon, ScanResult scanResult, Function() action) { return GestureDetector( - onTap: ((scanResult.advertisementData.serviceUuids.isNotEmpty - ? scanResult.advertisementData.serviceUuids[0] - : '') - .toString()[33] == - '1') - ? action - : null, + onTap: () { + final String? serviceUuid = + scanResult.advertisementData.serviceUuids.isNotEmpty + ? scanResult.advertisementData.serviceUuids[0].toString() + : null; + + // 检查 serviceUuid 是否存在且长度足够,并判断第 34 个字符是否为 '1' + final isPaired = !logic.isPaired(serviceUuid!); + if (serviceUuid != null && isPaired) { + action(); + } + }, child: Column( children: [ Container( @@ -136,15 +141,12 @@ class _NearbyLockPageState extends State with RouteAware { Text(scanResult.advertisementData.advName, style: TextStyle( fontSize: 20.sp, - color: ((scanResult.advertisementData.serviceUuids - .isNotEmpty - ? scanResult.advertisementData - .serviceUuids[0] - : '') - .toString()[33] == - '1') - ? AppColors.blackColor - : Colors.grey)), + color: logic.isSleeping( + scanResult.advertisementData.serviceUuids[0] + .toString(), + ) + ? Colors.grey + : AppColors.blackColor)), ], ), SizedBox( From 484416255f54a1a6a4ea193eab66f900da72bfce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CDaisyWu=E2=80=9D?= <“18682150237@163.com”> Date: Mon, 3 Mar 2025 18:41:57 +0800 Subject: [PATCH 002/135] =?UTF-8?q?fix:=09=E4=BF=AE=E5=A4=8D=E5=BC=80?= =?UTF-8?q?=E9=94=81=E9=A1=B5-=E7=BB=99=E9=82=AE=E7=AE=B1=E5=8F=91?= =?UTF-8?q?=E7=94=B5=E5=AD=90=E9=92=A5=E5=8C=99=E3=80=81=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E3=80=81=E7=BE=A4=E5=8F=91=E9=92=A5?= =?UTF-8?q?=E5=8C=99-=E6=8E=A5=E6=94=B6=E8=80=85=E3=80=81=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=8E=88=E6=9D=83=E9=80=89=E5=85=B6=E4=BB=96=E5=9B=BD?= =?UTF-8?q?=E5=AE=B6=E9=83=BD=E8=83=BD=E5=8F=91=E9=80=81=E2=80=94=E5=85=B3?= =?UTF-8?q?=E8=81=94=E5=A4=9A=E4=B8=AAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../authorizedAdmin_logic.dart | 10 +++ .../authorizedAdmin/authorizedAdmin_page.dart | 57 +++++++------ .../authorizedAdmin_state.dart | 1 + .../volumeAuthorizationLock_logic.dart | 10 ++- .../volumeAuthorizationLock_page.dart | 63 +++++++------- .../volumeAuthorizationLock_state.dart | 7 +- .../massSendElectronicKey_page.dart | 82 ++++++++++--------- .../view/sendElectronicKeyView_logic.dart | 23 ++++-- .../view/sendElectronicKeyView_page.dart | 54 ++++++------ .../view/sendElectronicKeyView_state.dart | 6 +- 10 files changed, 184 insertions(+), 129 deletions(-) diff --git a/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_logic.dart b/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_logic.dart index 18537ef1..290d7dc9 100755 --- a/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_logic.dart +++ b/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_logic.dart @@ -333,6 +333,16 @@ class AuthorizedAdminLogic extends BaseGetXController { } } + @override + void onInit() { + super.onInit(); + + // 监听输入框变化 + state.emailOrPhoneController.addListener(() { + state.emailOrPhone.value = state.emailOrPhoneController.text; + }); + } + @override void onReady() { super.onReady(); diff --git a/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_page.dart b/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_page.dart index c9e4ff0f..b908e07a 100755 --- a/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_page.dart +++ b/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_page.dart @@ -10,6 +10,7 @@ import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/pickers/pickers.dart'; import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; +import 'package:star_lock/tools/regularExpression.dart'; import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/tools/storage.dart'; @@ -114,29 +115,32 @@ class _AuthorizedAdminPageState extends State // isHaveRightWidget: true, // rightWidget: getTFWidget(true, '请输入手机号或者邮箱'.tr, 1)), perpetualKeyWidget('接收者'.tr, '请输入手机号或者邮箱'.tr), - CommonItem( - leftTitel: '国家/地区'.tr, - rightTitle: '', - isHaveLine: true, - isHaveRightWidget: true, - isHaveDirection: true, - rightWidget: Text( - '${state.countryName.value} +${state.countryCode.value}', - textAlign: TextAlign.end, - style: - TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor), - ), - action: () async { - final Object? result = await Navigator.pushNamed( - context, Routers.selectCountryRegionPage); - if (result != null) { - result as Map; - state.countryCode.value = result['code']; - state.countryName.value = result['countryName']; - setState(() {}); - } - }, - ), + Obx(() => Visibility( + visible: RegularExpression() + .isPhoneNumber(logic.state.emailOrPhone.value), + child: CommonItem( + leftTitel: '国家/地区'.tr, + rightTitle: '', + isHaveLine: true, + isHaveRightWidget: true, + isHaveDirection: true, + rightWidget: Text( + '${state.countryName.value} +${state.countryCode.value}', + textAlign: TextAlign.end, + style: TextStyle( + fontSize: 22.sp, color: AppColors.darkGrayTextColor), + ), + action: () async { + final Object? result = await Navigator.pushNamed( + context, Routers.selectCountryRegionPage); + if (result != null) { + result as Map; + state.countryCode.value = result['code']; + state.countryName.value = result['countryName']; + setState(() {}); + } + }, + ))), KeyNameItem( leftTitel: '姓名'.tr, rightTitle: '请输入'.tr, @@ -268,6 +272,10 @@ class _AuthorizedAdminPageState extends State ) ], ), + ), + Container( + color: AppColors.greyLineColor, // 设置边框颜色 + height: 2.0.h, // ) ], ); @@ -571,6 +579,9 @@ class _AuthorizedAdminPageState extends State BorderSide(width: 0, color: Colors.transparent)), contentPadding: const EdgeInsets.symmetric(vertical: 0), ), + onChanged: (value) { + logic.update(); + }, ), ), SizedBox( diff --git a/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_state.dart b/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_state.dart index 3b092812..59bd84ae 100755 --- a/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_state.dart +++ b/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_state.dart @@ -6,6 +6,7 @@ import 'package:star_lock/tools/dateTool.dart'; class AuthorizedAdminState { final TextEditingController emailOrPhoneController = TextEditingController(); //邮箱/手机号输入框 + RxString emailOrPhone = ''.obs; // 在logic的state中添加一个Rx变量 final TextEditingController keyNameController = TextEditingController(); //钥匙名输入框 late TabController tabController; diff --git a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_logic.dart b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_logic.dart index 4db8d338..27bde4bc 100755 --- a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_logic.dart +++ b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_logic.dart @@ -1,4 +1,3 @@ - import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lockSet/basicInformation/basicInformation/KeyDetailEntity.dart'; import 'package:star_lock/network/api_repository.dart'; @@ -57,4 +56,13 @@ class VolumeAuthorizationLockLogic extends BaseGetXController { } } + @override + void onInit() { + super.onInit(); + + // 监听输入框变化 + state.emailOrPhoneController.addListener(() { + state.emailOrPhone.value = state.emailOrPhoneController.text; + }); + } } diff --git a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_page.dart b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_page.dart index 0f035940..e2cbf86f 100755 --- a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_page.dart +++ b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -11,6 +10,7 @@ import 'package:star_lock/main/lockDetail/authorizedAdmin/volumeAuthorizationLoc import 'package:star_lock/tools/pickers/pickers.dart'; import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; +import 'package:star_lock/tools/regularExpression.dart'; import 'package:star_lock/tools/showTipView.dart'; import '../../../../appRouters.dart'; @@ -90,40 +90,38 @@ class _VolumeAuthorizationLockPageState isHaveLine: true, isHaveRightWidget: true, rightWidget: getTFWidget( - true, - '请输入手机号或者邮箱'.tr, - state.emailOrPhoneController)), - CommonItem( - leftTitel: '国家/地区'.tr, - rightTitle: '', - isHaveLine: true, - isHaveRightWidget: true, - isHaveDirection: true, - rightWidget: Text( - '${state.countryName.value} +${state.countryCode.value}', - textAlign: TextAlign.end, - style: - TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor), - ), - action: () async { - final Object? result = await Navigator.pushNamed( - context, Routers.selectCountryRegionPage); - if (result != null) { - result as Map; - state.countryCode.value = result['code']; - state.countryName.value = result['countryName']; - // setState(() {}); - } - }, - ), + true, '请输入手机号或者邮箱'.tr, state.emailOrPhoneController)), + Obx(() => Visibility( + visible: RegularExpression() + .isPhoneNumber(logic.state.emailOrPhone.value), + child: CommonItem( + leftTitel: '国家/地区'.tr, + rightTitle: '', + isHaveLine: true, + isHaveRightWidget: true, + isHaveDirection: true, + rightWidget: Text( + '${state.countryName.value} +${state.countryCode.value}', + textAlign: TextAlign.end, + style: TextStyle( + fontSize: 22.sp, color: AppColors.darkGrayTextColor), + ), + action: () async { + final Object? result = await Navigator.pushNamed( + context, Routers.selectCountryRegionPage); + if (result != null) { + result as Map; + state.countryCode.value = result['code']; + state.countryName.value = result['countryName']; + // setState(() {}); + } + }, + ))), CommonItem( leftTitel: '姓名'.tr, rightTitle: '', isHaveRightWidget: true, - rightWidget: getTFWidget( - false, - '请输入'.tr, - state.keyNameController)), + rightWidget: getTFWidget(false, '请输入'.tr, state.keyNameController)), Container(height: 10.h), ], ); @@ -186,7 +184,8 @@ class _VolumeAuthorizationLockPageState : state.lockIdList.length.toString(), isHaveDirection: true, action: () async { - final result = await Get.toNamed(Routers.massSendLockGroupListPage, + final result = await Get.toNamed( + Routers.massSendLockGroupListPage, arguments: { 'keyLimits': '1', 'lockIdList': state.lockIdList.value diff --git a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_state.dart b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_state.dart index 84229d0c..ee85b37b 100755 --- a/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_state.dart +++ b/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_state.dart @@ -4,8 +4,11 @@ import 'package:get/get.dart'; class VolumeAuthorizationLockState { final FlutterContactPicker contactPicker = FlutterContactPicker(); - final TextEditingController emailOrPhoneController = TextEditingController(); //邮箱/手机号输入框 - final TextEditingController keyNameController = TextEditingController(); //钥匙名输入框 + final TextEditingController emailOrPhoneController = + TextEditingController(); //邮箱/手机号输入框 + RxString emailOrPhone = ''.obs; // 在logic的state中添加一个Rx变量 + final TextEditingController keyNameController = + TextEditingController(); //钥匙名输入框 late Contact contact; RxList lockIdList = [].obs; RxBool isSendSuccess = false.obs; diff --git a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_page.dart b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_page.dart index d9722f2e..cf70635e 100755 --- a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_page.dart +++ b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -17,7 +16,8 @@ import 'massSendElectronicKey_logic.dart'; import 'massSendElectronicKey_state.dart'; class MassSendElectronicKeyPage extends StatefulWidget { - const MassSendElectronicKeyPage({required this.type, Key? key}) : super(key: key); + const MassSendElectronicKeyPage({required this.type, Key? key}) + : super(key: key); final String type; @override @@ -26,8 +26,10 @@ class MassSendElectronicKeyPage extends StatefulWidget { } class _MassSendElectronicKeyPageState extends State { - final MassSendElectronicKeyLogic logic = Get.put(MassSendElectronicKeyLogic()); - final MassSendElectronicKeyState state = Get.find().state; + final MassSendElectronicKeyLogic logic = + Get.put(MassSendElectronicKeyLogic()); + final MassSendElectronicKeyState state = + Get.find().state; @override initState() { @@ -47,9 +49,7 @@ class _MassSendElectronicKeyPageState extends State { state.type.value = widget.type; return SingleChildScrollView( - child: state.isDemoMode - ? indexChangeWidget() - : Obx(indexChangeWidget), + child: state.isDemoMode ? indexChangeWidget() : Obx(indexChangeWidget), ); } @@ -153,25 +153,25 @@ class _MassSendElectronicKeyPageState extends State { return Column( children: [ Obx(() => CommonItem( - leftTitel: '接收者'.tr, - rightTitle: state.receiverList.value.isEmpty - ? '请添加'.tr - : state.receiverList.value.length.toString(), - isHaveLine: true, - isHaveDirection: true, - action: () { - Navigator.pushNamed(context, Routers.massSendReceiverPage, - arguments: { - 'lockUserList': state.receiverList.value, - }).then((Object? value) { - if (value != null) { - value as Map; - state.receiverList.value = value['lockUserList']; - // setState(() {}); - } - }); - }, - )), + leftTitel: '接收者'.tr, + rightTitle: state.receiverList.value.isEmpty + ? '请添加'.tr + : state.receiverList.value.length.toString(), + isHaveLine: true, + isHaveDirection: true, + action: () { + Navigator.pushNamed(context, Routers.massSendReceiverPage, + arguments: { + 'lockUserList': state.receiverList.value, + }).then((Object? value) { + if (value != null) { + value as Map; + state.receiverList.value = value['lockUserList']; + // setState(() {}); + } + }); + }, + )), CommonItem( leftTitel: '国家/地区'.tr, rightTitle: '', @@ -202,7 +202,8 @@ class _MassSendElectronicKeyPageState extends State { : state.lockIdList.length.toString(), isHaveDirection: true, action: () async { - final result = await Get.toNamed(Routers.massSendLockGroupListPage, + final result = await Get.toNamed( + Routers.massSendLockGroupListPage, arguments: { 'keyLimits': '2', 'lockIdList': state.lockIdList @@ -235,7 +236,8 @@ class _MassSendElectronicKeyPageState extends State { PDuration selectDate = PDuration.parse(DateTime.tryParse(state.beginTime.value)); Pickers.showDatePicker(context, - selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { state.beginTime.value = DateTool().getYMDHNDateString(p, 1); }); })), @@ -244,8 +246,11 @@ class _MassSendElectronicKeyPageState extends State { rightTitle: state.endTime.value, isHaveDirection: true, action: () { - PDuration selectDate = PDuration.parse(DateTime.tryParse(state.endTime.value)); - Pickers.showDatePicker(context, selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { + PDuration selectDate = + PDuration.parse(DateTime.tryParse(state.endTime.value)); + Pickers.showDatePicker(context, + selectDate: selectDate, + mode: DateMode.YMDHM, onConfirm: (PDuration p) { state.endTime.value = DateTool().getYMDHNDateString(p, 1); }); })), @@ -279,14 +284,14 @@ class _MassSendElectronicKeyPageState extends State { isHaveDirection: true, isHaveLine: true, action: () async { - var result = - await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: { - 'validityValue': state.weekdaysList.value, - 'starDate': state.beginTime.value, - 'endDate': state.endTime.value, - 'starTime': state.effectiveDateTime.value, - 'endTime': state.failureDateTime.value - }); + var result = await Get.toNamed(Routers.seletKeyCyclicDatePage, + arguments: { + 'validityValue': state.weekdaysList.value, + 'starDate': state.beginTime.value, + 'endDate': state.endTime.value, + 'starTime': state.effectiveDateTime.value, + 'endTime': state.failureDateTime.value + }); if (result != null && result.isNotEmpty) { state.weekdaysList.value = result['validityValue']; state.beginTime.value = result['starDate']; @@ -376,5 +381,4 @@ class _MassSendElectronicKeyPageState extends State { }, ); } - } diff --git a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_logic.dart b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_logic.dart index d885aafa..88f39d31 100755 --- a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_logic.dart +++ b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_logic.dart @@ -39,6 +39,11 @@ class SendElectronicKeyViewLogic extends BaseGetXController { void onInit() { super.onInit(); + // 监听输入框变化 + state.emailOrPhoneController.addListener(() { + state.emailOrPhone.value = state.emailOrPhoneController.text; + }); + Storage.getBool(ifIsDemoModeOrNot) .then((bool? value) => state.isDemoMode = value ?? false); } @@ -186,10 +191,11 @@ class SendElectronicKeyViewLogic extends BaseGetXController { final String getMobile = (await Storage.getMobile())!; if (entity.errorCode!.codeIsSuccessful) { ApmHelper.instance.trackEvent('add_electronic_key', { - 'lock_name':BlueManage().connectDeviceName, - 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, - 'date':DateTool().getNowDateWithType(1), - 'add_electronic_key_result':'成功', + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'add_electronic_key_result': '成功', }); emailOrPhone = state.emailOrPhoneController.text; @@ -202,10 +208,11 @@ class SendElectronicKeyViewLogic extends BaseGetXController { eventBus.fire(ElectronicKeyListRefreshUI()); } else { ApmHelper.instance.trackEvent('add_electronic_key', { - 'lock_name':BlueManage().connectDeviceName, - 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, - 'date':DateTool().getNowDateWithType(1), - 'add_electronic_key_result':'${entity.errorCode}--${entity.errorMsg}', + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'add_electronic_key_result': '${entity.errorCode}--${entity.errorMsg}', }); emailOrPhone = null; diff --git a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_page.dart b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_page.dart index 9e2b8986..8fee41fd 100755 --- a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_page.dart +++ b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_page.dart @@ -17,6 +17,7 @@ import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/pickers/pickers.dart'; import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; +import 'package:star_lock/tools/regularExpression.dart'; import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/tools/submitBtn.dart'; @@ -114,29 +115,33 @@ class _SendElectronicKeyViewState extends State // 1, // logic)), perpetualKeyWidget(logic, '接收者'.tr, '请输入手机号或者邮箱'.tr), - CommonItem( - leftTitel: '国家/地区'.tr, - rightTitle: '', - isHaveLine: true, - isHaveRightWidget: true, - isHaveDirection: true, - rightWidget: Text( - '${logic.state.countryName} +${logic.state.countryCode}', - textAlign: TextAlign.end, - style: - TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor), - ), - action: () async { - final Object? result = await Navigator.pushNamed( - context, Routers.selectCountryRegionPage); - if (result != null) { - result as Map; - logic.state.countryCode = result['code']; - logic.state.countryName = result['countryName']; - logic.update(); - } - }, - ), + Obx(() => Visibility( + visible: RegularExpression() + .isPhoneNumber(logic.state.emailOrPhone.value), + child: CommonItem( + leftTitel: '国家/地区'.tr, + rightTitle: '', + isHaveLine: true, + isHaveRightWidget: true, + isHaveDirection: true, + rightWidget: Text( + '${logic.state.countryName} +${logic.state.countryCode}', + textAlign: TextAlign.end, + style: TextStyle( + fontSize: 22.sp, color: AppColors.darkGrayTextColor), + ), + action: () async { + final Object? result = await Navigator.pushNamed( + context, Routers.selectCountryRegionPage); + if (result != null) { + result as Map; + logic.state.countryCode = result['code']; + logic.state.countryName = result['countryName']; + logic.update(); + } + }, + ), + )), CommonItem( leftTitel: '姓名'.tr, rightTitle: '', @@ -589,6 +594,9 @@ class _SendElectronicKeyViewState extends State ), style: TextStyle( fontSize: 22.sp, textBaseline: TextBaseline.alphabetic), + onChanged: (String value) { + logic.update(); + }, ), ), SizedBox( diff --git a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart index 8f8244bc..353d884a 100755 --- a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart +++ b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart @@ -4,8 +4,12 @@ import 'package:get/get.dart'; import 'package:star_lock/tools/dateTool.dart'; class SendElectronicKeyViewState { + //循环 + TextEditingController emailOrPhoneController = TextEditingController(); //邮箱/手机号输入框 + // 监听输入框变化 + RxString emailOrPhone = ''.obs; // 在logic的state中添加一个Rx变量 TextEditingController keyNameController = TextEditingController(); //钥匙名输入框 TextEditingController realNameController = TextEditingController(); //真实姓名输入框 TextEditingController idCardController = TextEditingController(); //身份证号输入框 @@ -37,5 +41,5 @@ class SendElectronicKeyViewState { final String timeLimitTips = '接收者在有效期内可以不限次数使用'.tr; //限时 final String permanentTips = '接收者可以使用此App开关锁'.tr; //永久 final String onceLimitTips = '单次钥匙有效期为1小时,只能使用一次'.tr; //单次 - final String cycleLimitTips = '接收者可以在有效期内的固定时间段里,不限次数使用'.tr; //循环 + final String cycleLimitTips = '接收者可以在有效期内的固定时间段里,不限次数使用'.tr; } From a2fd315e86564e9dcf300dce59976feb3e71bd20 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 4 Mar 2025 09:42:12 +0800 Subject: [PATCH 003/135] =?UTF-8?q?feat=EF=BC=9A=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=B7=B3=E8=BF=87=E9=85=8D=E7=BD=91=E5=90=8E=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=89=A9=E7=90=86=E8=BF=94=E5=9B=9E=E9=94=AE=E5=8F=88=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=88=B0=E6=B7=BB=E5=8A=A0=E9=94=81=E7=9A=84=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lockSet/configuringWifi/wifiList/wifiList_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_page.dart b/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_page.dart index 4b15c18c..d00e360d 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_page.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_page.dart @@ -79,7 +79,7 @@ class _WifiListPageState extends State { borderRadius: 20.w, padding: EdgeInsets.only(top: 25.w, bottom: 25.w), onClick: () { - Get.offAndToNamed(Routers.starLockMain); + Get.offAllNamed(Routers.starLockMain); }, ) : Container(), From 7fd68e6abc8e5bae1412740ec0436fc209da5e42 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Tue, 4 Mar 2025 12:02:47 +0800 Subject: [PATCH 004/135] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dhonor=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0token=E4=B8=8A=E6=8A=A5=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tools/push/xs_jPhush.dart | 6 +++--- pubspec.lock | 6 +++--- pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/tools/push/xs_jPhush.dart b/lib/tools/push/xs_jPhush.dart index 7639dd86..f2f431c6 100755 --- a/lib/tools/push/xs_jPhush.dart +++ b/lib/tools/push/xs_jPhush.dart @@ -24,10 +24,10 @@ class XSJPushProvider { 3: 'meizu', 4: 'oppo', 5: 'vivo', - 6: 'honor', - 7: 'apns', + 7: 'honor', 8: 'fcm', - 9: 'jiguang' + 9: 'jiguang', + 10: 'apns', }; final JPush jpush = JPush(); DebounceThrottleTool? _debounceThrottleTool; diff --git a/pubspec.lock b/pubspec.lock index dd6aba4d..3eff3ffe 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -329,7 +329,7 @@ packages: source: hosted version: "0.3.4+2" crypto: - dependency: transitive + dependency: "direct main" description: name: crypto sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab @@ -992,8 +992,8 @@ packages: dependency: "direct main" description: path: "." - ref: ed2bd31147ccc929d9b9cf47205c2b8142a6d3f2 - resolved-ref: ed2bd31147ccc929d9b9cf47205c2b8142a6d3f2 + ref: "656df9ee91b1ec8b96aa1208a6b0df27a4516067" + resolved-ref: "656df9ee91b1ec8b96aa1208a6b0df27a4516067" url: "git@code-internal.star-lock.cn:StarlockTeam/jpush_flutter.git" source: git version: "2.5.8" diff --git a/pubspec.yaml b/pubspec.yaml index feb2c0ee..c4940ae7 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -214,7 +214,7 @@ dependencies: jpush_flutter: git: url: git@code-internal.star-lock.cn:StarlockTeam/jpush_flutter.git - ref: ed2bd31147ccc929d9b9cf47205c2b8142a6d3f2 + ref: 656df9ee91b1ec8b96aa1208a6b0df27a4516067 #视频播放器 video_player: ^2.9.2 From e32b2191f37e2bb66941c130c4cb5c83adb32fa3 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Thu, 6 Mar 2025 15:43:50 +0800 Subject: [PATCH 005/135] build trigger From 829e06a3dd37064f43ff75e98ceed68c0326b277 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Fri, 7 Mar 2025 09:27:28 +0800 Subject: [PATCH 006/135] =?UTF-8?q?fix=EF=BC=9A=E5=A4=9A=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_bn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lan/lan_bn.json b/lan/lan_bn.json index f8e6b0f5..c34bd028 100644 --- a/lan/lan_bn.json +++ b/lan/lan_bn.json @@ -151,7 +151,7 @@ "升级": "আন্ডারেট", "空闲": "ছোয়ান্ট", "已入住": "নিয়ন্ত্র", - "多语言": "Langu▁রেজ", + "多语言": "বহুভাষিক", "添加锁": "লক", "锁地址": "অ্যান্ডলক", "选择锁类型": "নির্মাণselectlocktypeype", From 458ad3314782bdd9c2e5a8580cda9e60d4a68fb6 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Fri, 7 Mar 2025 15:46:31 +0800 Subject: [PATCH 007/135] =?UTF-8?q?fix:=20=E9=80=80=E5=87=BA=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=90=8E=E9=9C=80=E8=A6=81=E4=BC=A0storageNonce?= =?UTF-8?q?=E6=B8=85=E7=90=86=E6=8E=A8=E9=80=81=E7=BB=91=E5=AE=9A=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mine/mineSet/mineSet/mineSet_logic.dart | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/mine/mineSet/mineSet/mineSet_logic.dart b/lib/mine/mineSet/mineSet/mineSet_logic.dart index 8778dfc0..845ec23b 100755 --- a/lib/mine/mineSet/mineSet/mineSet_logic.dart +++ b/lib/mine/mineSet/mineSet/mineSet_logic.dart @@ -123,14 +123,9 @@ class MineSetLogic extends BaseGetXController { //退出登录请求 Future userLogoutRequest() async { - String getPushDeviceID = ''; - await Storage.getString(pushDeviceID).then((String? value) { - if (value != null && value.isNotEmpty) { - getPushDeviceID = value; - } - }); + final String? deviceID = await Storage.getString(appDeviceID); final LoginEntity entity = - await ApiRepository.to.userLogout(storageNonce: getPushDeviceID); + await ApiRepository.to.userLogout(storageNonce: deviceID ?? ''); final String getMobile = (await Storage.getMobile())!; if (entity.errorCode!.codeIsSuccessful) { ApmHelper.instance.logout(); From 0794b2fe75fe3dedd6583fd334e0c555b348ed8a Mon Sep 17 00:00:00 2001 From: Liuyf Date: Mon, 10 Mar 2025 11:13:54 +0800 Subject: [PATCH 008/135] =?UTF-8?q?fix=EF=BC=9A=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=BD=91=E5=85=B3=E9=85=8D=E5=AF=B9=E5=BC=95=E5=AF=BC=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_zh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lan/lan_zh.json b/lan/lan_zh.json index 4fb4b3a2..27808a07 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -219,7 +219,7 @@ "添加网关": "添加网关", "重新通电": "重新通电", "指示灯": "指示灯", - "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "网关通电后,长按重置按钮5秒,指示灯交替闪烁时点击下一步", + "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步", "选择网关": "选择网关", "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置", "WiFi密码": "WiFi密码", From e9d8c071af9e3ef794724184b229aaf3258ccd87 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 10 Mar 2025 17:43:49 +0800 Subject: [PATCH 009/135] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=9B=BD=E9=99=85=E5=8C=96=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_ar.json | 16 +- lan/lan_bg.json | 16 +- lan/lan_bn.json | 16 +- lan/lan_cs.json | 16 +- lan/lan_da.json | 16 +- lan/lan_de.json | 16 +- lan/lan_el.json | 16 +- lan/lan_es.json | 16 +- lan/lan_et.json | 16 +- lan/lan_fi.json | 16 +- lan/lan_fr.json | 16 +- lan/lan_he.json | 16 +- lan/lan_hi.json | 1140 ++++++++++++++++++++++++++++++++++++++++++ lan/lan_hk.json | 16 +- lan/lan_hr.json | 16 +- lan/lan_hu.json | 16 +- lan/lan_id.json | 16 +- lan/lan_it.json | 16 +- lan/lan_ja.json | 16 +- lan/lan_kk.json | 16 +- lan/lan_ko.json | 16 +- lan/lan_lt.json | 16 +- lan/lan_ms.json | 16 +- lan/lan_nl.json | 16 +- lan/lan_pl.json | 16 +- lan/lan_pt.json | 16 +- lan/lan_ro.json | 16 +- lan/lan_ru.json | 16 +- lan/lan_sk.json | 16 +- lan/lan_sr_cyrl.json | 16 +- lan/lan_sv.json | 16 +- lan/lan_th.json | 16 +- lan/lan_tr.json | 16 +- lan/lan_tw.json | 16 +- lan/lan_uk.json | 16 +- lan/lan_ur.json | 1140 ++++++++++++++++++++++++++++++++++++++++++ lan/lan_vi.json | 16 +- 37 files changed, 2805 insertions(+), 35 deletions(-) create mode 100644 lan/lan_hi.json create mode 100644 lan/lan_ur.json diff --git a/lan/lan_ar.json b/lan/lan_ar.json index cbdfd09c..938e2aa1 100644 --- a/lan/lan_ar.json +++ b/lan/lan_ar.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "بعد إعادة الضبط ، سيتم حذف جهاز التحكم عن بعد للقفل. هل تريد إعادة ضبطه ؟", "版本说明": "تعليمات الإصدار", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "بعد تشغيل البوابة ، اضغط مع الاستمرار على زر إعادة الضبط لمدة 5 ثوانٍ. انقر فوق التالي عندما يومض ضوء المؤشر الأزرق", - "网关添加成功": "تم إضافة البوابة بنجاح" + "网关添加成功": "تم إضافة البوابة بنجاح", + "功能开启后,你将可以通过网关远程开锁。": "بعد تفعيل الوظيفة، ستكون قادرًا على الفتح عن بُعد من خلال البوابة.", + "录屏已保存到相册": "تم حفظ ملف تسجيل الشاشة للألبوم", + "通话未接通,已挂断": "الإتصال غير متصل، أغلق", + "通话异常中断": "انقطاع الاتصال غير الطبيعي", + "通话连接失败": "فشل اتصال المكالمة", + "已挂断": "أقفل الخط", + "正在说话...": "أتحدث الآن …", + "设备不在线": "الجهاز ليس متصلا", + "设备未配网": "الجهاز غير متصل بالشبكة", + "已静音": "الصوت كان مغلقاً", + "该锁的远程开锁功能未启用": "وظيفة الفتح عن بعد لهذا القفل غير ممكنة", + "下载完成,请到相册查看": "اكتملت عملية التحميل، الرجاء الذهاب إلى الألبوم لمشاهدته", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "عند ضبط عين على وضع توفير الطاقة لا يمكن إجراء المراقبة يرجى الانتقال إلى الأوضاع الأخرى في إعدادات", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "لا يمكن فتح القفل عن بعد عند ضبط عين على وضع توفير الطاقة يرجى الانتقال إلى وضع آخر في إعدادات عين القطة" } \ No newline at end of file diff --git a/lan/lan_bg.json b/lan/lan_bg.json index d911a65c..033c9ef5 100644 --- a/lan/lan_bg.json +++ b/lan/lan_bg.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "След нулиране, дистанционното управление на ключалката ще бъде изтрито. Искате ли да го нулирате?", "版本说明": "Обяснение на версията", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "След като шлюзът е включен, натиснете и задръжте бутона reset за 5 секунди. Щракнете върху следващия, когато синята индикаторна светлина мига", - "网关添加成功": "Gateway added successfully" + "网关添加成功": "Gateway added successfully", + "功能开启后,你将可以通过网关远程开锁。": "След като функцията е активирана, ще можете да отключите дистанционно през шлюза。", + "录屏已保存到相册": "Файлът за запис на екрана, записан в албум", + "通话未接通,已挂断": "Обаждането не е свързано, затворено е", + "通话异常中断": "Необичайно прекъсване на разговора", + "通话连接失败": "Неуспешна връзка за повикване", + "已挂断": "Затваряне", + "正在说话...": "Говоря сега...", + "设备不在线": "Устройството не е онлайн", + "设备未配网": "Устройството не е свързано към мрежата", + "已静音": "Звукът е изключен", + "该锁的远程开锁功能未启用": "Функцията за дистанционно отключване на тази ключалка не е активирана", + "下载完成,请到相册查看": "Изтеглянето е завършено, моля, отидете на албума, за да го видите", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Когато Cat Eye е настроен на режим на пестене на енергия, наблюдението не може да се извършва. Моля, превключете към други режими в настройките на Cat Eye", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Дистанционното отключване не е възможно, когато Cat Eye е настроен в режим на пестене на енергия. Моля, превключете на друг режим в настройките на Cat Eye" } \ No newline at end of file diff --git a/lan/lan_bn.json b/lan/lan_bn.json index c34bd028..3a4df8b0 100644 --- a/lan/lan_bn.json +++ b/lan/lan_bn.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "ব্যান্ডোটারপ্রাসেট, নিয়ন্ত্রণের নিয়ন্ত্রণ। ডোডো ডাইভান্টটুরে?", "版本说明": "ভার্সনপরিচিতি", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "ব্যাস্টোকার্টারটিইসপোভেরোর্ডন, প্রেস এবং প্রেসিটিসেট গানটেটনফোর্র 5 সইভিক ds। বিকশিক", - "网关添加成功": "রুপেডডড্রোজেন্টজেক্যালি" + "网关添加成功": "রুপেডডড্রোজেন্টজেক্যালি", + "功能开启后,你将可以通过网关远程开锁。": "ফাংশন সক্রিয় করার পরে, আপনি গেটওয়ে。 এর মাধ্যমে দূরবর্তীভাবে আনলক করতে সক্ষম হবেন", + "录屏已保存到相册": "স্ক্রিন রেকর্ডিং ফাইল অ্যালবামে সংরক্ষণ করা হয়েছে", + "通话未接通,已挂断": "কল কানেক্ট হয়নি, হ্যাং আপ", + "通话异常中断": "অস্বাভাবিক কল বাধা", + "通话连接失败": "কল সংযোগ ব্যর্থ হয়েছে", + "已挂断": "ঝুলিয়ে রাখা", + "正在说话...": "এখন কথা হচ্ছে...", + "设备不在线": "ডিভাইসটি অনলাইনে নেই", + "设备未配网": "ডিভাইসটি নেটওয়ার্কের সাথে সংযুক্ত নয়", + "已静音": "শব্দটি বন্ধ করা হয়েছে", + "该锁的远程开锁功能未启用": "এই লকের রিমোট আনলকিং ফাংশন সক্ষম নেই", + "下载完成,请到相册查看": "ডাউনলোড সম্পন্ন হয়েছে, দেখতে অনুগ্রহ করে অ্যালবামে যান", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "যখন ক্যাট আই পাওয়ার-সেভিং মোডে সেট করা থাকে, তখন পর্যবেক্ষণ করা যায় না। দয়া করে ক্যাট আই সেটিংসে অন্যান্য মোডে স্যুইচ করুন", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "ক্যাট আই পাওয়ার-সাশ্রয় মোডে সেট করা থাকলে রিমোট আনলক করা সম্ভব নয়। দয়া করে ক্যাট আই সেটিংসে অন্য মোডে স্যুইচ করুন" } \ No newline at end of file diff --git a/lan/lan_cs.json b/lan/lan_cs.json index 2fbf2f56..ceff8a23 100644 --- a/lan/lan_cs.json +++ b/lan/lan_cs.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Po resetu bude dálkové ovládání zámku odstraněno. Chcete ho obnovit?", "版本说明": "Verze", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Po zapnutí brány stiskněte a podržte tlačítko reset po dobu 5 sekund. Klepněte na tlačítko další, když modré světlo ukazatele bliká", - "网关添加成功": "Úspěšně přidaná brána" + "网关添加成功": "Úspěšně přidaná brána", + "功能开启后,你将可以通过网关远程开锁。": "Po aktivaci funkce budete moci vzdáleně odemknout prostřednictvím brány.", + "录屏已保存到相册": "Soubor záznamu obrazovky uložený do alba", + "通话未接通,已挂断": "Hovor není spojen, zavěsil", + "通话异常中断": "Abnormální přerušení hovoru", + "通话连接失败": "Připojení hovoru se nezdařilo", + "已挂断": "Zavěsit", + "正在说话...": "Teď mluvím...", + "设备不在线": "Zařízení není online", + "设备未配网": "Zařízení není připojeno k síti", + "已静音": "Zvuk byl vypnut", + "该锁的远程开锁功能未启用": "Funkce dálkového odemykání tohoto zámku není povolena", + "下载完成,请到相册查看": "Stahování dokončeno, přejděte prosím na album k zobrazení", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Když je Cat Eye nastaven do úsporného režimu, monitorování nelze provádět. Přepněte prosím do jiných režimů v nastavení Cat Eye", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Dálkové odemykání není možné, pokud je Cat Eye nastaven do úsporného režimu. Přepněte prosím do jiného režimu v nastavení Cat Eye" } \ No newline at end of file diff --git a/lan/lan_da.json b/lan/lan_da.json index 273816ab..09b0b141 100644 --- a/lan/lan_da.json +++ b/lan/lan_da.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Efter nulstilling, fjernbetjeningen af låsen vil blive slettet. Vil du nulstille den?", "版本说明": "Versionsbeskrivelse", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Når gateway er tændt, tryk på og hold nulstillingsknappen i 5 sekunder. Klik på Næste, når den blå indikator lys blinker", - "网关添加成功": "Gateway tilføjet med succet" + "网关添加成功": "Gateway tilføjet med succet", + "功能开启后,你将可以通过网关远程开锁。": "Når funktionen er aktiveret, vil du være i stand til at fjernlåse via gatewayen.", + "录屏已保存到相册": "Skærmoptagelsesfil gemt i album", + "通话未接通,已挂断": "Opkaldet blev ikke tilsluttet, lagt på", + "通话异常中断": "Unormal opkaldsafbrydelse", + "通话连接失败": "Opkaldsforbindelse mislykkedes", + "已挂断": "Lægger på", + "正在说话...": "Taler nu...", + "设备不在线": "Enheden er ikke online", + "设备未配网": "Enheden er ikke tilsluttet netværket", + "已静音": "Lyden er blevet slukket", + "该锁的远程开锁功能未启用": "Fjernoplåsningsfunktionen for denne lås er ikke aktiveret", + "下载完成,请到相册查看": "Download fuldført, gå til albummet for at se", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Når Cat Eye er indstillet til strømbesparende tilstand, kan overvågning ikke udføres. Skift venligst til andre tilstande i Cat Eye-indstillingerne", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Fjernoplåsning er ikke mulig, når Cat Eye er indstillet til strømbesparende tilstand. Skift venligst til en anden tilstand i Cat Eye-indstillinger" } \ No newline at end of file diff --git a/lan/lan_de.json b/lan/lan_de.json index e46ef9e4..e4b18d4d 100644 --- a/lan/lan_de.json +++ b/lan/lan_de.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Nach dem Zurücksetzen wird die Fernbedienung des Schlosses gelöscht. Willst du es zurücksetzen?", "版本说明": "Versionsbeschreibung", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Nachdem das Gateway eingesc haltet ist, drücken und halten Sie die Reset-Taste für 5 Sekunden. Klicken Sie auf Weiter, wenn die blaue Anzeige leuchte blinkt", - "网关添加成功": "Gateway erfolgreich hinzugefügt" + "网关添加成功": "Gateway erfolgreich hinzugefügt", + "功能开启后,你将可以通过网关远程开锁。": "Ist diese funktion aktiviert, können sie sie manuell über das gateway entsperren", + "录屏已保存到相册": "Aufzeichnungen werden in fotoalbum gespeichert", + "通话未接通,已挂断": "Nicht durchwahl und aufgelegt", + "通话异常中断": "Keine ungewöhnlichen anrufe.", + "通话连接失败": "Verbindung abgebrochen nicht.", + "已挂断": "hängen", + "正在说话...": "Und jetzt? - jetzt.", + "设备不在线": "Gerät nicht online.", + "设备未配网": "Die ausrüstung ist nicht mit dem netzwerk verbunden", + "已静音": "Der ton ist abgeschaltet", + "该锁的远程开锁功能未启用": "Die fernsteuerung des schlüssels nicht geöffnet", + "下载完成,请到相册查看": "Die herunterladen ist abgeschlossen. Gehen sie ins fotoalbum", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Die überwachung kann nicht durchgeführt werden, wenn die katze auf schaltungsmodus eingestellt ist. Wechseln sie in die einstellungen für die katze auf einen anderen modus", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Die katze kann nicht aus der ferne entsperren, wenn sie so eingestellt ist, dass strom gespart wird Wechseln sie in die einstellungen für die katze auf einen anderen modus" } \ No newline at end of file diff --git a/lan/lan_el.json b/lan/lan_el.json index 99d135fd..91697172 100644 --- a/lan/lan_el.json +++ b/lan/lan_el.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, το τηλεχειριστήριο της κλειδαριάς θα διαγραφεί. Θέλεις να το επαναφέρεις;", "版本说明": "Περιγραφή έκδοσης", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Αφού ενεργοποιηθεί η πύλη, πιέστε και κρατήστε το κουμπί επαναφοράς για 5 δευτερόλεπτα. Κάντε κλικ Επόμενο όταν το μπλε φως δείκτη αναβοσβήνει", - "网关添加成功": "Η πύλη προστέθηκε με επιτυχία" + "网关添加成功": "Η πύλη προστέθηκε με επιτυχία", + "功能开启后,你将可以通过网关远程开锁。": "Αφού ενεργοποιηθεί η λειτουργία, θα μπορείτε να ξεκλειδώσετε εξ αποστάσεως μέσω της πύλης。", + "录屏已保存到相册": "Αρχείο εγγραφής οθόνης αποθηκευμένο στο άλμπουμ", + "通话未接通,已挂断": "Η κλήση δεν συνδέθηκε, τερματίστηκε", + "通话异常中断": "Μη φυσιολογική διακοπή κλήσεων", + "通话连接失败": "Η σύνδεση κλήσης απέτυχε", + "已挂断": "Κλείσιμο του τηλεφώνου", + "正在说话...": "Μιλώντας τώρα...", + "设备不在线": "Η συσκευή δεν είναι συνδεδεμένη στο Internet", + "设备未配网": "Η συσκευή δεν είναι συνδεδεμένη στο δίκτυο", + "已静音": "Ο ήχος έχει απενεργοποιηθεί", + "该锁的远程开锁功能未启用": "Η λειτουργία απομακρυσμένου ξεκλειδώματος αυτής της κλειδαριάς δεν είναι ενεργοποιημένη", + "下载完成,请到相册查看": "Η λήψη ολοκληρώθηκε, μεταβείτε στο άλμπουμ για προβολή", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Όταν το Cat Eye έχει ρυθμιστεί σε λειτουργία εξοικονόμησης ενέργειας, δεν είναι δυνατή η εκτέλεση παρακολούθησης. Μεταβείτε σε άλλες λειτουργίες στις ρυθμίσεις του Cat Eye", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Το απομακρυσμένο ξεκλείδωμα δεν είναι δυνατό όταν το Cat Eye έχει ρυθμιστεί σε λειτουργία εξοικονόμησης ενέργειας. Μεταβείτε σε άλλη λειτουργία στις ρυθμίσεις του Cat Eye" } \ No newline at end of file diff --git a/lan/lan_es.json b/lan/lan_es.json index f9aea786..e1f203ba 100644 --- a/lan/lan_es.json +++ b/lan/lan_es.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Después del reinicio, se eliminará el control remoto de la cerradura. ¿Quieres resetearlo?", "版本说明": "Instrucciones de versión", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Después de encender la puerta de enlace, mantenga presionado el botón de reinicio durante 5 segundos. Haga clic en Siguiente cuando la luz indicadora azul parpadee", - "网关添加成功": "Gateway añadido con éxito" + "网关添加成功": "Gateway añadido con éxito", + "功能开启后,你将可以通过网关远程开锁。": "Después de que la función está habilitada, usted será capaz de desbloquear remotamente a través de la puerta de enlace.", + "录屏已保存到相册": "Archivo de grabación de pantalla guardado al álbum", + "通话未接通,已挂断": "Llamada no conectada, colgado", + "通话异常中断": "Interrupción anormal de la llamada", + "通话连接失败": "Fallo en la conexión de la llamada", + "已挂断": "Colgando arriba", + "正在说话...": "Hablando ahora...", + "设备不在线": "El dispositivo no está conectado", + "设备未配网": "El dispositivo no está conectado a la red", + "已静音": "El sonido ha sido apagado", + "该锁的远程开锁功能未启用": "La función de desbloqueo remoto de este bloqueo no está habilitada", + "下载完成,请到相册查看": "Descargar completado, por favor vaya al álbum para ver", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Cuando Cat Eye está configurado en modo de ahorro de energía, no se puede realizar la monitorización. Cambie a otros modos en la configuración de ojo gato", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "El desbloqueo remoto no es posible cuando Cat Eye está en modo de ahorro de energía. Cambie a otro modo en la configuración de ojos de gato" } \ No newline at end of file diff --git a/lan/lan_et.json b/lan/lan_et.json index 3a13e07d..c0a777f0 100644 --- a/lan/lan_et.json +++ b/lan/lan_et.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku kaugjuhtimine. Kas sa tahad seda lähtestada?", "版本说明": "Versiooniteave", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Kui värav on sisse lülitatud, vajutage nuppu ja hoidke nuppu 5 sekundit. Klõpsa Järgmine, kui sinine indikaator valgus vilgub", - "网关添加成功": "Gateway lisati edukalt" + "网关添加成功": "Gateway lisati edukalt", + "功能开启后,你将可以通过网关远程开锁。": "Pärast funktsiooni lubamist saate lüüsi kaudu kaugavada.", + "录屏已保存到相册": "Albumisse salvestatud ekraanisalvestusfail", + "通话未接通,已挂断": "Kõne ei ole ühendatud, katkestatakse", + "通话异常中断": "Ebatavaline kõnekatkestus", + "通话连接失败": "Kõne ühendamine ebaõnnestus", + "已挂断": "Riputamine", + "正在说话...": "Räägin nüüd...", + "设备不在线": "Seade pole võrgus", + "设备未配网": "Seade pole võrku ühendatud", + "已静音": "Heli on välja lülitatud", + "该锁的远程开锁功能未启用": "Selle luku kaugavamise funktsioon pole lubatud", + "下载完成,请到相册查看": "Allalaadimine on lõpetatud, vaatamiseks minge albumisse", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Kui Cat Eye on seatud energiasäästurežiimile, ei saa jälgimist teostada. Palun lülituge Cat Eye seadetes muudele režiimidele", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Kaugavamine ei ole võimalik, kui Cat Eye on seatud energiasäästurežiimile. Palun lülituge Cat Eye seadetes teisele režiimile" } \ No newline at end of file diff --git a/lan/lan_fi.json b/lan/lan_fi.json index 39fe12b0..079be028 100644 --- a/lan/lan_fi.json +++ b/lan/lan_fi.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Nollauksen jälkeen lukon kaukosäädin poistetaan. Haluatko palauttaa sen?", "版本说明": "Versio", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Kun portti on käytössä, paina ja pidä nollauspainiketta 5 sekunnin ajan. Napsauta Seuraava kun sininen ilmaisin valo vilkkuu", - "网关添加成功": "Gateway lisättiin onnistuneesti" + "网关添加成功": "Gateway lisättiin onnistuneesti", + "功能开启后,你将可以通过网关远程开锁。": "Kun toiminto on otettu käyttöön, voit avata lukituksen etänä yhdyskäytävän kautta.", + "录屏已保存到相册": "Näytön tallennustiedosto tallennettu albumiin", + "通话未接通,已挂断": "Puhelua ei ole yhdistetty, katkaistu puhelu", + "通话异常中断": "Epänormaali puhelun keskeytys", + "通话连接失败": "Puheluyhteys epäonnistui", + "已挂断": "Puhelun katkaiseminen", + "正在说话...": "Puhutaan nyt...", + "设备不在线": "Laite ei ole online-tilassa", + "设备未配网": "Laitetta ei ole yhdistetty verkkoon", + "已静音": "Ääni on kytketty pois päältä", + "该锁的远程开锁功能未启用": "Tämän lukon etälukituksen avaustoiminto ei ole käytössä", + "下载完成,请到相册查看": "Lataus valmis, siirry albumiin nähdäksesi", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Kun Cat Eye on asetettu virransäästötilaan, valvontaa ei voi suorittaa. Vaihda muihin tiloihin Cat Eye -asetuksissa", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Lukituksen avaaminen ei ole mahdollista, kun Cat Eye on asetettu virransäästötilaan. Vaihda toiseen tilaan Cat Eye -asetuksissa" } \ No newline at end of file diff --git a/lan/lan_fr.json b/lan/lan_fr.json index c823b2b6..0df73d91 100644 --- a/lan/lan_fr.json +++ b/lan/lan_fr.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Après réinitialisation, la télécommande du verrou sera supprimée. Voulez-vous le réinitialiser?", "版本说明": "Explication de la version", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Après la mise sous tension de la passerelle, appuyez sur le bouton de réinitialisation et maintenez-le enfoncé pendant 5 secondes. Cliquez sur Suivant lorsque le voyant bleu clignote", - "网关添加成功": "Gateway ajouté avec succès" + "网关添加成功": "Gateway ajouté avec succès", + "功能开启后,你将可以通过网关远程开锁。": "Une fois la fonction activée, vous pourrez déverrouiller à distance via la passerelle.", + "录屏已保存到相册": "Fichier d’enregistrement d’écran enregistré dans l’album", + "通话未接通,已挂断": "Appel non connecté, raccroché", + "通话异常中断": "Interruption anormale d’un appel", + "通话连接失败": "La connexion d’appel a échoué", + "已挂断": "Raccrocher en haut", + "正在说话...": "On parle maintenant...", + "设备不在线": "L’appareil n’est pas en ligne", + "设备未配网": "L’appareil n’est pas connecté au réseau", + "已静音": "Le son a été éteint", + "该锁的远程开锁功能未启用": "La fonction de déverrouillage à distance de ce verrou n’est pas activée", + "下载完成,请到相册查看": "Téléchargement terminé, s’il vous plaît aller à l’album pour voir", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Lorsque l’oeil de chat est réglé en mode économie d’énergie, la surveillance ne peut pas être effectuée. S’il vous plaît passer à d’autres modes dans les paramètres de l’oeil de chat", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Le déverrouillage à distance n’est pas possible lorsque l’oeil de chat est réglé sur le mode d’économie d’énergie. Veuillez passer à un autre mode dans les paramètres des yeux de chat" } \ No newline at end of file diff --git a/lan/lan_he.json b/lan/lan_he.json index f9815f0f..96df165b 100644 --- a/lan/lan_he.json +++ b/lan/lan_he.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "לאחר איפוס, השליטה מרחוק של המנעול יימחק. אתה רוצה לאפס את זה?", "版本说明": "המידע על גרסה", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "לאחר שהשער מופעל, לחץ והחזק את כפתור האיפוס למשך 5 שניות. לחץ על הבא כאשר האור מחוון כחול מהבהב", - "网关添加成功": "שער הוסיף בהצלחה" + "网关添加成功": "שער הוסיף בהצלחה", + "功能开启后,你将可以通过网关远程开锁。": "לאחר הפעלת הפונקציה, תוכל לבטל מרחוק את הנעילה דרך השער。", + "录屏已保存到相册": "קובץ הקלטת מסך שנשמר באלבום", + "通话未接通,已挂断": "השיחה לא מחוברת, ניתקה", + "通话异常中断": "הפרעה חריגה לשיחה", + "通话连接失败": "חיבור השיחה נכשל", + "已挂断": "ניתוקים", + "正在说话...": "מדברים עכשיו...", + "设备不在线": "המכשיר אינו מקוון", + "设备未配网": "ההתקן אינו מחובר לרשת", + "已静音": "הצליל כבה", + "该锁的远程开锁功能未启用": "פונקציית ביטול הנעילה מרחוק של מנעול זה אינה מופעלת", + "下载完成,请到相册查看": "ההורדה הושלמה, אנא עבור לאלבום לצפייה", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "כאשר Cat Eye מוגדר למצב חיסכון בחשמל, לא ניתן לבצע ניטור. עבור למצבים אחרים בהגדרות Cat Eye", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "ביטול נעילה מרחוק אינו אפשרי כאשר Cat Eye מוגדר למצב חיסכון בחשמל. עבור למצב אחר בהגדרות Cat Eye" } \ No newline at end of file diff --git a/lan/lan_hi.json b/lan/lan_hi.json new file mode 100644 index 00000000..d32b69fc --- /dev/null +++ b/lan/lan_hi.json @@ -0,0 +1,1140 @@ +{ + "星锁": "स्टार लॉक", + "锁通通": "टट्लॉक समर्थक", + "点击开锁,长按闭锁": "अनलॉक करने के लिए स्पर्श करें, लॉक को दबाए रखें", + "考勤": "उपस्थिति", + "考勤设置": "उपस्थिति विन्यास", + "电子钥匙": "एकांतवासी", + "添加卡": "कार्ड जोड़ें", + "卡号": "कार्ड संख्या", + "添加指纹": "फिंगरप्रिंट जोड़ें", + "指纹号": "फिंगरप्रिंट नंबर", + "遥控": "दूरस्थ", + "添加人脸": "चेहरा जोड़ें", + "门锁日志": "दरवाज़ा बंद लॉग", + "密码号": "पासवर्ड नंबर", + "添加者": "परिचालक", + "添加时间": "पहर", + "重置": "मुद्रण हेतु टाइप को सही तौर पर लगाना", + "请输入手机号或者邮箱": "फ़ोन नंबर या ईमेल", + "工作时间": "काम का समय", + "工作日设置": "कार्यदिवस सेटिंग", + "星期一": "सोमवार", + "星期二": "मंगलवार", + "星期三": "बुधवार", + "星期四": "बृहस्पतिवार", + "星期五": "शुक्रवार", + "星期六": "शनिवार", + "星期日": "रविवार", + "简写周一": "हजार", + "简写周二": "टी", + "简写周三": "दग्धा", + "简写周四": "टी", + "简写周五": "च", + "简写周六": "रों", + "简写周日": "रों", + "周一": "सोम", + "周二": "मंगल", + "周三": "बुद्ध", + "周四": "थू", + "周五": "शुक्र", + "周六": "शनि", + "周日": "रवि", + "群发钥匙": "बहुत सारी ईकाई भेजें", + "锁": "लट", + "请添加": "प्राप्त करने वाला", + "允许远程开锁": "रिमोट अनलॉक", + "请输入验证码": "सत्यापन कोड", + "获取密码": "पासकोड उत्पन्न करें", + "请给密码命名": "इस पासकोड के लिए नाम भरें", + "密码有限期为6个小时,只能使用一次": "यह पासकोड वर्तमान समय से 6 घंटे के भीतर प्रयोग किया जाना चाहिए या इसे सुरक्षा कारणों से निलंबित कर दिया जाएगा. इस पासकोड का प्रयोग केवल एक बार किया जा सकता है।", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "पासवर्ड के रूप में मैन्युअल रूप से 6 फोन ब्लूटूथ द्वारा लॉक के बगल में जोड़ा जा सकता है, या दूरस्थ रूप से गेटवे के माध्यम से जोड़ा जा सकता है", + "获取": "प्राप्त", + "添加": "जोड़ें…", + "删除公司": "कंपनी हटाना", + "密码详情": "पासकोड जानकारी", + "修改密码": "पासकोड बदलें", + "添加虹膜": "आईरिस जोड़ें", + "添加门磁": "दरवाजा सेंसर", + "添加无线键盘": "वायरलेस कीपैड", + "添加手掌": "हथेली जोड़ें", + "请输入员工账号": "कर्मचारी के खाते में प्रवेश करें", + "批量授权锁": "बहुल ताला दें", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "इस ताला को चलाने के लिए प्राधिकृत प्रशासक के पास वयस्कता की अनुमति होगी।", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "यह सुविधा आपको किसी गेटवे के माध्यम से दूर से स्मार्ट लॉक को अनलॉक करने देती है। यह सुविधा केवल ब्लूटूथ के माध्यम से चालू या बंद हो सकती है", + "功能开启后,你将可以通过网关远程开锁。": "फ़ंक्शन सक्षम होने के बाद, आप गेटवे पर दूरस्थ रूप से अनलॉक कर सकेंगे।", + "排列方式": "सूची प्रकार", + "早到榜": "जल्दी सूची", + "迟到榜": "विलंबित सूची", + "当前模式": "वर्तमान मोड", + "勤奋榜": "कठिन सूची में काम करना", + "延迟时间": "विलम्ब", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "लॉक समय के बाद स्वचालित रूप से लॉक होगा। कृपया सेटिंग को उपलब्ध कराने के लिए इसे पहले एक समय के लिए अनलॉक करें।", + "时间": "पहर", + "开始时间": "आरंभ समय", + "结束时间": "अंत समय", + "工作时间设置": "कार्य समय सेटिंग", + "常开模式": "मार्ग विधि", + "常开时间": "इस समय की अवधि में", + "常开日期": "इन दिनों", + "添加员工": "स्टाफ जोड़ें", + "编辑员工": "स्टाफ संपादित करें", + "节假日": "अवकाश", + "打卡方式": "विधि", + "员工是否有钥匙": "पहले से ही ekey है", + "上班时间": "शुरुआती समय", + "下班时间": "बंद करने का समय", + "本周": "इस सप्ताह", + "单休": "एक दिवसीय सप्ताहांत", + "双休": "दो दिवसीय सप्ताहांत", + "单双休": "एक दो दिवसीय सप्ताहांत", + "年": "साल", + "月": "द्विपक्ष", + "放假日期": "अवकाश", + "补班日期": "कार्य दिवस:", + "添加假日": "अवकाश जोड़ें", + "开始日期": "प्रारंभ तारीख़ @ label: spinbox", + "必填": "अपेक्षित", + "结束日期": "अंतिम तिथि", + "日榜": "दैनिक", + "月榜": "मासिक", + "考勤记录": "अभिलेख", + "假日信息": "छुट्टी की जानकारी", + "基本信息": "मूल बातें", + "无线键盘": "वायरलेस कीपैड", + "选择无线键盘": "कीपैड जोड़ें", + "门磁": "दरवाजा सेंसर", + "自动闭锁": "आटो लॉक", + "锁声音": "ताला ध्वनि", + "防撬报警": "छेड़छाड़ चेतावनी", + "重置键": "रीसेट बटन", + "锁时间": "लॉक घड़ी", + "诊断": "का निदान", + "上传数据": "डेटा अपलोड करें", + "导入其他锁数据": "एक और लॉक से आयात करें", + "锁升级": "फर्मवेयर अद्यतन", + "标记房态": "कमरे की स्थिति", + "开锁提醒": "अधिसूचना अनलॉक करें", + "微信二维码": "QR कोड अनलॉक करें", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "इलेक्ट्रॉनिक कुंजी वाले लोग WeChat के माध्यम से इस QR कोड को स्कैन करके दरवाजा खोल सकते हैं। प्रत्येक लॉक का क्यूआर कोड अलग है आप इसे मुद्रित कर सकते हैं और संबंधित लॉक के बगल में पेस्ट कर सकते हैं।", + "锁编号": "लॉक नंबर", + "电量": "विद्युत कोष", + "锁分组": "लॉक समूह", + "选择分组": "समूह का चयन करें", + "创建新分组": "एक समूह बनाएं", + "管理员开锁密码": "व्यवस्थापक पासकोड", + "更新": "अद्यतन करें", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "बैटरी का स्तर गेटवे या फोन ब्लूटूथ द्वारा अपडेट किया जाएगा।", + "当屏幕闪烁时,点击下一步": "कीपैड फ्लैश होने पर अगला क्लिक करें।", + "输入*529#或按设置键": "*529# दर्ज करें या सेटिंग कुंजी दबाएं", + "长按重置键2秒": "रीसेट बटन 2 सेकंड दबाकर रखें।", + "附近的设备": "पास के उपकरण", + "暂无数据": "कोई आंकड़ा नहीं", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "आप एक गेटवे के साथ एक दरवाजा सेंसर के साथ दरवाजा स्थिति प्राप्त करने में सक्षम होंगे। केवल एक सेंसर को लॉक के साथ संबद्ध करने की अनुमति है", + "开始": "प्रारंभ", + "全天": "सभी घंटे", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "आप पारगमन मोड के लिए कई समय अवधि सेट कर सकते हैं। निश्चित समयावधि में ताला खुला रहने के बाद खुली अवस्था में रहेगा.", + "请选择锁音量": "कृपया लॉक वॉल्यूम चुनें", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "चालू करके, आप लॉक से आवाज सुनेंगे", + "低": "बाज़ारी", + "较低": "मध्यम कम", + "中": "मध्यम", + "较高": "मध्यम उच्च", + "高": "निहायत", + "开启后,锁被撬动时,会发出报警声": "चालू करके, आप छेड़छाड़ चेतावनी सक्षम करते हैं।", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "बंद करके, रीसेट बटन अक्षम है।", + "校准时间": "समय जांचना", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "निदान लॉक के अंदर कॉन्फिगरेशन जानकारी को पढ़ना और उसे अपलोड करना है ताकि कर्मचारी असफलता के कारणों का विश्लेषण कर सकें।", + "上传": "अपलोड", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "लॉक से सर्वर पर डेटा अपलोड करें इसमें कुछ मिनट लग सकते हैं", + "请选择要从哪把锁导入": "इससे आयात के लिए लॉक चुनें", + "有新版本": "नया संस्करण है", + "当前版本": "वर्तमान संस्करण", + "升级": "अद्यतन करें", + "空闲": "रिक्त", + "已入住": "कब्जा कर लिया", + "多语言": "भाषायें", + "添加锁": "ताला जोड़ें", + "锁地址": "पता तालाबंद करें", + "选择锁类型": "लॉक क़िस्म चुनें", + "NFC无源锁": "एनएफसी निष्क्रिय लॉक", + "添加设备": "योजक युक् ति", + "网关": "गेटवे", + "客服": "ग्राहक सेवा", + "设置": "सेटिंगस", + "更多设置": "अधिक सेट", + "消息推送": "अधिसूचना पुश", + "锁用户管理": "उपयोगकर्ताओं को तालाबंद करें", + "拥有的钥匙": "इस उपयोगकर्ता के साथ जुड़े ईकाई", + "批量授权": "प्राधिकरण प्रबंधन", + "关联设备": "सहयुक्त युक्ति", + "关联姓名": "सम्बद्ध नाम", + "转移智能锁": "ट्रांसफर लॉक", + "选择锁": "स्क्रीन बंद", + "接收人信息": "प्राप्त करने वाला", + "转移网关": "अंतरण प्रवेशद्वार", + "锁屏": "स्क्रीन बंद", + "已关闭": "बंद", + "已开启": "पर", + "开启": "चालू करो", + "确定要开启重置键?": "रीसेट बटन को सक्षम करने के लिए जारी रखें?", + "确定要关闭重置键?": "रीसेट बटन को अक्षम करना जारी रखें?", + "隐藏无效开锁权限": "अवैध पहुंच छुपाएँ", + "APP开锁时需手机连网的锁": "ताले ऑनलाइन फोन की आवश्यकता होती है", + "增值服务": "कार्य", + "关于": "के बारे में", + "退出": "लॉगआउट", + "删除账号": "खाता हटा दो", + "个人信息": "खाता जानकारी", + "头像": "अवतार", + "昵称": "उपनाम", + "请输入昵称": "कृपया अपना उपनाम दर्ज करें", + "修改昵称": "नाम बदलने", + "修改账号": "खाता संपादित करें", + "重置密码": "रीसेट पासवर्ड", + "安全问题": "सुरक्षा प्रश्न", + "为了你的账号安全,修改账号前请先使用验证码验证": "अपने खाते की सुरक्षा के लिए, कृपया खाता को संशोधित करने से पहले खाता पासवर्ड सत्यापन का उपयोग करें।", + "请输入新账号": "कृपया नया खाता भरें", + "找回密码和登录新设备时,可通过绑定的手机验证": "बाध्यकारी फ़ोन नंबर का प्रयोग सत्यापन कोड प्राप्त करने के लिए किया जाएगा।", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "बाध्यकारी ईमेल का प्रयोग सत्यापन कोड प्राप्त करने के लिए किया जाएगा।", + "原密码": "वर्तमान पासवर्ड", + "新密码": "नया पासवर्ड", + "确认密码": "पासवर्ड की पुष्टि करें", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "यदि आपका फोन खो गया है, तो आप सुरक्षा प्रश्नों का उत्तर देकर नए फोन पर लॉगिन कर सकते हैं।", + "问题一": "प्रश्न 1", + "问题二": "प्रश्न 2", + "问题三": "प्रश्न 3", + "请输入你的答案": "कृपया अपना उत्तर लिखें", + "即将到期": "जल्द ही समाप्त हो जाएगा", + "去授权": "प्राधिकृत करने के लिए जाओ", + "修改名称": "नाम संपादित करें", + "状态": "स्थिति", + "WiFi名称": "वाईफाई नाम", + "网络MAC": "नेटवर्क मैक", + "网关升级": "गेटवे अपडेट", + "网关连接的锁": "ताला इस गेटवे से जुड़ा हुआ है", + "信号强": "विलक्षण", + "选择网关类型": "गेटवे प्रकार चुनें", + "添加网关": "गेटवे जोड़ें", + "重新通电": "शक्ति फिर से कनेक्ट", + "指示灯": "सुचक बत्ती", + "选择网关": "गेटवे चुनें", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G समर्थित नहीं है. कृपया 2.4 के एक वाईफ़ाई का चयन करें", + "WiFi密码": "वाईफाई पासवर्ड", + "请输入WiFi密码": "वाईफ़ाई पासवर्ड दर्ज करें", + "网关名称": "गेटवे नाम", + "请输入网关名称": "प्रवेश द्वार नाम दर्ज करें", + "IP地址": "आईपी पता", + "子网掩码": "सबनेट मास्क", + "默认网关": "डिफ़ॉल्ट गेटवे", + "自动获取DNS服务器地址": "स्वचालित रूप से डीएनएस सर्वर पता प्राप्त करें", + "首选DNS": "पसंदीदा डीएनएस", + "备选DNS": "वैकल्पिक डीएनएस", + "不使用静态IP": "कोई स्थिर आईपी प्रयोग नहीं किया जाता है", + "使用静态IP": "स्थिर आईपी का उपयोग करें", + "请输入IP地址": "आईपी पता दर्ज करें", + "请输入子网掩码": "सबनेट मास्क में भरें", + "请输入默认网关": "डिफ़ॉल्ट गेटवे दर्ज करें", + "所有锁": "सभी ताले", + "搜索所有类型的锁": "सभी प्रकार के लॉक स्कैन करें।", + "门锁": "दरवाज़े का ताला", + "挂锁": "टाला", + "保险箱锁": "सुरक्षित लॉक", + "智能门禁": "बुद्धिमान पहुंच नियंत्रण", + "车位锁": "पार्किंग लॉक", + "摸亮触摸屏": "कीपैड को सक्रिय करने के लिए किसी भी कुंजी को स्पर्श करें", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "लॉक को सक्रिय करने के लिए कृपया किसी भी कुंजी को स्पर्श करें और उसे युग्मन मोड में रखें। अगला दबाओ", + "附近的锁": "पास के ताले", + "如需修改名字请重新命名,点击确定添加锁": "यदि आप नाम बदलना चाहते हैं, तो कृपया नाम बदलें, लॉक जोड़ने के लिए OK पर क्लिक करें।", + "添加锁时,手机必须在锁旁边": "लॉक जोड़ते समय, फ़ोन लॉक के बगल में होना चाहिए।", + "登录": "प्रवेश करना", + "注册": "रजिस्टर", + "我已阅读并同意": "मैंने पढ़ा और सहमत हो गए हैं", + "验证码": "कोड", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "आपके पासवर्ड में 8-20 अक्षर होने चाहिए, और इसमें कम से कम दो प्रकार की संख्या, अक्षर और चिन्ह शामिल होने चाहिए।", + "手机": "फ़ोन", + "邮箱": "ईमेल", + "请输入邮箱": "अपना ईमेल दर्ज करें", + "国家/地区": "देश/क्षेत्र", + "你所在的国家/地区": "आपका देश/क्षेत्र", + "选择国家/地区": "अपना देश या क्षेत्र चुनें", + "获取验证码": "कोड प्राप्त करें", + "商务合作": "व्यापार", + "电脑网页版": "वेब प्रणाली", + "酒店系统": "होटल प्रणाली", + "说明书网页版": "उपयोगकर्ता पुस्तिका", + "高级功能": "उन्नत फ़ंक्शन", + "记录保存": "अभिलेख अवधारण", + "您可通过短信将密码、电子钥匙信息发给接收人。": "प्राप्तकर्ता को पासकोड और ईकी सूचना भेजने के लिए एसएमएस का प्रयोग किया जा सकता है।", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "प्राप्तकर्ता को ई-कोड और ई-की सूचना भेजने के लिए इस ईमेल का प्रयोग किया जा सकता है.", + "购买实名认证提示": "फ़ंक्शन को सक्षम करने के बाद, आपको एप्लिकेशन को खोलने के लिए अपने फिंगरप्रिंट, फेस या अकाउंट पासवर्ड का उपयोग करना होगा. फिर से 3 मिनट के लिए सत्यापित करने की आवश्यकता नहीं है", + "请选择你希望的实名认证频次": "कृपया वास्तविक नाम प्रमाणीकरण आवृत्ति चुनें जिसे आप चाहते हैं", + "仅首次": "पहली बार", + "每日一次": "दिन में एक बार", + "每周一次": "सप्ताह मेँ एक बार", + "每月一次": "हर महीने एक बार", + "当前状态": "वर्तमान स्थिति", + "试用中": "परीक्षण के लिए", + "高级功能权益内容": "उन्नत फंक्शन्स", + "短信模板": "एसएमएस टैम्पलेट", + "邮件模板": "ईमेल टैम्पलेट", + "发卡工具": "कार्ड एनकोडर", + "购买高级功能须知": "सूचना", + "购买高级功能提示": "अधिक उन्नत विशेषताओं का विकास हो रहा है, और यदि आपको उनकी जरूरत है, तो आप लॉक्स की संख्या के आधार पर सेवा खोलने के लिए स्वागत है। उन्नत सुविधाएँ केवल आपके ही लॉक के लिए उपलब्ध हैं। यदि आप एक अधिकृत व्यवस्थापक हैं, तो कृपया सेवा को खोलने के लिए लॉक के शीर्ष व्यवस्थापक से संपर्क करें।", + "免费体验": "मुफ्त आज़माइश", + "立即开通": "अब खोलें", + "购买短信": "एसएमएस खरीदें", + "购买邮件": "ईमेल खरीदो", + "购买实名认证次数": "वास्तविक नाम सत्यापन समय खरीदें", + "开通高级功能": "उन्नत फंक्शन सक्षम करें", + "选择套餐": "पैकेज चुनें", + "支付方式": "भुगतान का प्रकार", + "支付宝": "अलिवेतन", + "去支付": "वेतन", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "आपको अपने द्वारा संदेश को परिभाषित करने की अनुमति है इसका उपयोग पासकोड और अन्य के लिए ईके की जानकारी भेजने के लिए किया जाता है।", + "高级功能仅能用于你自己的锁": "एडवांस्ड फंक्शन केवल आपके ही लॉक लागू होगा।", + "新建模板": "क्रिएट टेम्पलेट", + "类型": "निदर्शन", + "模版内容": "टैम्प्लेट सामग्री", + "预览": "इत्तला", + "房间名": "कक्ष", + "预计产生短信条数": "अनुमानित संदेश सेगमेंट", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "यह फीचर आपको पासकोड, ईकीज़, कार्ड, और फिंगरप्रिंट जो कि कुछ समय के लिए अमान्य हैं, को छिपाने की अनुमति देता है।", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "ऐप के साथ इन चयनित लॉक को अनलॉक करने के लिए उपयोगकर्ता के फोन को ऑनलाइन होना आवश्यक है", + "配置WiFi": "वाईफ़ाई कॉन्फ़िगर करना", + "请输入WiFi名字": "कृपया वाईफ़ाई नाम दर्ज करें", + "WiFi配网": "वाईफाई वितरण नेटवर्क", + "胁迫卡": "तनाव कार्ड", + "员工是否有密码": "पहले से ही पासकोड है", + "员工是否有卡": "पहले से कार्ड है", + "员工是否有指纹": "फिंगरप्रिंट पहले से ही सेट कर रहा है", + "获取钥匙": "चाबी देना", + "获取卡": "कार्ड प्राप्त करें", + "获取指纹": "फिंगरप्रिंट प्राप्त करें", + "安全验证": "पहचान सत्यापन", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "आपके सभी खाते की जानकारी को स्थायी रूप से मंच से हटा दिया जाएगा और उसे वापस नहीं लिया जा सकता है. क्या आप हटाना चाहते हैं?", + "监控": "वरान", + "视频日志": "वीडियो लॉग", + "开门器": "द्वार खोलने वाला", + "面容开锁": "चेहरा खोलता है", + "开门方向设置": "ओपनिंग डायरेक्शन सेट", + "电机功率设置": "मोटर पावर सेटिंग", + "开锁时是否需联网": "यदि अनलॉकिंग के दौरान इंटरनेट की आवश्यकता होती है", + "选择要加入分组的锁": "इस समूह में जोड़ने हेतु लॉक चुनें", + "锁数量": "लॉक राशि", + "小米IOT平台": "ज़ियाओमी आईओटी मंच", + "面容开锁设置": "चेहरा सेट खोलता है", + "感应距离": "संवेदन दूरी", + "防误开": "गलत उद्घाटन रोकें", + "防误开已关闭,关门后仍可使用面容开锁": "दरवाजा बंद करने के बाद, गलत बोलने से रोकने के लिए बंद किया गया है, अभी भी चेहरा अनलॉक का उपयोग कर सकते हैं", + "添加和使用面容开锁时": "अनलॉकिंग करते समय चेहरे को जोड़ें और उपयोग करें", + "添加和使用面容开锁时提示": "\n1, कृपया दरवाजा ऑपरेशन के सामने एक व्यक्ति को रखने का प्रयास करें;\n2, कृपया दरवाज़े के ताला के सामने करीब 0.5~0.8 मीटर की दूरी पर खड़े रहें, दरवाज़ा बंद का सामना करना पड़ता है;\n3. कृपया अपने चेहरे को अबाधित और अपने चेहरे की विशेषताओं का पर्दाफाश करें;\n4. जब चेहरा पहचान असामान्य हो तो आप मैन्युअल रूप से चेहरा पहचान पुनः प्रारंभ करने के लिए डिजिटल कुंजीपटल पर किसी भी कुंजी को छू सकते हैं।", + "秒": "रों", + "请根据门锁实际情况,请谨慎选择电机功率:": "कृपया दरवाज़े के लॉक की वास्तविक स्थिति के अनुसार मोटर शक्ति को सावधानीपूर्वक चुनें:", + "小功率:": "मिनिवाट:", + "耗电少": "कम बिजली की खपत", + "大功率": "शक्तिशाली/शक्तिशाली", + "大功率提示": "यदि ताला खोलने पर लॉक जीभ को सामान्य रूप से रिट्रेक्ट नहीं किया जा सकता है, या उसे खोलने की जरूरत है।\nस्वर्ग और पृथ्वी हुक, यह उच्च शक्ति का चयन करने की सिफारिश की है इस समय बिजली की खपत होगी।\nबढ़ना।", + "开门方向设置提示": "कृपया अपने घर का दरवाजा खोलने के लिए दिशा का चयन करें (यदि आप गलत दिशा चुनते हैं, तो आप सही ढंग से दरवाजा खोलने और बंद करने में सक्षम नहीं होंगे):", + "左开": "बाएं खोलें", + "右开": "दायाँ खोलें", + "判断方法:": "।", + "判断方法内容": "आदमी घर के बाहर खड़ा था, प्रवेश द्वार की ओर।\nअगर दरवाजे का काज या शाफ्ट बाईं ओर है, तो दरवाजा खुला रहता है;\nअगर उसका काज या शाफ्ट दायीं तरफ है तो दरवाज़ा सही खुला है।\nयदि सेटिंग गलत है, तो वह दरवाजे को ठीक से नहीं खोलेगा और बंद कर देगा।\nस्थापना या रखरखाव कर्मियों द्वारा संचालित होने की सिफारिश की", + "录像时段": "वीडियो स्लॉट", + "密码": "पासवर्ड", + "卡": "पत्ते", + "指纹": "फ़िंगरप्रिंट", + "人脸": "दुमुँहा", + "配件商城": "ताला मॉल", + "公司名称": "कंपनी का नाम", + "请输入公司名字": "कंपनी का नाम दर्ज करें", + "提示": "परोक्ष संकेत", + "是否删除?": "क्या हटाना है?", + "员工信息": "कर्मचारी सूचना", + "员工": "स्टाफ़", + "打卡方式无效": "अनुपलब्ध", + "中国": "चढ़नी", + "选择钥匙": "ekey चुनें", + "编辑": "संपादित करें", + "无": "नहीं", + "有": "हाँ", + "请输入姓名": "कृपया कोई नाम भरें", + "获取人脸": "चेहरे हो रही है", + "选择密码": "पासकोड चुनें", + "选择卡": "कार्ड चुनें", + "选择指纹": "फिंगरप्रिंट चुनें", + "选择人脸": "चेहरे का चयन करें", + "员工是否有人脸": "क्या कर्मचारी का चेहरा है", + "同时删除员工钥匙": "उसकी/उसकी ekey हटाएँ", + "删除": "हटाना", + "确定要删除员工吗?": "इस कर्मचारी को हटाएं", + "月统计": "मासिक आंकड़े", + "迟到": "देर से", + "早退": "जल्दी छोड़ो", + "未打卡": "कोई रिकॉर्ड नहीं", + "钥匙将在": "इस ekey में समाप्त हो जाएगा", + "天后失效": "दिन", + "电量更新时间:": "बैटरी अद्यतन समयः", + "新增配件": "जोड़ें…", + "钥匙不可用": "कुंजी उपलब्ध नहीं है", + "正在开锁中...": "अनलॉक करना…", + "你的钥匙": "तुम्हारी कुंजी", + "常开模式启动!长按闭锁": "ओपन मोड शुरू! लॉक करने के लिए लंबे प्रेस", + "演示模式": "डेमो मोड", + "请先同意用户协议及隐私政策": "कृपया पहले उपयोगकर्ता अनुबंध और गोपनीयता नीति से सहमत हों।", + "用户协议": "उपयोगकर्ता शर्तें", + "隐私政策": "गोपनीयता नीति", + "注册成功": "पंजीकरण सफल हुआ", + "你所在的": "आप अंदर हैं", + "手机号": "दूरभाष क्रमांक", + "忘记密码": "पासवर्ड भूल गए", + "重置成功": "सफलता रीसेट करें", + "确定要退出吗?": "बाहर हों?", + "功能暂未开放": "फंक्शन अभी खुला नहीं है", + "设置成功": "सेट अप सफल", + "删除成功": "मिटाना सफल", + "单次": "भूतपूर्व", + "永久": "स्थायी", + "限时": "नियतकालिक", + "自定义": "रिवाज", + "清空码": "काट देना", + "循环": "आवर्ती", + "工作日": "कार्य दिवस", + "每日": "दैनिक", + "周末": "सप्ताहांत", + "确定要删除吗?": "मिटाएँ?", + "该锁的密码都将被删除": "इस लॉक के लिए सभी पासकोड हटा दिए जाएंगे।", + "已过期": "अमान्य", + "该锁的电子钥匙都将被删除": "इस लॉक के लिए सभी ईकियों को हटा दिया जाएगा।", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "इस Ekey से जुड़ा सभी ई-कुंजियों को मिटाएँ. यह चरण पूर्ववत नहीं किया जा सकता!", + "删除钥匙会在用户APP连网后生效": "Ekey तब डिलीट हो जाएगा जब उपयोगकर्ता का एप किसी नेटवर्क से जुड़ जाएगा।", + "有效时间": "प्रभावी समय", + "接收者": "प्राप्त करने वाला", + "仅管理自己创建的用户": "केवल अपने उपयोगकर्ताओं को प्रबंधित करें", + "远程开锁": "रिमोट अनलॉक", + "请输入钥匙名称": "कृपया कुंजी नाम भरें", + "修改成功": "सफल परिवर्धित करें", + "冻结": "फ्रीज", + "解除冻结": "गरमाहट", + "授权": "को अधिकृत", + "取消授权": "प्राधिकृत करना", + "同时解冻其发送的钥匙": "इस उपयोगकर्ता द्वारा जारी किए गए सभी ईकियों को पिघलना", + "会在用户APP连网后生效": "उपयोगकर्ता का ऐप किसी नेटवर्क से कनेक्ट होने पर इस EKI को थ्रेड किया जाएगा।", + "同时冻结其发送的钥匙": "इस उपयोगकर्ता द्वारा जारी किए गए सभी ईकियों को फ्रीज करें।", + "冻结会在用户APP连网后生效": "इस EKI को फ्रोज़न किया जाएगा जब उपयोगकर्ता किसी नेटवर्क से कनेक्ट होगा।", + "取消授权会在用户APP连网后生效": "उपयोगकर्ता की ऐप नेटवर्क से कनेक्ट होने पर उपयोगकर्ता उसकी अनुमति खो देगा।", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "प्राधिकृत उपयोक्ता की अनुमति करीब-करीब वही है जैसे कि लॉक मैनेजर (उदा. ईको और पासकोड भेजने की क्षमता)", + "失效时间需晚于生效时间": "समाप्ति समय प्रभावी समय से बाद का होना चाहिए", + "生效时间需晚于当前时间": "प्रभावी समय वर्तमान समय से बाद का होना चाहिए।", + "失效日期需晚于生效日期": "समाप्ति तिथि प्रभावी तिथि से बाद में होनी चाहिए।", + "修改有效期": "परिवर्तन काल", + "生效日期": "प्रारंभ तारीख़ @ label: spinbox", + "失效日期": "अंतिम तिथि", + "开锁": "अनलॉक", + "开锁成功": "सफलता अनलॉक", + "请选择锁": "कृपया ताले चुनें", + "请选择接收者": "कृपया रिसीवर का चयन करें", + "请选择有效期": "कृपया वैधता अवधि चुनें", + "请选择发送方式": "कृपया भेजने की विधि का चयन करें", + "请选择结束时间": "कृपया अंतिम समय चुनें", + "完成": "पूर्ण", + "有效日": "चक्र पर", + "发送成功": "सफलता भेजें", + "请选择开始时间": "कृपया प्रारंभ समय चुनें", + "选择用户": "प्राप्तकर्ता चुनें", + "已选中": "चुनें…", + "确定": "निसन्देह", + "请选择要发送的锁": "कृपया ताले चुनें", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "वास्तविक नाम प्रमाणीकरण फेस करें: उपयोगकर्ता द्वारा फ़ोन ऐप को अनलॉक करने से पहले उसके चेहरे को सत्यापित करने की आवश्यकता को संदर्भित करता है, और सत्यापन अनलॉक किया जा सकता है।", + "分享": "शेयर", + "请输入接收者账号": "कृपया रिसीवर खाता दर्ज करें।", + "接收者号码未注册,请重新发送": "रिसीवर संख्या पंजीकृत नहीं है, कृपया पुनः भेजें।", + "是否发送电子钥匙给未注册账号": "क्या आप एक नए खाते में Ekey भेजना चाहते हैं", + "取消": "रद्द करना", + "标记成功": "निशान सफलता", + "微信好友": "हम दोस्त हैं", + "短信": "एसएमएस", + "邮件": "ईमेल", + "更多": "अधिक", + "您好,您的电子钥匙生成成功": "हैलो, आपकी इलेक्ट्रॉनिक कुंजी सफलतापूर्वक उत्पन्न होती है", + "生效时间不能小于当前时间": "प्रभावी समय वर्तमान समय से कम नहीं हो सकता।", + "结束时间不能小于当前时间": "अंतिम समय वर्तमान समय से कम नहीं हो सकता", + "是否为管理员": "क्या यह एक व्यवस्थापक है", + "已连接到锁,请将卡靠近门锁的读卡区": "जुड़े हुए। कार्ड रीडर के खिलाफ कार्ड रखें।", + "尝试连接设备...": "लॉक के साथ कनेक्ट करना कृपया प्रतीक्षा करें…", + "地理位置": "भौगोलिक स्थिति", + "检查以确保以下地址是正确的": "सुनिश्चित करें कि निम्न पता सही है", + "地图加载中,请稍候。。": "नक्शा लोड हो रहा है, कृपया प्रतीक्षा करें…", + "跳过": "छोड़ें", + "还未获取到位置信息哦,请耐心等待一下!": "स्थान की जानकारी अभी तक प्राप्त नहीं हुई है, कृपया धैर्य से प्रतीक्षा करें!", + "请填写信息": "कृपया जानकारी भरें", + "有效期": "विधिमान्यता अवधि", + "生效时间": "आरंभ समय", + "失效时间": "अंत समय", + "上传成功": "सफलतापूर्वक अपलोड किया गया", + "未生效": "निष्क्रिय", + "已生效": "प्रभावी", + "指纹详情": "फिंगरप्रिंट जानकारी", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "आपको अपनी अंगुली सेंसर पर कई बार डालनी होगी। कृपया संकेतों का पालन करें…", + "开始添加": "प्रारंभ", + "请将您的手指按下": "सेंसर पर अपनी उंगली रखें", + "根据提示,抬起手指后再进行下一次指纹采集": "संकेतों का पालन करें… आपको अगले रिकॉर्ड के लिए अपनी उंगली को सेंसर पर निकालने और जगह देने की आवश्यकता होगी।", + "添加成功": "जोड़ें सफल", + "更新成功": "सफलता अद्यतन करें", + "搜索": "खोज", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "रीसेट करने के बाद, लॉक का कार्ड हटा दिया जाएगा, क्या आप रीसेट करना चाहते हैं?", + "已失效": "अमान्य", + "卡详情": "कार्ड सूचना", + "请输入": "कृपया यहां दर्ज करें", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "बंद करके, लॉक पूरे दिन अनलॉक रहेगा जब तक कि यह मैन्युअल रूप से लॉक नहीं हो जाता।", + "请输入小于或等于60的数字": "कृपया 60 से कम संख्या दर्ज करें", + "操作成功": "ऑपरेशन सफल", + "管理员密码相同,无需修改": "प्रशासक कूटशब्द समान है और इसमें बदलाव की आवश्यकता नहीं है", + "请输入6-9位数字": "लंबाई में 6 से 9 अंक", + "请输入6-9位管理员密码": "कृपया एक 6 9 अंकों का व्यवस्थापक पासवर्ड दर्ज करें।", + "请输入新的管理员密码": "कृपया नया प्रशासक कूटशब्द डालें", + "未分组": "समूह रहित", + "请输入分组名称": "एक समूह बनाएं", + "创建成功": "सफलता बनाएं", + "设置锁分组成功": "लॉक समूह को सफलता पूर्वक सेट करें", + "电池1电量": "बैटरी 1", + "电池2电量": "बैटरी 2", + "电量更新时间": "बैटरी अद्यतन समय", + "锁电量更新成功": "लॉक पावर अपडेट सफलता", + "您的钥匙未生效": "आपकी चाबी प्रभावी नहीं है", + "您的钥匙已冻结": "आपकी कुंजी जमी जा चुकी है", + "您的钥匙已过期": "आपकी कुंजी की समयसीमा समाप्त हो गई है", + "常开模式开启": "लॉक मार्ग मोड में है", + "超级管理员": "सुपर व्यवस्थापक", + "授权管理员": "व्यवस्थापक बनाओ", + "普通用户": "साधारण उपयोगकर्ता", + "余": "संतुलन", + "天": "दिन", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "सभी जानकारियों को मिटा देने के बाद, क्या आप सचमुच ताला हटाना चाहते हैं?", + "请输入登录密码": "कृपया आवेदन पासवर्ड दर्ज करें।", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "उपकरण को हटाने में विफल, कृपया सुनिश्चित करें कि डिवाइस डिवाइस के पास है, डिवाइस कनेक्ट नहीं है, और डिवाइस चालू है", + "用户无权限": "उपयोगकर्ता की कोई अनुमति नहीं है", + "创建公司后,考勤功能才能使用": "कृपया पहले एक कंपनी बनाएं", + "是否删除钥匙?": "इस ekey हटाएँ?", + "邮箱绑定成功": "ईमेल बाध्यकारी सफलता", + "手机绑定成功": "मोबाइल फोन बाध्यकारी सफलता", + "网络访问失败,请检查网络是否正常": "निवेदन असफल. नेटवर्क अनुपलब्ध है, कृपया अपने डिवाइस को 3 जी/4 जी/वाईफ़ाई से चेक और कनेक्ट करें।", + "清空": "साफ़ करें", + "是否清空?": "साफ़?", + "消息详情": "संदेश सूचना", + "创建时间": "निर्माण समय", + "管理员详情": "प्रशासक विवरण", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "अगर कोई आपको दरवाजा खोलने के लिए मजबूर करता है, तो आप इस कार्ड का उपयोग कर सकते हैं। व्यवस्थापक को अलार्म संदेश भेजा जाएगा। इस सुविधा का उपयोग करने के लिए, कृपया सुनिश्चित करें कि आपका लॉक ऑनलाइन है", + "请不要将胁迫卡用于日常开锁": "कृपया दैनिक उपयोग के लिए मजबूर कार्ड का उपयोग न करें।", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "अगर कोई आपको दरवाजा खोलने के लिए मजबूर करता है, तो आप इस फिंगरप्रिंट का उपयोग कर सकते हैं व्यवस्थापक को अलार्म संदेश भेजा जाएगा। इस सुविधा का उपयोग करने के लिए, कृपया सुनिश्चित करें कि आपका लॉक ऑनलाइन है", + "请不要将胁迫指纹用于日常开锁": "कृपया दैनिक उपयोग के लिए मजबूर फिंगरप्रिंट का उपयोग न करें।", + "创建公司": "कंपनी बनाना", + "公司名称不能超过30个字符": "कंपनी का नाम 30 वर्णों से अधिक नहीं हो सकता।", + "公司名称不能小于6个字符": "कंपनी का नाम 6 वर्णों से कम नहीं हो सकता।", + "WIFI列表": "वाईफाई सूची", + "刷新": "ताज़ा करना", + "手动配网": "मैनुअल वितरण नेटवर्क", + "远距离": "सुदूर फ़ोन वार्ता", + "中距离": "मध्यम दूरी", + "近距离": "कम दूरी", + "锁时间更新成功": "लॉक टाइम अपडेट सफलता", + "锁用户": "उपयोगकर्ताओं को तालाबंद करें", + "请选择常开日期": "कृपया खुली तिथि का चयन करें", + "结束时间不能小于开始时间哦": "समाप्ति समय प्रारंभ समय से कम नहीं हो सकता", + "介绍": "हमारी कहानी", + "个人信息收集清单": "व्यक्तिगत जानकारी संग्रह सूची", + "应用权限说明": "आवेदन अनुमति विवरण", + "第三方信息共享清单": "तृतीय पक्ष सूचना साझाकरण सूची", + "请选择您的位置": "कृपया अपना स्थान चुनें", + "请先选择位置": "कृपया पहले स्थान का चयन करें", + "管理员密码": "व्यवस्थापक पासकोड", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "अगर आपको संशोधित करने की आवश्यकता है, तो कृपया नया व्यवस्थापक पासवर्ड (6 अंक) दर्ज करें, संशोधित करने के लिए ठीक क्लिक करें।", + "修改": "संशोधित", + "网络摄像头": "प्रतिबिम्ब लेने की पेटी", + "重命名": "नाम बदलने", + "分组下的锁将被移到未分组里": "समूह के नीचे ताले समूहबद्ध करने के लिए ले जाया जाएगा।", + "编辑成功": "सफलतापूर्वक संपादित करें", + "厂商": "उत्पादक", + "型号": "आदर्श", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "पासवर्ड उत्पन्न होने के बाद, कृपया उसी दिन 23:59 से पहले सक्रियण के लिए एक बार उपयोग करें, अन्यथा यह 0 बजे के बाद अमान्य होगा। पासवर्ड सक्रिय होने के बाद, इसे असीमित समय का उपयोग वैधता अवधि के भीतर किया जा सकता है.", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "पासवर्ड उत्पन्न होने के बाद, कृपया उसी दिन 23:59 से पहले इसका प्रयोग करें, अन्यथा यह 0 बजे के बाद अमान्य होगा। स्पष्ट कोड का उपयोग आज 0 बजे से पहले उत्पन्न सभी पासवर्ड को साफ़ करने के लिए किया जाता है।", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "पासवर्ड उत्पन्न होने के बाद, कृपया उसी दिन 23:59 से पहले इसका प्रयोग करें, अन्यथा यह 0 बजे के बाद अमान्य होगा।", + "清空密码底部提示": "पासवर्ड खाली होने के दिन 23:59 तक मान्य है।\nखाली सामग्री 1: दिन के 0:00 से पहले पैदा होने वाले सभी पासवर्ड (दिन के 0:00 के बाद पैदा होने वाले पासवर्ड पासवर्ड साफ़ करने से प्रभावित नहीं होते और ये इस्तेमाल जारी रख सकते हैं)\nरिक्त सामग्री 2: इस्तेमाल के तुरंत बाद साफ पासवर्ड को साफ करें (इस्तेमाल में लाया और इस्तेमाल नहीं किया गया\nसभी पासवर्ड को पूरी तरह से साफ़ करने के लिए, सभी पासवर्ड सुविधा रीसेट करें।", + "相机": "प्रतिबिम्ब लेने की पेटी", + "相册": "फ़ोटो", + "读写": "भंड़ारण", + "定位": "स्थान", + "需要访问相机权限才能拍照上传文件例如头像上传": "कैमरे के लिए फोटो लेने और फ़ाइलों को अपलोड करने के लिए आवश्यक है, जैसे कि प्रोफाइल चित्र अपलोड करना", + "需要访问相机权限才能使用相册图片上传文件上传头像": "एल्बम छवियों का उपयोग करते हुए कैमरा और अवतार फाइल अपलोड करने के लिए कैमरा तक पहुँच जरूरी है", + "需要访问读写权限才能使用本地图片上传头像": "पढ़ने और लिखने की अनुमति के लिए स्थानीय छवियों का उपयोग करके अवतार अपलोड करने की आवश्यकता है", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "एडी कुंजी फलन के प्रयोग हेतु स्थान सूचना का अभिगम आवश्यक है।", + "申请": "आवेदन", + "权限": "अनुमति", + "不允许": "अनुमति नहीं", + "允许": "अनुमति", + "权限被拒绝": "अनुमति नहीं मिली", + "请手动在系统设置中开启": "कृपया सिस्टम सेटिंग में इसे हस्तचालित सक्षम करें", + "权限以继续使用应用": "अनुप्रयोग का प्रयोग जारी रखने के लिए अनुमति.", + "去设置": "इसे स्थापित करें", + "当前网络": "वर्तमान नेटवर्क", + "位置信息": "स्थान की जानकारी", + "请输入wifi名称": "कृपया वाईफाई नाम दर्ज करें।", + "虹膜": "परितारिका", + "手掌": "जय", + "商城": "शापिंग सेन्टर", + "我的": "मेरे", + "微信公众号推送": "Wechat सार्वजनिक खाते", + "蓝牙": "ब्लूटूथ", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "add key फ़ंक्शन की लोकेशन जानकारी का उपयोग करने के लिए ब्लूटूथ अनुमतियों तक पहुंच की आवश्यकता है।", + "请输入Email": "अपना ईमेल दर्ज करें", + "请输入手机号": "अपना दूरभाष क्रमांक दर्ज करें", + "家人到家": "परिवार के सदस्य घर पहुंचे", + "添加家人": "परिवार के सदस्य जोड़ें", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "यदि लॉक इंटरनेट से नहीं जुड़ा हुआ है, तो पासकोड, कार्ड, फिंगरप्रिंट, और अन्य द्वार खोलने की विधियों के लिए अनुस्मारक को समय पर नहीं भेजा जा सकता है।", + "消息提醒": "अनुस्मारक", + "开门通知": "आरंभिक सूचना", + "N天未开门": "दरवाजा खोलने के बिना N दिन", + "门未关好": "दरवाजा बंद नहीं है", + "防拆报警": "छेड़छाड़ अलार्म", + "低电量提醒": "बैटरी कम है", + "胁迫开门": "मजबूर दरवाजा खोलने", + "有人按门铃": "कोई घंटी बजती है", + "有人出现在门口": "कोई दरवाजे पर दिखाई देता है", + "提醒方式": "अनुस्मारक प्रणाली", + "开门方式": "दरवाजा खोलने विधि", + "请选择": "कृपया चयन करें", + "家人": "परिवार का सदस्य", + "保存": "बचाना", + "APP推送": "ऐप पुश", + "管理员": "व्यवस्थापक", + "未启用": "सक्षम नहीं", + "已启用": "सक्रिय किया", + "省电模式": "बिजली की बचत अवस्था", + "逗留抓拍模式": "रहने का कब्जा मोड", + "实时监控模式": "रीयल-टाइम मॉनिटरिंग मोड", + "自定义模式": "कस्टम मोड", + "猫眼设置": "बिल्ली नेत्र सेटिंग", + "猫眼工作模式": "बिल्ली नेत्र काम मोड", + "自动亮屏": "स्वचालित उज्ज्वल स्क्रीन", + "亮屏持续时间": "समय पर स्क्रीन", + "逗留警告": "चेतावनी रहें", + "异常警告": "असामान्य चेतावनी", + "短信提醒": "एसएमएस", + "邮件提醒": "ईमेल", + "N天未开门提醒": "दरवाजा खोलने के बिना N दिन", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "अगर कोई आपको लॉक खोलने के लिए मजबूर करता है, तो आप इस फिंगरप्रिंट का उपयोग कर सकते हैं। व्यवस्थापक को अलार्म संदेश भेजा जाएगा। इस सुविधा का उपयोग करने के लिए, कृपया सुनिश्चित करें कि आपका लॉक ऑनलाइन है", + "胁迫指纹": "मजबूर फिंगरप्रिंट", + "指纹列表": "फ़िंगरप्रिंट सूची", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "निर्धारित समय के बाद, यदि लॉक नहीं खोला जाता है, सिस्टम नामित प्राप्तकर्ता को एक अनुस्मारक संदेश भेजेगा. इस फंक्शन को लॉक को इंटरनेट से कनेक्ट करने की जरूरत है.", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "रिमाइंडर को सक्षम करने के बाद, जब लॉक बैटरी 20%, 10% और 5% से कम हो, तो सिस्टम नामित प्राप्तकर्ता को एक अनुस्मारक संदेश भेज देगा।", + "未开门时间": "दरवाजा खोलने के बिना दिन", + "添加和使用面容开锁时:": "अनलॉक करते समय चेहरे को जोड़ें और उपयोग करें:", + "关锁": "बंद ताला", + "功能": "समारोह", + "配件": "भाग", + "云存": "बादल भंडारण", + "本地": "यह इलाके", + "3天滚动储存": "3 दिन रोलिंग स्टोरेज", + "去升级": "अभी अपग्रेड करें", + "下载列表": "डाउनलोड सूची", + "已下载": "डाउनलोडेड", + "全部视频": "सभी वीडियो", + "已为本设备免费提供3大滚动视频储存服务": "इस उपकरण के लिए तीन स्क्रॉलिंग वीडियो भंडारण सेवाएं निःशुल्क प्रदान की गई हैं।", + "视频播放": "वीडियो प्लेबैक", + "全选": "सब", + "请选择要删除的视频": "कृपया उस वीडियो का चयन करें जिसे आप हटाना चाहते हैं।", + "请选择要下载的视频": "कृपया उस वीडियो का चयन करें जिसे आप डाउनलोड करना चाहते हैं।", + "欢迎使用": "उपयोग में आपका स्वागत है", + "用户协议和隐私政策概要": "उपयोगकर्ता समझौते और गोपनीयता नीति का सारांश", + "协议概要": "प्रोटोकॉल सारांश", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "इस एप्लिकेशन का उपयोग करने के लिए धन्यवाद हम आपकी व्यक्तिगत जानकारी और गोपनीयता संरक्षण के लिए बहुत महत्व देते हैं। इस उत्पाद का उपयोग करने से पहले, कृपया इसे ध्यानपूर्वक पढ़ें।", + "《用户协议》": "उपयोगकर्ता शर्तें", + "和": "तथा", + "《隐私政策》": "\"गोपनीयता नीति\"", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "की पूरी सामग्री। \"सहमत\" पर क्लिक करके, आप सहमत हैं और सभी शर्तों को स्वीकार करते हैं यदि आप सहमत नहीं होने का चयन करते हैं, तो आप हमारे उत्पादों और सेवाओं का उपयोग नहीं कर सकेंगे और आवेदन से बाहर निकल जाएंगे।", + "不同意": "असहमत", + "同意": "मेल मिलाप से रहना", + "该功能是高级功能,请开通后再使用": "यह उन्नत फ़ंक्शन है कृपया इसे पहले सक्षम करें.", + "常用程序": "आम कार्यक्रम", + "该锁已被重置": "लॉक रीसेट कर दिया गया है", + "需要访问读写权限才能使用手动升级固件": "फर्मवेयर को मैन्युअल रूप से अपग्रेड करने के लिए पढ़ने और लिखने की अनुमति की आवश्यकता है", + "错误D固件,请选择正确的文件": "गलत फर्मवेयर, कृपया सही फ़ाइल चुनें", + "非SYD固件,请选择正确的文件": "गैर SYD फर्मवेयर, कृपया सही फ़ाइल का चयन करें", + "文件校验失败 0x01": "फ़ाइल सत्यापन 0x01 में विफल रहा", + "解析元数据失败,请选择正确的文件": "मेटाडेटा की व्याख्या करने में विफल, कृपया सही फ़ाइल चुनें", + "文件校验失败 0x02": "फ़ाइल सत्यापन विफल 0x02", + "文件校验失败 0x03": "फ़ाइल सत्यापन 0x03 में विफल रहा", + "固件升级完成": "फर्मवेयर अद्यतन पूर्ण", + "记录": "अभिलेख", + "开通高级功能后才可以对锁进行管理": "कृपया ताले का प्रबंधन करने के लिए पहले उन्नत फ़ंक्शन सक्षम करें।", + "去开通": "सक्षम", + "实名认证": "वास्तविक नाम सत्यापन", + "当前剩余数量": "शेष", + "购买": "खरीद", + "实名认证为付费功能,请购买后再使用": "वास्तविक नाम सत्यापन एक पेड फंक्शन है, कृपया इसे खरीदने के बाद प्रयोग करें", + "密码不一致哦": "पासवर्ड असंगत है", + "退出添加": "जोड़ना छोड़ देना", + "管理员已满": "व्यवस्थापक पूर्ण", + "用户已满": "उपयोगकर्ता पूर्ण है", + "锁上面添加指纹已满": "लॉक पर फिंगरप्रिंट जोड़ें पूर्ण है।", + "指纹已存在": "फिंगरप्रिंट पहले से मौजूद है।", + "锁上面添加人脸已满": "जोड़ चेहरे ऊपर ताला भरा है।", + "人脸已存在": "चेहरा पहले से मौजूद है", + "锁上面添加卡已满": "ऐड कार्ड से ऊपर लॉक भरा हुआ है।", + "卡已存在": "कार्ड पहले से मौजूद है", + "锁上面添加密码已满": "पासवर्ड जोड़ने से ऊपर लॉक पूर्ण है।", + "密码已存在": "एक समान पासकोड पहले से मौजूद है। कृपया कोई अन्य चुनें", + "请输入密码": "कृपया पासवर्ड दर्ज करें", + "暂无密码,无需重置": "कोई पासवर्ड नहीं, रीसेट करने की कोई ज़रूरत नहीं है", + "真实姓名": "वास्तविक नाम", + "身份证号": "आईडी संख्या", + "请输入真实姓名": "कृपया अपना वास्तविक नाम दर्ज करें", + "请输入身份证号": "कृपया अपना आईडी नंबर दर्ज करें", + "请输入身份证号和真实姓名": "कृपया अपना आईडी नंबर और वास्तविक नाम दर्ज करें।", + "点击返回设备配对": "डिवाइस युग्मन पर वापस टैप करें", + "无法连接?尝试升级": "जुड़ नहीं सकता है? उन्नयन का प्रयास", + "固件升级提示": "फर्मवेयर अद्यतन प्राम्प्ट", + "请先获取固件文件到手机本地,再选择升级": "कृपया फ़र्मवेयर फ़ाइल को पहले स्थानीय फ़ोन में प्राप्त करें, और फिर अपग्रेड का चयन करें", + "固件升级中": "फ़र्मवेयर को अपग्रेड किया जा रहा है", + "取消升级": "अद्यतन निरस्त करें", + "固件传输中": "मार्गस्थ फर्मवेयर", + "关闭": "बंद करें", + "传输中'": "रास्ते में", + "操作记录": "अभिलेख", + "修改姓名": "नाम संपादित करें", + "传输中": "रास्ते में", + "发送人": "जारीकर्ता", + "发送时间": "समय जारी", + "钥匙详情": "ईकी जानकारी", + "姓名": "गाली", + "发送": "भेजना", + "请确认姓名全名和身份证号码是否正确": "कृपया पुष्टि करें कि पूर्ण नाम और आईडी नंबर सही हैं।", + "传输期间请勿离开当前页面": "हस्तांतरण के दौरान वर्तमान पृष्ठ को छोड़ नहीं है", + "机型": "मॉडल", + "硬件版本": "हार्डवेयर संस्करण", + "固件版本": "फर्मवेयर संस्करण", + "手动升级": "मैनुअल अद्यतन", + "设备连接中...": "उपकरण कनेक्ट हो रहा है…", + "未避免异常情况,请在门打开时升级": "अपरिहार्य अपवाद, कृपया दरवाजा खुला है जब उन्नयन।", + "钥匙无效": "यह कुंजी अवैध है", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "लॉक से कनेक्ट करने में असमर्थ. कृपया अपने फोन के ब्ल्यूट को पुनरारंभ करें और फिर से प्रयास करें।", + "如果是全自动锁,请使屏幕变亮": "अगर यह पूरी तरह से स्वचालित लॉक है, तो कृपया स्क्रीन को उज्जवल बनाएं।", + "正在尝试闭锁……": "ताला लगाने की कोशिश। कृपया प्रतीक्षा करें…", + "清空记录": "स्पष्ट अभिलेख", + "是否要删除操作记录?": "अभिलेख मिटाना जारी रखें?", + "被删除的记录不能恢复": "हटाने के बाद रिकॉर्ड पुनर्प्राप्त नहीं किया जा सकता।", + "全部事件": "सभी घटना", + "开锁事件": "घटना अनलॉक करें", + "异常事件": "असामान्य घटना", + "门铃事件": "घंटी घटना", + "视频事件": "वीडियो इवेंट", + "请开启蓝牙": "कृपया ब्लूटूथ चालू करें", + "请选择有效日": "प्रभावी दिन का चयन करें।", + "公司名字长度不能小于 6 ": "कंपनी के नाम की लंबाई 6 से कम नहीं हो सकती", + "已是最新版本": "कोई अद्यतन नहीं", + "一": "एक", + "二": "टू", + "三": "तीन", + "四": "चतुरश्मि", + "五": "पाँच", + "六": "छै", + "日": "रवि", + "新建短信模版": "Creat एसएमएस टेम्पलेट", + "新建邮件模版": "रचनात्मक ईमेल टेम्पलेट", + "自定义短信模版": "एसएमएस टैम्पलेट", + "自定义邮件模版": "ईमेल टैम्पलेट", + "名称": "गाली", + "星星锁": "स्टार लॉक", + "无考勤记录": "कोई रिकॉर्ड नहीं", + "大家干劲十足": "हर कोई समय में आता है", + "工作时长未出炉": "काम का कोई समय नहीं", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "देश/क्षेत्र की पसंद डेटा सुरक्षा को प्रभावित करेगी। आपने वर्तमान में अल्बानिया का चयन किया है, कृपया आगे बढ़ने से पहले पुष्टि करें।", + "确认国家或地区": "देश/क्षेत्र की पुष्टि करें", + "我知道了": "समझ गया", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "महत्वपूर्ण अपडेट प्राप्त करने के लिए, कृपया 'ठीक' पर क्लिक करें और सेटिंग में सूचनाएं सक्षम करें.", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "चालू करने के बाद, आप लॉक पर सेटिंग कुंजी को फिर से ऑन कर सकते हैं, और ऐप के साथ इसे फिर से जोड़ें।", + "已有": "वर्तमान", + "新增": "नया", + "账号格式错误": "खराब फ़ॉर्मेट", + "接收者信息为空": "प्राप्तकर्ता की जानकारी रिक्त है", + "请输入时间(秒)": "कृपया समय (सेकंड) दर्ज करें", + "加载数据失败": "डेटा लोड करने में विफल", + "重试": "पुन: प्रयास करें", + "升级中,是否退出": "अद्यतन के दौरान, चाहे बाहर हों", + "下一步": "सो", + "公寓": "फ्लैट", + "个人用户": "निजी", + "星寓": "सितारा अपार्टमेंट", + "账号": "हिसाब-किताब", + "请输入手机号或email": "फ़ोन नंबर या ईमेल", + "请输入星寓管理员的账号": "कृपया स्टार अपार्टमेंट व्यवस्थापक का खाता दर्ज करें", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "चयनित लॉक के सभी डेटा प्राप्तकर्ता को स्थायी रूप से स्थानांतरित किए जाएंगे।", + "暂不支持跨平台转移,敬请期待": "क्रॉस प्लेटफॉर्म ट्रांसफर समय के लिए समर्थित नहीं है, कृपया इसके लिए तत्पर हैं।", + "移除坏锁": "खराब/खराब लॉक को रद्दी में भेजें", + "转移确认": "अंतरण की पुष्टि करें", + "本次共转移": "इस समय के एक कुल।", + "把智能锁": "स्मार्ट लॉक", + "确认": "ठीक", + "移除成功": "मिटाएँ", + "转移成功": "स्थानांतरण सफलता", + "该已锁被删除": "बंद हटा दिया गया है", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "अधिकृत व्यवस्थापक केवल खुद के द्वारा पासकोड्स, ईकियों और ईकेन्रेडेड का प्रबंधन कर सकता है।", + "添加授权管理员": "व्यवस्थापक बनाएं", + "导出记录": "निर्यात रिकॉर्ड", + "选择时间段": "समय अवधि चुनें", + "导出": "निर्यात", + "批量导出": "खेप निर्यात", + "读取记录": "रिफ्रेश रिकॉर्ड्स", + "设备": "युक्ति", + "消息": "संदेशों", + "智能分析": "बुद्धिमान विश्लेषिकी", + "精准识别设备事件,过滤无效信息": "डिवाइस की घटनाओं की सही पहचान करें और अमान्य जानकारी को फ़िल्टर करें", + "系统设置": "तंत्र विन्यास", + "系统的全局配置在此项内进行设置": "इस मद में सिस्टम का वैश्विक विन्यास सेट है", + "导出操作记录": "निर्यात रिकॉर्ड", + "立即查看": "देखें", + "导出成功": "निर्यातित सफलतापूर्वक", + "发送钥匙": "ekey भेजें", + "进度": "दर", + "失败": "असफल.", + "人脸详情": "चेहरा विवरण", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "जब किसी को दरवाजे के सामने 1.5 मीटर पहले महसूस किया जाता है, तो चेहरा पहचान ताला खोलने की प्रक्रिया स्वतः आरंभ हो जाएगी.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "जब किसी को दरवाजे के सामने 0.8 मीटर के बारे में महसूस किया जाता है, चेहरा पहचान ताला खोलने स्वचालित रूप से शुरू हो जाएगा.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "जब किसी को दरवाजे के सामने 0.5 मीटर की दूरी पर महसूस होता है, तो चेहरा पहचान ताला खोलना स्वचालित रूप से शुरू हो जाएगा।", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "संवेदन दूरी को बंद कर दिया गया है, आपको फेस मान्यता को अनलॉक करने के लिए कुंजीपटल पर किसी भी कुंजी को हस्तचालित स्पर्श करने की आवश्यकता है।", + "防误开已打开,开锁后": "एंटी-गलती ओपनिंग को चालू किया गया है, और ताला खोलने के बाद भी।", + "秒内不可使用面容开锁": "चेहरा अनलॉकिंग सेकंड के भीतर उपयोग नहीं किया जा सकता।", + "掌静脉": "ताड़ का शिरा", + "添加掌静脉": "हथेली की शिरा जोड़ें", + "胁迫掌静脉": "जबरन हथेली की नस", + "请不要将胁迫掌静脉用于日常开锁": "कृपया दैनिक ताला खोलने के लिए जबरन हथेली की नसों का उपयोग न करें।", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "लॉक से जुड़ा, कृपया स्वाभाविक रूप से अपनी हथेली खोलें, हथेली कैमरे के सामने है।", + "掌静脉详情": "हथेली नस विवरण", + "掌静脉号": "हथेली नस नंबर", + "蓝牙未打开,请到设置里面打开蓝牙": "ब्लूटूथ चालू नहीं है, कृपया ब्लूटूथ को सेटिंग्स में चालू करें।", + "删除用户时,会将用户拥有的钥匙一起删除。": "अगर कोई उपयोगकर्ता उपयोगकर्ता के साथ जुड़े किसी भी ekey हटा दिया जाता है तो भी हटा दिया जाएगा।", + "配置网络": "नेटवर्क कॉन्फ़िगर करें", + "你好": "नमस्ते", + "成功": "राधिका", + "类型选择": "प्रकार का चयन करें", + "请选择要使用哪种类型": "कृपया चुनें कि किस प्रकार का उपयोग करना है", + "系统邮件(推荐)": "सिस्टम ईमेल (अनुशंसित)", + "系统短信(推荐)": "सिस्टम एसएमएस (अनुशंसित)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "ईमेल इस ऐप से भेजा जाएगा। कृपया पहले ईमेल पैकेज खरीदें।", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "इस ऐप से एसएमएस भेजा जाएगा। कृपया पहले ईमेल पैकेज खरीदें।", + "个人邮件": "व्यक्तिगत ईमेल", + "个人短信": "निजी एसएमएस", + "邮件将从你的个人邮箱发给用户": "ईमेल आपके व्यक्तिगत ईमेल खाते से भेजा जाएगा", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "एसएमएस संदेश आपके व्यक्तिगत फोन नंबर से भेजा जाएगा। आप अपने टेलीकॉम ऑपरेटर को भुगतान करते हैं।", + "为了更好地应用体验,请确定权限": "एक बेहतर आवेदन अनुभव के लिए, कृपया अनुमतियों की पुष्टि करें।", + "您第一次拒绝权限,请确定权限": "आपने पहली बार अनुमति से इनकार कर दिया, कृपया अनुमति की पुष्टि करें।", + "您第二次拒绝权限,请去应用设置开启权限": "आपने दूसरी बार अनुमति नहीं दी है, कृपया अनुमति सक्षम करने के लिए एप्लिकेशन सेटिंग पर जाएं", + "去应用市场": "ऐप स्टोर पर जाएं", + "温馨提示": "गर्म शीघ्र", + "关闭应用": "अनुप्रयोग बंद करें", + "开启微信接收报警消息需要先关注": "अलार्म संदेश प्राप्त करने के लिए WeChat खोलने के लिए, आप का पालन करने की आवश्यकता है", + "微信公众号,请保存二维码并使用微信扫一扫设置": "Wechat सार्वजनिक खाते, QR कोड को बचाने और सेटिंग्स स्कैन करने के लिए WeChat का उपयोग करें।", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "वास्तविक नाम प्रमाणीकरण एक सशुल्क फंक्शन है, कृपया खरीदने और उपयोग के लिए लॉक व्यवस्थापक से संपर्क करें", + "位置权限": "स्थान अनुमति", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "कृपया अपने locatian का उपयोग करने के लिए ऐप अनुदान दें इसका उपयोग केबल लॉक और गेटवे को स्कैन करने के लिए किया जाता है।", + "相机/相册权限": "कैमरा/एल्बम अनुमति", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "कृपया ऐप को भंडारण से फ़ोटो और फ़ाइलों को पढ़ने और लिखने के लिए अनुदान दें।", + "点击选择": "चुनने के लिए क्लिक करें", + "微信": "WeChat", + "朋友圈": "क्षणों", + "QQ": "QQ", + "QQ空间": "क्कज़ोन", + "微博": "वाईबो", + "FaceBook": "फेसबुक", + "链接": "संपर्क", + "今天": "आज", + "密码错误": "अवैध पासवर्ड", + "网络中断": "नेटवर्क रुकावट", + "钥匙不存在": "कुंजी मौजूद नहीं है", + "钥匙过期": "कुंजी की अवधि समाप्त हो गई", + "钥匙已存在": "कुंजी पहले से मौजूद है", + "密码失效": "कूटशब्द अवैध", + "门锁时间异常": "दरवाज़ा बंद समय असामान्य", + "APP(手机)未联网": "एप्लिकेशन (मोबाइल फोन) इंटरनेट से कनेक्ट नहीं है", + "数据不存在": "डेटा मौजूद नहीं है", + "待接收": "पछताए गए", + "已冻结": "जमे हुए", + "已删除": "अपमार्जित", + "未知": "अज्ञात", + "拖动下方滑块完成拼图": "स्लाइडर को सही पोस्टियन पर ड्रैग करें।", + "验证成功": "सत्यापन सफलता", + "验证失败": "प्रमाणीकरण असफल", + "向右拖动滑块填充拼图": "पहेली को भरने के लिए स्लाइडर को दायीं ओर खींचें।", + "请先获取到位置信息哦": "कृपया स्थान की जानकारी पहले प्राप्त करें।", + "请选择国家": "कृपया एक देश चुनें", + "获取锁信息": "लॉक जानकारी प्राप्त करें", + "锁数据异常,请重试": "लॉक डेटा असामान्य है, कृपया पुनः प्रयास करें", + "连接设备中...": "कनेक्ट किया जा रहा उपकरण…", + "把锁": "लट", + "条": "स्ट्रिप", + "封": "सील", + "次": "समय", + "支付成功": "वेतन सफलता", + "查看详情": "विवरण देखें", + "请输入模板名称": "कृपया टैम्प्लेट नाम भरें", + "模版类型": "निदर्शन", + "再返回一次退出": "फिर से बाहर निकलें", + "请先添加锁": "कृपया पहले लॉक जोड़ें।", + "可视对讲": "दृश्य इंटरकॉम", + "详细日志": "विस्तृत लॉग", + "已复制到剪切板": "कॉपी की गई", + "拍照": "तसवीर", + "从相册选择": "एल्बम से चुनें", + "选择问题": "कृपया एक प्रश्न का चयन करें", + "确认长度不足8位": "लंबाई की तुलना में 8 अंकों से कम करें", + "新密码长度不足8位": "नया पासवर्ड लंबाई 8 अंकों से कम है।", + "两次密码不一致": "पासवर्ड मेल नहीं खाता. कृपया पुन: प्रयास करें", + "请点击获取验证码,验证码将发送到": "कृपया एक सत्यापन कोड प्राप्त करें। कोड को भेजा जाएगा।", + "切换": "स्विच", + "验证": "जाँच करना", + "验证成功,账号已删除": "सत्यापन सफल, खाता हटाया गया", + "该密码不是自定义密码,无法修改": "यह कूटशब्द एक कस्टम कूटशब्द नहीं है और रूपांतरित नहीं किया जा सकता है", + "请选择设备要关联哪些姓名": "कृपया चुनें कि कौन से नाम युक्ति के साथ सम्बद्ध होना चाहिए", + "请选择姓名要关联哪些设备": "कृपया चुनें कि कौन सा उपकरण नाम के साथ जुड़ा हुआ है", + "确定要移除所选中的坏锁吗?": "खराब लॉक को मिटाएँ?", + "邮件通知": "ईमेल द्वारा सूचित करें", + "短信通知": "एसएमएस के माध्यम से सूचित करें", + "您好,您的授权管理员生成成功": "हैलो, आपका अधिकृत व्यवस्थापक सफलतापूर्वक उत्पन्न हुआ है", + "请输入接收者姓名": "कृपया यहां दर्ज करें", + "版本更新": "संस्करण अद्यतन", + "下次再说": "अगली बार", + "配网成功": "नेटवर्क वितरण सफलता", + "配网失败": "नेटवर्क वितरण विफल रहा", + "该锁的无线键盘都将被删除": "इस लॉक के लिए सभी वायरलेस कीपैड को हटा दिया जाएगा।", + "实时画面": "समकालीन तस्वीर", + "适合门口较为安全的环境。": "दरवाजे पर अपेक्षाकृत सुरक्षित वातावरण के लिए उपयुक्त", + "仅发生特定事件才录像,并可查看实时画面。": "केवल विशिष्ट घटनाओं को रिकॉर्ड किया जाता है और वास्तविक समय चित्र देखा जा सकता है.", + "一般情况下,满电可使用7-8个月": "सामान्य परिस्थितियों में, पूरी तरह चार्ज होने पर इसका उपयोग 7-8 महीने के लिए किया जा सकता है।", + "有人逗留或发生特定事件才录像,可随时查看": "कोई रह या विशिष्ट घटनाओं को दर्ज करता है, और किसी भी समय देखा जा सकता है।", + "实时画面。": "समकालीन तस्वीर।", + "一般情况下,满电可使用5~6个月。": "सामान्य परिस्थिति में इसका उपयोग पूर्ण चार्ज्ड होने पर 5~6 माह के लिए किया जा सकता है।", + "适合门口人员复杂、较不安全的环境。": "दरवाजे पर जटिल और अपेक्षाकृत असुरक्षित वातावरण के लिए उपयुक्त।", + "有人出现就录像,可随时查看实时画面。": "रिकॉर्ड करें जब कोई दिखाई देता है, और किसी भी समय वास्तविक समय तस्वीर देखें।", + "一般情况下,满电可使用2~4个月。": "सामान्य परिस्थितियों में इसका उपयोग 2~4 माह के लिए किया जा सकता है जब पूरी तरह चार्ज्ड हो.", + "根据您家门口实际情况设置录像和实时画面功能。": "अपने दरवाजे पर वास्तविक स्थिति के अनुसार वीडियो और वास्तविक समय चित्र फ़ंक्शन सेट करें।", + "可使用时长由具体设置决定。": "उपयोग की अवधि विशिष्ट सेटिंग्स द्वारा निर्धारित की जाती है", + "查看": "देखें", + "有人按门铃或发生": "कोई घंटी बजती है या", + "异常事件时": "असामान्य घटना", + "不录像": "कोई वीडियो नहीं", + "有人出现、按门铃": "कोई दिखाई देता है, घंटी बजती है", + "或发生异常事件时": "या एक असामान्य घटना होती है।", + "逗留达到10秒": "10 सेकंड तक रहें", + "约1.5米": "लगभग 1.5 मीटर की दूरी पर", + "随时": "किसी भी समय", + "立即录像": "तुरंत रिकॉर्ड करें", + "录像时机": "वीडियो समय", + "有人出现时录像": "रिकॉर्ड जब कोई प्रकट होता है", + "人体侦测距离": "मानव पहचान दूरी", + "查看实时画面": "वास्तविक समय तस्वीर देखें", + "自定义时间": "कस्टम समय", + "当日": "आज", + "次日": "अगले दिन", + "自定义时段": "कस्टम समय अवधि", + "发生事件时查看": "दृश्य जब घटना घटित होती है", + "实时查看": "वास्तविक समय दृश्य", + "有人在门口出现10秒后开始录像。": "रिकॉर्डिंग से पहले 10 सेकंड के लिए दरवाजे पर कोई दिखाई देता है", + "有人按门铃时立即录像。": "फौरन रिकॉर्ड करें जब कोई घंटी बजती है", + "有人出现在门前1.5米范围时启动录像": "रिकॉर्डिंग शुरू करते हैं जब कोई दरवाजे के सामने 1.5 मीटर के भीतर दिखाई देता है।", + "约0.8米": "लगभग 0.8 मीटर", + "约3.0米": "लगभग 3.0 मीटर", + "添加指纹失败": "ऑपरेशन असफल.", + "项": "मदें", + "播放中": "खेलत", + "下载": "डाउनलोड्स", + "暂无下载内容": "कोई डाउनलोड सामग्री नहीं", + "亮度": "चमक", + "音量": "आयतन", + "快进至": "तेजी से आगे", + "快退至": "वापस करने के लिए", + "暂无视频信息": "कोई वीडियो जानकारी नहीं", + "加载出错": "भारण त्रुटि", + "请单人正对门锁,距离一个成年人手臂长度": "कृपया एक हाथ की लंबाई में अकेले दरवाजे के सामने खड़े हो जाओ", + "(约0.6米)。": "(करीब 0.6 मीटर)", + "保持脸部无遮挡,露出五官。": "अपने चेहरे को अव्यवस्थित रखें और अपने चेहरे की विशेषताएं दिखाएं।", + "准备好了,开始添加": "और जोड़ना शुरू करो", + "正在录入中...": "ध्वन्यांकन…", + "添加人脸失败": "चेहरा जोड़ने में विफल", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "लॉक को रीसेट करने के बाद, लॉक के चेहरे को हटा दिया जाएगा। क्या आप निश्चित रूप से रीसेट करना चाहते हैं?", + "人脸号": "चेहरा संख्या", + "虹膜详情": "आईरिस विवरण", + "虹膜号": "आईरिस नंबर", + "选择设备类型": "युक्ति प्रकार चुनें", + "照明灯具": "प्रकाश जुड़नार", + "电动窗帘": "बिजली पर्दे", + "门窗传感器": "दरवाजा और खिड़की सेंसर", + "传感器": "सेंसर", + "清除数据成功": "डेटा सफलतापूर्वक साफ़ हो गया", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "लॉक इंटरनेट से कनेक्टेड नहीं है, इसलिए पासकोड, कार्ड, फ़िंगरप्रिंट, और द्वार खोलने की अन्य विधियों को वास्तविक समय में अपलोड नहीं किया जा सकता।", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "यदि आप ऐतिहासिक रिकॉर्ड रखने की जरूरत है, तो आप उन्हें निर्यात कर सकते हैं।", + "看不到操作记录,可能原因有": "आपरेशन रिकॉर्ड, संभावित कारण देख नहीं सकते", + "操作记录详情": "ऑपरेशन रिकॉर्ड विवरण", + "操作时间": "ऑपरेशन का समय", + "此模块功能需要锁联网后设置方可生效": "इंटरनेट से जुड़ने के उपरांत इस मॉड्यूल फलन का निर्धारण होना आवश्यक है।", + "用户已存在": "उपयोगकर्ता पहले से मौजूद है", + "钥匙数量已到上限": "कुंजियों की संख्या ऊपरी सीमा तक पहुँच चुकी है।", + "附近没有可用网关": "पास के पास कोई उपलब्ध गेटवे नहीं है", + "正在创建安全连接...": "एक सुरक्षित कनेक्शन बनाया जा रहा है…", + "监视状态下不能发送录音": "मॉनिटरिंग मोड में रिकॉर्डिंग नहीं भेज सकता", + "挂断": "फोन रख देना", + "监视中暂不能开锁": "मॉनिटरिंग के दौरान अनलॉकिंग उपलब्ध नहीं है", + "长按说话": "प्रेस और बोलने के लिए पकड़", + "松开发送": "भेजने के लिए जारी", + "请输入6位数字开锁密码": "कृपया एक 6 अंकों का अनलॉक पासवर्ड दर्ज करें।", + "请输入开锁密码": "कृपया अनलॉक पासवर्ड दर्ज करें", + "接收者在有效期内可以不限次数使用": "प्राप्तकर्ता वैधता अवधि के भीतर असीमित समय के लिए कुंजियों का उपयोग करने में सक्षम हैं.", + "接收者可以使用此App开关锁": "प्राप्तकर्ता इस ऐप द्वारा लॉक/अनलॉक करने में सक्षम हैं", + "单次钥匙有效期为1小时,只能使用一次": "एक बार ekey एक घंटे के लिए वैध है और केवल एक बार उपयोग किया जा सकता है", + "接收者可以在有效期内的固定时间段里,不限次数使用": "प्राप्तकर्ता तय चक्र समय के भीतर असीमित समय के लिए EKS का उपयोग करने में सक्षम हैं.", + "获取模板失败": "टैम्प्लेट पाने में असफल", + "微信通知": "Wechat अधिसूचना", + "系统短信": "सिस्टम एसएमएस", + "系统邮件": "सिस्टम ईमेल", + "模板": "साँचा", + "新建模版": "टैम्पलेट बनाएँ", + "您好,您的密码是": "हैलो, आपका पासवर्ड है", + "密码名字": "पासवर्ड का नाम", + "请输入6-9位密码": "कृपया एक 6 9 अंकों का पासवर्ड दर्ज करें।", + "设置密码": "पासवर्ड सेट करें", + "操作成功,密码为": "सफल रहे. पासकोड है", + "类型:自定义-永久": "प्रकार: मनपसंद स्थायी", + "实时播放": "रीयल-टाइम प्लेबैक", + "点击对讲": "इंटरकॉम पर क्लिक करें", + "长按开锁": "अनलॉक करने के लिए लंबे प्रेस", + "接听失败": "जवाब देने में विफल रहा", + "请在锁设置中开启远程开锁": "कृपया लॉक सेटिंग में रिमोट अनलॉकिंग सक्षम करें", + "接听": "उत्तर", + "截图已保存到相册": "स्क्रीनशॉट को एल्बम में सहेजा गया", + "录屏已保存到相册": "एल्बम में सहेजी गई स्क्रीन रिकॉर्डिंग फ़ाइल", + "添加遥控": "जोड़ें रिमोट", + "已连接到锁,请按遥控": "लॉक से जुड़े, कृपया रिमोट कंट्रोल को दबाएं।", + "遥控号": "सुदूर नियंत्रण संख्या", + "遥控详情": "सुदूर नियंत्रण विवरण", + "照明": "प्रदीप्ति", + "退出演示模式": "डेमो मोड से बाहर निकलें", + "提示:当前界面为展示界面,添加设备后才能继续使用": "टिप: वर्तमान इंटरफेस एक प्रदर्शन इंटरफ़ेस है. डिवाइस को जोड़ने के बाद, आप इसका उपयोग जारी रख सकते हैं।", + "门已上锁": "दरवाजा बंद है", + "您的账号在异地登录,如非本人,请尽快修改密码": "आपका खाता एक नए डिवाइस से लॉगिन करने के लिए उपयोग किया गया है", + "开门成功": "सफलतापूर्वक दरवाजा खोलें", + "开门失败": "दरवाजा खोलने में विफल", + "呼叫提醒": "कॉल रिमाइंडर", + "收到来自": "से प्राप्त किया", + "锁的呼叫": "लॉक कॉल", + "加载数据中": "डाटा लोड किया जा रहा है", + "搜索所有锁类型": "सभी लॉक प्रकारों को खोजें", + "锁电量更新时间": "बैटरी अद्यतन समय लॉक करें", + "1月": "जनवरी", + "2月": "फरवरी", + "3月": "मार्च", + "4月": "एपी", + "5月": "हो सकता है", + "6月": "जून", + "7月": "गुल", + "8月": "Constellation name (optional)", + "9月": "सीप", + "10月": "आक्ट", + "11月": "नव", + "12月": "दिसम्बर", + "热门城市": "गर्म शहरों", + "导出锁数据": "निर्यात लॉक डेटा", + "一键开锁": "एक क्लिक अनलॉक", + "已开通": "खुल गया", + "英文": "अंग्रेज़ी", + "简体中文": "पर", + "繁体中文": "पर", + "法语": "फ़्रैंकैइस", + "俄语": "सांद्रता सांद्रता सांद्रता", + "德语": "काटकर अलग कर देना", + "日语": "सोच।", + "韩语": "सोच।", + "意大利语": "इटालियनो", + "乌克兰语": "टाइप टाइप टाइप", + "葡萄牙语": "पुर्तगाओं", + "西班牙语": "स्पैनिश", + "阿拉伯语": "ए ए सेंटर सेंटर सेंटर सेंटर सेंटर।", + "越南语": "तिवारी पॅटर्न Vi पेंट टी", + "马来语": "बाहास मेलायु", + "荷兰语": "नेडरलैंड्स", + "罗马尼亚语": "रोमन पैन", + "立陶宛语": "लिटूवी हदीन", + "瑞典语": "स्का", + "爱沙尼亚语": "ईस्टी", + "波兰语": "पोल्की", + "斯洛伐克语": "चेपक", + "捷克语": "पुरआपसे", + "希腊语": "मोम मोम निर्देशिकाएँ", + "希伯来语": "।", + "塞尔维亚语": "टाइप टाइप", + "土耳其语": "तुरकी", + "匈牙利语": "माँजू", + "保加利亚语": "टाइप ने वाई", + "哈萨克斯坦语": "और और और और", + "孟加拉语": "कितना पैसा", + "克罗地亚语": "ह्रवत्स्की", + "泰语": "सोच।", + "印度尼西亚语": "बाहसा इंडोनेशिया", + "芬兰语": "सूमी", + "丹麦语": "मूर्ख व्यक्ति", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "रीसेट के बाद, लॉक के मेटाकार्पल नसों को हटा दिया जाएगा। क्या आप निश्चित रूप से रीसेट करना चाहते हैं?", + "在线": "ऑनलाइन", + "离线": "ऑफ़लाइन", + "购买记录": "खरीदारी रिकॉर्ड", + "使用记录": "उपयोगकर्ता रिकॉर्ड", + "失效时间要大于当前时间": "समाप्ति समय वर्तमान समय से अधिक लंबा होना चाहिए", + "修改名字": "नाम संपादित करें", + "时": "घंटा", + "分": "मिनट", + "Amazon Alexa": "अमेज़न एलेक्सा", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "आप अनलॉक करने, लॉक करने और लॉक स्थिति की जांच करने के लिए एलेक्सा का उपयोग कर सकते हैं।", + "支持的国家": "समर्थित देश", + "支持的国家值": "यूएसए, कनाडा, यूके, ऑस्ट्रेलिया, भारत, जर्मनी, जर्मनी, इटली, स्पेन, जापान", + "操作流程": "ऑपरेशन प्रक्रिया", + "操作流程值": "1 स्मार्ट लॉक ऐप के साथ लॉक और गेटवे जोड़ें\n\n2 एप्लिकेशन में लॉक का रिमोट अनलॉकिंग फ़ंक्शन सक्षम करें (यह फ़ंक्शन डिफ़ॉल्ट रूप से बंद है). अगर आपके पास यह विकल्प नहीं है, लॉक एलेक्सा का समर्थन नहीं करता है\n\n3 एलेक्सा के लिए कौशल जोड़ें और उन्हें स्मार्ट लॉक ऐप के खाते और पासवर्ड के साथ अधिकृत करें। प्राधिकरण सफल होने के बाद, आप खाते के अंतर्गत उपकरणों की खोज कर सकते हैं।\n\n4 एलेक्सए ऐप में लॉक का पता लगाएं, वॉयस अनलॉक फ़ंक्शन चालू करें, और भाषा का पासवर्ड सेट करें।\n\n5 लॉक को एलेक्सा के माध्यम से संचालित किया जा सकता है", + "Google Home": "गूगल होम", + "Action name": "क्रिया नाम", + "ScienerSmart": "विज्ञानचतुर", + "支持的语言": "समर्थित भाषाएं", + "英语": "अंग्रेज़ी", + "Google Home操作流程的值": "1. स्मार्ट लॉक ऐप का उपयोग लॉक्स और गेटवे जोड़ने के लिए करें।\n\n2. एप्लिकेशन में लॉक का रिमोट अनलॉकिंग फ़ंक्शन सक्षम करें (यह फ़ंक्शन डिफ़ॉल्ट रूप से बंद है). इस विकल्प के बिना, लॉक Google होम का समर्थन नहीं करता है\n\n3. गूगल होम ऐप को इंस्टॉल करें और ऊपरी बाएं कोने में \"+\" बटन पर क्लिक करें।\n\n4. सेटिंग पृष्ठ पर, \"Google के साथ कार्य करें\" का चयन करें\n\n5. \"ScienerSmart\" की खोज करें और अधिकृत करने के लिए स्मार्ट लॉक ऐप अकाउंट और पासवर्ड का उपयोग करें।", + "密码需至少包含数字/字母/字符中的2种组合": "पासवर्ड में निम्न में से कम से कम 2 में होना चाहिए: संख्याएं, अक्षर, और विशेष वर्ण।", + "已开锁": "अनलॉक करें", + "已闭锁": "यंत्रित", + "两次密码不一致哦": "पासवर्ड असंगत है", + "中功率": "मध्यम शक्ति", + "常规使用": "नियमित उपयोग", + "扫描设备": "स्कैन डिवाइस", + "删除失败,网关可能已经离线,是否强制删除该数据?": "मिटाना असफल. गेटवे ऑफ़लाइन हो सकता है। क्या आप हटाना चाहते हैं डेटा?", + "超级管理员英文": "सुपर व्यवस्थापक", + "授权管理员英文": "व्यवस्थापक बनाओ", + "普通管理员英文": "साधारण उपयोगकर्ता", + "网关设备英文": "गेटवे", + "手机需联网英文": "जरूरत", + "年简称": "हाँ", + "月简称": "हजार", + "日简称": "घ", + "时简称": "ज", + "分简称": "हजार", + "跟随系统": "सिस्टम का पालन करें", + "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "रीसेट के बाद, लॉक के फिंगरप्रिंट को हटा दिया जाएगा। क्या आप इसे रीसेट करना चाहते हैं?", + "通话未接通,已挂断": "कॉल जुड़ा नहीं है, लटका हुआ है", + "通话异常中断": "असामान्य कॉल रुकावट", + "通话连接失败": "कॉल कनेक्शन विफल रहा", + "已挂断": "लटकाना", + "正在说话...": "अब बात कर रहे हो…", + "设备不在线": "यह उपकरण ऑनलाइन नहीं है", + "设备未配网": "यह युक्ति नेटवर्क से कनेक्टेड नहीं है", + "已静音": "ध्वनि को बंद कर दिया गया है।", + "该锁的远程开锁功能未启用": "इस लॉक का रिमोट अनलॉकिंग फ़ंक्शन सक्षम नहीं है", + "下载完成,请到相册查看": "डाउनलोड पूर्ण, कृपया देखने के लिए एल्बम पर जाएं।", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "जब बिल्ली की आँख बिजली की बचत मोड पर सेट किया जाता है, तो निगरानी नहीं की जा सकती. कृपया बिल्ली आंख सेटिंग्स में अन्य मोड पर स्विच करें।", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "रिमोट अनलॉकिंग संभव नहीं है जब बिल्ली की आंख शक्ति बचत मोड पर सेट है. कृपया कैट आई सेटिंग में दूसरे मोड में जाएँ", + "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "रीसेट के बाद, लॉक का रिमोट कंट्रोल हटा दिया जाएगा। क्या आप इसे रीसेट करना चाहते हैं?", + "版本说明": "संस्करण वर्णन", + "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "गेटवे चालू होने के बाद, रीसेट बटन को 5 सेकंड के लिए दबाकर रखें। जब नीला संकेतक हल्का फ्लैश हो, तो अगला क्लिक करें।", + "网关添加成功": "गेटवे सफलतापूर्वक जोड़ा गया" +} \ No newline at end of file diff --git a/lan/lan_hk.json b/lan/lan_hk.json index bd9baa49..5c3b4bb1 100644 --- a/lan/lan_hk.json +++ b/lan/lan_hk.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "重置之後,鎖嘅遙控器將被刪除。 是否要重置它?", "版本说明": "版本說明", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "網關上電之後,長按重置掣5秒鐘。 單擊藍色指示燈閃爍時嘅下一步", - "网关添加成功": "已成功添加網關" + "网关添加成功": "已成功添加網關", + "功能开启后,你将可以通过网关远程开锁。": "啟用該功能之後,你將能夠透過網關遠程解鎖。", + "录屏已保存到相册": "保存到相冊嘅屏幕錄製文件", + "通话未接通,已挂断": "呼叫未接通,掛斷", + "通话异常中断": "異常通話中斷", + "通话连接失败": "呼叫連接失敗", + "已挂断": "收線", + "正在说话...": "現在正在談論...", + "设备不在线": "設備未聯機", + "设备未配网": "設備未連接到網絡", + "已静音": "聲音已關閉", + "该锁的远程开锁功能未启用": "此鎖嘅遠程解鎖功能未啟用", + "下载完成,请到相册查看": "下載完成,請至相冊查看", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "当Cat Eye設置為省電模式時,無法執行監控。 請喺Cat Eye設置中切換到其他模式", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "当Cat Eye設置為省電模式時,無法遠程解鎖。 請喺Cat Eye設置中切換到其他模式" } \ No newline at end of file diff --git a/lan/lan_hr.json b/lan/lan_hr.json index c695eab7..772bf665 100644 --- a/lan/lan_hr.json +++ b/lan/lan_hr.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Nakon resetovanja, daljinski upravljač brave će biti izbrisan. Hoæeš da ga resetuješ?", "版本说明": "Informacije o verziji", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Nakon što se uključi prolaz, pritisnite i zadržite dugme za reset 5 sekundi. Kliknite slijedeći kada svjetlo plavog indikatora bljeska", - "网关添加成功": "Gateway je uspješno dodano" + "网关添加成功": "Gateway je uspješno dodano", + "功能开启后,你将可以通过网关远程开锁。": "Nakon što je funkcija omogućena, moći ćete daljinski otključati putem pristupnika.", + "录屏已保存到相册": "Datoteka snimanja zaslona spremljena u album", + "通话未接通,已挂断": "Poziv nije povezan, prekinuo vezu", + "通话异常中断": "Nenormalan prekid poziva", + "通话连接失败": "Veza poziva nije uspjela", + "已挂断": "Spuštanje slušalice", + "正在说话...": "Razgovaram sada...", + "设备不在线": "Uređaj nije na mreži", + "设备未配网": "Uređaj nije spojen na mrežu", + "已静音": "Zvuk je isključen", + "该锁的远程开锁功能未启用": "Funkcija daljinskog otključavanja ove brave nije omogućena", + "下载完成,请到相册查看": "Preuzimanje je završeno, idite na album za pregled", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Kada je Cat Eye postavljen na način rada za uštedu energije, nadzor se ne može izvršiti. Prebacite se na druge načine rada u postavkama Cat Eye", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Daljinsko otključavanje nije moguće kada je Cat Eye postavljen na način rada za uštedu energije. Prebacite se na drugi način rada u postavkama Cat Eye" } \ No newline at end of file diff --git a/lan/lan_hu.json b/lan/lan_hu.json index ed032eed..d93cdbfa 100644 --- a/lan/lan_hu.json +++ b/lan/lan_hu.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "A reset után a zár távirányítója törlődik. Szeretné visszaállítani?", "版本说明": "Versió leírás", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Az átjáró bekapcsolása után 5 másodpercig nyomja meg a reset gombot. Kattintson a következő gombra, amikor a kék jelző fény villog", - "网关添加成功": "Átjáró sikeresen hozzáadott" + "网关添加成功": "Átjáró sikeresen hozzáadott", + "功能开启后,你将可以通过网关远程开锁。": "A funkció engedélyezése után távolról feloldhatja a zárolást az átjárón keresztül.", + "录屏已保存到相册": "Képernyőfelvételi fájl mentése az albumba", + "通话未接通,已挂断": "A hívás nincs csatlakoztatva, letette a telefont", + "通话异常中断": "Rendellenes hívásmegszakítás", + "通话连接失败": "A híváskapcsolat sikertelen", + "已挂断": "Leteszi a telefont", + "正在说话...": "Most beszélgetünk...", + "设备不在线": "A készülék nincs online", + "设备未配网": "A készülék nincs csatlakoztatva a hálózathoz", + "已静音": "A hang ki van kapcsolva", + "该锁的远程开锁功能未启用": "Ennek a zárnak a távoli feloldási funkciója nincs engedélyezve", + "下载完成,请到相册查看": "A letöltés befejeződött, kérjük, menjen az albumra a megtekintéshez", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Ha a Cat Eye energiatakarékos üzemmódba van állítva, a felügyelet nem végezhető el. Kérjük, váltson más módokra a Cat Eye beállításaiban", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "A távoli feloldás nem lehetséges, ha a Cat Eye energiatakarékos üzemmódba van állítva. Kérjük, váltson másik módra a Cat Eye beállításaiban" } \ No newline at end of file diff --git a/lan/lan_id.json b/lan/lan_id.json index c017ce28..21934da7 100644 --- a/lan/lan_id.json +++ b/lan/lan_id.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Setelah reset, remote control kunci akan dihapus. Ingin mengatur ulang?", "版本说明": "Catatan versi", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Setelah gateway dinyalakan, tekan dan tahan tombol Atur ulang selama 5 detik. Klik berikutnya ketika lampu indikator biru berkedip", - "网关添加成功": "Gateway berhasil ditambahkan" + "网关添加成功": "Gateway berhasil ditambahkan", + "功能开启后,你将可以通过网关远程开锁。": "Setelah fungsi diaktifkan, anda akan dapat membuka dari jarak jauh melalui gateway.", + "录屏已保存到相册": "Rekaman layar disimpan ke album", + "通话未接通,已挂断": "Panggilan tidak terhubung, ditutup", + "通话异常中断": "Interupsi panggilan Abnormal", + "通话连接失败": "Koneksi panggilan gagal", + "已挂断": "Tutup teleponnya", + "正在说话...": "Berbicara sekarang …", + "设备不在线": "Perangkat ini tidak online", + "设备未配网": "Alat ini tidak terhubung ke jaringan", + "已静音": "Suara telah dimatikan", + "该锁的远程开锁功能未启用": "Fungsi unlocking jarak jauh dari kunci ini tidak diaktifkan", + "下载完成,请到相册查看": "Download selesai, silakan pergi ke album untuk melihat", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Jika mata kucing disetel ke mode penyimpanan daya, pemantauan tidak dapat dilakukan. Silakan beralih ke mode lain di pengaturan mata kucing", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Membuka kunci jarak jauh tidak mungkin jika mata kucing diatur untuk mode menghemat daya. Silakan beralih ke mode lain di pengaturan mata kucing" } \ No newline at end of file diff --git a/lan/lan_it.json b/lan/lan_it.json index c4994c84..a87d0a27 100644 --- a/lan/lan_it.json +++ b/lan/lan_it.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Dopo il reset, il telecomando del lucchetto verrà eliminato. Vuoi resettarlo?", "版本说明": "Versione", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Dopo che il gateway è acceso, premere e tenere premuto il pulsante di reset per 5 secondi. Fai clic su Avanti quando la spia blu lampeggia", - "网关添加成功": "Gateway aggiunto correttamente" + "网关添加成功": "Gateway aggiunto correttamente", + "功能开启后,你将可以通过网关远程开锁。": "Dopo che la funzione è abilitata, sarà possibile sbloccare a distanza attraverso il gateway.", + "录屏已保存到相册": "File di registrazione dello schermo salvato nell’ album", + "通话未接通,已挂断": "Chiamata non connessa, sospesa", + "通话异常中断": "Interruzione anormale di chiamata", + "通话连接失败": "Connessione chiamata fallita", + "已挂断": "In sospeso", + "正在说话...": "Parlando ora...", + "设备不在线": "Il dispositivo non è in linea", + "设备未配网": "Il dispositivo non è connesso alla rete", + "已静音": "Il suono è stato spento", + "该锁的远程开锁功能未启用": "La funzione di sblocco remoto di questa serratura non è abilitata", + "下载完成,请到相册查看": "Scaricamento completato, vai all’ album da visualizzare", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Quando l’occhio gatto è impostato alla modalità risparmio energetico, il monitoraggio non può essere effettuato. Passa ad altre modalità nelle impostazioni degli occhi di gatto", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Lo sblocco a distanza non è possibile quando l’occhio gatto è impostato alla modalità risparmio energetico. Passa a un’altra modalità nelle impostazioni degli occhi di gatto" } \ No newline at end of file diff --git a/lan/lan_ja.json b/lan/lan_ja.json index 3be113b9..6df21bfe 100644 --- a/lan/lan_ja.json +++ b/lan/lan_ja.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "リセット後、ロックのリモコンが削除されます。リセットしますか?", "版本说明": "バージョン説明", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "ゲートウェイの電源がオンになった後、リセットボタンを5秒間押し続けます。青いインジケータライトが点滅したら、 [Next] をクリックします", - "网关添加成功": "ゲートウェイの追加に成功" + "网关添加成功": "ゲートウェイの追加に成功", + "功能开启后,你将可以通过网关远程开锁。": "この機能を有効にすると、ゲートウェイからリモートでロックを解除できるようになります。", + "录屏已保存到相册": "アルバムに保存された画面録画ファイル", + "通话未接通,已挂断": "接続されていない電話を切った", + "通话异常中断": "異常電話中断", + "通话连接失败": "電話接続ができなかった。", + "已挂断": "切る", + "正在说话...": "今話して…", + "设备不在线": "デバイスはオンラインではありません", + "设备未配网": "デバイスがネットワークに接続されていません", + "已静音": "音が消えています", + "该锁的远程开锁功能未启用": "このロックのリモートロック解除機能は有効になっていません", + "下载完成,请到相册查看": "ダウンロードが完了しましたので、アルバムでご覧ください", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "cat eyeが省電力モードに設定されている場合、監視はできません。cat eye設定で他のモードに切り替えてください", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "cat eyeが省電力モードに設定されている場合、リモートロック解除はできません。cat eye設定で別のモードに切り替えてください" } \ No newline at end of file diff --git a/lan/lan_kk.json b/lan/lan_kk.json index d52ad5fa..8f1ed1da 100644 --- a/lan/lan_kk.json +++ b/lan/lan_kk.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Қайта ысырып ысырып тасымалдауын өшіріледі. Оны ысырып тастауды қалайсыз ба?", "版本说明": "Версиятын көрсету", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Шығыс жегілді соң, ысырып тасымалдау батырмасын басып 5 секунд басыңыз. Көк белгісін жарыялды, келесі басыңыз", - "网关添加成功": "Шлюз сәтті қосылды" + "网关添加成功": "Шлюз сәтті қосылды", + "功能开启后,你将可以通过网关远程开锁。": "Функция қосылғаннан кейін шлюз арқылы құлыптан қашықтан ашуға болады·", + "录屏已保存到相册": "Альбомға сақталған экран жазу файлы", + "通话未接通,已挂断": "Қосылмаған, ілінген қоңырау", + "通话异常中断": "Қоңыраудың аномальды үзілуі", + "通话连接失败": "Қоңырау қосылымы жаңылысы", + "已挂断": "Ілініп тұру", + "正在说话...": "Қазір сөйлесу...", + "设备不在线": "Құрылғы онлайн емес", + "设备未配网": "Құрылғы желіге қосылмаған", + "已静音": "Дыбыс өшірілді", + "该锁的远程开锁功能未启用": "Бұғаттаудың қашықтан құлыптан босату функциясы қосылмаған", + "下载完成,请到相册查看": "Жүктеу аяқталды, көру үшін альбомға өтуіңізді сұраймыз", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Cat Eye қуат үнемдейтін режимге орнатылғанда, мониторингті орындау мүмкін емес. Cat Eye параметрлеріндегі басқа режимдерге ауысуыңызды сұраймын", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Cat Eye қуат үнемдейтін режимге орнатылғанда қашықтан құлыптан босату мүмкін емес. Cat Eye параметрлерінде басқа режимге ауысуыңызды сұраймыз" } \ No newline at end of file diff --git a/lan/lan_ko.json b/lan/lan_ko.json index 97bfe25a..f6b736e3 100644 --- a/lan/lan_ko.json +++ b/lan/lan_ko.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "재설정 후 잠금 장치의 리모컨이 삭제됩니다. 당신은 그것을 재설정 하시겠습니까?", "版本说明": "버전 설명", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "게이트웨이의 전원이 켜지면 재설정 버튼을 5 초 동안 누르고 있습니다. 파란색 표시등이 깜박일 때 다음을 클릭하십시오.", - "网关添加成功": "게이트웨이가 성공적으로 추가되었습니다." + "网关添加成功": "게이트웨이가 성공적으로 추가되었습니다.", + "功能开启后,你将可以通过网关远程开锁。": "기능이 활성화된 후에는 게이트웨이를 통해 원격으로 잠금 해제할 수 있습니다.", + "录屏已保存到相册": "화면 녹음 파일이 앨범에 저장되었습니다", + "通话未接通,已挂断": "전화가 연결되지 않았습니다. 끊겼습니다", + "通话异常中断": "비정상적인 통화 중단", + "通话连接失败": "통화 연결 실패", + "已挂断": "끊고 있", + "正在说话...": "지금 이야기하고 …", + "设备不在线": "장치가 온라인 상태가 아닙니다", + "设备未配网": "장치가 네트워크에 연결되어 있지 않습니다", + "已静音": "소리가 꺼졌다", + "该锁的远程开锁功能未启用": "이 잠금의 원격 잠금 해제 기능을 사용할 수 없습니다", + "下载完成,请到相册查看": "다운로드가 완료되었습니다. 보려면 앨범으로 이동하십시오", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Cat Eye 가 절전 모드로 설정되면 모니터링을 수행할 수 없습니다.캣아이 설정에서 다른 모드로 전환해 주세요", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Cat Eye 가 절전 모드로 설정된 경우에는 원격 잠금 해제가 불가능합니다.Cat Eye 설정에서 다른 모드로 전환해 주세요" } \ No newline at end of file diff --git a/lan/lan_lt.json b/lan/lan_lt.json index 57cd60ac..73a83706 100644 --- a/lan/lan_lt.json +++ b/lan/lan_lt.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Po reset, nuotolinis valdymo pultas užraktas bus ištrintas. Ar norite jį atkurti?", "版本说明": "Versijos aprašymas", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Įjungus vartus, 5 sekundes paspauskite ir palaikykite mygtuką \"reset\". Spustelėkite toliau, kai mėlyna indikatoriaus šviesa mirksi", - "网关添加成功": "Vartai sėkmingai pridėta" + "网关添加成功": "Vartai sėkmingai pridėta", + "功能开启后,你将可以通过网关远程开锁。": "Kai funkcija įjungta, galėsite nuotoliniu būdu atrakinti per šliuzą。", + "录屏已保存到相册": "Ekrano įrašymo failas, įrašytas į albumą", + "通话未接通,已挂断": "Skambutis neprijungtas, pakabintas", + "通话异常中断": "Nenormalus skambučio nutraukimas", + "通话连接失败": "Nepavyko prisijungti prie skambučio", + "已挂断": "Pakabinimas", + "正在说话...": "Kalbasi dabar...", + "设备不在线": "Įrenginys nėra prisijungęs", + "设备未配网": "Įrenginys neprijungtas prie tinklo", + "已静音": "Garsas buvo išjungtas", + "该锁的远程开锁功能未启用": "Šio užrakto nuotolinio atrakinimo funkcija neįjungta", + "下载完成,请到相册查看": "Atsisiuntimas baigtas, eikite į albumą, kad peržiūrėtumėte", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Kai \"Cat Eye\" nustatytas energijos taupymo režimas, stebėjimo atlikti negalima. \"Cat Eye\" nustatymuose perjunkite į kitus režimus", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Nuotolinis atrakinimas neįmanomas, kai \"Cat Eye\" nustatytas energijos taupymo režimas. \"Cat Eye\" nustatymuose perjunkite į kitą režimą" } \ No newline at end of file diff --git a/lan/lan_ms.json b/lan/lan_ms.json index a3651e49..75e8bbc9 100644 --- a/lan/lan_ms.json +++ b/lan/lan_ms.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, kawalan jauh kunci akan dipadamkan. Adakah anda mahu menetapkan semula?", "版本说明": "Penerangan versi", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Selepas pintu masuk dihidupkan, tekan dan tahan butang reset selama 5 saat. Klik seterusnya apabila lampu penunjuk biru berkelip", - "网关添加成功": "Get laluan ditambah berjaya" + "网关添加成功": "Get laluan ditambah berjaya", + "功能开启后,你将可以通过网关远程开锁。": "Selepas fungsi didayakan, anda akan dapat membuka kunci dari jauh melalui pintu masuk。", + "录屏已保存到相册": "Rakaman skrin fail disimpan ke album", + "通话未接通,已挂断": "Panggilan tidak disambungkan, ditutup", + "通话异常中断": "Gangguan panggilan yang tidak normal", + "通话连接失败": "Sambungan panggilan gagal", + "已挂断": "Menutup telefon", + "正在说话...": "Bercakap sekarang...", + "设备不在线": "Peranti tidak dalam talian", + "设备未配网": "Peranti tidak disambungkan ke rangkaian", + "已静音": "Bunyi telah dimatikan", + "该锁的远程开锁功能未启用": "Fungsi buka kunci jauh kunci ini tidak didayakan", + "下载完成,请到相册查看": "Muat turun selesai, sila pergi ke album untuk melihat", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Apabila Cat Eye ditetapkan kepada mod penjimatan kuasa, pemantauan tidak boleh dilakukan. Sila tukar kepada mod lain dalam tetapan Cat Eye", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Buka kunci jauh tidak boleh dilakukan apabila Cat Eye ditetapkan kepada mod penjimatan kuasa. Sila tukar kepada mod lain dalam tetapan Cat Eye" } \ No newline at end of file diff --git a/lan/lan_nl.json b/lan/lan_nl.json index fe7280f8..56be2060 100644 --- a/lan/lan_nl.json +++ b/lan/lan_nl.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Na het resetten wordt de afstandsbediening van het slot verwijderd. Wilt u het resetten?", "版本说明": "Versieomschrijving", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Nadat de gateway is ingeschakeld, houdt u de resetknop 5 seconden ingedrukt. Klik op Volgende wanneer het blauwe lampje knippert", - "网关添加成功": "Gateway met succes toegevoegd" + "网关添加成功": "Gateway met succes toegevoegd", + "功能开启后,你将可以通过网关远程开锁。": "Na het inschakelen van de functie kunt u op afstand ontgrendelen via de gateway.", + "录屏已保存到相册": "Scherm opname bestanden worden opgeslagen in albums", + "通话未接通,已挂断": "De telefoon is niet ingeschakeld en hangt", + "通话异常中断": "Buitengewone oproeponderbreking", + "通话连接失败": "Mislukte belverbinding", + "已挂断": "ophangen", + "正在说话...": "Zeg nu …", + "设备不在线": "Het apparaat is niet online", + "设备未配网": "Het apparaat is niet verbonden met het netwerk", + "已静音": "Het geluid is uitgeschakeld", + "该锁的远程开锁功能未启用": "De remote unlock functie van het slot is niet ingeschakeld", + "下载完成,请到相册查看": "De download is voltooid, ga naar het album om het te bekijken", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Wanneer 'kattenoog' is ingesteld op de energiebesparende modus, is monitoring niet mogelijk. Ga naar een andere modus in de kattenoog instellingen", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Wanneer cat eye is ingesteld op de energiebesparende modus, kan deze niet op afstand worden ontgrendeld. Ga naar een andere modus in de kattenoog instellingen" } \ No newline at end of file diff --git a/lan/lan_pl.json b/lan/lan_pl.json index 91216e70..8c958c55 100644 --- a/lan/lan_pl.json +++ b/lan/lan_pl.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Po zresetowaniu zdalne sterowanie zamkiem zostanie usunięte. Czy chcesz go zresetować?", "版本说明": "Wersja", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Po włączeniu bramy naciśnij i przytrzymaj przycisk resetowania przez 5 sekund. Kliknij przycisk Dalej, gdy miga niebieska lampka kontrolna", - "网关添加成功": "Gateway dodany pomyślnie" + "网关添加成功": "Gateway dodany pomyślnie", + "功能开启后,你将可以通过网关远程开锁。": "Po włączeniu tej funkcji będziesz mógł zdalnie odblokować za pośrednictwem bramy。", + "录屏已保存到相册": "Plik nagrania ekranu zapisany w albumie", + "通话未接通,已挂断": "Połączenie nie jest połączone, rozłączone", + "通话异常中断": "Nietypowe przerywanie połączenia", + "通话连接失败": "Połączenie nie powiodło się", + "已挂断": "Rozłączanie się", + "正在说话...": "Mówiąc teraz...", + "设备不在线": "Urządzenie nie jest w trybie online", + "设备未配网": "Urządzenie nie jest podłączone do sieci", + "已静音": "Dźwięk został wyłączony", + "该锁的远程开锁功能未启用": "Funkcja zdalnego odblokowania tego zamka nie jest włączona", + "下载完成,请到相册查看": "Pobieranie zakończone, przejdź do albumu, aby wyświetlić", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Gdy Cat Eye jest ustawiony w trybie oszczędzania energii, nie można przeprowadzić monitorowania. Przełącz się na inne tryby w ustawieniach Cat Eye", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Zdalne odblokowanie nie jest możliwe, gdy Cat Eye jest ustawiony w trybie oszczędzania energii. Przełącz się na inny tryb w ustawieniach Cat Eye" } \ No newline at end of file diff --git a/lan/lan_pt.json b/lan/lan_pt.json index 035ea4c6..9d0d2657 100644 --- a/lan/lan_pt.json +++ b/lan/lan_pt.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Após a reinicialização, o controle remoto do bloqueio será excluído. Você quer redefini-lo?", "版本说明": "Descrição da versão", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Depois que o gateway estiver ligado, pressione e segure o botão de reset por 5 segundos. Clique Próximo quando a luz indicadora azul pisca", - "网关添加成功": "Gateway adicionado com sucesso" + "网关添加成功": "Gateway adicionado com sucesso", + "功能开启后,你将可以通过网关远程开锁。": "Depois que a função for habilitada, você poderá desbloquear remotamente através do gateway。", + "录屏已保存到相册": "Arquivo de gravação de tela salvo no álbum", + "通话未接通,已挂断": "Chamada não conectada, desligada", + "通话异常中断": "Interrupção anormal de chamadas", + "通话连接失败": "Falha na conexão da chamada", + "已挂断": "Desligando", + "正在说话...": "Falando agora...", + "设备不在线": "O dispositivo não está online", + "设备未配网": "O dispositivo não está conectado à rede", + "已静音": "O som foi desligado", + "该锁的远程开锁功能未启用": "A função de desbloqueio remoto desta fechadura não está habilitada", + "下载完成,请到相册查看": "Download concluído, por favor, vá para o álbum para ver", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Quando o Cat Eye está definido para o modo de economia de energia, o monitoramento não pode ser executado. Por favor, mude para outros modos nas configurações do Cat Eye", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "O desbloqueio remoto não é possível quando o Cat Eye está definido para o modo de economia de energia. Por favor, mude para outro modo nas configurações do Cat Eye" } \ No newline at end of file diff --git a/lan/lan_ro.json b/lan/lan_ro.json index 71d132d9..584e33af 100644 --- a/lan/lan_ro.json +++ b/lan/lan_ro.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "După resetare, telecomanda de blocare va fi ştersă. Vrei să-l resetezi?", "版本说明": "Descrierea versiunii", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "După pornirea poarta, apăsați și țineți butonul de resetare timp de 5 secunde. Click Next atunci când lumina indicator albastru lăturare", - "网关添加成功": "Gateway adăugat cu succes" + "网关添加成功": "Gateway adăugat cu succes", + "功能开启后,你将可以通过网关远程开锁。": "După ce funcția este activată, veți putea debloca de la distanță prin gateway。", + "录屏已保存到相册": "Fișier de înregistrare ecran salvat în album", + "通话未接通,已挂断": "Apel neconectat, închis", + "通话异常中断": "Întrerupere anormală a apelului", + "通话连接失败": "Conexiunea la apel a eșuat", + "已挂断": "Închiderea", + "正在说话...": "Vorbind acum...", + "设备不在线": "Dispozitivul nu este online", + "设备未配网": "Dispozitivul nu este conectat la rețea", + "已静音": "Sunetul a fost oprit", + "该锁的远程开锁功能未启用": "Funcția de deblocare de la distanță a acestei încuietori nu este activată", + "下载完成,请到相册查看": "Descărcare finalizată, vă rugăm să accesați albumul pentru a vizualiza", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Când Cat Eye este setat în modul de economisire a energiei, monitorizarea nu poate fi efectuată. Vă rugăm să comutați la alte moduri în setările Cat Eye", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Deblocarea de la distanță nu este posibilă atunci când Cat Eye este setat în modul de economisire a energiei. Vă rugăm să comutați la un alt mod în setările Cat Eye" } \ No newline at end of file diff --git a/lan/lan_ru.json b/lan/lan_ru.json index bd922b54..393a68f7 100644 --- a/lan/lan_ru.json +++ b/lan/lan_ru.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "После сброса пульт дистанционного управления замком будет удален. А вы хотите его сбросить?", "版本说明": "Объяснение версии", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "После включения шлюза нажмите и удерживайте кнопку сброса в течение 5 секунд. Нажмите Далее, когда синий индикатор мигает", - "网关添加成功": "Шлюз успешно добавлен" + "网关添加成功": "Шлюз успешно добавлен", + "功能开启后,你将可以通过网关远程开锁。": "После включения функции вы сможете удаленно открывать шлюз.", + "录屏已保存到相册": "Файл записи экрана сохранен в альбом", + "通话未接通,已挂断": "Звонок не связан, вешаю трубку", + "通话异常中断": "Ненормальное прерывание вызова", + "通话连接失败": "Прервано подключение к телефонной линии", + "已挂断": "- вешаю трубку.", + "正在说话...": "Теперь я говорю...", + "设备不在线": "Устройство не работает", + "设备未配网": "Устройство не подключено к сети", + "已静音": "Звук был выключен", + "该锁的远程开锁功能未启用": "Функция дистанционного разблокирования этого замка не включена", + "下载完成,请到相册查看": "Загрузка завершена, пожалуйста, перейдите на альбом, чтобы посмотреть", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Когда кошачий глаз установлен в режим энергосбережения, мониторинг не может быть выполнен. Переключитесь на другие режимы в настройках кошачьего глаза", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Удаленная разблокировка невозможна, если кошачий глаз установлен в режим энергосбережения. Пожалуйста, переключитесь в другой режим в настройках кошачьего глаза" } \ No newline at end of file diff --git a/lan/lan_sk.json b/lan/lan_sk.json index 905391a9..176aab1b 100644 --- a/lan/lan_sk.json +++ b/lan/lan_sk.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Po resetovaní bude diaľkové ovládanie zámku vymazané. Chcete ho obnoviť?", "版本说明": "Popis verzie", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Po zapnutí brány stlačte a podržte tlačidlo reset 5 sekúnd. Kliknite na ďalšie, keď modrý indikátor svetlo bliká", - "网关添加成功": "Brána úspešne pridaná" + "网关添加成功": "Brána úspešne pridaná", + "功能开启后,你将可以通过网关远程开锁。": "Po aktivácii funkcie budete môcť na diaľku odomknúť cez bránu。", + "录屏已保存到相册": "Nahrávanie obrazovky file uložený do albumu", + "通话未接通,已挂断": "Hovor nie je spojený, zavesený", + "通话异常中断": "Abnormálne prerušenie hovoru", + "通话连接失败": "Pripojenie hovoru zlyhalo", + "已挂断": "Zavesenie", + "正在说话...": "Hovorím teraz...", + "设备不在线": "Zariadenie nie je online", + "设备未配网": "Zariadenie nie je pripojené k sieti", + "已静音": "Zvuk bol vypnutý", + "该锁的远程开锁功能未启用": "Funkcia diaľkového odomykania tohto zámku nie je povolená", + "下载完成,请到相册查看": "Sťahovanie dokončené, prejdite na album view", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Keď je Cat Eye nastavený na režim úspory energie, monitorovanie nie je možné vykonať. Prepnite na iné režimy v nastaveniach Cat Eye", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Diaľkové odomknutie nie je možné, keď je Cat Eye nastavený do režimu úspory energie. Prepnite do iného režimu v nastaveniach Cat Eye" } \ No newline at end of file diff --git a/lan/lan_sr_cyrl.json b/lan/lan_sr_cyrl.json index a93ce7aa..6ddf1a89 100644 --- a/lan/lan_sr_cyrl.json +++ b/lan/lan_sr_cyrl.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Након ресетовања, даљински управљач браве ће бити избрисан. Да ли желите да га ресетујете?", "版本说明": "Опис верзије", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Након што је гатеваи укључен, притисните и држите дугме за ресетовање за 5 секунди. Кликните Следећи када плава лампица трепери", - "网关添加成功": "Гатеваи је успешно додао" + "网关添加成功": "Гатеваи је успешно додао", + "功能开启后,你将可以通过网关远程开锁。": "Након што је функција омогућена, моћи ћете да даљински откључавање преко гатеваи。", + "录屏已保存到相册": "Датотека за снимање екрана сачувана у албуму", + "通话未接通,已挂断": "Позив није повезан, спустио слушалицу", + "通话异常中断": "Ненормалан прекид позива", + "通话连接失败": "Позив веза није успела", + "已挂断": "Спуштање веша", + "正在说话...": "Разговарамо сада ...", + "设备不在线": "Уређај није на мрежи", + "设备未配网": "Уређај није повезан на мрежу", + "已静音": "Звук је искључен", + "该锁的远程开锁功能未启用": "Функција даљинског откључавања ове браве није омогућена", + "下载完成,请到相册查看": "Преузимање завршено, идите на албум да видите", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Када је Цат Еие подешен на режим за уштеду енергије, праћење се не може извршити. Молимо Вас да пређете на друге режиме у подешавањима Цат Еие", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Даљинско откључавање није могуће када је Цат Еие подешен на режим за уштеду енергије. Молимо Вас да пређете на други режим у подешавањима Цат Еие" } \ No newline at end of file diff --git a/lan/lan_sv.json b/lan/lan_sv.json index cc28de40..27a46c37 100644 --- a/lan/lan_sv.json +++ b/lan/lan_sv.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Efter återställd, fjärrkontrollen på låset tas bort. Vill du återställa den?", "版本说明": "Versionsbeskrivning", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "När gateway är aktiverad, tryck på och håll återställningsknappen i 5 sekunder. Klicka Nästa när den blå indikator ljus blinkar", - "网关添加成功": "Gateway lagt till med lyckad" + "网关添加成功": "Gateway lagt till med lyckad", + "功能开启后,你将可以通过网关远程开锁。": "När funktionen är aktiverad kommer du att kunna låsa upp på distans via gatewayen.", + "录屏已保存到相册": "Skärminspelningsfil sparad i album", + "通话未接通,已挂断": "Samtalet är inte anslutet, har lagts på", + "通话异常中断": "Onormalt samtalsavbrott", + "通话连接失败": "Samtalsanslutningen misslyckades", + "已挂断": "Lägger på", + "正在说话...": "Pratar nu...", + "设备不在线": "Enheten är inte online", + "设备未配网": "Enheten är inte ansluten till nätverket", + "已静音": "Ljudet har stängts av", + "该锁的远程开锁功能未启用": "Fjärrupplåsningsfunktionen för detta lås är inte aktiverad", + "下载完成,请到相册查看": "Nedladdningen är klar, gå till albumet för att se", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "När Cat Eye är inställt på energisparläge kan övervakning inte utföras. Växla till andra lägen i Cat Eye-inställningarna", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Fjärrupplåsning är inte möjlig när Cat Eye är inställt på energisparläge. Byt till ett annat läge i Cat Eye-inställningarna" } \ No newline at end of file diff --git a/lan/lan_th.json b/lan/lan_th.json index 72dadd92..77c4451a 100644 --- a/lan/lan_th.json +++ b/lan/lan_th.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "หลังจากรีเซ็ตแล้วรีโมทคอนโทรลของล็อคจะถูกลบออกคุณต้องการรีเซ็ตไหม", "版本说明": "คำอธิบายรุ่น", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "หลังจากเปิดเกตเวย์แล้วให้กดปุ่มรีเซ็ตค้างไว้5วินาทีคลิกถัดไปเมื่อไฟแสดงสถานะสีน้ำเงินกะพริบ", - "网关添加成功": "เพิ่มเกตเวย์เรียบร้อยแล้ว" + "网关添加成功": "เพิ่มเกตเวย์เรียบร้อยแล้ว", + "功能开启后,你将可以通过网关远程开锁。": "หลังจากเปิดใช้งานฟังก์ชั่นแล้วคุณจะสามารถปลดล็อคจากระยะไกลผ่านประตู", + "录屏已保存到相册": "แฟ้มบันทึกการบันทึกหน้าจอไปยังอัลบั้ม", + "通话未接通,已挂断": "โทรไม่ได้เชื่อมต่อวางสาย", + "通话异常中断": "ผิดปกติการโทรขัดจังหวะ", + "通话连接失败": "การเชื่อมต่อสายล้มเหลว", + "已挂断": "วางสายนะ", + "正在说话...": "กำลังคุยอยู่...", + "设备不在线": "อุปกรณ์ไม่ออนไลน์", + "设备未配网": "อุปกรณ์ไม่ได้เชื่อมต่อกับเครือข่าย", + "已静音": "เสียงถูกปิด", + "该锁的远程开锁功能未启用": "ไม่เปิดใช้ฟังก์ชันการปลดล็อคระยะไกลของการล็อคนี้", + "下载完成,请到相册查看": "การดาวน์โหลดเสร็จสมบูรณ์แล้วโปรดไป ที่อัลบั้มเพื่อดู", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "เมื่อตั้งค่าตาแมวให้เป็นโหมดประหยัดพลังงานการตรวจสอบจะไม่สามารถทำงานได้ โปรดเปลี่ยนไปใช้โหมดอื่น ๆ ในการตั้งค่าตาแมว", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "ไม่สามารถปลดล็อคระยะไกลได้เมื่อตั้งค่าดวงตาแมวให้เป็นโหมดประหยัดพลังงาน โปรดเปลี่ยนเป็นโหมดอื่นในการตั้งค่าตาแมว" } \ No newline at end of file diff --git a/lan/lan_tr.json b/lan/lan_tr.json index 224695c1..58d3e84e 100644 --- a/lan/lan_tr.json +++ b/lan/lan_tr.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Sıfırladıktan sonra, kilidin uzaktan kumandası silinecektir. Sıfırlamak ister misin?", "版本说明": "Sürüm açıklaması", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Ağ geçidi açıldıktan sonra sıfırlama düğmesine 5 saniye basılı tutun. Mavi gösterge ışığı yanıp söndüğünde İleri'ye tıklayın", - "网关添加成功": "Ağ geçidi başarıyla eklendi" + "网关添加成功": "Ağ geçidi başarıyla eklendi", + "功能开启后,你将可以通过网关远程开锁。": "İşlev etkinleştirildikten sonra, ağ geçidi üzerinden uzaktan kilit açabileceksiniz。", + "录屏已保存到相册": "Albüme kaydedilen ekran kayıt dosyası", + "通话未接通,已挂断": "Arama bağlı değil, kapatıldı", + "通话异常中断": "Anormal çağrı kesintisi", + "通话连接失败": "Çağrı bağlantısı başarısız oldu", + "已挂断": "Telefonu kapatmak", + "正在说话...": "Şimdi konuşuyoruz...", + "设备不在线": "Cihaz çevrimiçi değil", + "设备未配网": "Cihaz ağa bağlı değil", + "已静音": "Ses kapatıldı", + "该锁的远程开锁功能未启用": "Bu kilidin uzaktan kilit açma işlevi etkin değil", + "下载完成,请到相册查看": "İndirme tamamlandı, görüntülemek için lütfen albüme gidin", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Cat Eye güç tasarrufu moduna ayarlandığında izleme yapılamaz. Lütfen Cat Eye ayarlarında diğer modlara geçin", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Cat Eye güç tasarrufu moduna ayarlandığında uzaktan kilit açma mümkün değildir. Lütfen Cat Eye ayarlarında başka bir moda geçin" } \ No newline at end of file diff --git a/lan/lan_tw.json b/lan/lan_tw.json index 58974b99..eb5482df 100644 --- a/lan/lan_tw.json +++ b/lan/lan_tw.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "重置後,鎖的遙控器將被刪除。 是否要重置它?", "版本说明": "版本說明", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "網關通電後,按住reset按鈕5秒鐘。 當藍色指示燈閃爍時,單擊 「下一步」", - "网关添加成功": "已成功添加網關" + "网关添加成功": "已成功添加網關", + "功能开启后,你将可以通过网关远程开锁。": "啓用該功能後,您可以通過網關遠程解鎖。", + "录屏已保存到相册": "屏幕錄製文件保存到相冊", + "通话未接通,已挂断": "電話未接通,掛了", + "通话异常中断": "異常呼叫中斷", + "通话连接失败": "呼叫連接失敗", + "已挂断": "掛", + "正在说话...": "說現在…", + "设备不在线": "設備未在線", + "设备未配网": "設備未連接到網絡", + "已静音": "聲音已被關掉了", + "该锁的远程开锁功能未启用": "未開啓該鎖的遠程解鎖功能", + "下载完成,请到相册查看": "下載完成,請到相冊查看", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "當“貓眼”設置爲省電模式時,無法進行監控。請在貓眼設置中切換到其他模式", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "當貓眼設置爲省電模式時,無法遠程解鎖。請在貓眼設置中切換到其他模式" } \ No newline at end of file diff --git a/lan/lan_uk.json b/lan/lan_uk.json index 4202223b..46af9456 100644 --- a/lan/lan_uk.json +++ b/lan/lan_uk.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Після скидання пульт дистанційного керування замком буде видалено. Хочете його скинути?", "版本说明": "Опис версії", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Після ввімкнення шлюзу натисніть і утримуйте кнопку скидання протягом 5 секунд. Натисніть «Далі», коли синій індикатор почне блимати", - "网关添加成功": "Шлюз успішно додано" + "网关添加成功": "Шлюз успішно додано", + "功能开启后,你将可以通过网关远程开锁。": "Після ввімкнення функції ви зможете віддалено розблокувати через шлюз。", + "录屏已保存到相册": "Файл запису екрана, збережений в альбомі", + "通话未接通,已挂断": "Дзвінок не підключений, поклав слухавку", + "通话异常中断": "Ненормальне переривання виклику", + "通话连接失败": "Не вдалося з'єднати дзвінок", + "已挂断": "Покласти слухавку", + "正在说话...": "Говорячи зараз...", + "设备不在线": "Пристрій не підключений до мережі", + "设备未配网": "Пристрій не підключений до мережі", + "已静音": "Звук вимкнено", + "该锁的远程开锁功能未启用": "Функція дистанційного розблокування цього замка не ввімкнена", + "下载完成,请到相册查看": "Завантаження завершено, будь ласка, перейдіть до альбому для перегляду", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Коли функцію «Котяче око» переведено в режим енергозбереження, моніторинг неможливий. Будь ласка, перейдіть на інші режими в налаштуваннях Cat Eye", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Віддалене розблокування неможливе, коли Cat Eye переведено в режим енергозбереження. Будь ласка, перейдіть в інший режим у налаштуваннях Cat Eye" } \ No newline at end of file diff --git a/lan/lan_ur.json b/lan/lan_ur.json new file mode 100644 index 00000000..c07e27d9 --- /dev/null +++ b/lan/lan_ur.json @@ -0,0 +1,1140 @@ +{ + "星锁": "اسٹار لاک", + "锁通通": "ٹی ٹی لاک پرو", + "点击开锁,长按闭锁": "ان لاک کرنے کے لئے ٹچ کریں، لاک کرنے کے لئے پکڑیں", + "考勤": "حاضری", + "考勤设置": "حاضری کی ترتیبات", + "电子钥匙": "eKeys", + "添加卡": "کارڈ شامل کریں", + "卡号": "کارڈ نمبر", + "添加指纹": "فنگر پرنٹ شامل کریں", + "指纹号": "فنگر پرنٹ نمبر", + "遥控": "دور", + "添加人脸": "چہرہ شامل کریں", + "门锁日志": "دروازہ لاک لاگ", + "密码号": "پاس ورڈ نمبر", + "添加者": "آپریٹر", + "添加时间": "وقت", + "重置": "سیٹ", + "请输入手机号或者邮箱": "فون نمبر یا ای میل", + "工作时间": "کام کرنے کا وقت", + "工作日设置": "کام کے دن کی ترتیب", + "星期一": "پیر", + "星期二": "منگل", + "星期三": "بدھ", + "星期四": "جمعرات", + "星期五": "جمعہ", + "星期六": "ہفتہ", + "星期日": "اتوار", + "简写周一": "M", + "简写周二": "T", + "简写周三": "W", + "简写周四": "T", + "简写周五": "F", + "简写周六": "S", + "简写周日": "S", + "周一": "مون", + "周二": "Tue", + "周三": "شادی شدہ", + "周四": "تھو", + "周五": "جمعہ", + "周六": "ہفتہ", + "周日": "سورج", + "群发钥匙": "متعدد ekeys بھیجیں", + "锁": "تالے", + "请添加": "وصولندہ", + "允许远程开锁": "ریموٹ ان لاک", + "请输入验证码": "تصدیقی کوڈ", + "获取密码": "Generate پاس کوڈ", + "请给密码命名": "اس پاس کوڈ کا نام درج کریں", + "密码有限期为6个小时,只能使用一次": "یہ پاس کوڈ موجودہ وقت سے 6 گھنٹے کے اندر استعمال کیا جانا چاہئے یا سیکیورٹی وجوہات کی بنا پر اسے معطل کردیا جائے گا۔ یہ پاس کوڈ صرف ایک بار استعمال کیا جاسکتا ہے۔", + "手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加": "دستی طور پر پاس ورڈ کے طور پر 6-9 ہندسے درج کریں۔ لاک کے ساتھ فون بلوٹوتھ کے ذریعہ شامل کیا جاسکتا ہے ، یا گیٹ وے کے ذریعہ دور سے شامل کیا جاسکتا ہے۔", + "获取": "پانا", + "添加": "اضافہ کرنا", + "删除公司": "کمپنی کو حذف کریں", + "密码详情": "Passcode Info", + "修改密码": "پاس کوڈ تبدیل کریں", + "添加虹膜": "Iris شامل کریں", + "添加门磁": "دروازے کا سینسر", + "添加无线键盘": "Wireless Keypad", + "添加手掌": "پام شامل کریں", + "请输入员工账号": "ملازم کا اکاؤنٹ درج کریں", + "批量授权锁": "ایک سے زیادہ تالے دیں", + "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "مجاز ایڈمنسٹریٹر کو اس لاک کو چلانے کی اکثریت کی اجازت ہوگی۔", + "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "یہ خصوصیت آپ کو گیٹ وے کے ذریعے اسمارٹ لاک کو دور سے ان لاک کرنے کی اجازت دیتی ہے۔ یہ خصوصیت صرف بلوٹوتھ کے ذریعے آن یا آف کی جاسکتی ہے۔", + "功能开启后,你将可以通过网关远程开锁。": "فنکشن فعال ہونے کے بعد ، آپ گیٹ وے کے ذریعے دور سے ان لاک کرسکیں گے۔", + "排列方式": "فہرست کی قسمیں", + "早到榜": "ابتدائی فہرست", + "迟到榜": "دیر سے فہرست", + "当前模式": "موجودہ موڈ", + "勤奋榜": "سخت محنت کی فہرست", + "延迟时间": "تاخیر کا وقت", + "经过以上设定的时间,锁会自动关闭。开启或修改设置后,请先开一次锁,使时间生效。": "وقت کے بعد لاک خود بخود لاک ہوجائے گا۔ سیٹنگ کو دستیاب کرنے کے لئے براہ کرم پہلے اسے ایک بار ان لاک کریں۔", + "时间": "وقت", + "开始时间": "شروع کرنے کا وقت", + "结束时间": "اختتام کا وقت", + "工作时间设置": "کام کرنے کے وقت کی ترتیب", + "常开模式": "Passage MODE", + "常开时间": "اس مدت میں", + "常开日期": "ان دنوں میں", + "添加员工": "عملہ شامل کریں", + "编辑员工": "عملے میں ترمیم کریں", + "节假日": "چھٹی", + "打卡方式": "طریقہ", + "员工是否有钥匙": "پہلے سے ہی ekey ہے", + "上班时间": "آغاز کا وقت", + "下班时间": "بند ہونے کا وقت", + "本周": "اس ہفتے", + "单休": "ایک روزہ اختتام ہفتہ", + "双休": "دو روزہ اختتام ہفتہ", + "单双休": "ایک دو دن کا اختتام ہفتہ", + "年": "سال", + "月": "مہینہ", + "放假日期": "چھٹی", + "补班日期": "کام کے دن", + "添加假日": "تعطیلات شامل کریں", + "开始日期": "آغاز کی تاریخ", + "必填": "مطلوبہ", + "结束日期": "اختتام کی تاریخ", + "日榜": "ہر دن", + "月榜": "ماہانہ", + "考勤记录": "ریکارڈ", + "假日信息": "تعطیلات کی معلومات", + "基本信息": "بنیادی باتیں", + "无线键盘": "Wireless Keypad", + "选择无线键盘": "Add Keypad", + "门磁": "دروازے کا سینسر", + "自动闭锁": "آٹو لاک", + "锁声音": "لاک آواز", + "防撬报警": "ٹمپر الرٹ", + "重置键": "بٹن کو ری سیٹ کریں", + "锁时间": "لاک گھڑی", + "诊断": "تشخیص", + "上传数据": "ڈیٹا اپ لوڈ کریں", + "导入其他锁数据": "ایک اور لاک سے درآمد کریں", + "锁升级": "Firmware Update", + "标记房态": "کمرے کی حیثیت", + "开锁提醒": "نوٹیفکیشن ان لاک کریں", + "微信二维码": "کیو آر کوڈ ان لاک کریں", + "拥有电子钥匙的人,通过微信扫一扫这个二维码,即可开门。每把锁的二维码都不相同,你可以将其打印出来贴在对应的锁旁边": "الیکٹرانک چابیاں رکھنے والے لوگ وی چیٹ کے ذریعے اس کیو آر کوڈ کو اسکین کرکے دروازہ کھول سکتے ہیں۔ ہر لاک کا کیو آر کوڈ مختلف ہوتا ہے۔ آپ اسے پرنٹ کرسکتے ہیں اور متعلقہ لاک کے ساتھ چسپاں کرسکتے ہیں۔", + "锁编号": "لاک نمبر", + "电量": "بیٹری", + "锁分组": "لاک گروپ", + "选择分组": "گروپ منتخب کریں", + "创建新分组": "ایک گروپ بنائیں", + "管理员开锁密码": "Admin Passcode", + "更新": "تازہ کاری", + "电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新": "بیٹری کی سطح گیٹ وے یا فون بلوٹوتھ کے ذریعہ اپ ڈیٹ کی جائے گی", + "当屏幕闪烁时,点击下一步": "جب کی پیڈ چمکتا ہے تو اگلا کلک کریں", + "输入*529#或按设置键": "*529# درج کریں یا ترتیبات کی کلید دبائیں", + "长按重置键2秒": "ری سیٹ بٹن کو 2 سیکنڈ دبائیں اور پکڑیں", + "附近的设备": "قریبی سامان", + "暂无数据": "کوئی ڈیٹا نہیں", + "通过门磁可查询门的开、关状态。每把锁咳添加一个门磁": "آپ گیٹ وے کے ساتھ ساتھ دروازے کے سینسر کے ساتھ دروازے کی حیثیت حاصل کرسکیں گے۔ صرف ایک سینسر کو لاک کے ساتھ منسلک کرنے کی اجازت ہے۔", + "开始": "شروع کرنا", + "全天": "تمام گھنٹے", + "你可以设置多个常开时间段,在设置的时间段内,锁被打开后一直处于打开的状态。": "آپ گزرنے کے موڈ کے لئے متعدد وقت کی مدت مقرر کرسکتے ہیں۔ مقررہ مدت کے اندر لاک ان لاک ہونے کے بعد کھلی حالت میں رہے گا۔", + "请选择锁音量": "براہ کرم لاک حجم منتخب کریں", + "功能开启后,你将可以听到智能锁的提示音。包括电量过低,密码错误等提示。": "آن کرنے سے ، آپ کو تالے سے آواز سنائی دے گی۔", + "低": "چھوٹا", + "较低": "درمیانے درجے کی کم", + "中": "درمیانہ", + "较高": "درمیانے درجے کی بلندی", + "高": "اونچا", + "开启后,锁被撬动时,会发出报警声": "آن کرکے ، آپ ٹیمپر الرٹ کو فعال کرتے ہیں۔", + "关闭后,重置键无效,锁要通过app删除后才能重新添加": "بند کرکے ، ری سیٹ بٹن غیر فعال ہوجاتا ہے۔", + "校准时间": "Calibrate Time", + "诊断是读取锁内的配置信息并上传,以便工作人员分析故障的原因": "تشخیص یہ ہے کہ لاک کے اندر ترتیب کی معلومات کو پڑھیں اور اسے اپ لوڈ کریں تاکہ عملہ ناکامی کی وجہ کا تجزیہ کرسکے۔", + "上传": "اپ لوڈ", + "本操作将上传锁内数据到服务器,过程可能需要几分钟,请耐心等待": "ڈیٹا کو لاک سے سرور پر اپ لوڈ کریں۔ اس میں کئی منٹ لگ سکتے ہیں", + "请选择要从哪把锁导入": "درآمد کرنے کے لئے ایک لاک منتخب کریں", + "有新版本": "نیا ورژن ہے", + "当前版本": "موجودہ ورژن", + "升级": "تازہ کاری", + "空闲": "خالی", + "已入住": "مقبوضہ", + "多语言": "زبانیں", + "添加锁": "لاک شامل کریں", + "锁地址": "لاک ایڈریس", + "选择锁类型": "لاک کی قسم منتخب کریں", + "NFC无源锁": "NFC Passive Lock", + "添加设备": "آلہ شامل کریں", + "网关": "گیٹ وے", + "客服": "Customer Service", + "设置": "سیٹنگیں", + "更多设置": "مزید سیٹ", + "消息推送": "نوٹیفکیشن پر دباؤ", + "锁用户管理": "صارفین کو لاک کریں", + "拥有的钥匙": "اس صارف سے وابستہ ای کیز", + "批量授权": "اتھارٹی انتظامیہ", + "关联设备": "متعلقہ آلہ", + "关联姓名": "متعلقہ نام", + "转移智能锁": "منتقلی لاک", + "选择锁": "سکرین لاک", + "接收人信息": "وصولندہ", + "转移网关": "ٹرانسفر گیٹ وے", + "锁屏": "سکرین لاک", + "已关闭": "آف", + "已开启": "پر", + "开启": "آن کریں", + "确定要开启重置键?": "ری سیٹ بٹن کو فعال کرنا جاری رکھیں؟", + "确定要关闭重置键?": "ری سیٹ بٹن کو غیر فعال کرنا جاری رکھیں؟", + "隐藏无效开锁权限": "غیر قانونی رسائی کو چھپائیں", + "APP开锁时需手机连网的锁": "فون کو آن لائن لاک کرنے کی ضرورت ہے", + "增值服务": "خدمات", + "关于": "تقریباً", + "退出": "Logout", + "删除账号": "اکاؤنٹ حذف کریں", + "个人信息": "اکاؤنٹ کی معلومات", + "头像": "اوتار", + "昵称": "لقب", + "请输入昵称": "برائے مہربانی اپنا لقب درج کریں", + "修改昵称": "نام تبدیل کریں", + "修改账号": "اکاؤنٹ میں ترمیم کریں", + "重置密码": "پاس ورڈ ری سیٹ کریں", + "安全问题": "سیکورٹی کا سوال", + "为了你的账号安全,修改账号前请先使用验证码验证": "اپنے اکاؤنٹ کی حفاظت کے لئے، براہ کرم اکاؤنٹ میں ترمیم کرنے سے پہلے اکاؤنٹ کے پاس ورڈ کی تصدیق کا استعمال کریں", + "请输入新账号": "براہ مہربانی نیا اکاؤنٹ درج کریں", + "找回密码和登录新设备时,可通过绑定的手机验证": "تصدیقی کوڈ وصول کرنے کے لئے پابند فون نمبر کا استعمال کیا جائے گا۔", + "找回密码和登录新设备时,可通过绑定的邮箱验证": "پابند ای میل تصدیقی کوڈ حاصل کرنے کے لئے استعمال کیا جائے گا.", + "原密码": "موجودہ پاس ورڈ", + "新密码": "نیا پاس ورڈ", + "确认密码": "پاس ورڈ کی تصدیق کریں", + "当你手机丢了,可以通过回答设置的安全问题来登录新设备": "اگر آپ کا فون گم ہوجاتا ہے تو ، آپ سیکیورٹی سوالات کے جوابات دے کر نئے فون پر لاگ ان کرسکتے ہیں۔", + "问题一": "سوال نمبر 1", + "问题二": "سوال نمبر 2", + "问题三": "سوال نمبر 3", + "请输入你的答案": "برائے مہربانی اپنا جواب ٹائپ کریں", + "即将到期": "جلد ہی ختم ہو جائے گا", + "去授权": "اجازت دینے کے لئے جائیں", + "修改名称": "نام میں ترمیم کریں", + "状态": "پایہ", + "WiFi名称": "Wifi کا نام", + "网络MAC": "نیٹ ورک MAC", + "网关升级": "گیٹ وے اپ ڈیٹ", + "网关连接的锁": "لاک(س) اس گیٹ وے سے منسلک ہیں", + "信号强": "مضبوط", + "选择网关类型": "گیٹ وے کی قسم منتخب کریں", + "添加网关": "گیٹ وے شامل کریں", + "重新通电": "پاور کو دوبارہ مربوط کریں", + "指示灯": "اشارے کی روشنی", + "选择网关": "گیٹ وے منتخب کریں", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5 جی کی حمایت نہیں ہے، براہ کرم 2.4 جی کا وائی فائی منتخب کریں۔", + "WiFi密码": "وائی فائی پاس ورڈ", + "请输入WiFi密码": "وائی فائی پاس ورڈ درج کریں", + "网关名称": "گیٹ وے کا نام", + "请输入网关名称": "گیٹ وے کا نام درج کریں", + "IP地址": "آئی پی ایڈریس", + "子网掩码": "Subnet Mask", + "默认网关": "Default Gateway", + "自动获取DNS服务器地址": "خود بخود ڈی این ایس سرور ایڈریس حاصل کریں", + "首选DNS": "پسندیدہ DNS", + "备选DNS": "Alternative DNS", + "不使用静态IP": "کوئی جامد آئی پی استعمال نہیں ہوتا ہے", + "使用静态IP": "جامد IP استعمال کریں", + "请输入IP地址": "IP ایڈریس درج کریں", + "请输入子网掩码": "Enter Subnet Mask", + "请输入默认网关": "ڈیفالٹ گیٹ وے درج کریں", + "所有锁": "تمام تالے", + "搜索所有类型的锁": "ہر قسم کے تالے اسکین کریں", + "门锁": "دروازے کا تالا", + "挂锁": "تالا", + "保险箱锁": "محفوظ لاک", + "智能门禁": "ذہین رسائی کنٹرول", + "车位锁": "پارکنگ لاک", + "摸亮触摸屏": "کی پیڈ کو چالو کرنے کے لئے کسی بھی کلید کو چھوئیں", + "摸亮触摸屏,锁进入可添加状态,点击下一步": "براہ کرم لاک کو چالو کرنے کے لئے کسی بھی کلید کو چھوئیں اور اسے پیئرنگ موڈ میں رکھیں۔ اگلا دبائیں", + "附近的锁": "آس پاس کے تالے", + "如需修改名字请重新命名,点击确定添加锁": "اگر آپ نام تبدیل کرنا چاہتے ہیں تو، براہ کرم نام تبدیل کریں، لاک شامل کرنے کے لئے ٹھیک پر کلک کریں", + "添加锁时,手机必须在锁旁边": "لاک شامل کرتے وقت ، فون کو لاک کے بغل میں ہونا چاہئے۔", + "登录": "لاگ ان", + "注册": "رجسٹر", + "我已阅读并同意": "میں نے پڑھا اور اتفاق کیا", + "验证码": "ضابطہ", + "密码必须是8-20位,至少包括数字/字母/符号中的2种": "آپ کے پاس ورڈ میں 8-20 حروف ہونا ضروری ہے ، اور اس میں کم از کم دو قسم کے نمبر ، حروف اور علامتیں شامل ہیں۔", + "手机": "فون", + "邮箱": "ای میل", + "请输入邮箱": "اپنا ای میل درج کریں", + "国家/地区": "ملک /علاقہ", + "你所在的国家/地区": "آپ کا ملک / علاقہ", + "选择国家/地区": "اپنے ملک یا علاقے کا انتخاب کریں", + "获取验证码": "کوڈ حاصل کریں", + "商务合作": "کاروبار", + "电脑网页版": "ویب سسٹم", + "酒店系统": "ہوٹل کا نظام", + "说明书网页版": "صارف دستی", + "高级功能": "اعلی درجے کا فنکشن", + "记录保存": "ریکارڈ برقرار رکھنا", + "您可通过短信将密码、电子钥匙信息发给接收人。": "ایس ایم ایس وصول کنندہ کو پاس کوڈ اور اہم معلومات بھیجنے کے لئے استعمال کیا جاسکتا ہے۔", + "您可通过邮件将密码、电子钥匙信息发给接收人。": "ای میل وصول کنندہ کو پاس کوڈ اور اہم معلومات بھیجنے کے لئے استعمال کیا جاسکتا ہے۔", + "购买实名认证提示": "فنکشن فعال ہونے کے بعد ، آپ کو ایپ کھولنے کے لئے اپنے فنگر پرنٹ ، چہرے یا اکاؤنٹ کا پاس ورڈ استعمال کرنے کی ضرورت ہے۔ 3 منٹ کے لئے دوبارہ تصدیق کرنے کی ضرورت نہیں ہے", + "请选择你希望的实名认证频次": "براہ کرم اصل نام کی توثیق کی فریکوئنسی منتخب کریں جو آپ چاہتے ہیں", + "仅首次": "پہلی بار", + "每日一次": "دن میں ایک بار", + "每周一次": "ہفتے میں ایک بار", + "每月一次": "ہر مہینے ایک بار", + "当前状态": "موجودہ صورت حال", + "试用中": "مقدمے کی سماعت", + "高级功能权益内容": "اعلی درجے کے افعال", + "短信模板": "ایس ایم ایس ٹیمپلیٹ", + "邮件模板": "ای میل ٹیمپلیٹ", + "发卡工具": "Card encoder", + "购买高级功能须知": "اطلاع نامہ", + "购买高级功能提示": "مزید جدید خصوصیات ترقی کے تحت ہیں، اور اگر آپ کو ان کی ضرورت ہے تو، آپ کو تالے کی تعداد کی بنیاد پر خدمت کھولنے کے لئے خوش آمدید ہے. جدید خصوصیات صرف آپ کے اپنے تالے کے لئے دستیاب ہیں. اگر آپ مجاز منتظم ہیں تو، براہ کرم سروس کھولنے کے لئے لاک کے اعلی منتظم سے رابطہ کریں", + "免费体验": "مفت ٹرائل", + "立即开通": "اب کھلا ہے", + "购买短信": "ایس ایم ایس خریدیں", + "购买邮件": "ای میل خریدیں", + "购买实名认证次数": "اصلی نام کی تصدیق کے اوقات خریدیں", + "开通高级功能": "اعلی درجے کے فنکشن کو فعال کریں", + "选择套餐": "پیکیج منتخب کریں", + "支付方式": "ادائیگی کا طریقہ", + "支付宝": "Alipay", + "去支付": "ادا کرنا", + "你可以自己定义模版的内容,用于发送密码或电子钥匙信息给他人": "آپ کو خود سے پیغام کی وضاحت کرنے کی اجازت ہے. یہ پاس کوڈ اور ایکی کی معلومات دوسروں کو بھیجنے کے لئے استعمال کیا جاتا ہے.", + "高级功能仅能用于你自己的锁": "اعلی درجے کا فنکشن صرف آپ کے اپنے تالے لاگو کیا جاسکتا ہے۔", + "新建模板": "Creat template", + "类型": "قسم", + "模版内容": "سانچہ کا مواد", + "预览": "پیش", + "房间名": "کمرہ", + "预计产生短信条数": "پیغام کے حصوں کا تخمینہ", + "功能开启后,已失效较长时间的密码、电子钥匙、卡、指纹等开锁权限将被隐藏,不在列表里显示。": "یہ خصوصیت آپ کو پاس کوڈ ، ایکیز ، کارڈز اور فنگر پرنٹس کو چھپانے کی اجازت دیتی ہے جو کچھ عرصے کے لئے غیر قانونی ہیں۔", + "对于选中的这些锁,当用户用APP开锁时,他的手机需要是连网的,否则无法开锁": "اے پی پی کے ساتھ ان منتخب لاک کو ان لاک کرنے کے لئے صارف کا فون آن لائن ہونا ضروری ہے۔", + "配置WiFi": "WiFi کو ترتیب دینا", + "请输入WiFi名字": "براہ کرم وائی فائی کا نام درج کریں", + "WiFi配网": "وائی فائی ڈسٹری بیوشن نیٹ ورک", + "胁迫卡": "اسٹریس کارڈ", + "员工是否有密码": "پاس کوڈ پہلے ہی موجود ہے", + "员工是否有卡": "پہلے سے ہی کارڈ ہے", + "员工是否有指纹": "پہلے ہی فنگر پرنٹ سیٹ کریں", + "获取钥匙": "کلید حاصل کریں", + "获取卡": "کارڈ حاصل کریں", + "获取指纹": "فنگر پرنٹ حاصل کریں", + "安全验证": "شناخت کی تصدیق", + "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "آپ کے اکاؤنٹ کی تمام معلومات کو مستقل طور پر پلیٹ فارم سے ہٹا دیا جائے گا اور Recovered.Do آپ حذف کرنا چاہتے ہیں تو نہیں کیا جا سکتا؟", + "监控": "مانیٹر", + "视频日志": "ویڈیو لاگ", + "开门器": "دروازے کا افتتاح", + "面容开锁": "فیس ان لاک", + "开门方向设置": "افتتاحی سمت کا تعین", + "电机功率设置": "موٹر پاور سیٹنگ", + "开锁时是否需联网": "اگر ان لاک کرتے وقت انٹرنیٹ کی ضرورت ہو", + "选择要加入分组的锁": "اس گروپ میں شامل کرنے کے لئے لاک ایس منتخب کریں", + "锁数量": "لاک کی رقم", + "小米IOT平台": "Xiaomi IOT Platform", + "面容开锁设置": "فیس ان لاک سیٹ", + "感应距离": "فاصلے کو محسوس کرنا", + "防误开": "غلط افتتاح کو روکیں", + "防误开已关闭,关门后仍可使用面容开锁": "غلط استعمال کی روک تھام بند کردی گئی ہے، دروازہ بند ہونے کے بعد بھی فیس ان لاک استعمال کر سکتے ہیں", + "添加和使用面容开锁时": "ان لاک کرتے وقت چہرہ شامل کریں اور استعمال کریں", + "添加和使用面容开锁时提示": "\n1، براہ کرم ایک ہی شخص کو دروازے کے آپریشن کے سامنے رکھنے کی کوشش کریں۔\n2، براہ کرم دروازے کے تالے کے سامنے تقریبا 0.5 ~ 0.8 میٹر کھڑے ہوں، دروازے کے تالے کا سامنا کریں۔\n3. براہ کرم اپنے چہرے کو بغیر کسی رکاوٹ کے رکھیں اور اپنے چہرے کی خصوصیات کو بے نقاب کریں۔\n4. جب چہرے کی شناخت غیر معمولی ہو تو ، آپ دستی طور پر چہرے کی شناخت کو دوبارہ شروع کرنے کے لئے ڈیجیٹل کی بورڈ پر کسی بھی کلید کو چھو سکتے ہیں۔", + "秒": "S", + "请根据门锁实际情况,请谨慎选择电机功率:": "دروازے کے تالے کی اصل صورتحال کے مطابق موٹر پاور کا انتخاب احتیاط سے کریں:", + "小功率:": "miniwatt:", + "耗电少": "بجلی کی کم کھپت", + "大功率": "اعلی طاقت:", + "大功率提示": "اگر ان لاک کرتے وقت زبان کو عام طور پر واپس نہیں لیا جاسکتا ہے ، یا چلانے کی ضرورت ہے\nآسمان اور زمین ہک، اعلی طاقت کا انتخاب کرنے کی سفارش کی جاتی ہے. اس موقع پر، بجلی کی کھپت ہوگی\nاضافہ.", + "开门方向设置提示": "براہ کرم احتیاط سے اپنے گھر کا دروازہ کھولنے کے لئے سمت کا انتخاب کریں (اگر آپ غلط سمت کا انتخاب کرتے ہیں تو، آپ دروازہ مناسب طریقے سے نہیں کھول سکیں گے اور بند نہیں کر سکیں گے) :", + "左开": "کھلی بائیں طرف", + "右开": "دائیں کھولیں", + "判断方法:": "判断方法:", + "判断方法内容": "وہ شخص گھر کے باہر کھڑا تھا اور داخلی دروازے کی طرف تھا۔\nاگر دروازے کی ہنگ یا شافٹ بائیں طرف ہے تو ، دروازہ کھلا چھوڑ دیا جاتا ہے۔\nایک دروازہ دائیں طرف کھلا ہوتا ہے اگر اس کا ہپ یا شافٹ دائیں طرف ہو۔\nاگر ترتیب غلط ہے تو ، یہ دروازہ مناسب طریقے سے نہیں کھولے گا اور بند نہیں کرے گا۔\nتنصیب یا دیکھ بھال کے عملے کے ذریعہ چلانے کی سفارش کی گئی ہے.", + "录像时段": "ویڈیو سلاٹ", + "密码": "Passcodes", + "卡": "کارڈ", + "指纹": "فنگر پرنٹس", + "人脸": "چہرے", + "配件商城": "لاک مال", + "公司名称": "کمپنی کا نام", + "请输入公司名字": "کمپنی کا نام درج کریں", + "提示": "اشارہ", + "是否删除?": "حذف کرنا ہے یا نہیں؟", + "员工信息": "عملے کی معلومات", + "员工": "عملہ", + "打卡方式无效": "دستیاب", + "中国": "چین", + "选择钥匙": "ekey کا انتخاب کریں", + "编辑": "تدوین", + "无": "نہيں", + "有": "ہاں", + "请输入姓名": "براہ کرم ایک نام درج کریں", + "获取人脸": "چہرے حاصل کرنا", + "选择密码": "پاس کوڈ منتخب کریں", + "选择卡": "کارڈ منتخب کریں", + "选择指纹": "فنگر پرنٹ کا انتخاب کریں", + "选择人脸": "چہرہ منتخب کریں", + "员工是否有人脸": "کیا ملازم کا کوئی چہرہ ہے", + "同时删除员工钥匙": "اس کی ekey حذف کریں", + "删除": "حذف کریں", + "确定要删除员工吗?": "اس ملازم کو حذف کریں", + "月统计": "ماہانہ اعداد و شمار", + "迟到": "دیر", + "早退": "جلدی چھوڑ دیں", + "未打卡": "کوئی ریکارڈ نہیں", + "钥匙将在": "اس ایکی کی میعاد ختم ہو جائے گی", + "天后失效": "دن(دن)", + "电量更新时间:": "بیٹری اپ ڈیٹ کا وقت:", + "新增配件": "اضافہ کرنا", + "钥匙不可用": "کلید دستیاب نہیں ہے", + "正在开锁中...": "ان لاک کریں...", + "你的钥匙": "آپ کی کلید", + "常开模式启动!长按闭锁": "اوپن موڈ شروع ہوا! لاک کرنے کے لئے لمبا دبائیں", + "演示模式": "Demo mode", + "请先同意用户协议及隐私政策": "براہ کرم پہلے صارف کے معاہدے اور رازداری کی پالیسی سے اتفاق کریں", + "用户协议": "صارف کی شرائط", + "隐私政策": "رازداری کی پالیسی", + "注册成功": "رجسٹریشن کامیاب", + "你所在的": "تم اندر ہو", + "手机号": "فون نمبر", + "忘记密码": "پاس ورڈ بھول گئے", + "重置成功": "کامیابی کو دوبارہ ترتیب دیں", + "确定要退出吗?": "نکاس?", + "功能暂未开放": "فنکشن ابھی تک کھلا نہیں ہے", + "设置成功": "کامیاب سیٹ اپ کریں", + "删除成功": "حذف کرنا کامیاب ہے", + "单次": "ایک", + "永久": "مستقل", + "限时": "Timed", + "自定义": "رواج", + "清空码": "مٹانا", + "循环": "مکرر", + "工作日": "کام کا دن", + "每日": "ہر دن", + "周末": "ہفتے", + "确定要删除吗?": "مٹانا?", + "该锁的密码都将被删除": "اس لاک کے تمام پاس کوڈ حذف کر دیئے جائیں گے", + "已过期": "اپاہج", + "该锁的电子钥匙都将被删除": "اس لاک کے لئے تمام ای کیز حذف کردی جائیں گی", + "同时删除其发送的所有钥匙,钥匙删除后不能恢复": "اس ایکی سے وابستہ تمام ایکیز کو حذف کریں۔ یہ مرحلہ ختم نہیں کیا جا سکتا!", + "删除钥匙会在用户APP连网后生效": "جب صارف کی ایپ کسی نیٹ ورک سے جڑجائے گی تو ای کی حذف ہوجائے گی۔", + "有效时间": "مؤثر وقت", + "接收者": "وصولندہ", + "仅管理自己创建的用户": "صرف اپنے صارفین کا انتظام کریں", + "远程开锁": "ریموٹ ان لاک", + "请输入钥匙名称": "براہ کرم کلیدی نام درج کریں", + "修改成功": "کامیاب میں ترمیم کریں", + "冻结": "منجمد", + "解除冻结": "پگھلاؤ", + "授权": "اختیار", + "取消授权": "ڈی-مجاز", + "同时解冻其发送的钥匙": "اس صارف کی طرف سے جاری کردہ تمام ایکیز کو پگھلائیں", + "会在用户APP连网后生效": "جب صارف کی ایپ کسی نیٹ ورک سے جڑجائے گی تو یہ ایکی پگھل جائے گی", + "同时冻结其发送的钥匙": "اس صارف کی طرف سے جاری کردہ تمام ایکیز کو منجمد کریں", + "冻结会在用户APP连网后生效": "جب صارف کی ایپ کسی نیٹ ورک سے جڑ جائے گی تو یہ ایکی منجمد ہوجائے گی", + "取消授权会在用户APP连网后生效": "جب صارف کی ایپ کسی نیٹ ورک سے جڑتی ہے تو صارف اپنی اجازت کھو دے گا", + "授权用户拥有管理员的大部分权限,比如发送钥匙、发送密码": "مجاز صارف کے پاس تقریبا وہی اجازتیں ہیں جو لاک مینیجر (مثال کے طور پر) ہیں۔ ای کیز اور پاس کوڈ بھیجنے کی اہلیت)", + "失效时间需晚于生效时间": "میعاد ختم ہونے کا وقت مؤثر وقت سے بعد میں ہونا چاہئے", + "生效时间需晚于当前时间": "مؤثر وقت موجودہ وقت سے بعد میں ہونا چاہئے", + "失效日期需晚于生效日期": "میعاد ختم ہونے کی تاریخ مؤثر تاریخ سے بعد میں ہونا ضروری ہے", + "修改有效期": "تبدیلی کی مدت", + "生效日期": "آغاز کی تاریخ", + "失效日期": "اختتام کی تاریخ", + "开锁": "ان لاک کریں", + "开锁成功": "کامیابی کو ان لاک کریں", + "请选择锁": "براہ کرم تالے منتخب کریں", + "请选择接收者": "براہ کرم وصول کنندہ منتخب کریں", + "请选择有效期": "براہ کرم قانونی مدت منتخب کریں", + "请选择发送方式": "براہ کرم بھیجنے کا طریقہ منتخب کریں", + "请选择结束时间": "براہ کرم اختتامی وقت منتخب کریں", + "完成": "کامل", + "有效日": "سائیکل پر", + "发送成功": "کامیابی بھیجیں", + "请选择开始时间": "براہ کرم آغاز کا وقت منتخب کریں", + "选择用户": "وصول کنندگان کا انتخاب کریں", + "已选中": "منتخب", + "确定": "یقینی", + "请选择要发送的锁": "براہ کرم تالے منتخب کریں", + "人脸实名认证指的是用户在使用手机APP开锁时,需要先进行本人人脸验证,验证通过才能开锁。": "چہرے کے حقیقی نام کی توثیق سے مراد فون ایپ کو ان لاک کرنے سے پہلے صارف کو اپنے چہرے کی تصدیق کرنے کی ضرورت ہے ، اور تصدیق کو ان لاک کیا جاسکتا ہے۔", + "分享": "حصہ", + "请输入接收者账号": "براہ کرم وصول کنندہ اکاؤنٹ درج کریں", + "接收者号码未注册,请重新发送": "وصول کنندہ نمبر رجسٹرڈ نہیں ہے، براہ کرم دوبارہ بھیجیں", + "是否发送电子钥匙给未注册账号": "کیا آپ کسی نئے اکاؤنٹ میں ایک ایکی بھیجنا چاہتے ہیں", + "取消": "منسوخ", + "标记成功": "مارک کی کامیابی", + "微信好友": "وی چیٹ دوست", + "短信": "SMS", + "邮件": "ای میل", + "更多": "زیادہ", + "您好,您的电子钥匙生成成功": "ہیلو، آپ کی الیکٹرانک کلید کامیابی سے تیار کی گئی ہے", + "生效时间不能小于当前时间": "موثر وقت موجودہ وقت سے کم نہیں ہو سکتا", + "结束时间不能小于当前时间": "اختتامی وقت موجودہ وقت سے کم نہیں ہو سکتا", + "是否为管理员": "کیا یہ منتظم ہے", + "已连接到锁,请将卡靠近门锁的读卡区": "منسلک. کارڈ ریڈر کے خلاف کارڈ رکھیں", + "尝试连接设备...": "لاک کے ساتھ رابطہ قائم کریں۔ براہ مہربانی انتظار کریں...", + "地理位置": "جغرافیائی محل وقوع", + "检查以确保以下地址是正确的": "اس بات کو یقینی بنانے کے لئے چیک کریں کہ مندرجہ ذیل پتہ صحیح ہے", + "地图加载中,请稍候。。": "نقشہ لوڈ ہو رہا ہے، براہ مہربانی انتظار کریں ...", + "跳过": "اچٹیں", + "还未获取到位置信息哦,请耐心等待一下!": "مقام کی معلومات ابھی تک حاصل نہیں کی گئی ہے، براہ مہربانی صبر سے انتظار کریں!", + "请填写信息": "براہ مہربانی معلومات بھریں", + "有效期": "صداقت کی مدت", + "生效时间": "شروع کرنے کا وقت", + "失效时间": "اختتام کا وقت", + "上传成功": "کامیابی کے ساتھ اپ لوڈ کیا گیا", + "未生效": "غیر فعال", + "已生效": "مؤثر", + "指纹详情": "فنگر پرنٹ کی معلومات", + "添加过程中,请根据提示,在指纹采集器上进行多次的抬起按压": "آپ کو اپنی انگلی کو سینسر پر کئی بار رکھنے کی ضرورت ہوگی۔ براہ مہربانی اشارے پر عمل کریں ...", + "开始添加": "شروع کرنا", + "请将您的手指按下": "اپنی انگلی کو سینسر پر رکھیں", + "根据提示,抬起手指后再进行下一次指纹采集": "اشارے پر عمل کریں ... آپ کو اگلے ریکارڈ کے لئے اپنی انگلی کو ہٹانے اور سینسر پر رکھنے کی ضرورت ہوگی", + "添加成功": "کامیاب شامل کریں", + "更新成功": "کامیابی کو اپ ڈیٹ کریں", + "搜索": "تلاش", + "重置后,该锁的卡都将被删除哦,确认要重置吗?": "ری سیٹ کرنے کے بعد ، لاک کا کارڈ حذف ہوجائے گا ، کیا آپ ری سیٹ کرنا چاہتے ہیں؟", + "已失效": "اپاہج", + "卡详情": "کارڈ کی معلومات", + "请输入": "براہ مہربانی یہاں داخل کریں", + "关闭后,智能锁将设置为全天常开模式,直到手动关闭": "بند کرنے سے ، لاک سارا دن ان لاک رہے گا جب تک کہ اسے دستی طور پر لاک نہیں کیا جاتا۔", + "请输入小于或等于60的数字": "برائے مہربانی 60 سے کم نمبر درج کریں", + "操作成功": "آپریشن کامیاب", + "管理员密码相同,无需修改": "ایڈمنسٹریٹر کا پاس ورڈ ایک ہی ہے اور اس میں ترمیم کرنے کی ضرورت نہیں ہے۔", + "请输入6-9位数字": "لمبائی میں 6-9 عدد", + "请输入6-9位管理员密码": "براہ کرم 6-9 ہندسوں کا ایڈمنسٹریٹر پاس ورڈ درج کریں", + "请输入新的管理员密码": "براہ کرم نیا منتظم پاس ورڈ درج کریں", + "未分组": "Ungrouped", + "请输入分组名称": "ایک گروپ بنائیں", + "创建成功": "کامیابی پیدا کریں", + "设置锁分组成功": "لاک گروپ کو کامیابی سے سیٹ کریں", + "电池1电量": "بیٹری 1", + "电池2电量": "بیٹری 2", + "电量更新时间": "بیٹری اپ ڈیٹ کا وقت", + "锁电量更新成功": "لاک پاور اپ ڈیٹ کی کامیابی", + "您的钥匙未生效": "آپ کی کلید مؤثر نہیں ہے", + "您的钥匙已冻结": "آپ کی چابی منجمد کر دی گئی ہے", + "您的钥匙已过期": "آپ کی کلید کی میعاد ختم ہو چکی ہے", + "常开模式开启": "لاک پیسیج موڈ میں ہے", + "超级管理员": "سپر ایڈمن", + "授权管理员": "ایڈمن بنائیں", + "普通用户": "عام صارف", + "余": "میزان", + "天": "دن", + "删除锁后,所有信息都会一起删除,确定删除锁吗?": "لاک حذف کرنے کے بعد ، تمام معلومات ایک ساتھ حذف ہوجائیں گی ، کیا آپ واقعی لاک کو حذف کرنا چاہتے ہیں؟", + "请输入登录密码": "براہ کرم ایپلی کیشن پاس ورڈ درج کریں", + "删除设备失败,请确保在设备附近,设备未被连接,设备已打开": "آلہ کو حذف کرنے میں ناکام، براہ کرم اس بات کو یقینی بنائیں کہ آلہ آلہ کے قریب ہے، آلہ منسلک نہیں ہے، اور آلہ آن ہے", + "用户无权限": "صارف کے پاس اجازت نہیں ہے", + "创建公司后,考勤功能才能使用": "براہ مہربانی پہلے ایک کمپنی بنائیں", + "是否删除钥匙?": "اس ای کی کو حذف کریں؟", + "邮箱绑定成功": "ای میل بانڈنگ کامیابی", + "手机绑定成功": "موبائل فون بانڈنگ کی کامیابی", + "网络访问失败,请检查网络是否正常": "درخواست ناکام. نیٹ ورک دستیاب نہیں ہے، براہ کرم چیک کریں اور اپنے آلے کو 3 جی / 4 جی / وائی فائی سے مربوط کریں", + "清空": "صاف", + "是否清空?": "صاف?", + "消息详情": "پیغام کی معلومات", + "创建时间": "تخلیق کا وقت", + "管理员详情": "ایڈمنسٹریٹر کی تفصیلات", + "当被胁迫要求强行开锁时,使用胁迫卡会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "اگر کوئی آپ کو دروازہ کھولنے کے لئے مجبور کرتا ہے تو ، آپ اس کارڈ کا استعمال کرسکتے ہیں۔ الارم کا پیغام منتظمین کو بھیجا جائے گا۔ اس خصوصیت کو استعمال کرنے کے لئے، براہ مہربانی یقینی بنائیں کہ آپ کا لاک آن لائن ہے.", + "请不要将胁迫卡用于日常开锁": "براہ کرم روزانہ استعمال کے لئے جبری کارڈ کا استعمال نہ کریں.", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。": "اگر کوئی آپ کو دروازہ کھولنے کے لئے مجبور کرتا ہے تو ، آپ اس فنگر پرنٹ کا استعمال کرسکتے ہیں۔ الارم کا پیغام منتظمین کو بھیجا جائے گا۔ اس خصوصیت کو استعمال کرنے کے لئے، براہ مہربانی یقینی بنائیں کہ آپ کا لاک آن لائن ہے.", + "请不要将胁迫指纹用于日常开锁": "براہ کرم روزانہ استعمال کے لئے جبری فنگر پرنٹ کا استعمال نہ کریں۔", + "创建公司": "ایک کمپنی بنائیں", + "公司名称不能超过30个字符": "کمپنی کا نام 30 حروف سے زیادہ نہیں ہو سکتا", + "公司名称不能小于6个字符": "کمپنی کا نام 6 حروف سے کم نہیں ہوسکتا", + "WIFI列表": "وائی فائی کی فہرست", + "刷新": "تازہ", + "手动配网": "دستی ڈسٹری بیوشن نیٹ ورک", + "远距离": "طویل فاصلہ", + "中距离": "درمیانی فاصلہ", + "近距离": "مختصر فاصلہ", + "锁时间更新成功": "لاک ٹائم اپ ڈیٹ کی کامیابی", + "锁用户": "صارفین کو لاک کریں", + "请选择常开日期": "براہ کرم کھلی تاریخ منتخب کریں", + "结束时间不能小于开始时间哦": "اختتام کا وقت شروع کے وقت سے کم نہیں ہو سکتا", + "介绍": "ہماری کہانی", + "个人信息收集清单": "ذاتی معلومات جمع کرنے کی فہرست", + "应用权限说明": "درخواست کی اجازت کی تفصیل", + "第三方信息共享清单": "تیسرے فریق کی معلومات کے اشتراک کی فہرست", + "请选择您的位置": "براہ کرم اپنا مقام منتخب کریں", + "请先选择位置": "براہ کرم پہلے مقام منتخب کریں", + "管理员密码": "Admin passcode", + "如需修改,请输入新的管理员密码(6位),点击确定即可修改": "اگر آپ کو ترمیم کرنے کی ضرورت ہے تو، براہ کرم ایک نیا منتظم پاس ورڈ (6 ہندسے) درج کریں، ترمیم کرنے کے لئے ٹھیک پر کلک کریں", + "修改": "ترمیم", + "网络摄像头": "کیمرہ", + "重命名": "نام تبدیل کریں", + "分组下的锁将被移到未分组里": "گروپ کے تحت لاک کو غیر گروپ میں منتقل کیا جائے گا", + "编辑成功": "کامیاب ترمیم کریں", + "厂商": "ڈویلپر", + "型号": "ماڈل", + "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "پاس ورڈ تیار ہونے کے بعد، براہ کرم اسے اسی دن 23:59 سے پہلے چالو کرنے کے لئے ایک بار استعمال کریں، ورنہ یہ 0 بجے کے بعد غیر قانونی ہو جائے گا. پاس ورڈ چالو ہونے کے بعد ، اسے قانونی مدت کے اندر لامحدود بار استعمال کیا جاسکتا ہے۔", + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "پاس ورڈ تیار ہونے کے بعد، براہ کرم اسے اسی دن 23:59 سے پہلے استعمال کریں، ورنہ یہ 0 بجے کے بعد غیر قانونی ہو جائے گا. آج صبح 0 بجے سے پہلے تیار کردہ تمام پاس ورڈز کو صاف کرنے کے لئے واضح کوڈ کا استعمال کیا جاتا ہے۔", + "密码生成后,请在当日23:59前使用,否则过0点后失效。": "پاس ورڈ تیار ہونے کے بعد، براہ کرم اسے اسی دن 23:59 سے پہلے استعمال کریں، ورنہ یہ 0 بجے کے بعد غیر قانونی ہو جائے گا.", + "清空密码底部提示": "پاس ورڈ خالی ہونے کے دن 23:59 تک درست ہے\n خالی مواد 1: دن کے 0:00 سے پہلے تیار کردہ تمام پاس ورڈ (دن کے 0:00 کے بعد پیدا ہونے والے پاس ورڈ پاس ورڈ کلیئر کرنے سے متاثر نہیں ہوتے ہیں اور استعمال جاری رکھے جاسکتے ہیں)\nخالی مواد 2: پاس ورڈ صاف کریں استعمال کے فورا بعد تمام کسٹم پاس ورڈ (استعمال شدہ اور غیر استعمال شدہ) کو صاف کریں\nتمام پاس ورڈز کو مکمل طور پر صاف کرنے کے لئے ، ری سیٹ آل پاس ورڈ کی خصوصیت استعمال کریں۔", + "相机": "کیمرہ", + "相册": "تصاویر", + "读写": "ذخیرہ", + "定位": "جگہ", + "需要访问相机权限才能拍照上传文件例如头像上传": "فوٹو لینے اور فائلیں اپ لوڈ کرنے کے لئے کیمرے تک رسائی کی ضرورت ہوتی ہے ، جیسے پروفائل تصویر اپ لوڈ کرنا۔", + "需要访问相机权限才能使用相册图片上传文件上传头像": "البم تصاویر کا استعمال کرتے ہوئے فائلوں اور اوتاروں کو اپ لوڈ کرنے کے لئے کیمرے تک رسائی کی ضرورت ہے۔", + "需要访问读写权限才能使用本地图片上传头像": "مقامی تصاویر کا استعمال کرتے ہوئے اوتار اپ لوڈ کرنے کے لئے پڑھنے اور لکھنے کی اجازت تک رسائی کی ضرورت ہے۔", + "需要访问定位权限才能使用添加钥匙功能的位置信息": "شامل کریں فنکشن کو استعمال کرنے کے لئے مقام کی معلومات تک رسائی ضروری ہے", + "申请": "ایپلی کیشن", + "权限": "اجازت", + "不允许": "اجازت نہیں", + "允许": "اجازت", + "权限被拒绝": "اجازت دینے سے انکار", + "请手动在系统设置中开启": "براہ کرم اسے دستی طور پر سسٹم کی ترتیبات میں فعال کریں", + "权限以继续使用应用": "ایپلی کیشن کا استعمال جاری رکھنے کی اجازت۔", + "去设置": "جاؤ اسے سیٹ اپ کریں", + "当前网络": "موجودہ نیٹ ورک", + "位置信息": "محل وقوع کی معلومات", + "请输入wifi名称": "براہ کرم وائی فائی کا نام درج کریں", + "虹膜": "iris", + "手掌": "ہتھیلی", + "商城": "مال", + "我的": "میرا", + "微信公众号推送": "Wechat public account", + "蓝牙": "بلوٹوتھ", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "شامل کریں فنکشن کی مقام کی معلومات استعمال کرنے کے لئے بلوٹوتھ کی اجازتوں تک رسائی کی ضرورت ہے", + "请输入Email": "اپنا ای میل درج کریں", + "请输入手机号": "اپنا فون نمبر درج کریں", + "家人到家": "اہل خانہ گھر پہنچ گئے", + "添加家人": "خاندان کے ممبر کو شامل کریں", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择。": "اگر لاک انٹرنیٹ سے منسلک نہیں ہے تو پاس کوڈ ، کارڈ ، فنگر پرنٹ اور دروازے کھولنے کے دیگر طریقوں کے لئے یاد دہانی بروقت نہیں بھیجی جاسکتی ہے۔", + "消息提醒": "یاددہانی", + "开门通知": "افتتاحی نوٹس", + "N天未开门": "دروازے نہ کھلنے والے دن", + "门未关好": "دروازہ بند نہیں ہے", + "防拆报警": "ٹمپر الارم", + "低电量提醒": "بیٹری کم", + "胁迫开门": "زبردستی دروازہ کھلنا", + "有人按门铃": "کوئی دروازے کی گھنٹی بجاتا ہے", + "有人出现在门口": "دروازے پر کوئی نمودار ہوتا ہے", + "提醒方式": "یاد دہانی کا طریقہ", + "开门方式": "دروازہ کھولنے کا طریقہ", + "请选择": "براہ کرم منتخب کریں", + "家人": "خاندان کے رکن", + "保存": "بچانا", + "APP推送": "اے پی پی پش", + "管理员": "ایڈمن", + "未启用": "فعال نہیں ہے", + "已启用": "اہل", + "省电模式": "بجلی کی بچت کا موڈ", + "逗留抓拍模式": "کیپچر موڈ برقرار رکھیں", + "实时监控模式": "ریئل ٹائم مانیٹرنگ موڈ", + "自定义模式": "اپنی مرضی کے مطابق موڈ", + "猫眼设置": "بلی کی آنکھ کی ترتیب", + "猫眼工作模式": "بلی کی آنکھ کے کام کرنے کا موڈ", + "自动亮屏": "خود کار طریقے سے روشن اسکرین", + "亮屏持续时间": "وقت پر اسکرین", + "逗留警告": "تنبیہ جاری رکھیں", + "异常警告": "غیر معمولی انتباہ", + "短信提醒": "SMS", + "邮件提醒": "ای میل", + "N天未开门提醒": "دروازے نہ کھلنے والے دن", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "اگر کوئی آپ کو لاک کھولنے کے لئے مجبور کرتا ہے تو ، آپ اس فنگر پرنٹ کا استعمال کرسکتے ہیں۔ الارم کا پیغام منتظمین کو بھیجا جائے گا۔ اس خصوصیت کو استعمال کرنے کے لئے، براہ مہربانی یقینی بنائیں کہ آپ کا لاک آن لائن ہے.", + "胁迫指纹": "جبری فنگر پرنٹ", + "指纹列表": "فنگر پرنٹ کی فہرست", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "مقررہ وقت کے بعد ، اگر لاک نہیں کھولا جاتا ہے تو ، سسٹم نامزد وصول کنندہ کو یاد دہانی کا پیغام بھیجے گا۔ اس فنکشن کے لئے لاک کو انٹرنیٹ سے منسلک کرنے کی ضرورت ہوتی ہے۔", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "یاد دہانی کو فعال کرنے کے بعد ، جب لاک بیٹری 20٪، 10٪ اور 5٪ سے کم ہو تو سسٹم نامزد وصول کنندہ کو یاد دہانی کا پیغام بھیجے گا۔", + "未开门时间": "دروازہ نہ کھلنے والے دن", + "添加和使用面容开锁时:": "ان لاک کرتے وقت چہرہ شامل کریں اور استعمال کریں:", + "关锁": "تالا بند کریں", + "功能": "کار", + "配件": "حصوں", + "云存": "Cloud storage", + "本地": "یہ علاقہ", + "3天滚动储存": "3 دن رولنگ اسٹوریج", + "去升级": "اب اپ گریڈ کریں", + "下载列表": "ڈاؤن لوڈ فہرست", + "已下载": "ڈاؤن لوڈ", + "全部视频": "تمام ویڈیوز", + "已为本设备免费提供3大滚动视频储存服务": "اس ڈیوائس کے لیے تین سکرولنگ ویڈیو اسٹوریج سروسز مفت فراہم کی گئی ہیں۔", + "视频播放": "ویڈیو پلے بیک", + "全选": "تمام", + "请选择要删除的视频": "براہ کرم وہ ویڈیو منتخب کریں جسے آپ حذف کرنا چاہتے ہیں", + "请选择要下载的视频": "براہ کرم وہ ویڈیو منتخب کریں جسے آپ ڈاؤن لوڈ کرنا چاہتے ہیں", + "欢迎使用": "استعمال میں خوش آمدید", + "用户协议和隐私政策概要": "صارف کے معاہدے اور رازداری کی پالیسی کا خلاصہ", + "协议概要": "پروٹوکول کا خلاصہ", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "اس ایپلی کیشن کو استعمال کرنے کے لئے آپ کا شکریہ. ہم آپ کی ذاتی معلومات اور رازداری کے تحفظ کو بہت اہمیت دیتے ہیں. اس مصنوعات کو استعمال کرنے سے پہلے، براہ کرم اسے احتیاط سے پڑھیں", + "《用户协议》": "صارف کی شرائط", + "和": "اور", + "《隐私政策》": "《رازداری کی پالیسی》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "اس کا پورا مواد. \"متفق\" پر کلک کرکے ، آپ متفق ہیں اور تمام شرائط کو قبول کرتے ہیں۔ اگر آپ اتفاق نہ کرنے کا انتخاب کرتے ہیں تو، آپ ہماری مصنوعات اور خدمات کو استعمال نہیں کر سکیں گے اور ایپلی کیشن سے باہر نکل جائیں گے.", + "不同意": "اختلاف", + "同意": "اتفاق کرنا", + "该功能是高级功能,请开通后再使用": "یہ اعلی درجے کا فنکشن ہے۔ براہ مہربانی پہلے اسے فعال کریں۔", + "常用程序": "مشترکہ پروگرام", + "该锁已被重置": "لاک کو دوبارہ ترتیب دیا گیا ہے", + "需要访问读写权限才能使用手动升级固件": "فرم ویئر کو دستی طور پر اپ گریڈ کرنے کے لئے پڑھنے اور لکھنے کی اجازتوں تک رسائی کی ضرورت ہے", + "错误D固件,请选择正确的文件": "غلط فرم ویئر، براہ کرم صحیح فائل منتخب کریں", + "非SYD固件,请选择正确的文件": "غیر ایس وائی ڈی فرم ویئر، براہ کرم صحیح فائل منتخب کریں", + "文件校验失败 0x01": "فائل کی تصدیق ناکام 0x01", + "解析元数据失败,请选择正确的文件": "میٹا ڈیٹا کو پارس کرنے میں ناکام، براہ کرم صحیح فائل منتخب کریں", + "文件校验失败 0x02": "فائل کی تصدیق ناکام 0x02", + "文件校验失败 0x03": "فائل کی تصدیق ناکام 0x03", + "固件升级完成": "Firmware upgrade مکمل", + "记录": "ریکارڈ", + "开通高级功能后才可以对锁进行管理": "براہ کرم تالے کا انتظام کرنے کے لئے پہلے اعلی درجے کے فنکشن کو فعال کریں۔", + "去开通": "اہل", + "实名认证": "اصل نام کی تصدیق", + "当前剩余数量": "باقی", + "购买": "خریدنا", + "实名认证为付费功能,请购买后再使用": "حقیقی نام کی توثیق ایک ادا شدہ فنکشن ہے، براہ کرم خریداری کے بعد اسے استعمال کریں", + "密码不一致哦": "پاس ورڈ متضاد ہیں", + "退出添加": "شامل کرنا چھوڑ دیں", + "管理员已满": "ایڈمن مکمل", + "用户已满": "صارف بھرا ہوا ہے", + "锁上面添加指纹已满": "لاک پر فنگر پرنٹ شامل کرنا بھرا ہوا ہے", + "指纹已存在": "فنگر پرنٹ پہلے ہی موجود ہے۔", + "锁上面添加人脸已满": "اوپر لاک لگائیں شامل کریں چہرہ بھرا ہوا ہے", + "人脸已存在": "چہرہ پہلے ہی موجود ہے", + "锁上面添加卡已满": "مندرجہ بالا ایڈ کارڈ مکمل ہے", + "卡已存在": "کارڈ پہلے سے موجود ہے", + "锁上面添加密码已满": "اوپر لاک شامل کریں پاس ورڈ بھرا ہوا ہے", + "密码已存在": "ایک جیسا پاس کوڈ پہلے ہی موجود ہے۔ براہ مہربانی ایک مختلف کا انتخاب کریں", + "请输入密码": "براہ کرم پاس ورڈ درج کریں", + "暂无密码,无需重置": "کوئی پاس ورڈ نہیں، ری سیٹ کرنے کی ضرورت نہیں", + "真实姓名": "اصل نام", + "身份证号": "ID نمبر", + "请输入真实姓名": "برائے مہربانی اپنا اصل نام درج کریں", + "请输入身份证号": "برائے مہربانی اپنا شناختی نمبر درج کریں", + "请输入身份证号和真实姓名": "برائے مہربانی اپنا شناختی نمبر اور اصلی نام درج کریں", + "点击返回设备配对": "ڈیوائس جوڑنے پر واپس ٹیپ کریں", + "无法连接?尝试升级": "رابطہ نہیں کر سکتے؟ اپ گریڈ کرنے کی کوشش", + "固件升级提示": "Firmware upgrade prompt", + "请先获取固件文件到手机本地,再选择升级": "براہ کرم فرم ویئر فائل کو پہلے مقامی فون پر حاصل کریں ، اور پھر اپ گریڈ منتخب کریں۔", + "固件升级中": "فرم ویئر کو اپ گریڈ کیا جا رہا ہے", + "取消升级": "اپ گریڈ کو منسوخ کریں", + "固件传输中": "Firmware in transit", + "关闭": "بند کر دو", + "传输中'": "ٹرانزٹ میں", + "操作记录": "ریکارڈ", + "修改姓名": "نام میں ترمیم کریں", + "传输中": "ٹرانزٹ میں", + "发送人": "جاری کردہ", + "发送时间": "وقت جاری کر دیا گیا", + "钥匙详情": "ekey Info", + "姓名": "نام", + "发送": "بھیجنا", + "请确认姓名全名和身份证号码是否正确": "برائے مہربانی تصدیق کریں کہ پورا نام اور شناختی نمبر درست ہے", + "传输期间请勿离开当前页面": "منتقلی کے دوران موجودہ صفحہ نہ چھوڑیں", + "机型": "ماڈل", + "硬件版本": "ہارڈ ویئر ورژن", + "固件版本": "Firmware version", + "手动升级": "دستی اپ گریڈ", + "设备连接中...": "ڈیوائس کنیکٹنگ...", + "未避免异常情况,请在门打开时升级": "ناگزیر استثنیات، براہ کرم دروازہ کھلا ہونے پر اپ گریڈ کریں", + "钥匙无效": "کلید غیر قانونی ہے", + "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "لاک سے رابطہ قائم کرنے میں ناکام۔ براہ کرم اپنے فون کے بلوٹوتھ کو دوبارہ اسٹارٹ کریں اور دوبارہ کوشش کریں۔", + "如果是全自动锁,请使屏幕变亮": "اگر یہ مکمل طور پر خودکار لاک ہے تو، براہ کرم اسکرین کو روشن بنائیں", + "正在尝试闭锁……": "لاک کرنے کی کوشش کر رہے ہیں. براۓ مہربانی انتظار کريں...", + "清空记录": "واضح ریکارڈ", + "是否要删除操作记录?": "ریکارڈ حذف کرنا جاری رکھیں؟", + "被删除的记录不能恢复": "حذف کرنے کے بعد ریکارڈ کو بازیافت نہیں کیا جاسکتا ہے۔", + "全部事件": "تمام واقعات", + "开锁事件": "ان لاک ایونٹ", + "异常事件": "غیر معمولی واقعہ", + "门铃事件": "Doorbell event", + "视频事件": "ویڈیو ایونٹ", + "请开启蓝牙": "براہ کرم بلوٹوتھ آن کریں", + "请选择有效日": "براہ کرم مؤثر دن منتخب کریں", + "公司名字长度不能小于 6 ": "کمپنی کے نام کی لمبائی 6 سے کم نہیں ہوسکتی ہے", + "已是最新版本": "کوئی تازہ کاری نہیں", + "一": "ایک", + "二": "دو", + "三": "تین", + "四": "چار", + "五": "پانچ", + "六": "چھ", + "日": "سورج", + "新建短信模版": "Creat SMS ٹیمپلیٹ", + "新建邮件模版": "کریٹ ای میل ٹیمپلیٹ", + "自定义短信模版": "ایس ایم ایس ٹیمپلیٹ", + "自定义邮件模版": "ای میل ٹیمپلیٹ", + "名称": "نام", + "星星锁": "اسٹار لاک", + "无考勤记录": "کوئی ریکارڈ نہیں", + "大家干劲十足": "ہر کوئی وقت پر آتا ہے", + "工作时长未出炉": "کام کے گھنٹے نہیں", + "国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续": "ملک / خطے کا انتخاب ڈیٹا سیکیورٹی کو متاثر کرے گا. آپ نے فی الحال البانیہ کا انتخاب کیا ہے، براہ مہربانی آگے بڑھنے سے پہلے تصدیق کریں.", + "确认国家或地区": "ملک / خطے کی تصدیق کریں", + "我知道了": "مل گيا", + "为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。": "اہم اپ ڈیٹس حاصل کرنے کے لئے، براہ کرم 'ٹھیک ہے' پر کلک کریں اور ترتیبات میں اطلاعات کو فعال کریں۔", + "开启后,可通过长按锁上的设置键重新上电,用APP重新添加": "آن کرنے کے بعد ، آپ لاک پر سیٹنگ کلید کو لمبے عرصے تک دبا کر دوبارہ پاور آن کرسکتے ہیں ، اور اسے اے پی پی کے ساتھ دوبارہ شامل کرسکتے ہیں۔", + "已有": "رو", + "新增": "نیا", + "账号格式错误": "خراب فارمیٹ", + "接收者信息为空": "وصول کنندہ کی معلومات خالی ہے", + "请输入时间(秒)": "براہ کرم وقت درج کریں (سیکنڈ)", + "加载数据失败": "ڈیٹا لوڈ کرنے میں ناکام", + "重试": "دوبارہ کوشش کرو", + "升级中,是否退出": "اپ گریڈ کے دوران، کیا باہر نکلنا ہے", + "下一步": "اگلا", + "公寓": "اپارٹمنٹ", + "个人用户": "ذاتی", + "星寓": "اسٹار اپارٹمنٹ", + "账号": "حساب", + "请输入手机号或email": "فون نمبر یا ای میل", + "请输入星寓管理员的账号": "براہ کرم اسٹار اپارٹمنٹ ایڈمنسٹریٹر کا اکاؤنٹ درج کریں", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "منتخب کردہ لاک (وں) کا تمام ڈیٹا مستقل طور پر وصول کنندہ کو منتقل کردیا جائے گا۔", + "暂不支持跨平台转移,敬请期待": "کراس پلیٹ فارم ٹرانسفر فی الحال سپورٹ نہیں ہے، براہ مہربانی اس کا انتظار کریں", + "移除坏锁": "خراب / خراب تالے کو کوڑے دان میں منتقل کریں", + "转移确认": "منتقلی کی تصدیق کریں", + "本次共转移": "اس بار مجموعی طور پر", + "把智能锁": "سمارٹ لاک", + "确认": "ٹھيک ہے", + "移除成功": "کامیابی کے ساتھ حذف کریں", + "转移成功": "منتقلی کی کامیابی", + "该已锁被删除": "لاک حذف کر دیا گیا ہے", + "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "مجاز ایڈمن صرف پاس کوڈ ، ایکی اور وغیرہ کا انتظام کرسکتا ہے جو خود تیار کیے گئے ہیں۔", + "添加授权管理员": "ایڈمن بنائیں", + "导出记录": "برآمدات کا ریکارڈ", + "选择时间段": "وقت کی مدت منتخب کریں", + "导出": "برآمد", + "批量导出": "Batch export", + "读取记录": "ریکارڈ تازہ کریں", + "设备": "آلہ", + "消息": "پیغامات", + "智能分析": "ذہین تجزیات", + "精准识别设备事件,过滤无效信息": "ڈیوائس کے واقعات کی درست طور پر شناخت کریں اور غیر قانونی معلومات کو فلٹر کریں", + "系统设置": "نظام کی ترتیبات", + "系统的全局配置在此项内进行设置": "سسٹم کی عالمی ترتیب اس آئٹم میں ترتیب دی گئی ہے", + "导出操作记录": "برآمدات کا ریکارڈ", + "立即查看": "منظر", + "导出成功": "کامیابی سے برآمد کیا گیا", + "发送钥匙": "Send ekey", + "进度": "شرح", + "失败": "ناکام", + "人脸详情": "چہرے کی تفصیلات", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "جب کسی کو دروازے کے سامنے تقریبا 1.5 میٹر کا احساس ہوتا ہے تو ، چہرے کی شناخت خود بخود شروع ہوجائے گی۔", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "جب کسی کو دروازے کے سامنے تقریبا 0.8 میٹر کا احساس ہوتا ہے تو ، چہرے کی شناخت خود بخود شروع ہوجائے گی۔", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "جب کسی کو دروازے کے سامنے تقریبا 0.5 میٹر کا احساس ہوتا ہے تو ، چہرے کی شناخت خود بخود شروع ہوجائے گی۔", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "سینسنگ فاصلہ بند کردیا گیا ہے ، آپ کو چہرے کی شناخت کو ان لاک کرنے کے لئے کی بورڈ پر کسی بھی کلید کو دستی طور پر چھونے کی ضرورت ہے۔", + "防误开已打开,开锁后": "اینٹی غلطی اوپننگ آن کردی گئی ہے ، اور ان لاک ہونے کے بعد", + "秒内不可使用面容开锁": "فیس ان لاکنگ سیکنڈ کے اندر استعمال نہیں کی جا سکتی", + "掌静脉": "کھجور کی رگ", + "添加掌静脉": "کھجور کی رگ شامل کریں", + "胁迫掌静脉": "جبری ہتھیلی کی رگ", + "请不要将胁迫掌静脉用于日常开锁": "براہ مہربانی روزانہ کھولنے کے لئے ہتھیلی کی رگوں کا استعمال نہ کریں", + "已连接到锁,请自然张开手掌,掌心正对摄像头": "تالے سے منسلک، براہ مہربانی قدرتی طور پر اپنی ہتھیلی کھولیں، ہتھیلی کیمرے کے سامنے ہے", + "掌静脉详情": "ہتھیلی کی رگ کی تفصیلات", + "掌静脉号": "کھجور کی رگ کا نمبر", + "蓝牙未打开,请到设置里面打开蓝牙": "بلوٹوتھ آن نہیں ہے، براہ کرم ترتیبات میں بلوٹوتھ کو آن کریں", + "删除用户时,会将用户拥有的钥匙一起删除。": "اگر کسی صارف کو حذف کیا جاتا ہے تو صارف سے وابستہ کسی بھی ایکیز کو بھی حذف کردیا جائے گا۔", + "配置网络": "Configure network", + "你好": "ہیلو", + "成功": "کامیاب", + "类型选择": "منتخب کی قسم", + "请选择要使用哪种类型": "براہ کرم منتخب کریں کہ کون سی قسم استعمال کرنا ہے", + "系统邮件(推荐)": "سسٹم ای میل (تجویز کردہ)", + "系统短信(推荐)": "سسٹم ایس ایم ایس (تجویز کردہ)", + "邮件将从软件平台直接发给用户,请根据需要在软件里购买邮件数量。": "ای میل اس ایپ سے بھیجی جائے گی۔ براہ کرم پہلے ای میل پیکج خریدیں۔", + "短信将从软件平台直接发给用户,请根据需要在软件里购买短信数量。": "ایس ایم ایس اس ایپ سے بھیجا جائے گا۔ براہ کرم پہلے ای میل پیکج خریدیں۔", + "个人邮件": "ذاتی ای میل", + "个人短信": "ذاتی ایس ایم ایس", + "邮件将从你的个人邮箱发给用户": "ای میل آپ کے ذاتی ای میل اکاؤنٹ سے بھیجا جائے گا.", + "短信将从你的个人手机号发给用户,费用由运营商从你的手机号扣除": "ایس ایم ایس پیغام آپ کے ذاتی فون نمبر سے بھیجا جائے گا۔ آپ اپنے ٹیلی کام آپریٹر کو ادائیگی کرتے ہیں.", + "为了更好地应用体验,请确定权限": "ایک بہتر ایپلی کیشن تجربے کے لئے، براہ کرم اجازتوں کی تصدیق کریں", + "您第一次拒绝权限,请确定权限": "آپ نے پہلی بار اجازت دینے سے انکار کیا، براہ کرم اجازت کی تصدیق کریں", + "您第二次拒绝权限,请去应用设置开启权限": "آپ نے دوسری بار اجازت دینے سے انکار کر دیا، براہ کرم اجازت کو فعال کرنے کے لئے ایپلی کیشن کی ترتیبات میں جائیں", + "去应用市场": "ایپ اسٹور پر جائیں", + "温馨提示": "گرم پرامپٹ", + "关闭应用": "ایپلی کیشن کو بند کریں", + "开启微信接收报警消息需要先关注": "الارم پیغامات وصول کرنے کے لئے وی چیٹ کھولنے کے لئے، آپ کو پیروی کرنے کی ضرورت ہے", + "微信公众号,请保存二维码并使用微信扫一扫设置": "وی چیٹ پبلک اکاؤنٹ، کیو آر کوڈ محفوظ کریں اور ترتیبات کو اسکین کرنے کے لئے وی چیٹ استعمال کریں", + "实名认证为付费功能,请联系锁的管理员购买后再使用": "حقیقی نام کی توثیق ایک ادا شدہ فنکشن ہے، براہ کرم خریدنے اور استعمال کرنے کے لئے لاک ایڈمنسٹریٹر سے رابطہ کریں", + "位置权限": "محل وقوع کی اجازت", + "请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作": "براہ کرم ایپ کو اپنے لوکیٹیشن کو استعمال کرنے کے لئے گرانٹ دیں۔ یہ بی ایل ای لاک اور گیٹ وے کو اسکین کرنے کے لئے استعمال کیا جاتا ہے۔", + "相机/相册权限": "کیمرہ / البم کی اجازت", + "请开启本地存储权限,允许应用读写设备上的照片及文件": "براہ کرم ایپ کو اسٹوریج سے فوٹو اور فائلیں پڑھنے اور لکھنے کی اجازت دیں۔", + "点击选择": "منتخب کرنے کے لئے کلک کریں", + "微信": "WeChat", + "朋友圈": "لمحات", + "QQ": "QQ", + "QQ空间": "QQZone", + "微博": "Weibo", + "FaceBook": "فیس بک", + "链接": "ربط", + "今天": "آج", + "密码错误": "غیر قانونی پاس ورڈ", + "网络中断": "نیٹ ورک میں رکاوٹ", + "钥匙不存在": "کلید موجود نہیں ہے", + "钥匙过期": "کلید ختم ہو گئی", + "钥匙已存在": "کلید پہلے سے موجود ہے", + "密码失效": "پاس ورڈ غیر قانونی ہے", + "门锁时间异常": "دروازے بند کرنے کا وقت غیر معمولی", + "APP(手机)未联网": "اے پی پی (موبائل فون) انٹرنیٹ سے منسلک نہیں ہے", + "数据不存在": "ڈیٹا موجود نہیں ہے", + "待接收": "BeReceived", + "已冻结": "منجمد", + "已删除": "حذف", + "未知": "نامعلوم", + "拖动下方滑块完成拼图": "سلائیڈر کو صحیح پوسٹن پر گھسیٹیں", + "验证成功": "تصدیق کی کامیابی", + "验证失败": "تصدیق ناکام", + "向右拖动滑块填充拼图": "پہیلی کو بھرنے کے لئے سلائڈر کو دائیں طرف گھسیٹیں", + "请先获取到位置信息哦": "براہ مہربانی پہلے مقام کی معلومات حاصل کریں", + "请选择国家": "براہ کرم ایک ملک منتخب کریں", + "获取锁信息": "لاک کی معلومات حاصل کریں", + "锁数据异常,请重试": "لاک ڈیٹا غیر معمولی ہے، براہ کرم دوبارہ کوشش کریں", + "连接设备中...": "کنیکٹنگ ڈیوائس...", + "把锁": "تالے", + "条": "پٹی", + "封": "مہر", + "次": "اوقات", + "支付成功": "کامیابی کی قیمت ادا کریں", + "查看详情": "تفصیلات دیکھیں", + "请输入模板名称": "براہ کرم ٹیمپلیٹ کا نام درج کریں", + "模版类型": "قسم", + "再返回一次退出": "دوبارہ باہر نکلیں", + "请先添加锁": "براہ کرم پہلے تالا شامل کریں", + "可视对讲": "Visual intercom", + "详细日志": "تفصیلی لاگ", + "已复制到剪切板": "نقل", + "拍照": "فوٹو", + "从相册选择": "البم میں سے منتخب کریں", + "选择问题": "براہ کرم ایک سوال منتخب کریں", + "确认长度不足8位": "لمبائی 8 ہندسوں سے کم ہونے کی تصدیق کریں", + "新密码长度不足8位": "نئے پاس ورڈ کی لمبائی 8 ہندسوں سے کم", + "两次密码不一致": "پاس ورڈ کا ملاپ۔ براہ کرم دوبارہ کوشش کریں", + "请点击获取验证码,验证码将发送到": "براہ مہربانی تصدیقی کوڈ حاصل کریں۔ کوڈ بھیج دیا جائے گا", + "切换": "سوئچ", + "验证": "تصدیق کرنا", + "验证成功,账号已删除": "تصدیق کامیاب، اکاؤنٹ حذف کر دیا گیا", + "该密码不是自定义密码,无法修改": "یہ پاس ورڈ اپنی مرضی کے مطابق پاس ورڈ نہیں ہے اور اس میں ترمیم نہیں کی جا سکتی", + "请选择设备要关联哪些姓名": "براہ کرم منتخب کریں کہ آلہ کو کن ناموں کے ساتھ منسلک کیا جانا چاہئے", + "请选择姓名要关联哪些设备": "براہ کرم منتخب کریں کہ نام کس ڈیوائس کے ساتھ منسلک ہونا چاہئے", + "确定要移除所选中的坏锁吗?": "خراب لاک کو ہٹا دیں؟", + "邮件通知": "ای میل کے ذریعے مطلع کریں", + "短信通知": "ایس ایم ایس کے ذریعے مطلع کریں", + "您好,您的授权管理员生成成功": "ہیلو، آپ کا مجاز منتظم کامیابی سے تیار کیا گیا ہے", + "请输入接收者姓名": "براہ مہربانی یہاں داخل کریں", + "版本更新": "ورژن اپ ڈیٹ", + "下次再说": "اگلی بار", + "配网成功": "نیٹ ورک کی تقسیم کی کامیابی", + "配网失败": "نیٹ ورک کی تقسیم ناکام", + "该锁的无线键盘都将被删除": "اس لاک کے لئے تمام وائرلیس کی پیڈ حذف کردیئے جائیں گے۔", + "实时画面": "حقیقی وقت کی تصویر", + "适合门口较为安全的环境。": "دروازے پر نسبتا محفوظ ماحول کے لئے موزوں.", + "仅发生特定事件才录像,并可查看实时画面。": "صرف مخصوص واقعات ریکارڈ کیے جاتے ہیں اور حقیقی وقت کی تصویر دیکھی جاسکتی ہے۔", + "一般情况下,满电可使用7-8个月": "عام حالات میں ، اسے مکمل چارج ہونے پر 7-8 ماہ تک استعمال کیا جاسکتا ہے۔", + "有人逗留或发生特定事件才录像,可随时查看": "کسی کا قیام یا مخصوص واقعات ریکارڈ کیے جاتے ہیں، اور کسی بھی وقت دیکھا جا سکتا ہے", + "实时画面。": "حقیقی وقت کی تصویر.", + "一般情况下,满电可使用5~6个月。": "عام حالات میں ، یہ مکمل چارج ہونے پر 5 ~ 6 ماہ کے لئے استعمال کیا جاسکتا ہے۔", + "适合门口人员复杂、较不安全的环境。": "دروازے پر پیچیدہ اور نسبتا غیر محفوظ ماحول کے لئے موزوں.", + "有人出现就录像,可随时查看实时画面。": "جب کوئی ظاہر ہوتا ہے تو ریکارڈ کریں ، اور کسی بھی وقت حقیقی وقت کی تصویر دیکھیں۔", + "一般情况下,满电可使用2~4个月。": "عام حالات میں ، یہ مکمل چارج ہونے پر 2 ~ 4 ماہ کے لئے استعمال کیا جاسکتا ہے۔", + "根据您家门口实际情况设置录像和实时画面功能。": "اپنے دروازے پر حقیقی صورتحال کے مطابق ویڈیو اور ریئل ٹائم تصویر کے افعال سیٹ کریں۔", + "可使用时长由具体设置决定。": "استعمال کی مدت کا تعین مخصوص ترتیبات کے ذریعہ کیا جاتا ہے۔", + "查看": "منظر", + "有人按门铃或发生": "کوئی دروازے کی گھنٹی بجاتا ہے یا", + "异常事件时": "غیر معمولی واقعہ", + "不录像": "کوئی ویڈیو نہیں", + "有人出现、按门铃": "کوئی نمودار ہوتا ہے، دروازے کی گھنٹی بجاتا ہے", + "或发生异常事件时": "یا کوئی غیر معمولی واقعہ پیش آتا ہے", + "逗留达到10秒": "10 سیکنڈ کے لئے رہو", + "约1.5米": "تقریبا 1.5 میٹر", + "随时": "کسی بھی وقت", + "立即录像": "فوری طور پر ریکارڈ کریں", + "录像时机": "ویڈیو کا وقت", + "有人出现时录像": "ریکارڈ کریں جب کوئی ظاہر ہوتا ہے", + "人体侦测距离": "انسانی شناخت کا فاصلہ", + "查看实时画面": "حقیقی وقت کی تصویر دیکھیں", + "自定义时间": "اپنی مرضی کے مطابق وقت", + "当日": "آج", + "次日": "اگلے دن", + "自定义时段": "اپنی مرضی کے مطابق وقت کی مدت", + "发生事件时查看": "جب کوئی واقعہ پیش آتا ہے تو دیکھیں", + "实时查看": "حقیقی وقت کا منظر", + "有人在门口出现10秒后开始录像。": "کوئی ریکارڈنگ سے پہلے 10 سیکنڈ کے لئے دروازے پر نمودار ہوتا ہے۔", + "有人按门铃时立即录像。": "جب کوئی دروازے کی گھنٹی بجائے تو فوری طور پر ریکارڈ کریں۔", + "有人出现在门前1.5米范围时启动录像": "جب کوئی دروازے کے سامنے 1.5 میٹر کے اندر ظاہر ہوتا ہے تو ریکارڈنگ شروع کریں", + "约0.8米": "تقریبا 0.8 میٹر", + "约3.0米": "تقریبا 3.0 میٹر", + "添加指纹失败": "آپریشن ناکام ہو گیا۔", + "项": "اشیا", + "播放中": "کھیلنے", + "下载": "ڈاؤن لوڈ", + "暂无下载内容": "ڈاؤن لوڈ کا کوئی مواد نہیں", + "亮度": "چمک", + "音量": "صوت", + "快进至": "تیزی سے آگے بڑھیں", + "快退至": "Rewind to", + "暂无视频信息": "کوئی ویڈیو معلومات نہیں", + "加载出错": "لوڈ نگ کی غلطی", + "请单人正对门锁,距离一个成年人手臂长度": "براہ مہربانی دروازے کے تالے کے سامنے اکیلے کھڑے ہوں، ایک بازو کی لمبائی پر", + "(约0.6米)。": "(تقریبا 0.6 میٹر).", + "保持脸部无遮挡,露出五官。": "اپنے چہرے کو بغیر کسی رکاوٹ کے رکھیں اور اپنے چہرے کی خصوصیات دکھائیں۔", + "准备好了,开始添加": "تیار ہیں، شامل کرنا شروع کریں", + "正在录入中...": "ریکارڈنگ...", + "添加人脸失败": "چہرہ شامل کرنے میں ناکام", + "重置后,该锁的人脸都将被删除哦,确认要重置吗?": "ری سیٹ کرنے کے بعد ، لاک کے چہرے حذف ہوجائیں گے۔ کیا آپ واقعی دوبارہ ترتیب دینا چاہتے ہیں؟", + "人脸号": "چہرے کا نمبر", + "虹膜详情": "Iris کی تفصیلات", + "虹膜号": "آئیرس نمبر", + "选择设备类型": "آلہ کی قسم منتخب کریں", + "照明灯具": "لائٹنگ فکسچر", + "电动窗帘": "بجلی کے پردے", + "门窗传感器": "دروازے اور ونڈو سنسر", + "传感器": "سینسر", + "清除数据成功": "ڈیٹا کامیابی سے صاف کیا گیا", + "1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。": "لاک انٹرنیٹ سے منسلک نہیں ہے ، لہذا پاس کوڈ ، کارڈ ، فنگر پرنٹ ، اور دروازے کھولنے کے دیگر طریقوں کے ریکوڈ ریئل ٹائم میں اپ لوڈ نہیں کیے جاسکتے ہیں۔", + "2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录": "اگر آپ کو تاریخی ریکارڈ رکھنے کی ضرورت ہے تو، آپ انہیں برآمد کر سکتے ہیں.", + "看不到操作记录,可能原因有": "آپریشن ریکارڈ نہیں دیکھ سکتے، ممکنہ وجوہات", + "操作记录详情": "آپریشن ریکارڈ کی تفصیلات", + "操作时间": "آپریشن کا وقت", + "此模块功能需要锁联网后设置方可生效": "لاک کے مؤثر ہونے کے لئے انٹرنیٹ سے منسلک ہونے کے بعد اس ماڈیول فنکشن کو سیٹ کرنے کی ضرورت ہے۔", + "用户已存在": "صارف پہلے سے موجود ہے", + "钥匙数量已到上限": "چابیوں کی تعداد اوپری حد تک پہنچ گئی ہے", + "附近没有可用网关": "آس پاس کوئی گیٹ وے دستیاب نہیں ہے", + "正在创建安全连接...": "ایک محفوظ کنکشن بنانا...", + "监视状态下不能发送录音": "مانیٹرنگ موڈ میں ریکارڈنگ نہیں بھیج سکتا", + "挂断": "فون کاٹنا", + "监视中暂不能开锁": "نگرانی کے دوران ان لاک نگ دستیاب نہیں ہے", + "长按说话": "بولنے کے لئے دبائیں اور پکڑیں", + "松开发送": "بھیجنے کے لئے جاری کریں", + "请输入6位数字开锁密码": "براہ کرم 6 ہندسوں کا ان لاک پاس ورڈ درج کریں", + "请输入开锁密码": "براہ کرم ان لاک پاس ورڈ درج کریں", + "接收者在有效期内可以不限次数使用": "وصول کنندگان قانونی مدت کے اندر لامحدود اوقات کے لئے ایکیز استعمال کرنے کے قابل ہیں۔", + "接收者可以使用此App开关锁": "وصول کنندہ اس ایپ کے ذریعہ لاک / ان لاک کرنے کے قابل ہیں۔", + "单次钥匙有效期为1小时,只能使用一次": "ون ٹائم ایکی ایک گھنٹے کے لئے درست ہے اور صرف ایک بار استعمال کیا جا سکتا ہے.", + "接收者可以在有效期内的固定时间段里,不限次数使用": "وصول کنندگان مقررہ سائیکل کے وقت کے اندر لامحدود اوقات کے لئے ایکیز استعمال کرنے کے قابل ہیں۔", + "获取模板失败": "ٹیمپلیٹ حاصل کرنے میں ناکام", + "微信通知": "WeChat نوٹیفکیشن", + "系统短信": "سسٹم ایس ایم ایس", + "系统邮件": "سسٹم ای میل", + "模板": "سانچا", + "新建模版": "ٹیمپلیٹ بنائیں", + "您好,您的密码是": "ہیلو، آپ کا پاس ورڈ ہے", + "密码名字": "پاس ورڈ کا نام", + "请输入6-9位密码": "براہ کرم 6-9 ہندسوں کا پاس ورڈ درج کریں", + "设置密码": "پاس ورڈ سیٹ کریں", + "操作成功,密码为": "کامیاب. پاس کوڈ ہے", + "类型:自定义-永久": "قسم: اپنی مرضی کے مطابق مستقل", + "实时播放": "ریئل ٹائم پلے بیک", + "点击对讲": "انٹرکام پر کلک کریں", + "长按开锁": "ان لاک کرنے کے لئے لمبا دبائیں", + "接听失败": "جواب دینے میں ناکام", + "请在锁设置中开启远程开锁": "براہ کرم لاک کی ترتیبات میں ریموٹ ان لاکنگ کو فعال کریں", + "接听": "جواب", + "截图已保存到相册": "البم میں محفوظ کردہ اسکرین شاٹ", + "录屏已保存到相册": "اسکرین ریکارڈنگ فائل کو البم میں محفوظ کیا گیا ہے", + "添加遥控": "ریموٹ کنٹرول شامل کریں", + "已连接到锁,请按遥控": "لاک سے منسلک، براہ کرم ریموٹ کنٹرول دبائیں", + "遥控号": "ریموٹ کنٹرول نمبر", + "遥控详情": "ریموٹ کنٹرول کی تفصیلات", + "照明": "روشنی", + "退出演示模式": "Exit demo mode", + "提示:当前界面为展示界面,添加设备后才能继续使用": "اشارہ: موجودہ انٹرفیس ایک ڈسپلے انٹرفیس ہے۔ آلہ شامل کرنے کے بعد ، آپ اسے استعمال کرنا جاری رکھ سکتے ہیں۔", + "门已上锁": "دروازہ بند ہے", + "您的账号在异地登录,如非本人,请尽快修改密码": "آپ کا اکاؤنٹ کسی نئی ڈیوائس سے لاگ ان کرنے کے لئے استعمال کیا گیا ہے", + "开门成功": "کامیابی کے ساتھ دروازہ کھولیں", + "开门失败": "دروازہ کھولنے میں ناکام", + "呼叫提醒": "یاد دہانی پر کال کریں", + "收到来自": "سے موصول ہوا", + "锁的呼叫": "لاک کال", + "加载数据中": "ڈیٹا لوڈ کر رہا ہے", + "搜索所有锁类型": "لاک کی تمام اقسام تلاش کریں", + "锁电量更新时间": "لاک بیٹری اپ ڈیٹ کا وقت", + "1月": "جان", + "2月": "فروری", + "3月": "مارچ", + "4月": "اپریل", + "5月": "مئی", + "6月": "جون", + "7月": "جولائی", + "8月": "اگست", + "9月": "ستمبر", + "10月": "اکتوبر", + "11月": "نومبر", + "12月": "دسمبر", + "热门城市": "گرم شہر", + "导出锁数据": "ایکسپورٹ لاک ڈیٹا", + "一键开锁": "ایک کلک ان لاک", + "已开通": "کھولی", + "英文": "انگريزی", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Francis", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Romunaă", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", + "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "ری سیٹ کرنے کے بعد ، لاک کی میٹاکارپل رگیں حذف کردی جائیں گی۔ کیا آپ واقعی دوبارہ ترتیب دینا چاہتے ہیں؟", + "在线": "آن لائن", + "离线": "آف لائن", + "购买记录": "خریداری کا ریکارڈ", + "使用记录": "صارف ریکارڈ", + "失效时间要大于当前时间": "میعاد ختم ہونے کا وقت موجودہ وقت سے زیادہ ہونا چاہئے", + "修改名字": "نام میں ترمیم کریں", + "时": "گھنٹہ", + "分": "منٹ", + "Amazon Alexa": "ایمیزون الیکسا", + "您可以使用Alexa进行开锁、闭锁和查看锁状态": "آپ لاک اسٹیٹس کو ان لاک ، لاک اور چیک کرنے کے لئے الیکسا کا استعمال کرسکتے ہیں۔", + "支持的国家": "حمایت یافتہ ممالک", + "支持的国家值": "امریکہ، کینیڈا، برطانیہ، آسٹریلیا، بھارت، جرمنی، فرانس، اٹلی، اسپین، جاپان", + "操作流程": "آپریشن کا عمل", + "操作流程值": "1 سمارٹ لاک ایپ کے ساتھ لاک اور گیٹ وے شامل کریں\n\n2 اے پی پی میں لاک کے ریموٹ ان لاکنگ فنکشن کو فعال کریں (یہ فنکشن ڈیفالٹ طور پر بند ہے)۔ اگر آپ کے پاس یہ اختیار نہیں ہے تو ، لاک الیکسا کی حمایت نہیں کرتا ہے۔\n\n3 الیکسا میں مہارت شامل کریں اور انہیں اسمارٹ لاک ایپ کے اکاؤنٹ اور پاس ورڈ کے ساتھ اختیار دیں۔ منظوری کامیاب ہونے کے بعد ، آپ اکاؤنٹ کے تحت آلات کو تلاش کرسکتے ہیں۔\n\n4 الیکسا ایپ میں لاک تلاش کریں ، وائس ان لاک فنکشن کو آن کریں ، اور زبان کا پاس ورڈ سیٹ کریں۔\n\n5 لاک کو الیکسا کے ذریعے چلایا جا سکتا ہے", + "Google Home": "گوگل ہوم", + "Action name": "ایکشن کا نام", + "ScienerSmart": "ScienerSmart", + "支持的语言": "حمایت یافتہ زبانیں", + "英语": "انگريزی", + "Google Home操作流程的值": "1. لاک اور گیٹ وے شامل کرنے کے لئے اسمارٹ لاک ایپ کا استعمال کریں\n\n2. اے پی پی میں لاک کے ریموٹ ان لاکنگ فنکشن کو فعال کریں (یہ فنکشن ڈیفالٹ طور پر بند ہے)۔ اس آپشن کے بغیر ، لاک گوگل ہوم کو سپورٹ نہیں کرتا ہے۔\n\n3. گوگل ہوم ایپ انسٹال کریں اور اوپری بائیں کونے میں \"+\" بٹن پر کلک کریں۔\n\n4. ترتیبات کے صفحے پر ، \"گوگل کے ساتھ کام کریں\" منتخب کریں۔\n\n5. \"سائنر اسمارٹ\" تلاش کریں اور اختیار دینے کے لئے اسمارٹ لاک ایپ اکاؤنٹ اور پاس ورڈ استعمال کریں۔", + "密码需至少包含数字/字母/字符中的2种组合": "پاس ورڈ میں مندرجہ ذیل میں سے کم از کم 2 شامل ہونا ضروری ہے: نمبر، حروف، اور خصوصی حروف", + "已开锁": "کھلا", + "已闭锁": "مقفل", + "两次密码不一致哦": "پاس ورڈ متضاد ہیں", + "中功率": "درمیانی طاقت", + "常规使用": "باقاعدگی سے استعمال", + "扫描设备": "Scan device", + "删除失败,网关可能已经离线,是否强制删除该数据?": "حذف کرنا ناکام رہا۔ گیٹ وے آف لائن ہوسکتا ہے۔ کیا آپ ڈیٹا کو زبردستی حذف کرنا چاہتے ہیں؟", + "超级管理员英文": "سپر ایڈمن", + "授权管理员英文": "ایڈمن بنائیں", + "普通管理员英文": "عام صارف", + "网关设备英文": "گیٹ وے", + "手机需联网英文": "نیڈنیٹ", + "年简称": "Y", + "月简称": "M", + "日简称": "D", + "时简称": "H", + "分简称": "M", + "跟随系统": "نظام کی پیروی کریں", + "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "ری سیٹ کرنے کے بعد ، لاک کے فنگر پرنٹس حذف ہوجائیں گے۔ کیا آپ یقینی طور پر اسے دوبارہ ترتیب دینا چاہتے ہیں؟", + "通话未接通,已挂断": "کال منسلک نہیں، لٹکا دی گئی", + "通话异常中断": "کال میں غیر معمولی رکاوٹ", + "通话连接失败": "کال کنکشن ناکام", + "已挂断": "لٹکا ہوا ہے", + "正在说话...": "اب بات کرتے ہیں...", + "设备不在线": "آلہ آن لائن نہیں ہے", + "设备未配网": "آلہ نیٹ ورک سے منسلک نہیں ہے", + "已静音": "آواز بند کر دی گئی ہے", + "该锁的远程开锁功能未启用": "اس لاک کا ریموٹ ان لاکنگ فنکشن فعال نہیں ہے۔", + "下载完成,请到相册查看": "ڈاؤن لوڈ مکمل، براہ کرم دیکھنے کے لئے البم پر جائیں", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "جب کیٹ آئی کو پاور سیونگ موڈ پر سیٹ کیا جاتا ہے تو ، نگرانی نہیں کی جاسکتی ہے۔ براہ کرم کیٹ آئی کی ترتیبات میں دوسرے طریقوں پر سوئچ کریں", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "جب کیٹ آئی کو پاور سیونگ موڈ پر سیٹ کیا جاتا ہے تو ریموٹ ان لاک کرنا ممکن نہیں ہوتا ہے۔ براہ کرم کیٹ آئی کی ترتیبات میں کسی دوسرے موڈ پر سوئچ کریں", + "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "ری سیٹ کرنے کے بعد ، لاک کا ریموٹ کنٹرول حذف کردیا جائے گا۔ کیا آپ اسے دوبارہ ترتیب دینا چاہتے ہیں؟", + "版本说明": "ورژن کی تفصیل", + "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "گیٹ وے کے چلنے کے بعد ، ری سیٹ بٹن کو 5 سیکنڈ تک دبائیں اور پکڑیں۔ جب نیلے اشارے کی روشنی چمکتی ہے تو اگلا پر کلک کریں", + "网关添加成功": "گیٹ وے نے کامیابی کے ساتھ اضافہ کیا" +} \ No newline at end of file diff --git a/lan/lan_vi.json b/lan/lan_vi.json index 593d87b7..8a6c76d3 100644 --- a/lan/lan_vi.json +++ b/lan/lan_vi.json @@ -1122,5 +1122,19 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Sau khi đặt lại, điều khiển từ xa của khóa sẽ bị xóa. Bạn có muốn đặt lại không?", "版本说明": "Thông tin phiên bản", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "Sau khi cổng được bật, Nhấn và giữ nút Reset trong 5 giây. Nhấp vào tiếp theo khi đèn báo màu xanh lam nhấp nháy", - "网关添加成功": "Gateway đã thêm thành công" + "网关添加成功": "Gateway đã thêm thành công", + "功能开启后,你将可以通过网关远程开锁。": "Sau khi chức năng được kích hoạt, bạn sẽ có thể mở khóa từ xa thông qua gateway.", + "录屏已保存到相册": "Trên màn hình lưu vào album", + "通话未接通,已挂断": "Gọi không liên lạc, cúp máy", + "通话异常中断": "Sự gián đoạn cuộc gọi bất thường", + "通话连接失败": "Kết nối cuộc gọi đã thất bại", + "已挂断": "Cúp máy", + "正在说话...": "Nói chuyện bây giờ...", + "设备不在线": "Thiết bị không có trên mạng", + "设备未配网": "Thiết bị không được kết nối với mạng", + "已静音": "Âm thanh đã bị tắt", + "该锁的远程开锁功能未启用": "Chức năng mở khóa từ xa của khóa này không được kích hoạt", + "下载完成,请到相册查看": "Hoàn tất tải về, xin hãy đến album để xem", + "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Khi mắt mèo được thiết lập để tiết kiệm điện, giám sát không thể được thực hiện. Hãy chuyển sang chế độ khác trong mắt mèo", + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Mở khóa từ xa là không thể khi mắt mèo được thiết lập ở chế độ tiết kiệm điện. Hãy chuyển sang chế độ khác trong thiết lập mắt mèo" } \ No newline at end of file From cdc83eb40052a2a0100ea15f20af5cb6d184e072 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Mon, 10 Mar 2025 18:12:35 +0800 Subject: [PATCH 010/135] =?UTF-8?q?fix=EF=BC=9A=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=8D=8A=E8=87=AA=E5=8A=A8=E9=94=81=E8=BF=9C=E7=A8=8B=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E5=BC=80=E9=94=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lockDetail/lockDetail_logic.dart | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index 2455c416..13a1a87e 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -639,18 +639,18 @@ class LockDetailLogic extends BaseGetXController { // 远程开锁 Future remoteOpenLock() async { final catEyeConfig = state.keyInfos.value.lockSetting?.catEyeConfig ?? []; - if (catEyeConfig.isNotEmpty && - catEyeConfig.length > 0 && - catEyeConfig[0].catEyeMode != 0) { - final LoginEntity entity = await ApiRepository.to.remoteOpenLock( - lockId: state.keyInfos.value.lockId.toString(), - timeOut: 60, - ); - if (entity.errorCode!.codeIsSuccessful) { - showToast('已开锁'.tr); - } - } else { + // 支持猫眼功能时,才需要判断是否是省电模式 + if (state.keyInfos.value.lockFeature?.isSupportCatEye == 1 && + catEyeConfig[0].catEyeMode == 0) { showToast('猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式'.tr); + return; + } + final LoginEntity entity = await ApiRepository.to.remoteOpenLock( + lockId: state.keyInfos.value.lockId.toString(), + timeOut: 60, + ); + if (entity.errorCode!.codeIsSuccessful) { + showToast('已开锁'.tr); } } From ef46fb88602932a7a635fac19379d9b7f4f30441 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 12:02:32 +0800 Subject: [PATCH 011/135] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A032bit=E7=9A=84?= =?UTF-8?q?=E9=94=81uuid=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/blue/blue_manage.dart | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/lib/blue/blue_manage.dart b/lib/blue/blue_manage.dart index 9aa7e77d..359758b9 100755 --- a/lib/blue/blue_manage.dart +++ b/lib/blue/blue_manage.dart @@ -179,12 +179,19 @@ class BlueManage { upload: false); if (isExit) { for (final ScanResult scanResult in results) { - if (((scanResult.advertisementData.serviceUuids.isNotEmpty - ? scanResult.advertisementData.serviceUuids[0] - : '') - .toString() - .contains('758824')) && - (scanResult.rssi >= -100)) { + if (scanResult.advertisementData.serviceUuids.isNotEmpty) { + // AppLog.log( + // '扫描到的设备:${scanResult.advertisementData.serviceUuids[0].toString()}'); + } else { + continue; + } + + final isMatch = _isMatch(scanResult + .advertisementData.serviceUuids + .map((e) => e.uuid) + .toList()); + + if (isMatch && (scanResult.rssi >= -100)) { // 查询id相同的元素 final int knownDeviceIndex = scanDevices.indexWhere( (ScanResult d) => @@ -261,10 +268,11 @@ class BlueManage { } final isMatch = _isMatch( - scanResult.advertisementData.serviceUuids - .map((e) => e.uuid) - .toList(), - deviceType); + scanResult.advertisementData.serviceUuids + .map((e) => e.uuid) + .toList(), + deviceType: deviceType, + ); // 判断名字为空的直接剔除 if (isMatch && (scanResult.rssi >= -100)) { // 查询id相同的元素 @@ -307,7 +315,8 @@ class BlueManage { } /// 判断是否包含指定的uuid - bool _isMatch(List serviceUuids, DeviceType deviceType) { + bool _isMatch(List serviceUuids, + {DeviceType deviceType = DeviceType.blue}) { // 获取设备类型数组 List deviceTypeList = getDeviceType(deviceType); From e6b6672ceb801d876c7c67bb110bcfef9f6f1ff1 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 12:08:16 +0800 Subject: [PATCH 012/135] =?UTF-8?q?feat:=E6=A0=A1=E5=87=86=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=94=B9=E4=B8=BA=E6=94=B6=E5=88=B0=E5=BA=94=E7=AD=94?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E4=BD=BF=E7=94=A8=E7=B3=BB=E7=BB=9F=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart b/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart index a6700931..6396bee5 100755 --- a/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart +++ b/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart @@ -86,8 +86,11 @@ class LockTimeLogic extends BaseGetXController { switch (status) { case 0x00: //成功 - final String dataEime = - DateTool().dateToYMDHNString('${state.serverTime}'); + // final String dataEime = + // DateTool().dateToYMDHNString('${state.serverTime}'); + + final String dataEime = DateTool().dateToYMDHNString( + '${DateTime.now().millisecondsSinceEpoch ~/ 1000}'); state.dateTime.value = dataEime; state.sureBtnState.value = 0; From e27667250743059f4b8ae92c6164797e26b9f65b Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 13:57:39 +0800 Subject: [PATCH 013/135] =?UTF-8?q?feat:=E4=BF=AE=E5=A4=8DIOS=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E5=A4=B4=E5=83=8F=E9=80=89=E6=8B=A9=E7=9B=B8=E5=86=8C?= =?UTF-8?q?=E6=97=B6=E5=87=BA=E7=8E=B0=E7=9A=84=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/widget/permission/permission_dialog.dart | 53 ++++++++++++++------ 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/lib/widget/permission/permission_dialog.dart b/lib/widget/permission/permission_dialog.dart index a68aaa7d..998eab8c 100755 --- a/lib/widget/permission/permission_dialog.dart +++ b/lib/widget/permission/permission_dialog.dart @@ -69,14 +69,22 @@ class PermissionDialog { CupertinoDialogAction( child: Text('不允许'.tr), onPressed: () { - BuglyTool.uploadExceptionWithEvent(eventStr: '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', detail: "不允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); + BuglyTool.uploadExceptionWithEvent( + eventStr: + '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', + detail: + "不允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); Get.back(result: false); }, ), CupertinoDialogAction( child: Text('允许'.tr), onPressed: () { - BuglyTool.uploadExceptionWithEvent(eventStr: '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', detail: "不允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); + BuglyTool.uploadExceptionWithEvent( + eventStr: + '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', + detail: + "不允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); Get.back(result: true); }, ), @@ -110,10 +118,15 @@ class PermissionDialog { if (Get.context == null) { return false; } - final AndroidDeviceInfo androidInfo = await DeviceInfoPlugin().androidInfo; - final bool isAndroid33 = - AppPlatform.isAndroid && androidInfo.version.sdkInt >= 33; - + bool isAndroid33 = false; + try { + final AndroidDeviceInfo androidInfo = + await DeviceInfoPlugin().androidInfo; + isAndroid33 = AppPlatform.isAndroid && androidInfo.version.sdkInt >= 33; + } catch (e) { + // 如果获取设备信息失败,默认使用旧版本权限申请方式 + isAndroid33 = false; + } //通用的局部函数 List requestPermission() { List permissions; @@ -148,7 +161,7 @@ class PermissionDialog { bool application = true; const Permission permission = Permission.photos; final List permissions = requestPermission(); - final dynamic cache = await Storage.getString(titles[permission]??''); + final dynamic cache = await Storage.getString(titles[permission] ?? ''); final bool isGranted = await permissionStatus(permissions); if (AppPlatform.isAndroid && !isGranted && cache is! String) { application = await showCupertinoDialog( @@ -187,7 +200,8 @@ class PermissionDialog { } } if (application) { - final Map statuses = await permissions.request(); + final Map statuses = + await permissions.request(); final bool isGranted = await permissionStatus(statuses.keys.toList()); return isGranted; } @@ -241,7 +255,7 @@ class PermissionDialog { bool application = true; const Permission permission = Permission.storage; final List permissions = requestPermission(); - final dynamic cache = await Storage.getString(titles[permission]??''); + final dynamic cache = await Storage.getString(titles[permission] ?? ''); final bool isGranted = await permissionStatus(permissions); if (AppPlatform.isAndroid && !isGranted && cache is! String) { application = await showCupertinoDialog( @@ -270,7 +284,7 @@ class PermissionDialog { }, ); if (application) { - await Storage.setString(titles[permission]??'', titles[permission]); + await Storage.setString(titles[permission] ?? '', titles[permission]); } } else if (cache is String) { final bool isDenied = !(await permissionStatus(permissions)); @@ -280,7 +294,8 @@ class PermissionDialog { } } if (application) { - final Map statuses = await permissions.request(); + final Map statuses = + await permissions.request(); final bool isGranted = await permissionStatus(statuses.keys.toList()); return isGranted; } @@ -295,7 +310,7 @@ class PermissionDialog { } bool application = true; final PermissionStatus status = await permission.status; - final dynamic cache = await Storage.getString(titles[permission]??''); + final dynamic cache = await Storage.getString(titles[permission] ?? ''); if (AppPlatform.isAndroid && !status.isGranted && cache is! String) { application = await showCupertinoDialog( context: Get.context!, @@ -309,14 +324,22 @@ class PermissionDialog { CupertinoDialogAction( child: Text('不允许'.tr), onPressed: () { - BuglyTool.uploadExceptionWithEvent(eventStr: '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', detail: "不允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); + BuglyTool.uploadExceptionWithEvent( + eventStr: + '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', + detail: + "不允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); Get.back(result: false); }, ), CupertinoDialogAction( child: Text('允许'.tr), onPressed: () { - BuglyTool.uploadExceptionWithEvent(eventStr: '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', detail: "允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); + BuglyTool.uploadExceptionWithEvent( + eventStr: + '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', + detail: + "允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); Get.back(result: true); }, ), @@ -325,7 +348,7 @@ class PermissionDialog { }, ); if (application) { - await Storage.setString(titles[permission]??'', titles[permission]); + await Storage.setString(titles[permission] ?? '', titles[permission]); } } else if (cache is String) { if (status.isDenied) { From f132fa1a1a16586c72e9d38ea3eca67ad40fe525 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 14:38:20 +0800 Subject: [PATCH 014/135] =?UTF-8?q?feat:=E4=BF=AE=E5=A4=8D=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E8=AF=A6=E6=83=85=E4=B8=AD=E7=9A=84=E6=9C=89=E6=95=88?= =?UTF-8?q?=E6=9C=9F=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passwordKeyDetail_logic.dart | 155 ++++-------------- 1 file changed, 33 insertions(+), 122 deletions(-) diff --git a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart index bc0a3615..9ed38957 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart @@ -181,6 +181,7 @@ class PasswordKeyDetailLogic extends BaseGetXController { }); } + //使用期限详情显示 //使用期限详情显示 String getUseDateStr() { final int? getPwdType = state.itemData.value.keyboardPwdType; @@ -195,170 +196,80 @@ class PasswordKeyDetailLogic extends BaseGetXController { switch (getPwdType) { case 1: //单次 1 只能在开始时间后6小时内使用一次 - useDateStr = '\n' + - '类型'.tr + - ':' + - '单次'.tr + - '\n' + - '\n' + - '有效期'.tr + - ':${startDateStr.toLocal().toString().substring(0, 16)} -- ${endDateStr.toLocal().toString().substring(0, 16)}\n\n' + - '这是单次密码,只能使用一次\n'; + useDateStr = + '${startDateStr.toLocal().toString().substring(0, 16)}\n${endDateStr.toLocal().toString().substring(0, 16)}'; + state.isCirculation.value = false; break; case 2: //永久 2 从开始时间开始永久有效,必需在开始时间24小时内使用一次,否则将失效 - useDateStr = '\n' + - '类型'.tr + - ':' + - '永久'.tr + - '\n' + - '\n注:\n' + - '必需在开始时间24小时内使用一次,否则将失效\n'; + useDateStr = '永久'; + state.isCirculation.value = false; break; case 3: //限期 3 在开始和结束时间内有效,必需在开始时间24小时内使用一次,否则将失效 - useDateStr = '\n' + - '类型'.tr + - ':' + - '限时'.tr + - '\n' + - '\n' + - '有效期'.tr + - ':${startDateStr.toLocal().toString().substring(0, 16)}-${endDateStr.toLocal().toString().substring(0, 16)}' + - '\n' + - '\n注:\n' + - '必需在开始时间24小时内使用一次,否则将失效\n'; + useDateStr = + '${startDateStr.toLocal().toString().substring(0, 16)}\n${DateTime.fromMillisecondsSinceEpoch(state.itemData.value.endDate! - 1).toLocal().toString().substring(0, 16)}'; + state.isCirculation.value = false; break; case 4: //删除 4 在锁上使用后会删除之前在锁上使用过的密码 - useDateStr = '类型'.tr + ':' + '清空'.tr; + useDateStr = + '${startDateStr.toLocal().toString().substring(0, 16)}\n${endDateStr.toLocal().toString().substring(0, 16)}'; + state.isCirculation.value = false; break; case 5: //周未循环 5 在周未开始和结束时间指定时间段内有效 - useDateStr = '\n' + - '类型'.tr + - ':' + - '循环'.tr + - '\n' + - '\n' + - '周末'.tr + - ' $starHour:00-$endHour:00' + - '\n'; + useDateStr = '周末'.tr + '$starHour:00-$endHour:00'; + state.isCirculation.value = true; break; case 6: //每日循环 6 每天开始和结束时间指定时间段内有效 - useDateStr = '\n' + - '类型'.tr + - ':' + - '循环'.tr + - '\n' + - '\n' + - '每日'.tr + - ' $starHour:00-$endHour:00' + - '\n'; + useDateStr = '每日'.tr + '$starHour:00-$endHour:00'; + state.isCirculation.value = true; break; case 7: //工作日循环 7 工作日开始和结束时间指定的时间段内有效 - useDateStr = '\n' + - '类型'.tr + - ':' + - '循环'.tr + - '\n' + - '\n' + - '工作日'.tr + - ' $starHour:00-$endHour:00' + - '\n'; + useDateStr = '工作日'.tr + '$starHour:00-$endHour:00'; + state.isCirculation.value = true; break; case 8: //周一循环 8 每周一开始和结束时间指定时间段内有效 - useDateStr = '\n' + - '类型'.tr + - ':' + - '循环'.tr + - '\n' + - '\n' + - '周一'.tr + - ' $starHour:00-$endHour:00' + - '\n'; + useDateStr = '周一'.tr + '$starHour:00-$endHour:00'; + state.isCirculation.value = true; break; case 9: //周二循环 9 每周二开始和结束时间指定时间段内有效 - useDateStr = '\n' + - '类型'.tr + - ':' + - '循环'.tr + - '\n' + - '\n' + - '周二'.tr + - ' $starHour:00-$endHour:00' + - '\n'; + useDateStr = '周二'.tr + '$starHour:00-$endHour:00'; + state.isCirculation.value = true; break; case 10: //周三循环 10 每周三开始和结束时间指定时间段内有效 - useDateStr = '\n' + - '类型'.tr + - ':' + - '循环'.tr + - '\n' + - '\n' + - '周三'.tr + - ' $starHour:00-$endHour:00' + - '\n'; + useDateStr = '周三'.tr + '$starHour:00-$endHour:00'; + state.isCirculation.value = true; break; case 11: //周四循环 11 每周四开始和结束时间指定时间段内有效 - useDateStr = '\n' + - '类型'.tr + - ':' + - '循环'.tr + - '\n' + - '\n' + - '周四'.tr + - ' $starHour:00 -$endHour:00' + - '\n'; + useDateStr = '周四'.tr + '$starHour:00-$endHour:00'; + state.isCirculation.value = true; break; case 12: //周五循环 12 每周五开始和结束时间指定时间段内有效 - useDateStr = '\n' + - '类型'.tr + - ':' + - '循环'.tr + - '\n' + - '\n' + - '周五'.tr + - ' $starHour:00-$endHour:00' + - '\n'; + useDateStr = '周五'.tr + '$starHour:00-$endHour:00'; + state.isCirculation.value = true; break; case 13: //周六循环 13 每周六开始和结束时间指定时间段内有效 - useDateStr = '\n' + - '类型'.tr + - ':' + - '循环'.tr + - '\n' + - '\n' + - '周六'.tr + - ' $starHour:00-$endHour:00' + - '\n'; + useDateStr = '周六'.tr + '$starHour:00-$endHour:00'; + state.isCirculation.value = true; break; case 14: //周日循环 14 每周日开始和结束时间指定时间段内有效 - useDateStr = '\n' + - '类型'.tr + - ':' + - '循环'.tr + - '\n' + - '\n' + - '周日'.tr + - ' $starHour:00-$endHour:00' + - '\n'; + useDateStr = '周日'.tr + '$starHour:00-$endHour:00'; + state.isCirculation.value = true; break; default: } - // return '您好,您的密码是'.tr + ':${state.itemData.value.keyboardPwd}\n$useDateStr\n${'密码名字'.tr}:${state.itemData.value.keyboardPwdName}'; - return '您好' + - ',\n您的开门密码是' + - ':${state.itemData.value.keyboardPwd}\n$useDateStr\n${'密码名字'.tr}:${state.itemData.value.keyboardPwdName}\n\n开锁时,先激活锁键盘,再输入密码,以#号结束,#号键在键盘右下角,有可能是其他图标'; + return useDateStr; } String getShareContentStr() { From f8eb6ea97716f738913ecda9cf0397204c1d3c1b Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 14:46:00 +0800 Subject: [PATCH 015/135] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E7=8C=AB?= =?UTF-8?q?=E7=9C=BC=E8=AE=BE=E7=BD=AE=E3=80=81=E5=BC=80=E9=97=A8=E6=96=B9?= =?UTF-8?q?=E5=90=91=E5=9B=BD=E9=99=85=E5=8C=96=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_en.json | 2 ++ lan/lan_keys.json | 2 ++ lan/lan_zh.json | 2 ++ .../lockSet/openDoorDirection/openDoorDirection_page.dart | 2 +- 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lan/lan_en.json b/lan/lan_en.json index 9fd07353..1f5ac308 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1135,6 +1135,8 @@ "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Remote unlocking is not possible when Cat Eye is set to power-saving mode. Please switch to another mode in Cat Eye settings", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "After reset, the remote control of the lock will be deleted. Do you want to reset it?", "版本说明": "Version description", + "呼叫目标": "Call target", + "管理员APP": "Administrator APP", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "After the gateway is powered on, press and hold the reset button for 5 seconds. Click Next when the blue indicator light flashes", "网关添加成功": "Gateway added successfully" } diff --git a/lan/lan_keys.json b/lan/lan_keys.json index 3a37f570..62c5b3f0 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1136,5 +1136,7 @@ "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "重置后,该锁的遥控都将被删除哦,确认要重置吗?", "版本说明": "版本说明", + "呼叫目标": "呼叫目标", + "管理员APP": "管理员APP", "网关添加成功": "网关添加成功" } diff --git a/lan/lan_zh.json b/lan/lan_zh.json index 27808a07..2204763f 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1136,5 +1136,7 @@ "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "重置后,该锁的遥控都将被删除哦,确认要重置吗?", "版本说明": "版本说明", + "呼叫目标": "呼叫目标", + "管理员APP": "管理员APP", "网关添加成功": "网关添加成功" } diff --git a/lib/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_page.dart b/lib/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_page.dart index 5d8094ed..ac619472 100755 --- a/lib/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_page.dart +++ b/lib/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_page.dart @@ -56,7 +56,7 @@ class _OpenDoorDirectionPageState extends State { height: 60.h, ), _buildTipsView( - "${'判断方法'.tr}:", + "${'判断方法:'.tr}:", '判断方法内容'.tr, false) ], From 97a36b58407f03e5fd7a91ceca765bc4c7d0a001 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 15:26:28 +0800 Subject: [PATCH 016/135] =?UTF-8?q?feat:=E4=BF=AE=E5=A4=8D=E5=BD=93?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E8=B7=9F=E9=9A=8F=E7=B3=BB=E7=BB=9F=E6=98=AF?= =?UTF-8?q?=E7=AE=80=E4=BD=93=E4=B8=AD=E6=96=87=E6=97=B6=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=BE=AE=E4=BF=A1=E5=85=AC=E4=BC=97=E5=8F=B7=E6=8E=A8?= =?UTF-8?q?=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mine/mineSet/mineSet/mineSet_page.dart | 2 +- lib/mine/mineSet/mineSet/mineSet_state.dart | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/mine/mineSet/mineSet/mineSet_page.dart b/lib/mine/mineSet/mineSet/mineSet_page.dart index 7f639d2b..a098bb8b 100755 --- a/lib/mine/mineSet/mineSet/mineSet_page.dart +++ b/lib/mine/mineSet/mineSet/mineSet_page.dart @@ -215,7 +215,7 @@ class _MineSetPageState extends State child: Obx(_isPushNotificationSwitch))), // if (F.appFlavor == Flavor.sky) Visibility( - visible: state.currentLanguageName == '简体中文'.tr, + visible: state.currentLanguageCode == 'zh_CN', child: CommonItem( leftTitel: '微信公众号推送'.tr, rightTitle: '', diff --git a/lib/mine/mineSet/mineSet/mineSet_state.dart b/lib/mine/mineSet/mineSet/mineSet_state.dart index af4973f9..e3733a9b 100755 --- a/lib/mine/mineSet/mineSet/mineSet_state.dart +++ b/lib/mine/mineSet/mineSet/mineSet_state.dart @@ -35,6 +35,10 @@ class MineSetState { .lanTitle; } + String get currentLanguageCode { + return currentLanguage.value; + } + RxBool isAmazonAlexa = false.obs; //亚马逊Alexa RxBool isGoogleHome = false.obs; //谷歌Home Rx amazonAlexaData = AmazonAlexa().obs; From 982a41cffe91b55a616fc8c4cc2d004c06bf324f Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 15:36:14 +0800 Subject: [PATCH 017/135] =?UTF-8?q?feat:=E8=B0=83=E6=95=B4=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E7=A8=8B=E5=92=8C=E5=85=B3=E9=97=AD=E3=80=81?= =?UTF-8?q?=E5=BC=80=E5=90=AF=E5=8F=AA=E6=9C=89=E4=B8=80=E7=A7=8D=E7=AE=80?= =?UTF-8?q?=E4=BD=93=E4=B8=AD=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mine/mineSet/google_home/google_home_page.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/mine/mineSet/google_home/google_home_page.dart b/lib/mine/mineSet/google_home/google_home_page.dart index b06aab3e..afdee0e3 100644 --- a/lib/mine/mineSet/google_home/google_home_page.dart +++ b/lib/mine/mineSet/google_home/google_home_page.dart @@ -76,11 +76,11 @@ class _GoogleHomePageState extends State { } Widget _buildBottomWidget() { - final String instructions = '1.用智能锁APP添加锁和网关\n\n' - '2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home\n\n' - '3.安装Google Home APP,点击左上角的“+”按钮\n\n' - '4.在设置页面,选择“与Google协同工作”\n\n' - '5.搜索“${state.googleHomeData.value.actionName ?? ''}”,并用智能锁APP的账号和密码进行授权'; + final String instructions = '${'1.用智能锁APP添加锁和网关'.tr}\n\n' + '${'2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home'.tr}\n\n' + '${'3.安装Google Home APP,点击左上角的加号按钮'.tr}\n\n' + '${'4.在设置页面,选择"与Google协同工作'.tr}\n\n' + '${'5.搜索'.tr}"${state.googleHomeData.value.actionName ?? ''}"${',并用智能锁APP的账号和密码进行授权'.tr}'; return Container( color: Colors.white, From ee5772da0212e7947b5571fb46dbb980896d2b25 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 15:47:05 +0800 Subject: [PATCH 018/135] =?UTF-8?q?feat:=E8=B0=83=E6=95=B4=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=AF=86=E7=A0=81=E8=BE=93=E5=85=A5=E6=A1=86=E7=9A=84?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tools/tf_loginInput.dart | 35 +++++++++-------------------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/lib/tools/tf_loginInput.dart b/lib/tools/tf_loginInput.dart index 4c7230c3..ba08fb72 100755 --- a/lib/tools/tf_loginInput.dart +++ b/lib/tools/tf_loginInput.dart @@ -28,7 +28,7 @@ class LoginInput extends StatefulWidget { BlockStrCallback? onchangeAction; BlockStrCallback? onSubmitted; BlockClickCallback? onTapAction; - bool? isLogin;// 是否是登录之前,因为登录之前的密码框文字显示缩在左上角 默认是false + bool? isLogin; // 是否是登录之前,因为登录之前的密码框文字显示缩在左上角 默认是false LoginInput({ Key? key, @@ -94,19 +94,16 @@ class _LoginInputState extends State { autofocus: false, inputFormatters: widget.inputFormatters, textInputAction: TextInputAction.next, - keyboardType: isPwd ? TextInputType.emailAddress : null, - style: isPwd - ? TextStyle( - fontSize: 22.sp, - color: Colors.transparent, - letterSpacing: 2.5, - fontFamily: 'Monospace', - ) - : null, + // 修改键盘类型为密码类型 + keyboardType: isPwd + ? TextInputType.visiblePassword + : TextInputType.emailAddress, + // 添加密码隐藏属性 + obscureText: isPwd, decoration: InputDecoration( //输入里面输入文字内边距设置 - contentPadding: const EdgeInsets.only( - top: 8.0, right: -10.0, bottom: 8.0), + // contentPadding: const EdgeInsets.only( + // top: 8.0, right: -10.0, bottom: 8.0), labelText: widget.label, labelStyle: TextStyle( fontSize: 22.sp, color: AppColors.darkGrayTextColor), @@ -122,20 +119,6 @@ class _LoginInputState extends State { : null, ), ), - if (isPwd) - Padding( - padding: EdgeInsets.only( - top: F.sw(skyCall: () => 27.h, xhjCall: () => widget.isLogin! ? 27.h : 39.h)), - child: Text( - pwd, - style: TextStyle( - fontSize: 22.sp, - color: AppColors.darkGrayTextColor, - letterSpacing: 2.0, - fontFamily: 'Monospace', - ), - ), - ), ], ), ), From 9972b5ddeb245f048e03f748dc684683f028e90b Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 15:47:31 +0800 Subject: [PATCH 019/135] =?UTF-8?q?feat:=E4=BF=AE=E5=A4=8D=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=A1=B5=E9=9D=A2=E9=80=89=E6=8B=A9=E5=9B=BD=E5=AE=B6?= =?UTF-8?q?=E6=97=B6=E4=B8=8D=E8=87=AA=E5=8A=A8=E8=BF=9B=E8=A1=8C=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/login/starLock_login_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/login/login/starLock_login_page.dart b/lib/login/login/starLock_login_page.dart index 0c39c91a..351125c0 100755 --- a/lib/login/login/starLock_login_page.dart +++ b/lib/login/login/starLock_login_page.dart @@ -108,7 +108,7 @@ class _StarLockLoginPageState extends State { if (result != null) { result as Map; state.countryCode.value = result['code']; - state.countryKey = result['countryName']; + state.countryKey.value = result['countryName']; logic.checkIpAction(); } }, From 1548934d34520def34fee6be21fd756d6b0bc554 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 15:48:08 +0800 Subject: [PATCH 020/135] =?UTF-8?q?feat:=E4=BC=98=E5=8C=96=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E5=B8=A7=E5=87=BD=E6=95=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handle/impl/udp_talk_data_handler.dart | 73 +++++++++++++------ 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart index ac3e8a2f..35412daf 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart @@ -189,40 +189,65 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle } Future> _processCompletePayload(Uint8List payload) async { - // 存储找到的所有完整帧 List frames = []; + int startIdx = -1; + final length = payload.length - 1; - // 手动遍历 payload - int i = 0; - while (i < payload.length - 1) { - // 寻找起始标志 0xFFD8 - if (payload[i] == 0xFF && payload[i + 1] == 0xD8) { - int startIdx = i; - i += 2; // 跳过起始标志 + for (int i = 0; i < length; i++) { + final currentByte = payload[i]; + final nextByte = payload[i + 1]; - // 寻找结束标志 0xFFD9 - while (i < payload.length - 1) { - if (payload[i] == 0xFF && payload[i + 1] == 0xD9) { - // 找到结束标志 0xFFD9 - int endIdx = i + 2; - // 使用 Uint8List.view 创建视图,避免内存分配 - frames.add( - Uint8List.view(payload.buffer, startIdx, endIdx - startIdx)); - i = endIdx; // 继续寻找下一个帧 - break; - } else { - i += 1; // 继续寻找结束标志 - } + if (currentByte == 0xFF) { + if (nextByte == 0xD8) { + startIdx = i; + i++; // Skip the next byte + } else if (nextByte == 0xD9 && startIdx != -1) { + frames + .add(Uint8List.view(payload.buffer, startIdx, i + 2 - startIdx)); + startIdx = -1; + i++; // Skip the next byte } - } else { - i += 1; // 继续寻找起始标志 } } - // 返回找到的所有完整帧 return frames; } +// Future> _processCompletePayload(Uint8List payload) async { +// // 存储找到的所有完整帧 +// List frames = []; +// +// // 手动遍历 payload +// int i = 0; +// while (i < payload.length - 1) { +// // 寻找起始标志 0xFFD8 +// if (payload[i] == 0xFF && payload[i + 1] == 0xD8) { +// int startIdx = i; +// i += 2; // 跳过起始标志 +// +// // 寻找结束标志 0xFFD9 +// while (i < payload.length - 1) { +// if (payload[i] == 0xFF && payload[i + 1] == 0xD9) { +// // 找到结束标志 0xFFD9 +// int endIdx = i + 2; +// // 使用 Uint8List.view 创建视图,避免内存分配 +// frames.add( +// Uint8List.view(payload.buffer, startIdx, endIdx - startIdx)); +// i = endIdx; // 继续寻找下一个帧 +// break; +// } else { +// i += 1; // 继续寻找结束标志 +// } +// } +// } else { +// i += 1; // 继续寻找起始标志 +// } +// } +// +// // 返回找到的所有完整帧 +// return frames; +// } + // Future> _processCompletePayload(Uint8List payload) async { // // 存储找到的所有完整帧 // List frames = []; From ec3990b0af7f7155a735c2d8bc37b048c2994982 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 15:49:01 +0800 Subject: [PATCH 021/135] =?UTF-8?q?feat:=E4=BF=AE=E5=A4=8D=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=9D=83=E9=99=90=E6=97=B6await=20DeviceInfoPlugin().?= =?UTF-8?q?androidInfo;=E5=87=BA=E7=8E=B0=E7=9A=84=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/widget/permission/permission_dialog.dart | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/widget/permission/permission_dialog.dart b/lib/widget/permission/permission_dialog.dart index 998eab8c..23d9a6cc 100755 --- a/lib/widget/permission/permission_dialog.dart +++ b/lib/widget/permission/permission_dialog.dart @@ -213,10 +213,15 @@ class PermissionDialog { if (Get.context == null) { return false; } - final AndroidDeviceInfo androidInfo = await DeviceInfoPlugin().androidInfo; - final bool isAndroid33 = - AppPlatform.isAndroid && androidInfo.version.sdkInt >= 33; - + bool isAndroid33 = false; + try { + final AndroidDeviceInfo androidInfo = + await DeviceInfoPlugin().androidInfo; + isAndroid33 = AppPlatform.isAndroid && androidInfo.version.sdkInt >= 33; + } catch (e) { + // 如果获取设备信息失败,默认使用旧版本权限申请方式 + isAndroid33 = false; + } //通用的局部函数 List requestPermission() { List permissions; From bae56ad094aa7586e2b42311da60ff43a9c76e10 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 15:50:50 +0800 Subject: [PATCH 022/135] =?UTF-8?q?feat:=E6=81=A2=E5=A4=8D=E9=94=81?= =?UTF-8?q?=E6=A0=A1=E5=87=86=E6=97=B6=E9=97=B4=E8=87=B3=E5=8E=9F=E6=9C=89?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart b/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart index 6396bee5..6e2fdf36 100755 --- a/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart +++ b/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart @@ -86,11 +86,9 @@ class LockTimeLogic extends BaseGetXController { switch (status) { case 0x00: //成功 - // final String dataEime = - // DateTool().dateToYMDHNString('${state.serverTime}'); + final String dataEime = + DateTool().dateToYMDHNString('${state.serverTime}'); - final String dataEime = DateTool().dateToYMDHNString( - '${DateTime.now().millisecondsSinceEpoch ~/ 1000}'); state.dateTime.value = dataEime; state.sureBtnState.value = 0; From 5b84cfdffd80bfd535f4c17111b420a22563b203 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 15:51:44 +0800 Subject: [PATCH 023/135] =?UTF-8?q?feat:=E8=B0=83=E6=95=B4=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_ar.json | 11 ++++++++++- lan/lan_bg.json | 11 ++++++++++- lan/lan_bn.json | 19 ++++++++++++++----- lan/lan_cs.json | 11 ++++++++++- lan/lan_da.json | 11 ++++++++++- lan/lan_de.json | 11 ++++++++++- lan/lan_el.json | 11 ++++++++++- lan/lan_en.json | 7 +++++++ lan/lan_es.json | 11 ++++++++++- lan/lan_et.json | 11 ++++++++++- lan/lan_fi.json | 11 ++++++++++- lan/lan_fr.json | 11 ++++++++++- lan/lan_he.json | 11 ++++++++++- lan/lan_hi.json | 11 ++++++++++- lan/lan_hk.json | 11 ++++++++++- lan/lan_hr.json | 11 ++++++++++- lan/lan_hu.json | 11 ++++++++++- lan/lan_id.json | 11 ++++++++++- lan/lan_it.json | 11 ++++++++++- lan/lan_ja.json | 11 ++++++++++- lan/lan_keys.json | 10 ++++++++++ lan/lan_kk.json | 11 ++++++++++- lan/lan_ko.json | 11 ++++++++++- lan/lan_lt.json | 11 ++++++++++- lan/lan_ms.json | 11 ++++++++++- lan/lan_nl.json | 11 ++++++++++- lan/lan_pl.json | 11 ++++++++++- lan/lan_pt.json | 11 ++++++++++- lan/lan_ro.json | 11 ++++++++++- lan/lan_ru.json | 11 ++++++++++- lan/lan_sk.json | 11 ++++++++++- lan/lan_sr_cyrl.json | 11 ++++++++++- lan/lan_sv.json | 11 ++++++++++- lan/lan_th.json | 11 ++++++++++- lan/lan_tr.json | 11 ++++++++++- lan/lan_tw.json | 11 ++++++++++- lan/lan_uk.json | 11 ++++++++++- lan/lan_ur.json | 11 ++++++++++- lan/lan_vi.json | 11 ++++++++++- lan/lan_zh.json | 10 ++++++++++ 40 files changed, 401 insertions(+), 41 deletions(-) diff --git a/lan/lan_ar.json b/lan/lan_ar.json index 938e2aa1..fc977f2f 100644 --- a/lan/lan_ar.json +++ b/lan/lan_ar.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "وظيفة الفتح عن بعد لهذا القفل غير ممكنة", "下载完成,请到相册查看": "اكتملت عملية التحميل، الرجاء الذهاب إلى الألبوم لمشاهدته", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "عند ضبط عين على وضع توفير الطاقة لا يمكن إجراء المراقبة يرجى الانتقال إلى الأوضاع الأخرى في إعدادات", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "لا يمكن فتح القفل عن بعد عند ضبط عين على وضع توفير الطاقة يرجى الانتقال إلى وضع آخر في إعدادات عين القطة" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "لا يمكن فتح القفل عن بعد عند ضبط عين على وضع توفير الطاقة يرجى الانتقال إلى وضع آخر في إعدادات عين القطة", + "呼叫目标": "الاتصال الهدف", + "管理员APP": "برنامج التطبيقات الخاص بالمسؤول", + "可视门铃码": "رمز جرس الباب البصري", + "电子反锁": "جهاز إلكتروني لمنع القفل", + "双重认证": "المصادقة من عاملين", + "双锁联动": "وصلة القفل المزدوج", + "1.用智能锁APP添加锁和网关": "1. أضف أقفال وبوابات باستخدام تطبيق القفل الذكي", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. تمكين وظيفة الفتح عن بعد للقفل في APP (يتم إيقاف هذه الوظيفة بشكل افتراضي). إذا كان هذا الخيار غير متاح، لن يدعم القفل جوجل هوم", + "3.安装Google Home APP,点击左上角的加号按钮": "3. قم بتثبيت تطبيق Google Home وانقر فوق الزر زائد في الزاوية العلوية اليسرى" } \ No newline at end of file diff --git a/lan/lan_bg.json b/lan/lan_bg.json index 033c9ef5..ac25d40b 100644 --- a/lan/lan_bg.json +++ b/lan/lan_bg.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Функцията за дистанционно отключване на тази ключалка не е активирана", "下载完成,请到相册查看": "Изтеглянето е завършено, моля, отидете на албума, за да го видите", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Когато Cat Eye е настроен на режим на пестене на енергия, наблюдението не може да се извършва. Моля, превключете към други режими в настройките на Cat Eye", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Дистанционното отключване не е възможно, когато Cat Eye е настроен в режим на пестене на енергия. Моля, превключете на друг режим в настройките на Cat Eye" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Дистанционното отключване не е възможно, когато Cat Eye е настроен в режим на пестене на енергия. Моля, превключете на друг режим в настройките на Cat Eye", + "呼叫目标": "Цел на обаждане", + "管理员APP": "Приложение за администратор", + "可视门铃码": "Визуален код на звънеца", + "电子反锁": "Електронна анти блокировка", + "双重认证": "Двуфакторно удостоверяване", + "双锁联动": "Връзка с двойно заключване", + "1.用智能锁APP添加锁和网关": "1. Добавете брави и шлюзове с помощта на приложението Smart Lock", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Активирайте функцията за дистанционно отключване на ключалката в приложението (тази функция е изключена по подразбиране). Ако тази опция не е налице, заключването няма да поддържа Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Инсталирайте приложението Google Home и щракнете върху бутона плюс в горния ляв ъгъл" } \ No newline at end of file diff --git a/lan/lan_bn.json b/lan/lan_bn.json index 3a4df8b0..a2f980ee 100644 --- a/lan/lan_bn.json +++ b/lan/lan_bn.json @@ -177,7 +177,7 @@ "开启": "টেকওন", "确定要开启重置键?": "গানট্টটন?", "确定要关闭重置键?": "গানট্টটন?", - "隐藏无效开锁权限": "Hide ali▁alidaccessGenericName", + "隐藏无效开锁权限": "অবৈধ অনুমতি আড়াল করো", "APP开锁时需手机连网的锁": "ব্লকস্ক্রিয়ামিংফোনলাইন", "增值服务": "ওয়ার্ডেরিসিস", "关于": "কুবআউট", @@ -217,7 +217,7 @@ "重新通电": "পরীক্ষা", "指示灯": "কেয়ানারেটরলাইট", "选择网关": "সিওসিকারওয়ে", - "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5 gisnoteigpped,.", + "不支持5G WiFi网络,请选择2.4G WiFi网络进行配置": "5G ওয়াইফাই নেটওয়ার্ক সমর্থন করে না, কনফিগার করার জন্য 2.4G ওয়াইফাই নেটওয়ার্ক নির্বাচন করুন", "WiFi密码": "উইফিক", "请输入WiFi密码": "দ্বিতীয় ওয়ার্ড", "网关名称": "সমুদ্রনাম", @@ -1087,13 +1087,13 @@ "修改名字": "নেম", "时": "Hour", "分": "নিউট", - "Amazon Alexa": "Ammogonalexa", + "Amazon Alexa": "Amazon Alexa", "您可以使用Alexa进行开锁、闭锁和查看锁状态": "/অনুপন্থির", "支持的国家": "আদিবাস্য", "支持的国家值": "ইউসা, চা, uk, ঊর্ধ্ব, ডাইডিয়া, germany, ডিফায়েন্স, লি, ইম্পোসি, ইজেড", "操作流程": "ক্যামেশনprocesscess", "操作流程值": "1 বিরোধীদ্যালক্যান্ডgatkorethrouthhescartchlockParp\n\n2 দশমিক... ...সম্পোকলকিং... লকটিংয়ের (সংখ্যা ইংলিপিস অফবি-রফ-এফল্ট)। ফিফডোনট্যানস্ট্রিওপশন, থেলক ক্যান্টোনট\n\n3 বিদ্রোহী স্কুই ls টু-এক্সাআন্ড ঊর্ধ্বতন পোস্টার্থে\n\n৪লক্যাটথলকের দিন ইক্সাপপ্প, টেসিতে ইসোলাকক fun\n\n5thelockcanbe equavaedunderroughalexaxa", - "Google Home": "শ্রোগল", + "Google Home": "Google Home", "Action name": "কর্মসূচী", "ScienerSmart": "ইসিসিভার্ট", "支持的语言": "আদিবাস্য", @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "এই লকের রিমোট আনলকিং ফাংশন সক্ষম নেই", "下载完成,请到相册查看": "ডাউনলোড সম্পন্ন হয়েছে, দেখতে অনুগ্রহ করে অ্যালবামে যান", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "যখন ক্যাট আই পাওয়ার-সেভিং মোডে সেট করা থাকে, তখন পর্যবেক্ষণ করা যায় না। দয়া করে ক্যাট আই সেটিংসে অন্যান্য মোডে স্যুইচ করুন", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "ক্যাট আই পাওয়ার-সাশ্রয় মোডে সেট করা থাকলে রিমোট আনলক করা সম্ভব নয়। দয়া করে ক্যাট আই সেটিংসে অন্য মোডে স্যুইচ করুন" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "ক্যাট আই পাওয়ার-সাশ্রয় মোডে সেট করা থাকলে রিমোট আনলক করা সম্ভব নয়। দয়া করে ক্যাট আই সেটিংসে অন্য মোডে স্যুইচ করুন", + "呼叫目标": "কল টার্গেট", + "管理员APP": "প্রশাসক অ্যাপ", + "可视门铃码": "ভিজ্যুয়াল ডোরবেল কোড", + "电子反锁": "বৈদ্যুতিন বিরোধী লক", + "双重认证": "টু-ফ্যাক্টর অথেনটিকেশন", + "双锁联动": "ডাবল লক লিঙ্কেজ", + "1.用智能锁APP添加锁和网关": "1. স্মার্ট লক অ্যাপ ব্যবহার করে লক ও গেটওয়ে যোগ করুন", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. অ্যাপে লকের রিমোট আনলকিং ফাংশন সক্ষম করুন (এই ফাংশনটি ডিফল্টরূপে বন্ধ রয়েছে)। যদি এই বিকল্পটি উপলভ্য না হয় তবে লকটি গুগল হোম সমর্থন করবে না", + "3.安装Google Home APP,点击左上角的加号按钮": "গুগল হোম অ্যাপ্লিকেশনটি ইনস্টল করুন এবং উপরের বাম কোণে প্লাস বোতামটি ক্লিক করুন" } \ No newline at end of file diff --git a/lan/lan_cs.json b/lan/lan_cs.json index ceff8a23..33e659a2 100644 --- a/lan/lan_cs.json +++ b/lan/lan_cs.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Funkce dálkového odemykání tohoto zámku není povolena", "下载完成,请到相册查看": "Stahování dokončeno, přejděte prosím na album k zobrazení", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Když je Cat Eye nastaven do úsporného režimu, monitorování nelze provádět. Přepněte prosím do jiných režimů v nastavení Cat Eye", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Dálkové odemykání není možné, pokud je Cat Eye nastaven do úsporného režimu. Přepněte prosím do jiného režimu v nastavení Cat Eye" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Dálkové odemykání není možné, pokud je Cat Eye nastaven do úsporného režimu. Přepněte prosím do jiného režimu v nastavení Cat Eye", + "呼叫目标": "Cíl hovoru", + "管理员APP": "Aplikace správce", + "可视门铃码": "Vizuální kód zvonku", + "电子反锁": "Elektronické blokování", + "双重认证": "Dvoufaktorová autentizace", + "双锁联动": "Dvojitý zámek", + "1.用智能锁APP添加锁和网关": "1. Přidejte zámky a brány pomocí aplikace chytrého zámku", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Povolte funkci dálkového odemykání zámku v APP (tato funkce je ve výchozím nastavení vypnutá). Pokud tato možnost není k dispozici, zámek nebude podporovat Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Nainstalujte aplikaci Google Home a klikněte na tlačítko plus v levém horním rohu" } \ No newline at end of file diff --git a/lan/lan_da.json b/lan/lan_da.json index 09b0b141..3c6a2175 100644 --- a/lan/lan_da.json +++ b/lan/lan_da.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Fjernoplåsningsfunktionen for denne lås er ikke aktiveret", "下载完成,请到相册查看": "Download fuldført, gå til albummet for at se", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Når Cat Eye er indstillet til strømbesparende tilstand, kan overvågning ikke udføres. Skift venligst til andre tilstande i Cat Eye-indstillingerne", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Fjernoplåsning er ikke mulig, når Cat Eye er indstillet til strømbesparende tilstand. Skift venligst til en anden tilstand i Cat Eye-indstillinger" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Fjernoplåsning er ikke mulig, når Cat Eye er indstillet til strømbesparende tilstand. Skift venligst til en anden tilstand i Cat Eye-indstillinger", + "呼叫目标": "Mål for opkald", + "管理员APP": "Administrator APP", + "可视门铃码": "Visuel dørklokkekode", + "电子反锁": "Elektronisk anti-lås", + "双重认证": "To-faktor-godkendelse", + "双锁联动": "Dobbelt låseforbindelse", + "1.用智能锁APP添加锁和网关": "1. Tilføj låse og gateways ved hjælp af smart lock-appen", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Aktiver fjernoplåsningsfunktionen for låsen i APP'en (denne funktion er slået fra som standard). Hvis denne mulighed ikke er tilgængelig, understøtter låsen ikke Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installer Google Home-appen, og klik på plusknappen i øverste venstre hjørne" } \ No newline at end of file diff --git a/lan/lan_de.json b/lan/lan_de.json index e4b18d4d..3f68aeee 100644 --- a/lan/lan_de.json +++ b/lan/lan_de.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Die fernsteuerung des schlüssels nicht geöffnet", "下载完成,请到相册查看": "Die herunterladen ist abgeschlossen. Gehen sie ins fotoalbum", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Die überwachung kann nicht durchgeführt werden, wenn die katze auf schaltungsmodus eingestellt ist. Wechseln sie in die einstellungen für die katze auf einen anderen modus", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Die katze kann nicht aus der ferne entsperren, wenn sie so eingestellt ist, dass strom gespart wird Wechseln sie in die einstellungen für die katze auf einen anderen modus" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Die katze kann nicht aus der ferne entsperren, wenn sie so eingestellt ist, dass strom gespart wird Wechseln sie in die einstellungen für die katze auf einen anderen modus", + "呼叫目标": "Aktiviere ziel.", + "管理员APP": "Administrator tor wenden.", + "可视门铃码": "Achter türcode", + "电子反锁": "Die elektronische abwehrvorrichtung", + "双重认证": "Duale identität", + "双锁联动": "Ein doppelschloss verbindet sich", + "1.用智能锁APP添加锁和网关": "1. Schlösser und gateway mit der anwendung intelligente schlösser hinzufügen", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Entsichern in einer APP, die ein schloss öffnet (standard abschalten) Wenn diese option nicht verfügbar ist, wird das schloss google nicht unterstützen", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installiert die google-app und klicken auf den knopf hinzufügen in der oberen linken ecke" } \ No newline at end of file diff --git a/lan/lan_el.json b/lan/lan_el.json index 91697172..833e8146 100644 --- a/lan/lan_el.json +++ b/lan/lan_el.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Η λειτουργία απομακρυσμένου ξεκλειδώματος αυτής της κλειδαριάς δεν είναι ενεργοποιημένη", "下载完成,请到相册查看": "Η λήψη ολοκληρώθηκε, μεταβείτε στο άλμπουμ για προβολή", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Όταν το Cat Eye έχει ρυθμιστεί σε λειτουργία εξοικονόμησης ενέργειας, δεν είναι δυνατή η εκτέλεση παρακολούθησης. Μεταβείτε σε άλλες λειτουργίες στις ρυθμίσεις του Cat Eye", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Το απομακρυσμένο ξεκλείδωμα δεν είναι δυνατό όταν το Cat Eye έχει ρυθμιστεί σε λειτουργία εξοικονόμησης ενέργειας. Μεταβείτε σε άλλη λειτουργία στις ρυθμίσεις του Cat Eye" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Το απομακρυσμένο ξεκλείδωμα δεν είναι δυνατό όταν το Cat Eye έχει ρυθμιστεί σε λειτουργία εξοικονόμησης ενέργειας. Μεταβείτε σε άλλη λειτουργία στις ρυθμίσεις του Cat Eye", + "呼叫目标": "Στόχος κλήσης", + "管理员APP": "Εφαρμογή διαχειριστή", + "可视门铃码": "Οπτικός κωδικός κουδουνιού πόρτας", + "电子反锁": "Ηλεκτρονικό αντικλείδωμα", + "双重认证": "Έλεγχος ταυτότητας δύο παραγόντων", + "双锁联动": "Σύνδεσμος διπλού κλειδώματος", + "1.用智能锁APP添加锁和网关": "1. Προσθέστε κλειδαριές και πύλες χρησιμοποιώντας την εφαρμογή Smart Lock", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Ενεργοποιήστε τη λειτουργία απομακρυσμένου ξεκλειδώματος της κλειδαριάς στην εφαρμογή (αυτή η λειτουργία είναι απενεργοποιημένη από προεπιλογή). Εάν αυτή η επιλογή δεν είναι διαθέσιμη, το κλείδωμα δεν θα υποστηρίζει το Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Εγκαταστήστε την εφαρμογή Google Home και κάντε κλικ στο κουμπί συν στην επάνω αριστερή γωνία" } \ No newline at end of file diff --git a/lan/lan_en.json b/lan/lan_en.json index 1f5ac308..bf8243ca 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1137,6 +1137,13 @@ "版本说明": "Version description", "呼叫目标": "Call target", "管理员APP": "Administrator APP", + "可视门铃码": "Visual doorbell code", + "电子反锁": "Electronic anti lock", + "双重认证": "Two-factor authentication", + "双锁联动": "Double lock linkage", + "1.用智能锁APP添加锁和网关": "1. Add locks and gateways using the smart lock app", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Enable the remote unlocking function of the lock in the APP (this function is turned off by default). If this option is not available, the lock will not support Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Install the Google Home app and click the plus button in the upper left corner", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "After the gateway is powered on, press and hold the reset button for 5 seconds. Click Next when the blue indicator light flashes", "网关添加成功": "Gateway added successfully" } diff --git a/lan/lan_es.json b/lan/lan_es.json index e1f203ba..efd54202 100644 --- a/lan/lan_es.json +++ b/lan/lan_es.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "La función de desbloqueo remoto de este bloqueo no está habilitada", "下载完成,请到相册查看": "Descargar completado, por favor vaya al álbum para ver", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Cuando Cat Eye está configurado en modo de ahorro de energía, no se puede realizar la monitorización. Cambie a otros modos en la configuración de ojo gato", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "El desbloqueo remoto no es posible cuando Cat Eye está en modo de ahorro de energía. Cambie a otro modo en la configuración de ojos de gato" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "El desbloqueo remoto no es posible cuando Cat Eye está en modo de ahorro de energía. Cambie a otro modo en la configuración de ojos de gato", + "呼叫目标": "Objetivo de la llamada", + "管理员APP": "Aplicación de administrador", + "可视门铃码": "Código de timbre Visual de la puerta", + "电子反锁": "Antibloqueo electrónico", + "双重认证": "Autenticación de dos factores", + "双锁联动": "Doble cierre", + "1.用智能锁APP添加锁和网关": "1. Agregue bloqueos y puertas de enlace con la aplicación smart lock", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Habilitar la función de desbloqueo remoto del bloqueo en la aplicación (esta función se desactiva por defecto). Si esta opción no está disponible, el bloqueo no será compatible con Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Instale la aplicación de Google Home y haga clic en el botón más en la esquina superior izquierda" } \ No newline at end of file diff --git a/lan/lan_et.json b/lan/lan_et.json index c0a777f0..9fe1badb 100644 --- a/lan/lan_et.json +++ b/lan/lan_et.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Selle luku kaugavamise funktsioon pole lubatud", "下载完成,请到相册查看": "Allalaadimine on lõpetatud, vaatamiseks minge albumisse", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Kui Cat Eye on seatud energiasäästurežiimile, ei saa jälgimist teostada. Palun lülituge Cat Eye seadetes muudele režiimidele", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Kaugavamine ei ole võimalik, kui Cat Eye on seatud energiasäästurežiimile. Palun lülituge Cat Eye seadetes teisele režiimile" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Kaugavamine ei ole võimalik, kui Cat Eye on seatud energiasäästurežiimile. Palun lülituge Cat Eye seadetes teisele režiimile", + "呼叫目标": "Kõne sihtmärk", + "管理员APP": "Administraatori rakendus", + "可视门铃码": "Visuaalne uksekella kood", + "电子反锁": "Elektrooniline mitteblokeeruv", + "双重认证": "Kahefaktoriline autentimine", + "双锁联动": "Kahekordne lukustusühendus", + "1.用智能锁APP添加锁和网关": "1. Lisage lukke ja lüüse nutiluku rakenduse abil", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Lubage rakenduses APP luku kaugavamise funktsioon (see funktsioon on vaikimisi välja lülitatud). Kui see valik pole saadaval, ei toeta lukk Google Home'i", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installige rakendus Google Home ja klõpsake vasakus ülanurgas plussnuppu" } \ No newline at end of file diff --git a/lan/lan_fi.json b/lan/lan_fi.json index 079be028..0cd26944 100644 --- a/lan/lan_fi.json +++ b/lan/lan_fi.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Tämän lukon etälukituksen avaustoiminto ei ole käytössä", "下载完成,请到相册查看": "Lataus valmis, siirry albumiin nähdäksesi", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Kun Cat Eye on asetettu virransäästötilaan, valvontaa ei voi suorittaa. Vaihda muihin tiloihin Cat Eye -asetuksissa", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Lukituksen avaaminen ei ole mahdollista, kun Cat Eye on asetettu virransäästötilaan. Vaihda toiseen tilaan Cat Eye -asetuksissa" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Lukituksen avaaminen ei ole mahdollista, kun Cat Eye on asetettu virransäästötilaan. Vaihda toiseen tilaan Cat Eye -asetuksissa", + "呼叫目标": "Puhelun kohde", + "管理员APP": "Järjestelmänvalvojan APP", + "可视门铃码": "Visuaalinen ovikellon koodi", + "电子反锁": "Elektroninen lukkiutumaton", + "双重认证": "Kaksivaiheinen todennus", + "双锁联动": "Kaksinkertainen lukitus", + "1.用智能锁APP添加锁和网关": "1. Lisää lukkoja ja yhdyskäytäviä älylukkosovelluksella", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Ota lukon etälukituksen avaustoiminto käyttöön APP:ssa (tämä toiminto on oletuksena pois päältä). Jos tämä vaihtoehto ei ole käytettävissä, lukko ei tue Google Homea", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Asenna Google Home -sovellus ja napsauta vasemmassa yläkulmassa olevaa pluspainiketta" } \ No newline at end of file diff --git a/lan/lan_fr.json b/lan/lan_fr.json index 0df73d91..b0d0bd3d 100644 --- a/lan/lan_fr.json +++ b/lan/lan_fr.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "La fonction de déverrouillage à distance de ce verrou n’est pas activée", "下载完成,请到相册查看": "Téléchargement terminé, s’il vous plaît aller à l’album pour voir", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Lorsque l’oeil de chat est réglé en mode économie d’énergie, la surveillance ne peut pas être effectuée. S’il vous plaît passer à d’autres modes dans les paramètres de l’oeil de chat", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Le déverrouillage à distance n’est pas possible lorsque l’oeil de chat est réglé sur le mode d’économie d’énergie. Veuillez passer à un autre mode dans les paramètres des yeux de chat" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Le déverrouillage à distance n’est pas possible lorsque l’oeil de chat est réglé sur le mode d’économie d’énergie. Veuillez passer à un autre mode dans les paramètres des yeux de chat", + "呼叫目标": "Cible d’appel", + "管理员APP": "Application administrateur", + "可视门铃码": "Code visuel de sonnette", + "电子反锁": "Anti serrure électronique", + "双重认证": "Authentification à deux facteurs", + "双锁联动": "Double liaison de serrure", + "1.用智能锁APP添加锁和网关": "1. Ajoutez des serrures et des passerelles à l’aide de l’application smart lock", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Activez la fonction de déverrouillage à distance de la serrure dans l’application (cette fonction est désactivée par défaut). Si cette option n’est pas disponible, le verrou ne prendra pas en charge Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installez l’application Google Home et cliquez sur le bouton plus dans le coin supérieur gauche" } \ No newline at end of file diff --git a/lan/lan_he.json b/lan/lan_he.json index 96df165b..f1110789 100644 --- a/lan/lan_he.json +++ b/lan/lan_he.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "פונקציית ביטול הנעילה מרחוק של מנעול זה אינה מופעלת", "下载完成,请到相册查看": "ההורדה הושלמה, אנא עבור לאלבום לצפייה", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "כאשר Cat Eye מוגדר למצב חיסכון בחשמל, לא ניתן לבצע ניטור. עבור למצבים אחרים בהגדרות Cat Eye", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "ביטול נעילה מרחוק אינו אפשרי כאשר Cat Eye מוגדר למצב חיסכון בחשמל. עבור למצב אחר בהגדרות Cat Eye" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "ביטול נעילה מרחוק אינו אפשרי כאשר Cat Eye מוגדר למצב חיסכון בחשמל. עבור למצב אחר בהגדרות Cat Eye", + "呼叫目标": "יעד שיחה", + "管理员APP": "יישום מנהל מערכת", + "可视门铃码": "קוד פעמון דלת חזותי", + "电子反锁": "אנטי לוק אלקטרוני", + "双重认证": "אימות דו-שלבי", + "双锁联动": "הצמדת נעילה כפולה", + "1.用智能锁APP添加锁和网关": "1. הוסיפו מנעולים ושערים באמצעות אפליקציית Smart Lock", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. הפעל את פונקציית ביטול הנעילה מרחוק של המנעול באפליקציה (פונקציה זו כבויה כברירת מחדל). אם אפשרות זו אינה זמינה, המנעול לא יתמוך ב-Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. התקן את אפליקציית Google Home ולחץ על כפתור הפלוס בפינה השמאלית העליונה" } \ No newline at end of file diff --git a/lan/lan_hi.json b/lan/lan_hi.json index d32b69fc..1360cfd5 100644 --- a/lan/lan_hi.json +++ b/lan/lan_hi.json @@ -1136,5 +1136,14 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "रीसेट के बाद, लॉक का रिमोट कंट्रोल हटा दिया जाएगा। क्या आप इसे रीसेट करना चाहते हैं?", "版本说明": "संस्करण वर्णन", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "गेटवे चालू होने के बाद, रीसेट बटन को 5 सेकंड के लिए दबाकर रखें। जब नीला संकेतक हल्का फ्लैश हो, तो अगला क्लिक करें।", - "网关添加成功": "गेटवे सफलतापूर्वक जोड़ा गया" + "网关添加成功": "गेटवे सफलतापूर्वक जोड़ा गया", + "呼叫目标": "कॉल लक्ष्य", + "管理员APP": "व्यवस्थापक एप", + "可视门铃码": "Name", + "电子反锁": "इलेक्ट्रॉनिक विरोधी लॉक", + "双重认证": "द्वि-कारक प्रमाणीकरण", + "双锁联动": "द्वि पाश सहलग्नता", + "1.用智能锁APP添加锁和网关": "1. स्मार्ट लॉक ऐप का उपयोग करके लॉक्स और गेटवे जोड़ें", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. एप्लिकेशन में लॉक का रिमोट अनलॉकिंग फ़ंक्शन सक्षम करें (यह फ़ंक्शन डिफ़ॉल्ट रूप से बंद है). यदि यह विकल्प उपलब्ध नहीं है, तो लॉक आपके गूगल होम को सपोर्ट नहीं करेगा।", + "3.安装Google Home APP,点击左上角的加号按钮": "3. गूगल होम ऐप को इंस्टॉल करें और ऊपरी बाएं कोने में प्लस बटन पर क्लिक करें।" } \ No newline at end of file diff --git a/lan/lan_hk.json b/lan/lan_hk.json index 5c3b4bb1..3d42492f 100644 --- a/lan/lan_hk.json +++ b/lan/lan_hk.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "此鎖嘅遠程解鎖功能未啟用", "下载完成,请到相册查看": "下載完成,請至相冊查看", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "当Cat Eye設置為省電模式時,無法執行監控。 請喺Cat Eye設置中切換到其他模式", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "当Cat Eye設置為省電模式時,無法遠程解鎖。 請喺Cat Eye設置中切換到其他模式" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "当Cat Eye設置為省電模式時,無法遠程解鎖。 請喺Cat Eye設置中切換到其他模式", + "呼叫目标": "呼叫目標", + "管理员APP": "管理員APP", + "可视门铃码": "可視門鈴密碼", + "电子反锁": "電子防抱死", + "双重认证": "雙重認證", + "双锁联动": "雙鎖聯動", + "1.用智能锁APP添加锁和网关": "1.使用智能鎖應用程序添加鎖和網關", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2.喺APP中開啟鎖嘅遠程解鎖功能(此功能默認關閉)。 如果此選項不可用,則鎖將唔撐Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3.安裝Google Home應用,點擊左上角嘅加號掣" } \ No newline at end of file diff --git a/lan/lan_hr.json b/lan/lan_hr.json index 772bf665..70897559 100644 --- a/lan/lan_hr.json +++ b/lan/lan_hr.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Funkcija daljinskog otključavanja ove brave nije omogućena", "下载完成,请到相册查看": "Preuzimanje je završeno, idite na album za pregled", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Kada je Cat Eye postavljen na način rada za uštedu energije, nadzor se ne može izvršiti. Prebacite se na druge načine rada u postavkama Cat Eye", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Daljinsko otključavanje nije moguće kada je Cat Eye postavljen na način rada za uštedu energije. Prebacite se na drugi način rada u postavkama Cat Eye" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Daljinsko otključavanje nije moguće kada je Cat Eye postavljen na način rada za uštedu energije. Prebacite se na drugi način rada u postavkama Cat Eye", + "呼叫目标": "Cilj poziva", + "管理员APP": "Administratorska aplikacija", + "可视门铃码": "Vizualni kod zvona na vratima", + "电子反锁": "Elektronička zaštita od blokiranja", + "双重认证": "Dvofaktorska autentifikacija", + "双锁联动": "Dvostruka brava", + "1.用智能锁APP添加锁和网关": "1. Dodajte brave i pristupnike pomoću aplikacije pametne brave", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Omogućite funkciju daljinskog otključavanja brave u APP-u (ova je funkcija prema zadanim postavkama isključena). Ako ova opcija nije dostupna, zaključavanje neće podržavati Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Instalirajte aplikaciju Google Home i kliknite gumb plus u gornjem lijevom kutu" } \ No newline at end of file diff --git a/lan/lan_hu.json b/lan/lan_hu.json index d93cdbfa..3c5d41ce 100644 --- a/lan/lan_hu.json +++ b/lan/lan_hu.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Ennek a zárnak a távoli feloldási funkciója nincs engedélyezve", "下载完成,请到相册查看": "A letöltés befejeződött, kérjük, menjen az albumra a megtekintéshez", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Ha a Cat Eye energiatakarékos üzemmódba van állítva, a felügyelet nem végezhető el. Kérjük, váltson más módokra a Cat Eye beállításaiban", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "A távoli feloldás nem lehetséges, ha a Cat Eye energiatakarékos üzemmódba van állítva. Kérjük, váltson másik módra a Cat Eye beállításaiban" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "A távoli feloldás nem lehetséges, ha a Cat Eye energiatakarékos üzemmódba van állítva. Kérjük, váltson másik módra a Cat Eye beállításaiban", + "呼叫目标": "Hívás cél", + "管理员APP": "Rendszergazdai alkalmazás", + "可视门铃码": "Vizuális csengő kód", + "电子反锁": "Elektronikus blokkolásgátló", + "双重认证": "Kétfaktoros hitelesítés", + "双锁联动": "Dupla reteszelő rudazat", + "1.用智能锁APP添加锁和网关": "1. Adjon hozzá zárakat és átjárókat az intelligens zár alkalmazással", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Engedélyezze a zár távoli feloldási funkcióját az APP-ban (ez a funkció alapértelmezés szerint ki van kapcsolva). Ha ez az opció nem érhető el, a zár nem támogatja a Google Home szolgáltatást", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Telepítse a Google Home alkalmazást, és kattintson a plusz gombra a bal felső sarokban" } \ No newline at end of file diff --git a/lan/lan_id.json b/lan/lan_id.json index 21934da7..224692f6 100644 --- a/lan/lan_id.json +++ b/lan/lan_id.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Fungsi unlocking jarak jauh dari kunci ini tidak diaktifkan", "下载完成,请到相册查看": "Download selesai, silakan pergi ke album untuk melihat", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Jika mata kucing disetel ke mode penyimpanan daya, pemantauan tidak dapat dilakukan. Silakan beralih ke mode lain di pengaturan mata kucing", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Membuka kunci jarak jauh tidak mungkin jika mata kucing diatur untuk mode menghemat daya. Silakan beralih ke mode lain di pengaturan mata kucing" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Membuka kunci jarak jauh tidak mungkin jika mata kucing diatur untuk mode menghemat daya. Silakan beralih ke mode lain di pengaturan mata kucing", + "呼叫目标": "Hubungi target.", + "管理员APP": "Aplikasi Administrator", + "可视门铃码": "Kode bel Visual", + "电子反锁": "Anti elektronik", + "双重认证": "Dua faktor otentikasi", + "双锁联动": "Kunci ganda hubungan", + "1.用智能锁APP添加锁和网关": "1. Tambahkan kunci dan gerbang menggunakan aplikasi smart lock", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Aktifkan fungsi kunci pengunci jarak jauh di aplikasi (fungsi ini dimatikan secara standar). Jika opsi ini tidak tersedia, kunci tidak akan mendukung Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Instal aplikasi Google Home dan klik tombol plus di sudut kiri atas" } \ No newline at end of file diff --git a/lan/lan_it.json b/lan/lan_it.json index a87d0a27..6eb09aab 100644 --- a/lan/lan_it.json +++ b/lan/lan_it.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "La funzione di sblocco remoto di questa serratura non è abilitata", "下载完成,请到相册查看": "Scaricamento completato, vai all’ album da visualizzare", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Quando l’occhio gatto è impostato alla modalità risparmio energetico, il monitoraggio non può essere effettuato. Passa ad altre modalità nelle impostazioni degli occhi di gatto", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Lo sblocco a distanza non è possibile quando l’occhio gatto è impostato alla modalità risparmio energetico. Passa a un’altra modalità nelle impostazioni degli occhi di gatto" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Lo sblocco a distanza non è possibile quando l’occhio gatto è impostato alla modalità risparmio energetico. Passa a un’altra modalità nelle impostazioni degli occhi di gatto", + "呼叫目标": "Obiettivo chiamata", + "管理员APP": "Applicazione amministratore", + "可视门铃码": "Codice campanella visiva", + "电子反锁": "Antibloccaggio elettronico", + "双重认证": "Autenticazione a due fattori", + "双锁联动": "Collegamento a doppio bloccaggio", + "1.用智能锁APP添加锁和网关": "1. Aggiunge serrature e gateway usando l’applicazione smart lock", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Abilita la funzione di sblocco remoto del lock nella APP (questa funzione è disattivata in modo predefinito). Se questa opzione non è disponibile, il lock non supporta Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installa l’applicazione Home di Google e fai clic sul pulsante più nell’angolo in alto a sinistra" } \ No newline at end of file diff --git a/lan/lan_ja.json b/lan/lan_ja.json index 6df21bfe..7c81db90 100644 --- a/lan/lan_ja.json +++ b/lan/lan_ja.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "このロックのリモートロック解除機能は有効になっていません", "下载完成,请到相册查看": "ダウンロードが完了しましたので、アルバムでご覧ください", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "cat eyeが省電力モードに設定されている場合、監視はできません。cat eye設定で他のモードに切り替えてください", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "cat eyeが省電力モードに設定されている場合、リモートロック解除はできません。cat eye設定で別のモードに切り替えてください" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "cat eyeが省電力モードに設定されている場合、リモートロック解除はできません。cat eye設定で別のモードに切り替えてください", + "呼叫目标": "通話ターゲットの", + "管理员APP": "管理者アプリ", + "可视门铃码": "視覚チャイムコード", + "电子反锁": "電子反ロック", + "双重认证": "2ファクタ認証", + "双锁联动": "二重ロック連動", + "1.用智能锁APP添加锁和网关": "1. スマートロックappを使用してロックとゲートウェイを追加します", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. アプリでロックのリモートロック解除機能を有効にします(この機能はデフォルトでオフになっています)。このオプションが利用できない場合、ロックはgoogle homeをサポートしません", + "3.安装Google Home APP,点击左上角的加号按钮": "3. google homeアプリをインストールし、左上隅のプラスボタンをクリックします" } \ No newline at end of file diff --git a/lan/lan_keys.json b/lan/lan_keys.json index 62c5b3f0..f3d9487d 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1138,5 +1138,15 @@ "版本说明": "版本说明", "呼叫目标": "呼叫目标", "管理员APP": "管理员APP", + "可视门铃码": "可视门铃码", + "电子反锁": "电子反锁", + "双重认证": "双重认证", + "双锁联动": "双锁联动", + "1.用智能锁APP添加锁和网关": "1.用智能锁APP添加锁和网关", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3.安装Google Home APP,点击左上角的加号按钮", + "4.在设置页面,选择与Google协同工作": "4.在设置页面,选择与Google协同工作", + "5.搜索": "5.搜索", + ",并用智能锁APP的账号和密码进行授权": ",并用智能锁APP的账号和密码进行授权", "网关添加成功": "网关添加成功" } diff --git a/lan/lan_kk.json b/lan/lan_kk.json index 8f1ed1da..27c9b22c 100644 --- a/lan/lan_kk.json +++ b/lan/lan_kk.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Бұғаттаудың қашықтан құлыптан босату функциясы қосылмаған", "下载完成,请到相册查看": "Жүктеу аяқталды, көру үшін альбомға өтуіңізді сұраймыз", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Cat Eye қуат үнемдейтін режимге орнатылғанда, мониторингті орындау мүмкін емес. Cat Eye параметрлеріндегі басқа режимдерге ауысуыңызды сұраймын", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Cat Eye қуат үнемдейтін режимге орнатылғанда қашықтан құлыптан босату мүмкін емес. Cat Eye параметрлерінде басқа режимге ауысуыңызды сұраймыз" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Cat Eye қуат үнемдейтін режимге орнатылғанда қашықтан құлыптан босату мүмкін емес. Cat Eye параметрлерінде басқа режимге ауысуыңызды сұраймыз", + "呼叫目标": "Қоңырау шалу мақсаты", + "管理员APP": "APP әкімшісі", + "可视门铃码": "Көзбен шолып есігінің коды", + "电子反锁": "Электрондық бұғаттауға қарсы", + "双重认证": "Екі факторлы аутентификация", + "双锁联动": "Қос бұғаттау сілтемесі", + "1.用智能锁APP添加锁和网关": "1. Смарт-құлыптау бағдарламасын пайдалана отырып құлыптар мен шлюздерді қосу", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. APP бағдарламасында құлыпты қашықтан ашу функциясын қосу (бұл функция әдепкі бойынша өшіріледі). Егер бұл параметр қол жетімді болмаса, бұғаттау Google Home-ды қолдамайды", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Google Home бағдарламасын орнатып, жоғарғы сол жақ бұрыштағы қосу түймешігін басыңыз" } \ No newline at end of file diff --git a/lan/lan_ko.json b/lan/lan_ko.json index f6b736e3..7dcdfdf3 100644 --- a/lan/lan_ko.json +++ b/lan/lan_ko.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "이 잠금의 원격 잠금 해제 기능을 사용할 수 없습니다", "下载完成,请到相册查看": "다운로드가 완료되었습니다. 보려면 앨범으로 이동하십시오", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Cat Eye 가 절전 모드로 설정되면 모니터링을 수행할 수 없습니다.캣아이 설정에서 다른 모드로 전환해 주세요", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Cat Eye 가 절전 모드로 설정된 경우에는 원격 잠금 해제가 불가능합니다.Cat Eye 설정에서 다른 모드로 전환해 주세요" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Cat Eye 가 절전 모드로 설정된 경우에는 원격 잠금 해제가 불가능합니다.Cat Eye 설정에서 다른 모드로 전환해 주세요", + "呼叫目标": "전화 대상", + "管理员APP": "관리자 앱", + "可视门铃码": "시각 초인종 부호", + "电子反锁": "전자식 anti lock", + "双重认证": "이중 인증", + "双锁联动": "2 중 잠금 연결", + "1.用智能锁APP添加锁和网关": "1. 스마트 잠금 앱을 사용하여 잠금 및 게이트웨이를 추가합니다", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. 앱에서 잠금의 원격 잠금 해제 기능을 활성화합니다 (이 기능은 기본적으로 꺼져 있습니다).이 옵션을 사용할 수 없는 경우 잠금은 Google Home을 지원하지 않습니다", + "3.安装Google Home APP,点击左上角的加号按钮": "3. 구글 홈 앱을 설치하고 왼쪽 상단 모서리에 있는 더하기 버튼을 클릭합니다" } \ No newline at end of file diff --git a/lan/lan_lt.json b/lan/lan_lt.json index 73a83706..9eedf503 100644 --- a/lan/lan_lt.json +++ b/lan/lan_lt.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Šio užrakto nuotolinio atrakinimo funkcija neįjungta", "下载完成,请到相册查看": "Atsisiuntimas baigtas, eikite į albumą, kad peržiūrėtumėte", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Kai \"Cat Eye\" nustatytas energijos taupymo režimas, stebėjimo atlikti negalima. \"Cat Eye\" nustatymuose perjunkite į kitus režimus", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Nuotolinis atrakinimas neįmanomas, kai \"Cat Eye\" nustatytas energijos taupymo režimas. \"Cat Eye\" nustatymuose perjunkite į kitą režimą" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Nuotolinis atrakinimas neįmanomas, kai \"Cat Eye\" nustatytas energijos taupymo režimas. \"Cat Eye\" nustatymuose perjunkite į kitą režimą", + "呼叫目标": "Skambučio tikslas", + "管理员APP": "Administratoriaus programa", + "可视门铃码": "Vaizdinis durų skambučio kodas", + "电子反锁": "Elektroninis antiblokavimas", + "双重认证": "Dviejų veiksnių autentifikavimas", + "双锁联动": "Dvigubo užrakto jungtis", + "1.用智能锁APP添加锁和网关": "1. Pridėkite spynas ir šliuzus naudodami \"smart lock\" programą", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Įjunkite užrakto nuotolinio atrakinimo funkciją APP (ši funkcija yra išjungta pagal numatytuosius nustatymus). Jei ši parinktis nepasiekiama, užraktas nepalaikys \"Google Home\"", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Įdiekite \"Google Home\" programą ir spustelėkite pliuso mygtuką viršutiniame kairiajame kampe" } \ No newline at end of file diff --git a/lan/lan_ms.json b/lan/lan_ms.json index 75e8bbc9..526575cc 100644 --- a/lan/lan_ms.json +++ b/lan/lan_ms.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Fungsi buka kunci jauh kunci ini tidak didayakan", "下载完成,请到相册查看": "Muat turun selesai, sila pergi ke album untuk melihat", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Apabila Cat Eye ditetapkan kepada mod penjimatan kuasa, pemantauan tidak boleh dilakukan. Sila tukar kepada mod lain dalam tetapan Cat Eye", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Buka kunci jauh tidak boleh dilakukan apabila Cat Eye ditetapkan kepada mod penjimatan kuasa. Sila tukar kepada mod lain dalam tetapan Cat Eye" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Buka kunci jauh tidak boleh dilakukan apabila Cat Eye ditetapkan kepada mod penjimatan kuasa. Sila tukar kepada mod lain dalam tetapan Cat Eye", + "呼叫目标": "Sasaran panggilan", + "管理员APP": "APP Pentadbir", + "可视门铃码": "Kod loceng pintu visual", + "电子反锁": "Anti kunci elektronik", + "双重认证": "Pengesahan dua faktor", + "双锁联动": "Pautan kunci berganda", + "1.用智能锁APP添加锁和网关": "1. Tambah kunci dan pintu masuk menggunakan apl kunci pintar", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Dayakan fungsi buka kunci jauh kunci dalam APP (fungsi ini dimatikan secara lalai). Jika pilihan ini tidak tersedia, kunci tidak akan menyokong Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Pasang apl Google Home dan klik butang tambah di penjuru kiri sebelah atas" } \ No newline at end of file diff --git a/lan/lan_nl.json b/lan/lan_nl.json index 56be2060..8f3575f0 100644 --- a/lan/lan_nl.json +++ b/lan/lan_nl.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "De remote unlock functie van het slot is niet ingeschakeld", "下载完成,请到相册查看": "De download is voltooid, ga naar het album om het te bekijken", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Wanneer 'kattenoog' is ingesteld op de energiebesparende modus, is monitoring niet mogelijk. Ga naar een andere modus in de kattenoog instellingen", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Wanneer cat eye is ingesteld op de energiebesparende modus, kan deze niet op afstand worden ontgrendeld. Ga naar een andere modus in de kattenoog instellingen" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Wanneer cat eye is ingesteld op de energiebesparende modus, kan deze niet op afstand worden ontgrendeld. Ga naar een andere modus in de kattenoog instellingen", + "呼叫目标": "Doel van de oproep", + "管理员APP": "Toepassing door de beheerder", + "可视门铃码": "Visuele deurbel code", + "电子反锁": "Elektronische abs", + "双重认证": "Twee-factor authenticatie", + "双锁联动": "Dubbele vergrendeling voor koppeling", + "1.用智能锁APP添加锁和网关": "1. Voeg sloten en gateways toe met de smart lock app", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Open het slot op afstand in de APP (standaard uitgeschakeld). Als deze optie niet beschikbaar is, wordt google Home niet ondersteund", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installeer de google home-app en klik op de plus-knop in de linkerbovenhoek" } \ No newline at end of file diff --git a/lan/lan_pl.json b/lan/lan_pl.json index 8c958c55..b9797859 100644 --- a/lan/lan_pl.json +++ b/lan/lan_pl.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Funkcja zdalnego odblokowania tego zamka nie jest włączona", "下载完成,请到相册查看": "Pobieranie zakończone, przejdź do albumu, aby wyświetlić", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Gdy Cat Eye jest ustawiony w trybie oszczędzania energii, nie można przeprowadzić monitorowania. Przełącz się na inne tryby w ustawieniach Cat Eye", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Zdalne odblokowanie nie jest możliwe, gdy Cat Eye jest ustawiony w trybie oszczędzania energii. Przełącz się na inny tryb w ustawieniach Cat Eye" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Zdalne odblokowanie nie jest możliwe, gdy Cat Eye jest ustawiony w trybie oszczędzania energii. Przełącz się na inny tryb w ustawieniach Cat Eye", + "呼叫目标": "Cel połączenia", + "管理员APP": "Aplikacja administratora", + "可视门铃码": "Wizualny kod dzwonka do drzwi", + "电子反锁": "Elektroniczny układ przeciwblokujący", + "双重认证": "Uwierzytelnianie dwuskładnikowe", + "双锁联动": "Podwójny zamek zawieszenia", + "1.用智能锁APP添加锁和网关": "1. Dodaj zamki i bramy za pomocą aplikacji inteligentnego zamka", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Włącz funkcję zdalnego odblokowywania zamka w aplikacji (ta funkcja jest domyślnie wyłączona). Jeśli ta opcja nie jest dostępna, zamek nie będzie obsługiwał Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Zainstaluj aplikację Google Home i kliknij przycisk plusa w lewym górnym rogu" } \ No newline at end of file diff --git a/lan/lan_pt.json b/lan/lan_pt.json index 9d0d2657..a4faac2a 100644 --- a/lan/lan_pt.json +++ b/lan/lan_pt.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "A função de desbloqueio remoto desta fechadura não está habilitada", "下载完成,请到相册查看": "Download concluído, por favor, vá para o álbum para ver", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Quando o Cat Eye está definido para o modo de economia de energia, o monitoramento não pode ser executado. Por favor, mude para outros modos nas configurações do Cat Eye", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "O desbloqueio remoto não é possível quando o Cat Eye está definido para o modo de economia de energia. Por favor, mude para outro modo nas configurações do Cat Eye" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "O desbloqueio remoto não é possível quando o Cat Eye está definido para o modo de economia de energia. Por favor, mude para outro modo nas configurações do Cat Eye", + "呼叫目标": "Destino da chamada", + "管理员APP": "Aplicativo Administrador", + "可视门铃码": "Código visual da campainha", + "电子反锁": "Anti bloqueio eletrônico", + "双重认证": "Autenticação de dois fatores", + "双锁联动": "Articulação de trava dupla", + "1.用智能锁APP添加锁和网关": "1. Adicione fechaduras e gateways usando o aplicativo Smart Lock", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Ative a função de desbloqueio remoto da fechadura no APP (esta função está desativada por padrão). Se esta opção não estiver disponível, o bloqueio não será compatível com o Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Instale o aplicativo Google Home e clique no botão de adição no canto superior esquerdo" } \ No newline at end of file diff --git a/lan/lan_ro.json b/lan/lan_ro.json index 584e33af..635bb36a 100644 --- a/lan/lan_ro.json +++ b/lan/lan_ro.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Funcția de deblocare de la distanță a acestei încuietori nu este activată", "下载完成,请到相册查看": "Descărcare finalizată, vă rugăm să accesați albumul pentru a vizualiza", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Când Cat Eye este setat în modul de economisire a energiei, monitorizarea nu poate fi efectuată. Vă rugăm să comutați la alte moduri în setările Cat Eye", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Deblocarea de la distanță nu este posibilă atunci când Cat Eye este setat în modul de economisire a energiei. Vă rugăm să comutați la un alt mod în setările Cat Eye" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Deblocarea de la distanță nu este posibilă atunci când Cat Eye este setat în modul de economisire a energiei. Vă rugăm să comutați la un alt mod în setările Cat Eye", + "呼叫目标": "Țintă de apel", + "管理员APP": "Aplicație de administrator", + "可视门铃码": "Codul vizual al soneriei", + "电子反锁": "Antiblocare electronică", + "双重认证": "Autentificare cu doi factori", + "双锁联动": "Legătură dublă de blocare", + "1.用智能锁APP添加锁和网关": "1. Adăugați încuietori și gateway-uri folosind aplicația smart lock", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Activați funcția de deblocare de la distanță a încuietorului în aplicație (această funcție este dezactivată în mod implicit). Dacă această opțiune nu este disponibilă, blocarea nu va accepta Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Instalați aplicația Google Home și faceți clic pe butonul plus din colțul din stânga sus" } \ No newline at end of file diff --git a/lan/lan_ru.json b/lan/lan_ru.json index 393a68f7..10da744f 100644 --- a/lan/lan_ru.json +++ b/lan/lan_ru.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Функция дистанционного разблокирования этого замка не включена", "下载完成,请到相册查看": "Загрузка завершена, пожалуйста, перейдите на альбом, чтобы посмотреть", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Когда кошачий глаз установлен в режим энергосбережения, мониторинг не может быть выполнен. Переключитесь на другие режимы в настройках кошачьего глаза", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Удаленная разблокировка невозможна, если кошачий глаз установлен в режим энергосбережения. Пожалуйста, переключитесь в другой режим в настройках кошачьего глаза" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Удаленная разблокировка невозможна, если кошачий глаз установлен в режим энергосбережения. Пожалуйста, переключитесь в другой режим в настройках кошачьего глаза", + "呼叫目标": "Звони в цель.", + "管理员APP": "Приложение для администратора", + "可视门铃码": "Визуальный код дверного звонка", + "电子反锁": "Электронный анти-блокировка", + "双重认证": "Двухфакторная аутентификация", + "双锁联动": "2.1.3 двойная блокировка", + "1.用智能锁APP添加锁和网关": "1. Добавить замки и шлюзы с помощью приложения smart lock", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Включите функцию удаленного разблокирования замка в приложении (эта функция выключается по умолчанию). Если эта опция не доступна, блокировка не будет поддерживать Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Установите приложение Google Home и нажмите кнопку plus в левом верхнем углу" } \ No newline at end of file diff --git a/lan/lan_sk.json b/lan/lan_sk.json index 176aab1b..284c99cb 100644 --- a/lan/lan_sk.json +++ b/lan/lan_sk.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Funkcia diaľkového odomykania tohto zámku nie je povolená", "下载完成,请到相册查看": "Sťahovanie dokončené, prejdite na album view", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Keď je Cat Eye nastavený na režim úspory energie, monitorovanie nie je možné vykonať. Prepnite na iné režimy v nastaveniach Cat Eye", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Diaľkové odomknutie nie je možné, keď je Cat Eye nastavený do režimu úspory energie. Prepnite do iného režimu v nastaveniach Cat Eye" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Diaľkové odomknutie nie je možné, keď je Cat Eye nastavený do režimu úspory energie. Prepnite do iného režimu v nastaveniach Cat Eye", + "呼叫目标": "Cieľ hovoru", + "管理员APP": "Aplikácia správcu", + "可视门铃码": "Vizuálny kód zvončeka", + "电子反锁": "Elektronický protiblokovací systém", + "双重认证": "Dvojfaktorová autentifikácia", + "双锁联动": "Dvojitý zámok", + "1.用智能锁APP添加锁和网关": "1. Pridajte zámky a brány pomocou aplikácie inteligentného zámku", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Povoľte funkciu diaľkového odomykania zámku v aplikácii APP (táto funkcia je predvolene vypnutá). Ak táto možnosť nie je k dispozícii, zámok nebude podporovať Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Nainštalujte si aplikáciu Google Home a kliknite na tlačidlo plus v ľavom hornom rohu" } \ No newline at end of file diff --git a/lan/lan_sr_cyrl.json b/lan/lan_sr_cyrl.json index 6ddf1a89..3c3b8dec 100644 --- a/lan/lan_sr_cyrl.json +++ b/lan/lan_sr_cyrl.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Функција даљинског откључавања ове браве није омогућена", "下载完成,请到相册查看": "Преузимање завршено, идите на албум да видите", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Када је Цат Еие подешен на режим за уштеду енергије, праћење се не може извршити. Молимо Вас да пређете на друге режиме у подешавањима Цат Еие", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Даљинско откључавање није могуће када је Цат Еие подешен на режим за уштеду енергије. Молимо Вас да пређете на други режим у подешавањима Цат Еие" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Даљинско откључавање није могуће када је Цат Еие подешен на режим за уштеду енергије. Молимо Вас да пређете на други режим у подешавањима Цат Еие", + "呼叫目标": "Циљ позива", + "管理员APP": "Администратор АПП", + "可视门铃码": "Визуелни код звона", + "电子反锁": "Електронски против блокирања", + "双重认证": "Двофакторска аутентификација", + "双锁联动": "Двострука брава веза", + "1.用智能锁APP添加锁和网关": "1 . Додајте браве и гатеваи помоћу апликације Смарт Лоцк", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2 . Омогућите функцију даљинског откључавања браве у АПП-у (ова функција је подразумевано искључена). Ако ова опција није доступна, брава неће подржати Гоогле Хоме", + "3.安装Google Home APP,点击左上角的加号按钮": "3 . Инсталирајте апликацију Гоогле Хоме и кликните на дугме плус у горњем левом углу" } \ No newline at end of file diff --git a/lan/lan_sv.json b/lan/lan_sv.json index 27a46c37..b81f6bef 100644 --- a/lan/lan_sv.json +++ b/lan/lan_sv.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Fjärrupplåsningsfunktionen för detta lås är inte aktiverad", "下载完成,请到相册查看": "Nedladdningen är klar, gå till albumet för att se", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "När Cat Eye är inställt på energisparläge kan övervakning inte utföras. Växla till andra lägen i Cat Eye-inställningarna", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Fjärrupplåsning är inte möjlig när Cat Eye är inställt på energisparläge. Byt till ett annat läge i Cat Eye-inställningarna" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Fjärrupplåsning är inte möjlig när Cat Eye är inställt på energisparläge. Byt till ett annat läge i Cat Eye-inställningarna", + "呼叫目标": "Anropa mål", + "管理员APP": "APP för administratör", + "可视门铃码": "Visuell dörrklockakod", + "电子反锁": "Elektroniskt låsningsfritt läge", + "双重认证": "Tvåfaktorsautentisering", + "双锁联动": "Dubbel låslänkage", + "1.用智能锁APP添加锁和网关": "1. Lägg till lås och gateways med hjälp av den smarta låsappen", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Aktivera fjärrupplåsningsfunktionen för låset i APP (den här funktionen är avstängd som standard). Om det här alternativet inte är tillgängligt kommer låset inte att stödja Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installera Google Home-appen och klicka på plusknappen i det övre vänstra hörnet" } \ No newline at end of file diff --git a/lan/lan_th.json b/lan/lan_th.json index 77c4451a..0bf0f6a4 100644 --- a/lan/lan_th.json +++ b/lan/lan_th.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "ไม่เปิดใช้ฟังก์ชันการปลดล็อคระยะไกลของการล็อคนี้", "下载完成,请到相册查看": "การดาวน์โหลดเสร็จสมบูรณ์แล้วโปรดไป ที่อัลบั้มเพื่อดู", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "เมื่อตั้งค่าตาแมวให้เป็นโหมดประหยัดพลังงานการตรวจสอบจะไม่สามารถทำงานได้ โปรดเปลี่ยนไปใช้โหมดอื่น ๆ ในการตั้งค่าตาแมว", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "ไม่สามารถปลดล็อคระยะไกลได้เมื่อตั้งค่าดวงตาแมวให้เป็นโหมดประหยัดพลังงาน โปรดเปลี่ยนเป็นโหมดอื่นในการตั้งค่าตาแมว" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "ไม่สามารถปลดล็อคระยะไกลได้เมื่อตั้งค่าดวงตาแมวให้เป็นโหมดประหยัดพลังงาน โปรดเปลี่ยนเป็นโหมดอื่นในการตั้งค่าตาแมว", + "呼叫目标": "เรียกเป้าหมาย", + "管理员APP": "แอพผู้ดูแลระบบ", + "可视门铃码": "รหัสประตูหน้า", + "电子反锁": "ล็อคป้องกันอิเล็กทรอนิกส์", + "双重认证": "การตรวจสอบสิทธิ์สองระดับ", + "双锁联动": "ดับเบิ้ลล็อคการเชื่อมต่อ", + "1.用智能锁APP添加锁和网关": "1. เพิ่มล็อค และเกตเวย์โดยใช้แอพสมาร์ทล็อค", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. เปิดใช้งานฟังก์ชันการปลดล็อคระยะไกลของการล็อคในแอพ (ฟังก์ชันนี้ จะถูกปิดโดยค่าเริ่มต้น) หากไม่มีตัวเลือกนี้ การล็อคจะไม่สนับสนุนกูเกิ้ลโฮม", + "3.安装Google Home APP,点击左上角的加号按钮": "3. ติดตั้ง googlehome แอพ และคลิกปุ่มบวก ที่มุมบนซ้าย" } \ No newline at end of file diff --git a/lan/lan_tr.json b/lan/lan_tr.json index 58d3e84e..d09053ca 100644 --- a/lan/lan_tr.json +++ b/lan/lan_tr.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Bu kilidin uzaktan kilit açma işlevi etkin değil", "下载完成,请到相册查看": "İndirme tamamlandı, görüntülemek için lütfen albüme gidin", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Cat Eye güç tasarrufu moduna ayarlandığında izleme yapılamaz. Lütfen Cat Eye ayarlarında diğer modlara geçin", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Cat Eye güç tasarrufu moduna ayarlandığında uzaktan kilit açma mümkün değildir. Lütfen Cat Eye ayarlarında başka bir moda geçin" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Cat Eye güç tasarrufu moduna ayarlandığında uzaktan kilit açma mümkün değildir. Lütfen Cat Eye ayarlarında başka bir moda geçin", + "呼叫目标": "Çağrı hedefi", + "管理员APP": "Yönetici APP", + "可视门铃码": "Görsel kapı zili kodu", + "电子反锁": "Elektronik kilitlenme önleyici", + "双重认证": "İki faktörlü kimlik doğrulama", + "双锁联动": "Çift kilit bağlantısı", + "1.用智能锁APP添加锁和网关": "1. Akıllı kilit uygulamasını kullanarak kilitler ve ağ geçitleri ekleyin", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. APP'de kilidin uzaktan kilit açma işlevini etkinleştirin (bu işlev varsayılan olarak kapalıdır). Bu seçenek mevcut değilse, kilit Google Home'u desteklemeyecektir", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Google Home uygulamasını yükleyin ve sol üst köşedeki artı düğmesini tıklayın" } \ No newline at end of file diff --git a/lan/lan_tw.json b/lan/lan_tw.json index eb5482df..c2d9cfe6 100644 --- a/lan/lan_tw.json +++ b/lan/lan_tw.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "未開啓該鎖的遠程解鎖功能", "下载完成,请到相册查看": "下載完成,請到相冊查看", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "當“貓眼”設置爲省電模式時,無法進行監控。請在貓眼設置中切換到其他模式", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "當貓眼設置爲省電模式時,無法遠程解鎖。請在貓眼設置中切換到其他模式" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "當貓眼設置爲省電模式時,無法遠程解鎖。請在貓眼設置中切換到其他模式", + "呼叫目标": "調用目標", + "管理员APP": "管理員應用", + "可视门铃码": "可視門鈴碼", + "电子反锁": "電子防抱死裝置", + "双重认证": "雙因素身份驗證", + "双锁联动": "雙鎖聯動", + "1.用智能锁APP添加锁和网关": "1. 使用智能鎖應用程序添加鎖和網關", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. 在APP中開啓鎖的遠程開鎖功能(默認關閉)。如果這個選項不可用,鎖將不支持谷歌Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. 安裝谷歌Home應用程序並單擊左上角的加號按鈕" } \ No newline at end of file diff --git a/lan/lan_uk.json b/lan/lan_uk.json index 46af9456..426cbc1a 100644 --- a/lan/lan_uk.json +++ b/lan/lan_uk.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Функція дистанційного розблокування цього замка не ввімкнена", "下载完成,请到相册查看": "Завантаження завершено, будь ласка, перейдіть до альбому для перегляду", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Коли функцію «Котяче око» переведено в режим енергозбереження, моніторинг неможливий. Будь ласка, перейдіть на інші режими в налаштуваннях Cat Eye", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Віддалене розблокування неможливе, коли Cat Eye переведено в режим енергозбереження. Будь ласка, перейдіть в інший режим у налаштуваннях Cat Eye" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Віддалене розблокування неможливе, коли Cat Eye переведено в режим енергозбереження. Будь ласка, перейдіть в інший режим у налаштуваннях Cat Eye", + "呼叫目标": "Ціль дзвінка", + "管理员APP": "Додаток адміністратора", + "可视门铃码": "Візуальний код дверного дзвінка", + "电子反锁": "Електронний антиблокувальний засіб", + "双重认证": "Двофакторна аутентифікація", + "双锁联动": "Важіль з подвійним замком", + "1.用智能锁APP添加锁和网关": "1. Додайте замки та шлюзи за допомогою програми Smart Lock", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Увімкніть функцію дистанційного розблокування замка в APP (ця функція вимкнена за замовчуванням). Якщо ця опція недоступна, замок не підтримуватиме Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Встановіть програму Google Home і натисніть кнопку плюс у верхньому лівому кутку" } \ No newline at end of file diff --git a/lan/lan_ur.json b/lan/lan_ur.json index c07e27d9..4c760df9 100644 --- a/lan/lan_ur.json +++ b/lan/lan_ur.json @@ -1136,5 +1136,14 @@ "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "ری سیٹ کرنے کے بعد ، لاک کا ریموٹ کنٹرول حذف کردیا جائے گا۔ کیا آپ اسے دوبارہ ترتیب دینا چاہتے ہیں؟", "版本说明": "ورژن کی تفصیل", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "گیٹ وے کے چلنے کے بعد ، ری سیٹ بٹن کو 5 سیکنڈ تک دبائیں اور پکڑیں۔ جب نیلے اشارے کی روشنی چمکتی ہے تو اگلا پر کلک کریں", - "网关添加成功": "گیٹ وے نے کامیابی کے ساتھ اضافہ کیا" + "网关添加成功": "گیٹ وے نے کامیابی کے ساتھ اضافہ کیا", + "呼叫目标": "کال ہدف", + "管理员APP": "Administrator APP", + "可视门铃码": "Visual doorbell code", + "电子反锁": "الیکٹرانک اینٹی لاک", + "双重认证": "دو عوامل کی تصدیق", + "双锁联动": "ڈبل لاک لنک", + "1.用智能锁APP添加锁和网关": "1. سمارٹ لاک ایپ کا استعمال کرتے ہوئے لاک اور گیٹ وے شامل کریں", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. اے پی پی میں لاک کے ریموٹ ان لاکنگ فنکشن کو فعال کریں (یہ فنکشن ڈیفالٹ طور پر بند ہے)۔ اگر یہ آپشن دستیاب نہیں ہے تو ، لاک گوگل ہوم کو سپورٹ نہیں کرے گا۔", + "3.安装Google Home APP,点击左上角的加号按钮": "3. گوگل ہوم ایپ انسٹال کریں اور اوپری بائیں کونے میں پلس بٹن پر کلک کریں۔" } \ No newline at end of file diff --git a/lan/lan_vi.json b/lan/lan_vi.json index 8a6c76d3..1517c8cf 100644 --- a/lan/lan_vi.json +++ b/lan/lan_vi.json @@ -1136,5 +1136,14 @@ "该锁的远程开锁功能未启用": "Chức năng mở khóa từ xa của khóa này không được kích hoạt", "下载完成,请到相册查看": "Hoàn tất tải về, xin hãy đến album để xem", "猫眼设置为省电模式时无法进行监控,请在猫眼设置中切换为其他模式": "Khi mắt mèo được thiết lập để tiết kiệm điện, giám sát không thể được thực hiện. Hãy chuyển sang chế độ khác trong mắt mèo", - "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Mở khóa từ xa là không thể khi mắt mèo được thiết lập ở chế độ tiết kiệm điện. Hãy chuyển sang chế độ khác trong thiết lập mắt mèo" + "猫眼设置为省电模式时无法进行远程开锁,请在猫眼设置中切换为其他模式": "Mở khóa từ xa là không thể khi mắt mèo được thiết lập ở chế độ tiết kiệm điện. Hãy chuyển sang chế độ khác trong thiết lập mắt mèo", + "呼叫目标": "Đặt mục tiêu", + "管理员APP": "Ứng dụng quản trị viên", + "可视门铃码": "Hình ảnh chuông cửa", + "电子反锁": "Khóa chống điện tử", + "双重认证": "Chứng thực hai yếu tố", + "双锁联动": "Liên kết hai khóa", + "1.用智能锁APP添加锁和网关": "1. Thêm khoá và cổng bằng ứng dụng Smart Lock", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Kích hoạt chức năng mở khóa từ xa trong ứng dụng (chức năng này bị tắt theo mặc định). Nếu tùy chọn này không có sẵn, khóa sẽ không hỗ trợ Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3. Cài đặt ứng dụng Google Home và nhấn nút Plus ở góc trên bên trái" } \ No newline at end of file diff --git a/lan/lan_zh.json b/lan/lan_zh.json index 2204763f..ea9e45d4 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1138,5 +1138,15 @@ "版本说明": "版本说明", "呼叫目标": "呼叫目标", "管理员APP": "管理员APP", + "可视门铃码": "可视门铃码", + "电子反锁": "电子反锁", + "双重认证": "双重认证", + "双锁联动": "双锁联动", + "1.用智能锁APP添加锁和网关": "1.用智能锁APP添加锁和网关", + "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home", + "3.安装Google Home APP,点击左上角的加号按钮": "3.安装Google Home APP,点击左上角的加号按钮", + "4.在设置页面,选择与Google协同工作": "4.在设置页面,选择与Google协同工作", + "5.搜索": "5.搜索", + ",并用智能锁APP的账号和密码进行授权": ",并用智能锁APP的账号和密码进行授权", "网关添加成功": "网关添加成功" } From cd00d3159daeb2c50b3ed9f7b49df5b64e0d9ad7 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 16:49:56 +0800 Subject: [PATCH 024/135] =?UTF-8?q?feat:=E8=B0=83=E6=95=B4=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mine/mineSet/google_home/google_home_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mine/mineSet/google_home/google_home_page.dart b/lib/mine/mineSet/google_home/google_home_page.dart index afdee0e3..1c80ccf1 100644 --- a/lib/mine/mineSet/google_home/google_home_page.dart +++ b/lib/mine/mineSet/google_home/google_home_page.dart @@ -79,7 +79,7 @@ class _GoogleHomePageState extends State { final String instructions = '${'1.用智能锁APP添加锁和网关'.tr}\n\n' '${'2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home'.tr}\n\n' '${'3.安装Google Home APP,点击左上角的加号按钮'.tr}\n\n' - '${'4.在设置页面,选择"与Google协同工作'.tr}\n\n' + '${'4.在设置页面,选择与Google协同工作'.tr}\n\n' '${'5.搜索'.tr}"${state.googleHomeData.value.actionName ?? ''}"${',并用智能锁APP的账号和密码进行授权'.tr}'; return Container( From e1b9c1868ec30245d1dda91c901524b173e33ea7 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 11 Mar 2025 16:50:23 +0800 Subject: [PATCH 025/135] =?UTF-8?q?feat:=E8=B0=83=E6=95=B4=E6=A0=A1?= =?UTF-8?q?=E5=87=86=E6=97=B6=E9=97=B4=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lockSet/lockTime/lockTime_logic.dart | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart b/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart index 6e2fdf36..bb2e9962 100755 --- a/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart +++ b/lib/main/lockDetail/lockSet/lockTime/lockTime_logic.dart @@ -50,10 +50,25 @@ class LockTimeLogic extends BaseGetXController { // 有效时间 final List indate = reply.data.sublist(150, 154); - final int indateValue = (0xff & indate[0]) << 24 | + int indateValue = (0xff & indate[0]) << 24 | (0xff & indate[1]) << 16 | (0xff & indate[2]) << 8 | (0xFF & indate[3]); + // 检查时间戳是否无效或超出范围 + if (indateValue == 0xffffffff || indateValue <= 0) { + // 使用当前系统时间戳(秒) + indateValue = DateTime.now().millisecondsSinceEpoch ~/ 1000; + AppLog.log('检测到无效时间戳,使用系统时间:$indateValue'); + } + + // 验证时间戳是否在合理范围内(例如:2000年到2100年之间) + final DateTime dateTime = + DateTime.fromMillisecondsSinceEpoch(indateValue * 1000); + if (dateTime.year < 2000 || dateTime.year > 2100) { + AppLog.log('时间戳超出合理范围: $indateValue'); + indateValue = DateTime.now().millisecondsSinceEpoch ~/ 1000; + } + AppLog.log( '====================indate:$indate indateValue:$indateValue'); state.dateTime.value = DateTool().dateToYMDHNString('$indateValue'); From 6769e9af5d8adb26b2844f9440b465fedf721f09 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Tue, 11 Mar 2025 18:55:23 +0800 Subject: [PATCH 026/135] =?UTF-8?q?fix=EF=BC=9A=20=E5=9C=A8=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E7=BD=91=E5=85=B3=E7=95=8C=E9=9D=A2=E5=BD=93=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=87=BA=E7=BD=91=E5=85=B3=E6=97=B6=E7=BD=91=E5=85=B3?= =?UTF-8?q?=E6=8B=94=E6=8E=89=E7=94=B5=E6=BA=90=EF=BC=8C=E5=B7=A6=E4=B8=8A?= =?UTF-8?q?=E9=94=AE=E8=BF=94=E5=9B=9E=E5=86=8D=E7=82=B9=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E6=AD=A5=E5=BA=94=E6=B2=A1=E6=9C=89=E8=AF=A5=E7=BD=91=E5=85=B3?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main_local.dart | 2 +- .../addGateway/selectGateway/selectGatewayList_logic.dart | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/main_local.dart b/lib/main_local.dart index 9e30d007..bd256362 100755 --- a/lib/main_local.dart +++ b/lib/main_local.dart @@ -4,7 +4,7 @@ import 'flavors.dart'; import 'main.dart' as runner; Future main() async { - F.appFlavor = Flavor.xhj; + F.appFlavor = Flavor.sky; // AppLog.log('local调用了main函数'); await runner.main(); } diff --git a/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_logic.dart b/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_logic.dart index 09222b9e..3de08509 100644 --- a/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_logic.dart +++ b/lib/mine/gateway/addGateway/selectGateway/selectGatewayList_logic.dart @@ -121,6 +121,7 @@ class SelectGatewayListLogic extends BaseGetXController { Future stopScanBlueList() async { // BlueManage().disconnect(); + state.devices.clear(); await BlueManage().stopScan(); } From 42d9bfd2ec530f263da8a10a4639949adf3b6015 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Wed, 12 Mar 2025 11:01:55 +0800 Subject: [PATCH 027/135] =?UTF-8?q?fix=EF=BC=9A=20=E5=9C=A8=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E7=BD=91=E5=85=B3=E7=95=8C=E9=9D=A2=E5=BD=93=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=87=BA=E7=BD=91=E5=85=B3=E6=97=B6=E7=BD=91=E5=85=B3?= =?UTF-8?q?=E6=8B=94=E6=8E=89=E7=94=B5=E6=BA=90=EF=BC=8C=E5=B7=A6=E4=B8=8A?= =?UTF-8?q?=E9=94=AE=E8=BF=94=E5=9B=9E=E5=86=8D=E7=82=B9=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E6=AD=A5=E5=BA=94=E6=B2=A1=E6=9C=89=E8=AF=A5=E7=BD=91=E5=85=B3?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remoteUnlocking/remoteUnlocking_page.dart | 17 ++++-- .../gatewayDetail/gatewayDetail_logic.dart | 10 ++++ .../gatewayDetail/gatewayDetail_page.dart | 2 + .../selectGetewayList_entity.dart | 58 ++++++++++++++----- lib/network/api.dart | 1 + lib/network/api_provider.dart | 8 ++- lib/network/api_repository.dart | 12 +++- pubspec.lock | 8 +++ 8 files changed, 92 insertions(+), 24 deletions(-) diff --git a/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart b/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart index 3489df75..dd061929 100755 --- a/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart +++ b/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart @@ -1,4 +1,4 @@ - +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -19,7 +19,8 @@ class RemoteUnlockingPage extends StatefulWidget { State createState() => _RemoteUnlockingPageState(); } -class _RemoteUnlockingPageState extends State with RouteAware { +class _RemoteUnlockingPageState extends State + with RouteAware { final RemoteUnlockingLogic logic = Get.put(RemoteUnlockingLogic()); final RemoteUnlockingState state = Get.find().state; @@ -62,16 +63,20 @@ class _RemoteUnlockingPageState extends State with RouteAwa ], ); }), + Padding( + padding: EdgeInsets.only(top: 20.h), + child: Text('功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。'.tr, + style: TextStyle(fontSize: 20.sp)), + ), SizedBox( height: 40.h, ), Obx(() => SubmitBtn( - btnName: state.remoteEnable.value == 1 - ? '关闭'.tr - : '开启'.tr, + btnName: state.remoteEnable.value == 1 ? '关闭'.tr : '开启'.tr, onClick: () { //全自动锁只判断是否开启远程开锁 - bool isContains = BlueManage().connectDeviceName.contains('T9A'); + bool isContains = + BlueManage().connectDeviceName.contains('T9A'); if (isContains) { logic.remoteUnlockingOpenOrClose(); } else { diff --git a/lib/mine/gateway/gatewayDetail/gatewayDetail_logic.dart b/lib/mine/gateway/gatewayDetail/gatewayDetail_logic.dart index d7487983..cde446fc 100644 --- a/lib/mine/gateway/gatewayDetail/gatewayDetail_logic.dart +++ b/lib/mine/gateway/gatewayDetail/gatewayDetail_logic.dart @@ -5,6 +5,7 @@ import '../../../login/login/entity/LoginEntity.dart'; import '../../../network/api_repository.dart'; import '../../../tools/eventBusEventManage.dart'; import '../../../tools/showTipView.dart'; +import '../../mineSet/transferGateway/selectGetewayList_entity.dart'; import 'gatewayDetail_state.dart'; class GatewayDetailLogic extends BaseGetXController { @@ -40,4 +41,13 @@ class GatewayDetailLogic extends BaseGetXController { }); } } + + Future getGatewayDetail() async { + final GetewayInfoEntity entity = await ApiRepository.to + .getGatewayDetailData( + gatewayId: state.getewayItemData.value.gatewayId ?? 0, timeout: 60); + if (entity.errorCode!.codeIsSuccessful) { + state.getewayItemData.value = entity.data!; + } + } } diff --git a/lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart b/lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart index b700ba28..612aba33 100755 --- a/lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart +++ b/lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart @@ -84,6 +84,8 @@ class _GatewayDetailPageState extends State { action: () { Get.toNamed(Routers.gatewayConnectionLockPage, arguments: { 'gatewayId': state.getewayItemData.value.gatewayId ?? 0 + })?.then((value) { + logic.getGatewayDetail(); }); }), // CommonItem( diff --git a/lib/mine/mineSet/transferGateway/selectGetewayList_entity.dart b/lib/mine/mineSet/transferGateway/selectGetewayList_entity.dart index e115265a..b6f476e2 100755 --- a/lib/mine/mineSet/transferGateway/selectGetewayList_entity.dart +++ b/lib/mine/mineSet/transferGateway/selectGetewayList_entity.dart @@ -1,5 +1,4 @@ class GetewayDataEntity { - GetewayDataEntity( {this.errorCode, this.description, this.errorMsg, this.data}); @@ -9,6 +8,7 @@ class GetewayDataEntity { errorMsg = json['errorMsg']; data = json['data'] != null ? GetewayListData.fromJson(json['data']) : null; } + int? errorCode; String? description; String? errorMsg; @@ -27,8 +27,8 @@ class GetewayDataEntity { } class GetewayListData { - - GetewayListData({this.list, this.pageNo, this.pageSize, this.pages, this.total}); + GetewayListData( + {this.list, this.pageNo, this.pageSize, this.pages, this.total}); GetewayListData.fromJson(Map json) { if (json['list'] != null) { @@ -42,6 +42,7 @@ class GetewayListData { pages = json['pages']; total = json['total']; } + List? list; int? pageNo; int? pageSize; @@ -62,20 +63,19 @@ class GetewayListData { } class GetewayItemData { - GetewayItemData( {this.serialNumber, - this.gatewayMac, - this.gatewayName, - this.gatewayType, - this.networkName, - this.networkMac, - this.lockNum, - this.isOnline, - this.firmwareInfo, - this.needUpgrade, - this.version, - this.gatewayId}); + this.gatewayMac, + this.gatewayName, + this.gatewayType, + this.networkName, + this.networkMac, + this.lockNum, + this.isOnline, + this.firmwareInfo, + this.needUpgrade, + this.version, + this.gatewayId}); GetewayItemData.fromJson(Map json) { serialNumber = json['serialNumber']; @@ -96,6 +96,7 @@ class GetewayItemData { version = json['version']; gatewayId = json['gatewayId']; } + String? serialNumber; String? gatewayMac; String? gatewayName; @@ -130,3 +131,30 @@ class GetewayItemData { } } +class GetewayInfoEntity { + GetewayInfoEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + GetewayInfoEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = json['data'] != null ? GetewayItemData.fromJson(json['data']) : null; + } + + int? errorCode; + String? description; + String? errorMsg; + GetewayItemData? data; + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} diff --git a/lib/network/api.dart b/lib/network/api.dart index a1be47c2..db9ccf33 100755 --- a/lib/network/api.dart +++ b/lib/network/api.dart @@ -158,6 +158,7 @@ abstract class Api { final String gatewaykListURL = '/gateway/list'; // 网关列表 final String addGatewayURL = '/gateway/add'; // 添加网关 final String deletGatewayURL = '/gateway/delete'; // 删除网关 + final String gatewayDetailURL = '/gateway/detail'; // 网关列表 final String transferGatewayConfirmURL = '/plug/transferPlugConfirm'; // 转移网关确认 final String transferGatewayURL = '/plug/transfer'; // 转移网关 diff --git a/lib/network/api_provider.dart b/lib/network/api_provider.dart index cf7b064e..4cad97cc 100755 --- a/lib/network/api_provider.dart +++ b/lib/network/api_provider.dart @@ -1742,6 +1742,11 @@ class ApiProvider extends BaseProvider { jsonEncode({'pageNo': pageNo, 'pageSize': pageSize}), timeout: timeout); + // 获取网关详情 + Future getGatewayDetailData(int gatewayId, int timeout) => + post(gatewayDetailURL.toUrl, jsonEncode({'gatewayId': gatewayId}), + timeout: timeout); + // 添加网关 Future addGatewayNetwork( String gatewayName, @@ -1823,7 +1828,8 @@ class ApiProvider extends BaseProvider { post(getGatewayConfigURL.toUrl, jsonEncode({}), timeout: timeout); Future getGatewayConfigurationNotLoading(int timeout) => - post(getGatewayConfigURL.toUrl, jsonEncode({}), timeout: timeout,isUnShowLoading: true); + post(getGatewayConfigURL.toUrl, jsonEncode({}), + timeout: timeout, isUnShowLoading: true); Future gatewayConnectionLockListLoadData( int gatewayId, int timeout) => diff --git a/lib/network/api_repository.dart b/lib/network/api_repository.dart index c2732880..b5e09c33 100755 --- a/lib/network/api_repository.dart +++ b/lib/network/api_repository.dart @@ -496,10 +496,12 @@ class ApiRepository { final res = await apiProvider.getLockSettingInfoData(lockId); return LockSetInfoEntity.fromJson(res.body); } + // 获取所有锁设置信息(不显示加载框) Future getLockSettingInfoDataIsNotLoadingIcon( {required String lockId}) async { - final res = await apiProvider.getLockSettingInfoDataIsNotLoadingIcon(lockId); + final res = + await apiProvider.getLockSettingInfoDataIsNotLoadingIcon(lockId); return LockSetInfoEntity.fromJson(res.body); } @@ -1928,6 +1930,13 @@ class ApiRepository { return GetewayDataEntity.fromJson(res.body); } + // 获取网关详情 + Future getGatewayDetailData( + {required int gatewayId, required int timeout}) async { + final res = await apiProvider.getGatewayDetailData(gatewayId, timeout); + return GetewayInfoEntity.fromJson(res.body); + } + // 添加网关 Future gatewayDistributionNetwork( {required String gatewayName, @@ -2027,7 +2036,6 @@ class ApiRepository { return GetGatewayConfigurationEntity.fromJson(res.body); } - // 移除坏锁 Future removeBrokenLockData( {required List lockIdList}) async { diff --git a/pubspec.lock b/pubspec.lock index 3eff3ffe..9b40c4b0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1045,6 +1045,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.13" + jverify: + dependency: "direct main" + description: + name: jverify + sha256: "26d1667d8c71403b77a2620a8c618625f8b4bfc950dac285b8f35ebc5e60fa5a" + url: "https://pub.dev" + source: hosted + version: "3.0.0" leak_tracker: dependency: transitive description: From 1ca854e435e2c64d1406842fc4145d7f8a1511f4 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Wed, 12 Mar 2025 11:51:14 +0800 Subject: [PATCH 028/135] =?UTF-8?q?fix=EF=BC=9A=E7=BD=91=E5=85=B3=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E4=BF=AE=E6=94=B9=E7=9A=84=E5=BC=B9=E6=A1=86=E8=AF=B7?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E5=A7=93=E5=90=8D=E5=BA=94=E6=98=AF=E8=AF=B7?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart b/lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart index 612aba33..795f2923 100755 --- a/lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart +++ b/lib/mine/gateway/gatewayDetail/gatewayDetail_page.dart @@ -42,10 +42,10 @@ class _GatewayDetailPageState extends State { action: () { ShowTipView().showTFViewAlertDialog( state.changeGatewayNameController, - '请输入姓名'.tr, - '请输入姓名'.tr, () { + '请输入名称'.tr, + '请输入名称'.tr, () { if (state.changeGatewayNameController.text.isEmpty) { - logic.showToast('请输入姓名'.tr); + logic.showToast('请输入名称'.tr); return; } Get.back(); From 2fb3c7d2b557f8c8b43492fc234afb8cc1ca63a1 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 12 Mar 2025 14:22:56 +0800 Subject: [PATCH 029/135] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E7=94=B5?= =?UTF-8?q?=E6=9C=BA=E5=8A=9F=E7=8E=87=E6=93=8D=E4=BD=9C=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E3=80=81=E4=B8=8D=E5=9C=A8=E9=94=81=E8=BE=B9?= =?UTF-8?q?=E5=BA=94=E6=8F=90=E7=A4=BA=E6=93=8D=E4=BD=9C=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E3=80=81=E6=97=A0=E7=BD=91=E7=BB=9C=E5=9C=A8=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E6=97=B6=E5=BA=94=E6=8F=90=E7=A4=BA=E7=BD=91=E7=BB=9C=E8=AE=BF?= =?UTF-8?q?=E9=97=AE=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lockSet/motorPower/motorPower_logic.dart | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/main/lockDetail/lockSet/motorPower/motorPower_logic.dart b/lib/main/lockDetail/lockSet/motorPower/motorPower_logic.dart index 44b72e64..79f860ea 100755 --- a/lib/main/lockDetail/lockSet/motorPower/motorPower_logic.dart +++ b/lib/main/lockDetail/lockSet/motorPower/motorPower_logic.dart @@ -30,9 +30,10 @@ class MotorPowerLogic extends BaseGetXController { state.lockSetInfoData.value.lockSettingInfo!.openDirectionValue = state.motorTorsion.value; - eventBus - .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - showToast('操作成功'.tr); + showToast('操作成功'.tr, something: () { + eventBus + .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + }); } } @@ -80,6 +81,7 @@ class MotorPowerLogic extends BaseGetXController { switch (status) { case 0x00: //成功 + cancelBlueConnetctToastTimer(); _setLockSetGeneralSetting(); break; case 0x06: @@ -123,6 +125,10 @@ class MotorPowerLogic extends BaseGetXController { // 设置支持功能(带参数) Future sendOpenDoorDirection() async { + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); + }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { @@ -149,6 +155,10 @@ class MotorPowerLogic extends BaseGetXController { needAuthor: 1, publicKey: getPublicKeyList, privateKey: getPrivateKeyList); + } else if (connectionState == BluetoothConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + showBlueConnetctToast(); } }); } From 794bf8cf1127a9c15a0775b231b9ea3bc68e34a0 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 12 Mar 2025 17:31:54 +0800 Subject: [PATCH 030/135] =?UTF-8?q?feat:=E8=B0=83=E6=95=B4=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E8=AE=B0=E5=BD=95=E6=97=B6=E4=B8=80=E7=9B=B4=E8=BD=AC?= =?UTF-8?q?=E5=9C=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doorLockLog/doorLockLog_logic.dart | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart b/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart index 052ac7e8..4999b8ed 100755 --- a/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart +++ b/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart @@ -54,9 +54,11 @@ class DoorLockLogLogic extends BaseGetXController { switch (status) { case 0x00: + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); //成功 final int dataLength = (reply.data[5] << 8) + reply.data[6]; - // AppLog.log("dataLength:$dataLength"); + AppLog.log("dataLength:$dataLength"); // var dataLength = reply.data[5]; if (dataLength > 0) { reply.data.removeRange(0, 7); @@ -108,6 +110,8 @@ class DoorLockLogLogic extends BaseGetXController { state.ifHaveNext = false; } lockRecordUploadData(uploadList); + } else { + showToast('暂无最新记录'.tr); } break; case 0x06: @@ -117,6 +121,7 @@ class DoorLockLogLogic extends BaseGetXController { default: //失败 dismissEasyLoading(); + cancelBlueConnetctToastTimer(); break; } } @@ -148,30 +153,23 @@ class DoorLockLogLogic extends BaseGetXController { ).toString(); showEasyLoading(); - showBlueConnetctToastTimer( - isShowBlueConnetctToast: true, - action: () async { - cancelBlueConnetctToastTimer(); + showBlueConnetctToastTimer(action: () async { + dismissEasyLoading(); + final String getMobile = (await Storage.getMobile())!; + ApmHelper.instance.trackEvent('check_doorLockLog', { + 'lockName': state.keyInfos.value.lockName!, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'open_lock_result': '超时', + }); - final String getMobile = (await Storage.getMobile())!; - ApmHelper.instance.trackEvent('check_doorLockLog', { - 'lockName': state.keyInfos.value.lockName!, - 'account': - getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, - 'date': DateTool().getNowDateWithType(1), - 'open_lock_result': '超时', - }); - - BuglyTool.uploadException( - message: '查询锁记录超时-查询锁记录失败', - detail: - '添加密码超时,查询锁记录失败--senderReferEventRecordTimeCommand:$command', - eventStr: '查询锁记录事件超时', - upload: true); - if (state.isLockReceiveResponse == false) { - dismissEasyLoading(); - } - }); + BuglyTool.uploadException( + message: '查询锁记录超时-查询锁记录失败', + detail: '添加密码超时,查询锁记录失败--senderReferEventRecordTimeCommand:$command', + eventStr: '查询锁记录事件超时', + upload: true); + }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionStateState) async { if (connectionStateState == BluetoothConnectionState.connected) { @@ -303,20 +301,22 @@ class DoorLockLogLogic extends BaseGetXController { lockId: state.keyInfos.value.lockId.toString(), records: list); final String getMobile = (await Storage.getMobile())!; if (entity.errorCode!.codeIsSuccessful) { - if (state.ifHaveNext == true) { - showEasyLoading(); - getLockRecordLastUploadDataTime(); - } else { - ApmHelper.instance.trackEvent('check_doorLockLog', { - 'lockName': state.keyInfos.value.lockName!, - 'account': - getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, - 'date': DateTool().getNowDateWithType(1), - 'open_lock_result': '成功', - }); - mockNetworkDataRequest(isRefresh: true); - } - dismissEasyLoading(); + showToast('操作成功'.tr, something: () async { + dismissEasyLoading(); + if (state.ifHaveNext == true) { + showEasyLoading(); + getLockRecordLastUploadDataTime(); + } else { + ApmHelper.instance.trackEvent('check_doorLockLog', { + 'lockName': state.keyInfos.value.lockName!, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'open_lock_result': '成功', + }); + mockNetworkDataRequest(isRefresh: true); + } + }); } else { ApmHelper.instance.trackEvent('check_doorLockLog', { 'lockName': state.keyInfos.value.lockName!, From fcdd09fcb2448d0579bbbcf816e1a842311b96f3 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 12 Mar 2025 17:32:26 +0800 Subject: [PATCH 031/135] =?UTF-8?q?feat:=E8=B0=83=E6=95=B4IOS=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E5=88=86=E4=BA=AB=E9=80=89=E6=A8=A1=E6=9D=BF=E5=90=8E?= =?UTF-8?q?=E5=92=8C=E7=94=B5=E5=AD=90=E9=92=A5=E5=8C=99=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E9=94=AE=E7=9B=98=E6=97=A0=E6=B3=95=E6=94=B6?= =?UTF-8?q?=E8=B5=B7=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sendEmailNotification/sendEmailNotification_page.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart b/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart index 90e4c33e..06efc928 100755 --- a/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart +++ b/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart @@ -95,6 +95,9 @@ class _SendEmailNotificationPageState extends State { maxLength: 1000, textAlign: TextAlign.start, controller: state.templateContentController, + keyboardType: TextInputType.multiline, // 多行文本键盘类型 + textInputAction: TextInputAction.done, // 键盘完成按钮 + onEditingComplete: () => FocusScope.of(context).unfocus(), // 点击完成 style: TextStyle( color: Colors.black, fontSize: 22.sp, From 0cdaa26fe5112d748c44b4a87e095dfb6d622b51 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 12 Mar 2025 17:42:02 +0800 Subject: [PATCH 032/135] =?UTF-8?q?feat:=E8=B0=83=E6=95=B4image=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=E5=AF=B9=E8=AE=B2=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/talkView/talk_view_logic.dart | 256 +++++++++++++++--- .../views/talkView/talk_view_page.dart | 24 +- .../views/talkView/talk_view_state.dart | 3 + 3 files changed, 228 insertions(+), 55 deletions(-) diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index 71473bee..111741e3 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -38,17 +38,25 @@ class TalkViewLogic extends BaseGetXController { final LockDetailState lockDetailState = Get.put(LockDetailLogic()).state; Timer? _syncTimer; // 音视频播放刷新率定时器 Timer? _audioTimer; // 音视频播放刷新率定时器 + Timer? _networkQualityTimer; // 网络质量监测定时器 + int _startTime = 0; // 开始播放时间戳,用于判断帧数据中的时间戳位置 int bufferSize = 40; // 缓冲区大小(以帧为单位) int audioBufferSize = 500; // 缓冲区大小(以帧为单位) + // 帧率监控相关 + final List _lastFewFps = []; // 存储最近的帧率数据 - int frameIntervalMs = 45; // 初始帧间隔设置为45毫秒(约22FPS) + int frameIntervalMs = 83; // 初始帧间隔设置为83毫秒(12FPS) int audioFrameIntervalMs = 20; // 初始帧间隔设置为45毫秒(约22FPS) - int minFrameIntervalMs = 30; // 最小帧间隔(约33 FPS) - int maxFrameIntervalMs = 100; // 最大帧间隔(约1 FPS) + int minFrameIntervalMs = 83; // 最小帧间隔(12 FPS) + int maxFrameIntervalMs = 166; // 最大帧间隔(约6 FPS) // 定义音频帧缓冲和发送函数 final List _bufferedAudioFrames = []; + // 在类的开始处添加缓存相关变量 + final int maxImageCacheCount = 40; // 最大图片缓存数量 + final Map _imageCache = {}; + /// 初始化音频播放器 void _initFlutterPcmSound() { const int sampleRate = 8000; @@ -150,63 +158,205 @@ class TalkViewLogic extends BaseGetXController { /// 播放视频数据 void _playVideoData(TalkData talkData) async { - state.listData.value = Uint8List.fromList(talkData.content); + try { + // 计算当前帧的哈希值作为缓存key + String cacheKey = talkData.content.hashCode.toString(); + + // 检查缓存 + if (_imageCache.containsKey(cacheKey)) { + // 使用缓存的解码图片 + state.currentImage.value = _imageCache[cacheKey]; + } else { + // 将 List 转换为 Uint8List + final Uint8List uint8Data = Uint8List.fromList(talkData.content); + // 在后台线程解码图片 + ui.Image? image = await decodeImageFromList(uint8Data); + + // 缓存管理:如果缓存太大则移除最早的项 + if (_imageCache.length >= maxImageCacheCount) { + _imageCache.remove(_imageCache.keys.first); + } + + // 添加到缓存 + _imageCache[cacheKey] = image; + state.currentImage.value = image; + } + + // 更新显示数据 + state.listData.value = Uint8List.fromList(talkData.content); + } catch (e) { + print('视频帧解码错误: $e'); + } + // state.listData.value = Uint8List.fromList(talkData.content); } /// 启动播放 void _startPlayback() { Future.delayed(Duration(milliseconds: 800), () { + // 添加网络质量监测 + _networkQualityTimer ??= + Timer.periodic(const Duration(seconds: 5), _checkNetworkQuality); _startTime = DateTime.now().millisecondsSinceEpoch; _syncTimer ??= Timer.periodic(Duration(milliseconds: frameIntervalMs), (timer) { // 动态调整帧间隔 _adjustFrameInterval(); + // 监控帧率稳定性 + _monitorFrameStability(); }); }); } /// 动态调整帧间隔 void _adjustFrameInterval() { - int newFrameIntervalMs = frameIntervalMs; - if (state.videoBuffer.length < 10 && frameIntervalMs < maxFrameIntervalMs) { - // 如果缓冲区较小且帧间隔小于最大值,则增加帧间隔 - frameIntervalMs += 5; - } else if (state.videoBuffer.length > 20 && - frameIntervalMs > minFrameIntervalMs) { - // 如果缓冲区较大且帧间隔大于最小值,则减少帧间隔 - frameIntervalMs -= 5; + // 计算目标帧间隔 + int targetInterval = _calculateTargetInterval(); + + // 平滑过渡到目标帧率,避免突变 + if (frameIntervalMs != targetInterval) { + // 每次最多调整2ms,使变化更平滑 + frameIntervalMs += (targetInterval > frameIntervalMs) ? 2 : -2; + + // 确保在合理范围内 + frameIntervalMs = + frameIntervalMs.clamp(minFrameIntervalMs, maxFrameIntervalMs); + + // 只在帧间隔变化超过阈值时才重建定时器 + if ((frameIntervalMs - targetInterval).abs() >= 5) { + _rebuildTimers(); + } } - // 只有在帧间隔发生变化时才重建定时器 - if (newFrameIntervalMs != frameIntervalMs) { - frameIntervalMs = newFrameIntervalMs; - // 取消旧的定时器 - _syncTimer?.cancel(); - _syncTimer = - Timer.periodic(Duration(milliseconds: frameIntervalMs), (timer) { - // 播放视频帧 - _playVideoFrames(); - }); + // int newFrameIntervalMs = frameIntervalMs; + // if (state.videoBuffer.length < 10 && frameIntervalMs < maxFrameIntervalMs) { + // // 如果缓冲区较小且帧间隔小于最大值,则增加帧间隔 + // frameIntervalMs += 5; + // } else if (state.videoBuffer.length > 20 && + // frameIntervalMs > minFrameIntervalMs) { + // // 如果缓冲区较大且帧间隔大于最小值,则减少帧间隔 + // frameIntervalMs -= 5; + // } + // // 只有在帧间隔发生变化时才重建定时器 + // if (newFrameIntervalMs != frameIntervalMs) { + // frameIntervalMs = newFrameIntervalMs; + // // 取消旧的定时器 + // _syncTimer?.cancel(); + // _syncTimer = + // Timer.periodic(Duration(milliseconds: frameIntervalMs), (timer) { + // // 播放视频帧 + // _playVideoFrames(); + // }); + // + // _audioTimer?.cancel(); + // _audioTimer = + // Timer.periodic(Duration(milliseconds: audioFrameIntervalMs), (timer) { + // final currentTime = DateTime.now().millisecondsSinceEpoch; + // final elapsedTime = currentTime - _startTime; + // + // // 播放合适的音频帧 + // if (state.audioBuffer.isNotEmpty && + // state.audioBuffer.first.durationMs <= elapsedTime) { + // // 判断音频开关是否打开 + // if (state.isOpenVoice.value) { + // _playAudioData(state.audioBuffer.removeAt(0)); + // } else { + // // 如果不播放音频,只从缓冲区中读取数据,但不移除 + // // 你可以根据需要调整此处逻辑,例如保留缓冲区的最大长度,防止无限增长 + // // 仅移除缓冲区数据但不播放音频,确保音频也是实时更新的 + // state.audioBuffer.removeAt(0); + // } + // } + // }); + // } + } - _audioTimer?.cancel(); - _audioTimer = - Timer.periodic(Duration(milliseconds: audioFrameIntervalMs), (timer) { - final currentTime = DateTime.now().millisecondsSinceEpoch; - final elapsedTime = currentTime - _startTime; + /// 监控帧率稳定性 + void _monitorFrameStability() { + const stabilityThreshold = 5; // 帧率波动阈值 + final currentFps = 1000 / frameIntervalMs; - // 播放合适的音频帧 - if (state.audioBuffer.isNotEmpty && - state.audioBuffer.first.durationMs <= elapsedTime) { - // 判断音频开关是否打开 - if (state.isOpenVoice.value) { - _playAudioData(state.audioBuffer.removeAt(0)); - } else { - // 如果不播放音频,只从缓冲区中读取数据,但不移除 - // 你可以根据需要调整此处逻辑,例如保留缓冲区的最大长度,防止无限增长 - // 仅移除缓冲区数据但不播放音频,确保音频也是实时更新的 - state.audioBuffer.removeAt(0); - } - } - }); + if (_lastFewFps.length >= 10) { + _lastFewFps.removeAt(0); + } + _lastFewFps.add(currentFps); + + // 计算帧率标准差 + if (_lastFewFps.length >= 5) { + double mean = _lastFewFps.reduce((a, b) => a + b) / _lastFewFps.length; + double variance = + _lastFewFps.map((fps) => pow(fps - mean, 2)).reduce((a, b) => a + b) / + _lastFewFps.length; + double stdDev = sqrt(variance); + + // 如果帧率波动过大,采取平滑措施 + if (stdDev > stabilityThreshold) { + _smoothFrameRate(mean); + } + } + } + + /// 检查网络质量 + void _checkNetworkQuality(Timer timer) { + final bufferHealth = state.videoBuffer.length / bufferSize; + + if (bufferHealth < 0.3) { + // 缓冲区不足30% + // 降低帧率以适应网络状况 + frameIntervalMs = min(frameIntervalMs + 10, maxFrameIntervalMs); + _rebuildTimers(); + } else if (bufferHealth > 0.7) { + // 缓冲区超过70% + // 提高帧率以提供更好体验 + frameIntervalMs = max(frameIntervalMs - 5, minFrameIntervalMs); + _rebuildTimers(); + } + } + + /// 计算目标帧间隔 + int _calculateTargetInterval() { + const int optimalBufferSize = 15; // 理想的缓冲区大小 + const int bufferTolerance = 5; // 缓冲区容差 + + if (state.videoBuffer.length < optimalBufferSize - bufferTolerance) { + // 缓冲区过小,降低帧率 + return (frameIntervalMs * 1.2).round(); + } else if (state.videoBuffer.length > optimalBufferSize + bufferTolerance) { + // 缓冲区过大,提高帧率 + return (frameIntervalMs * 0.8).round(); + } + return frameIntervalMs; + } + + /// 重建定时器 + void _rebuildTimers() { + // 取消现有定时器 + _syncTimer?.cancel(); + _audioTimer?.cancel(); + + // 创建新的视频定时器 + _syncTimer = + Timer.periodic(Duration(milliseconds: frameIntervalMs), (timer) { + _playVideoFrames(); + }); + + // 创建新的音频定时器,使用固定间隔 + _audioTimer = + Timer.periodic(Duration(milliseconds: audioFrameIntervalMs), (timer) { + _processAudioFrame(); + }); + } + + /// 处理音频帧 + void _processAudioFrame() { + final currentTime = DateTime.now().millisecondsSinceEpoch; + final elapsedTime = currentTime - _startTime; + + while (state.audioBuffer.isNotEmpty && + state.audioBuffer.first.durationMs <= elapsedTime) { + if (state.isOpenVoice.value) { + _playAudioData(state.audioBuffer.removeAt(0)); + } else { + state.audioBuffer.removeAt(0); + } } } @@ -404,6 +554,24 @@ class TalkViewLogic extends BaseGetXController { requestPermissions(); } + /// 平滑帧率 + void _smoothFrameRate(double targetFps) { + // 计算目标帧间隔 + int targetInterval = (1000 / targetFps).round(); + + // 使用加权平均来平滑过渡 + double weight = 0.3; // 权重因子,可以根据需要调整 + frameIntervalMs = + (frameIntervalMs * (1 - weight) + targetInterval * weight).round(); + + // 确保帧间隔在合理范围内 + frameIntervalMs = + frameIntervalMs.clamp(minFrameIntervalMs, maxFrameIntervalMs); + + // 重建定时器 + _rebuildTimers(); + } + @override void onClose() { _stopPlayG711Data(); // 停止播放音频 @@ -416,7 +584,13 @@ class TalkViewLogic extends BaseGetXController { _audioTimer = null; // 释放定时器引用 state.oneMinuteTimeTimer?.cancel(); state.oneMinuteTimeTimer = null; + // 添加新的清理代码 + _networkQualityTimer?.cancel(); + _lastFewFps.clear(); stopProcessingAudio(); + // 清理图片缓存 + _imageCache.clear(); + super.onClose(); } diff --git a/lib/talk/starChart/views/talkView/talk_view_page.dart b/lib/talk/starChart/views/talkView/talk_view_page.dart index 2059d0ac..021d1616 100644 --- a/lib/talk/starChart/views/talkView/talk_view_page.dart +++ b/lib/talk/starChart/views/talkView/talk_view_page.dart @@ -133,20 +133,16 @@ class _TalkViewPageState extends State child: SizedBox.expand( child: RotatedBox( quarterTurns: -1, - child: Image.memory( - state.listData.value, - width: ScreenUtil().scaleWidth, - height: ScreenUtil().scaleHeight, - gaplessPlayback: true, - fit: BoxFit.cover, - filterQuality: FilterQuality.high, - errorBuilder: ( - BuildContext context, - Object error, - StackTrace? stackTrace, - ) { - return Container(color: Colors.transparent); - }, + child: Obx( + () => state.currentImage.value != null + ? RawImage( + image: state.currentImage.value, + width: ScreenUtil().scaleWidth, + height: ScreenUtil().scaleHeight, + fit: BoxFit.cover, + filterQuality: FilterQuality.high, + ) + : Container(color: Colors.transparent), ), ), ), diff --git a/lib/talk/starChart/views/talkView/talk_view_state.dart b/lib/talk/starChart/views/talkView/talk_view_state.dart index 25538093..66974032 100644 --- a/lib/talk/starChart/views/talkView/talk_view_state.dart +++ b/lib/talk/starChart/views/talkView/talk_view_state.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:typed_data'; +import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:flutter_voice_processor/flutter_voice_processor.dart'; @@ -89,4 +90,6 @@ class TalkViewState { RxBool isLongPressing = false.obs; // 旋转角度(以弧度为单位) RxBool hasAudioData = false.obs; // 是否有音频数据 RxInt lastAudioTimestamp = 0.obs; // 最后接收到的音频数据的时间戳 + // 添加图片状态变量 + final Rx currentImage = Rx(null); } From fc23d8f8513ba10266d4f0e32c19e3087e40d1dc Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 13 Mar 2025 13:38:59 +0800 Subject: [PATCH 033/135] =?UTF-8?q?feat:=E8=B0=83=E6=95=B4=E5=AF=B9?= =?UTF-8?q?=E8=AE=B2=E6=97=B6=E7=9A=84=E6=95=B0=E6=8D=AE=E7=BC=93=E5=86=B2?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/talkView/talk_view_logic.dart | 414 ++++++------------ .../views/talkView/talk_view_state.dart | 1 - 2 files changed, 146 insertions(+), 269 deletions(-) diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index 111741e3..63fbafc7 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -36,25 +36,22 @@ class TalkViewLogic extends BaseGetXController { final TalkViewState state = TalkViewState(); final LockDetailState lockDetailState = Get.put(LockDetailLogic()).state; - Timer? _syncTimer; // 音视频播放刷新率定时器 - Timer? _audioTimer; // 音视频播放刷新率定时器 - Timer? _networkQualityTimer; // 网络质量监测定时器 - int _startTime = 0; // 开始播放时间戳,用于判断帧数据中的时间戳位置 - int bufferSize = 40; // 缓冲区大小(以帧为单位) - int audioBufferSize = 500; // 缓冲区大小(以帧为单位) - // 帧率监控相关 - final List _lastFewFps = []; // 存储最近的帧率数据 + final int minBufferSize = 2; // 最小缓冲2帧,约166ms + final int maxBufferSize = 8; // 最大缓冲8帧,约666ms + int bufferSize = 3; // 初始化为默认大小 + // 修改音频相关的成员变量 + final int minAudioBufferSize = 1; // 音频最小缓冲1帧 + final int maxAudioBufferSize = 3; // 音频最大缓冲3帧 + int audioBufferSize = 2; // 音频默认缓冲2帧 + + // 添加开始时间记录 + int _startTime = 0; // 开始播放时间戳 + bool _isFirstFrame = true; // 是否是第一帧 - int frameIntervalMs = 83; // 初始帧间隔设置为83毫秒(12FPS) - int audioFrameIntervalMs = 20; // 初始帧间隔设置为45毫秒(约22FPS) - int minFrameIntervalMs = 83; // 最小帧间隔(12 FPS) - int maxFrameIntervalMs = 166; // 最大帧间隔(约6 FPS) // 定义音频帧缓冲和发送函数 final List _bufferedAudioFrames = []; - // 在类的开始处添加缓存相关变量 - final int maxImageCacheCount = 40; // 最大图片缓存数量 final Map _imageCache = {}; /// 初始化音频播放器 @@ -91,24 +88,153 @@ class TalkViewLogic extends BaseGetXController { void _startListenTalkData() { state.talkDataRepository.talkDataStream.listen((TalkData talkData) async { final contentType = talkData.contentType; + final currentTime = DateTime.now().millisecondsSinceEpoch; + + // 第一帧到达时记录开始时间 + if (_isFirstFrame) { + _startTime = currentTime; + _isFirstFrame = false; + } + // 判断数据类型,进行分发处理 switch (contentType) { case TalkData_ContentTypeE.G711: - if (state.audioBuffer.length >= audioBufferSize) { + if (state.audioBuffer.length >= bufferSize) { state.audioBuffer.removeAt(0); // 丢弃最旧的数据 } state.audioBuffer.add(talkData); // 添加新数据 + // 添加音频播放逻辑,与视频类似 + _playAudioFrames(); break; case TalkData_ContentTypeE.Image: + // 计算实际延迟:(当前系统时间 - 开始时间) - 帧的预期播放时间 + final expectedTime = _startTime + talkData.durationMs; + final videoDelay = currentTime - expectedTime; + // 动态调整缓冲区 + _adjustBufferSize(videoDelay); + // 然后添加到播放缓冲区 if (state.videoBuffer.length >= bufferSize) { - state.videoBuffer.removeAt(0); // 丢弃最旧的数据 + state.videoBuffer.removeAt(0); } - state.videoBuffer.add(talkData); // 添加新数据 + state.videoBuffer.add(talkData); + // 先进行解码和缓存 + await _decodeAndCacheFrame(talkData); + // 最后尝试播放 + _playVideoFrames(); break; } }); } + // 修改:视频帧播放逻辑 + void _playVideoFrames() { + // 如果缓冲区为空或未达到目标大小,不进行播放 + if (state.videoBuffer.isEmpty || state.videoBuffer.length < bufferSize) { + // AppLog.log('📊 缓冲中 - 当前缓冲区大小: ${state.videoBuffer.length}/${bufferSize}'); + return; + } + // 找出时间戳最小的帧(最旧的帧) + TalkData? oldestFrame; + int oldestIndex = -1; + for (int i = 0; i < state.videoBuffer.length; i++) { + if (oldestFrame == null || + state.videoBuffer[i].durationMs < oldestFrame.durationMs) { + oldestFrame = state.videoBuffer[i]; + oldestIndex = i; + } + } + // 确保找到了有效帧 + if (oldestFrame != null && oldestIndex != -1) { + final cacheKey = oldestFrame.content.hashCode.toString(); + + // 使用缓存的解码图片更新显示 + if (_imageCache.containsKey(cacheKey)) { + state.currentImage.value = _imageCache[cacheKey]; + state.listData.value = Uint8List.fromList(oldestFrame.content); + state.videoBuffer.removeAt(oldestIndex); // 移除已播放的帧 + + // AppLog.log('🎬 播放帧 - 缓冲区剩余: ${state.videoBuffer.length}/${bufferSize}, ' + // '播放延迟: ${currentTime - oldestFrame.durationMs}ms, ' + // '帧时间戳: ${oldestFrame.durationMs}'); + } else { + // AppLog.log('⚠️ 帧未找到缓存 - Key: $cacheKey'); + state.videoBuffer.removeAt(oldestIndex); // 移除无法播放的帧 + } + } + } + + // 新增:音频帧播放逻辑 + void _playAudioFrames() { + // 如果缓冲区为空或未达到目标大小,不进行播放 + // 音频缓冲区要求更小,以减少延迟 + if (state.audioBuffer.isEmpty || + state.audioBuffer.length < audioBufferSize) { + return; + } + + // 找出时间戳最小的音频帧 + TalkData? oldestFrame; + int oldestIndex = -1; + for (int i = 0; i < state.audioBuffer.length; i++) { + if (oldestFrame == null || + state.audioBuffer[i].durationMs < oldestFrame.durationMs) { + oldestFrame = state.audioBuffer[i]; + oldestIndex = i; + } + } + + // 确保找到了有效帧 + if (oldestFrame != null && oldestIndex != -1) { + if (state.isOpenVoice.value) { + // 播放音频 + _playAudioData(oldestFrame); + } + state.audioBuffer.removeAt(oldestIndex); + } + } + + // 新增:解码和缓存帧的方法 + Future _decodeAndCacheFrame(TalkData talkData) async { + try { + String cacheKey = talkData.content.hashCode.toString(); + + // 如果该帧还没有被缓存,则进行解码和缓存 + if (!_imageCache.containsKey(cacheKey)) { + final Uint8List uint8Data = Uint8List.fromList(talkData.content); + final ui.Image image = await decodeImageFromList(uint8Data); + + // 管理缓存大小 + if (_imageCache.length >= bufferSize) { + _imageCache.remove(_imageCache.keys.first); + } + + // 添加到缓存 + _imageCache[cacheKey] = image; + + // AppLog.log('📥 缓存新帧 - 缓存数: ${_imageCache.length}, Key: $cacheKey'); + } + } catch (e) { + AppLog.log('❌ 帧解码错误: $e'); + } + } + + // 新增:动态调整缓冲区大小的方法 + void _adjustBufferSize(int delay) { + const int delayThresholdHigh = 250; // 高延迟阈值(约3帧的时间) + const int delayThresholdLow = 166; // 低延迟阈值(约2帧的时间) + const int adjustInterval = 1; // 每次调整1帧 + + if (delay > delayThresholdHigh && bufferSize < maxBufferSize) { + // 延迟较大,增加缓冲区 + bufferSize = min(bufferSize + adjustInterval, maxBufferSize); + AppLog.log('📈 增加缓冲区 - 当前大小: $bufferSize, 延迟: ${delay}ms'); + } else if (delay < delayThresholdLow && bufferSize > minBufferSize) { + // 延迟较小,减少缓冲区 + bufferSize = max(bufferSize - adjustInterval, minBufferSize); + AppLog.log('📉 减少缓冲区 - 当前大小: $bufferSize, 延迟: ${delay}ms'); + } + } + /// 监听对讲状态 void _startListenTalkStatus() { state.startChartTalkStatus.statusStream.listen((talkStatus) { @@ -156,231 +282,6 @@ class TalkViewLogic extends BaseGetXController { } } - /// 播放视频数据 - void _playVideoData(TalkData talkData) async { - try { - // 计算当前帧的哈希值作为缓存key - String cacheKey = talkData.content.hashCode.toString(); - - // 检查缓存 - if (_imageCache.containsKey(cacheKey)) { - // 使用缓存的解码图片 - state.currentImage.value = _imageCache[cacheKey]; - } else { - // 将 List 转换为 Uint8List - final Uint8List uint8Data = Uint8List.fromList(talkData.content); - // 在后台线程解码图片 - ui.Image? image = await decodeImageFromList(uint8Data); - - // 缓存管理:如果缓存太大则移除最早的项 - if (_imageCache.length >= maxImageCacheCount) { - _imageCache.remove(_imageCache.keys.first); - } - - // 添加到缓存 - _imageCache[cacheKey] = image; - state.currentImage.value = image; - } - - // 更新显示数据 - state.listData.value = Uint8List.fromList(talkData.content); - } catch (e) { - print('视频帧解码错误: $e'); - } - // state.listData.value = Uint8List.fromList(talkData.content); - } - - /// 启动播放 - void _startPlayback() { - Future.delayed(Duration(milliseconds: 800), () { - // 添加网络质量监测 - _networkQualityTimer ??= - Timer.periodic(const Duration(seconds: 5), _checkNetworkQuality); - _startTime = DateTime.now().millisecondsSinceEpoch; - _syncTimer ??= - Timer.periodic(Duration(milliseconds: frameIntervalMs), (timer) { - // 动态调整帧间隔 - _adjustFrameInterval(); - // 监控帧率稳定性 - _monitorFrameStability(); - }); - }); - } - - /// 动态调整帧间隔 - void _adjustFrameInterval() { - // 计算目标帧间隔 - int targetInterval = _calculateTargetInterval(); - - // 平滑过渡到目标帧率,避免突变 - if (frameIntervalMs != targetInterval) { - // 每次最多调整2ms,使变化更平滑 - frameIntervalMs += (targetInterval > frameIntervalMs) ? 2 : -2; - - // 确保在合理范围内 - frameIntervalMs = - frameIntervalMs.clamp(minFrameIntervalMs, maxFrameIntervalMs); - - // 只在帧间隔变化超过阈值时才重建定时器 - if ((frameIntervalMs - targetInterval).abs() >= 5) { - _rebuildTimers(); - } - } - // int newFrameIntervalMs = frameIntervalMs; - // if (state.videoBuffer.length < 10 && frameIntervalMs < maxFrameIntervalMs) { - // // 如果缓冲区较小且帧间隔小于最大值,则增加帧间隔 - // frameIntervalMs += 5; - // } else if (state.videoBuffer.length > 20 && - // frameIntervalMs > minFrameIntervalMs) { - // // 如果缓冲区较大且帧间隔大于最小值,则减少帧间隔 - // frameIntervalMs -= 5; - // } - // // 只有在帧间隔发生变化时才重建定时器 - // if (newFrameIntervalMs != frameIntervalMs) { - // frameIntervalMs = newFrameIntervalMs; - // // 取消旧的定时器 - // _syncTimer?.cancel(); - // _syncTimer = - // Timer.periodic(Duration(milliseconds: frameIntervalMs), (timer) { - // // 播放视频帧 - // _playVideoFrames(); - // }); - // - // _audioTimer?.cancel(); - // _audioTimer = - // Timer.periodic(Duration(milliseconds: audioFrameIntervalMs), (timer) { - // final currentTime = DateTime.now().millisecondsSinceEpoch; - // final elapsedTime = currentTime - _startTime; - // - // // 播放合适的音频帧 - // if (state.audioBuffer.isNotEmpty && - // state.audioBuffer.first.durationMs <= elapsedTime) { - // // 判断音频开关是否打开 - // if (state.isOpenVoice.value) { - // _playAudioData(state.audioBuffer.removeAt(0)); - // } else { - // // 如果不播放音频,只从缓冲区中读取数据,但不移除 - // // 你可以根据需要调整此处逻辑,例如保留缓冲区的最大长度,防止无限增长 - // // 仅移除缓冲区数据但不播放音频,确保音频也是实时更新的 - // state.audioBuffer.removeAt(0); - // } - // } - // }); - // } - } - - /// 监控帧率稳定性 - void _monitorFrameStability() { - const stabilityThreshold = 5; // 帧率波动阈值 - final currentFps = 1000 / frameIntervalMs; - - if (_lastFewFps.length >= 10) { - _lastFewFps.removeAt(0); - } - _lastFewFps.add(currentFps); - - // 计算帧率标准差 - if (_lastFewFps.length >= 5) { - double mean = _lastFewFps.reduce((a, b) => a + b) / _lastFewFps.length; - double variance = - _lastFewFps.map((fps) => pow(fps - mean, 2)).reduce((a, b) => a + b) / - _lastFewFps.length; - double stdDev = sqrt(variance); - - // 如果帧率波动过大,采取平滑措施 - if (stdDev > stabilityThreshold) { - _smoothFrameRate(mean); - } - } - } - - /// 检查网络质量 - void _checkNetworkQuality(Timer timer) { - final bufferHealth = state.videoBuffer.length / bufferSize; - - if (bufferHealth < 0.3) { - // 缓冲区不足30% - // 降低帧率以适应网络状况 - frameIntervalMs = min(frameIntervalMs + 10, maxFrameIntervalMs); - _rebuildTimers(); - } else if (bufferHealth > 0.7) { - // 缓冲区超过70% - // 提高帧率以提供更好体验 - frameIntervalMs = max(frameIntervalMs - 5, minFrameIntervalMs); - _rebuildTimers(); - } - } - - /// 计算目标帧间隔 - int _calculateTargetInterval() { - const int optimalBufferSize = 15; // 理想的缓冲区大小 - const int bufferTolerance = 5; // 缓冲区容差 - - if (state.videoBuffer.length < optimalBufferSize - bufferTolerance) { - // 缓冲区过小,降低帧率 - return (frameIntervalMs * 1.2).round(); - } else if (state.videoBuffer.length > optimalBufferSize + bufferTolerance) { - // 缓冲区过大,提高帧率 - return (frameIntervalMs * 0.8).round(); - } - return frameIntervalMs; - } - - /// 重建定时器 - void _rebuildTimers() { - // 取消现有定时器 - _syncTimer?.cancel(); - _audioTimer?.cancel(); - - // 创建新的视频定时器 - _syncTimer = - Timer.periodic(Duration(milliseconds: frameIntervalMs), (timer) { - _playVideoFrames(); - }); - - // 创建新的音频定时器,使用固定间隔 - _audioTimer = - Timer.periodic(Duration(milliseconds: audioFrameIntervalMs), (timer) { - _processAudioFrame(); - }); - } - - /// 处理音频帧 - void _processAudioFrame() { - final currentTime = DateTime.now().millisecondsSinceEpoch; - final elapsedTime = currentTime - _startTime; - - while (state.audioBuffer.isNotEmpty && - state.audioBuffer.first.durationMs <= elapsedTime) { - if (state.isOpenVoice.value) { - _playAudioData(state.audioBuffer.removeAt(0)); - } else { - state.audioBuffer.removeAt(0); - } - } - } - - void _playVideoFrames() { - final currentTime = DateTime.now().millisecondsSinceEpoch; - final elapsedTime = currentTime - _startTime; - - // 播放合适的视频帧 - // 跳帧策略:如果缓冲区中有多个帧,且它们的时间戳都在当前时间之前,则播放最新的帧 - int maxFramesToProcess = 5; // 每次最多处理 5 帧 - int processedFrames = 0; - - while (state.videoBuffer.isNotEmpty && - state.videoBuffer.first.durationMs <= elapsedTime && - processedFrames < maxFramesToProcess) { - if (state.videoBuffer.length > 1) { - state.videoBuffer.removeAt(0); - } else { - _playVideoData(state.videoBuffer.removeAt(0)); - } - processedFrames++; - } - } - /// 停止播放音频 void _stopPlayG711Data() async { await FlutterPcmSound.pause(); @@ -546,7 +447,7 @@ class TalkViewLogic extends BaseGetXController { _initFlutterPcmSound(); // 启动播放定时器 - _startPlayback(); + // _startPlayback(); // 初始化录音控制器 _initAudioRecorder(); @@ -554,39 +455,16 @@ class TalkViewLogic extends BaseGetXController { requestPermissions(); } - /// 平滑帧率 - void _smoothFrameRate(double targetFps) { - // 计算目标帧间隔 - int targetInterval = (1000 / targetFps).round(); - - // 使用加权平均来平滑过渡 - double weight = 0.3; // 权重因子,可以根据需要调整 - frameIntervalMs = - (frameIntervalMs * (1 - weight) + targetInterval * weight).round(); - - // 确保帧间隔在合理范围内 - frameIntervalMs = - frameIntervalMs.clamp(minFrameIntervalMs, maxFrameIntervalMs); - - // 重建定时器 - _rebuildTimers(); - } - @override void onClose() { _stopPlayG711Data(); // 停止播放音频 state.listData.value = Uint8List(0); // 清空视频数据 state.audioBuffer.clear(); // 清空音频缓冲区 state.videoBuffer.clear(); // 清空视频缓冲区 - _syncTimer?.cancel(); // 取消定时器 - _syncTimer = null; // 释放定时器引用 - _audioTimer?.cancel(); - _audioTimer = null; // 释放定时器引用 + state.oneMinuteTimeTimer?.cancel(); state.oneMinuteTimeTimer = null; - // 添加新的清理代码 - _networkQualityTimer?.cancel(); - _lastFewFps.clear(); + stopProcessingAudio(); // 清理图片缓存 _imageCache.clear(); diff --git a/lib/talk/starChart/views/talkView/talk_view_state.dart b/lib/talk/starChart/views/talkView/talk_view_state.dart index 66974032..1ff29b5e 100644 --- a/lib/talk/starChart/views/talkView/talk_view_state.dart +++ b/lib/talk/starChart/views/talkView/talk_view_state.dart @@ -55,7 +55,6 @@ class TalkViewState { // 星图对讲相关状态 List audioBuffer = [].obs; - List audioBuffer2 = [].obs; List activeAudioBuffer = [].obs; List activeVideoBuffer = [].obs; From 5e781a5f00c0110b167ff453095d178ef5711b61 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 13 Mar 2025 13:39:19 +0800 Subject: [PATCH 034/135] =?UTF-8?q?feat:=E8=B0=83=E6=95=B4=E7=BB=84?= =?UTF-8?q?=E5=8C=85=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handle/scp_message_base_handle.dart | 104 ++++++++++++++---- 1 file changed, 84 insertions(+), 20 deletions(-) diff --git a/lib/talk/starChart/handle/scp_message_base_handle.dart b/lib/talk/starChart/handle/scp_message_base_handle.dart index c1225f0e..f4b68024 100644 --- a/lib/talk/starChart/handle/scp_message_base_handle.dart +++ b/lib/talk/starChart/handle/scp_message_base_handle.dart @@ -43,7 +43,7 @@ class ScpMessageBaseHandle { // 存储每个 messageId 对应的分包数据 static Map>> _packetBuffer = {}; final Map _packetTimers = {}; - final Duration _timeoutDuration = Duration(seconds: 10); // 分包组包最大超时时间 + final Duration _timeoutDuration = Duration(seconds: 3); // 分包组包最大超时时间 // 通话数据流的单例流数据处理类 final TalkDataRepository talkDataRepository = TalkDataRepository.instance; @@ -106,40 +106,104 @@ class ScpMessageBaseHandle { required int payloadType, }) { // 初始化分包列表 - String key = '$messageId-$payloadType'; - if (!_packetBuffer.containsKey(key)) { - _packetBuffer[key] = List.filled(spTotal, []); - _startTimer(key); - } + // 使用更高效的key生成方式 + final key = '${messageId}_$payloadType'; + + // 打印每个包的信息 + // AppLog.log( + // '📦 收到分包 - MessageId: $messageId, 总包数: $spTotal, 当前包序号: $spIndex'); // 检查分包索引是否在合法范围内 if (spIndex < 1 || spIndex > spTotal) { - // print( - // 'Invalid spTotal: $spTotal spIndex: $spIndex for messageId: $messageId'); + AppLog.log( + '❌ 分包序号异常 - MessageId: $messageId, 总包数: $spTotal, 无效包序号: $spIndex'); return null; } + // 检查分包索引是否在合法范围内(提前检查可以避免后续无效操作) + if (spIndex < 1 || spIndex > spTotal) return null; + + // 初始化分包列表(使用固定长度列表提高性能) + var packets = _packetBuffer[key]; + if (packets == null) { + // 预分配固定大小的列表,避免动态扩容 + packets = List>.filled(spTotal, const [], growable: false); + _packetBuffer[key] = packets; + _startTimer(key); + // AppLog.log('📝 新建分包缓存 - MessageId: $messageId, 预期总包数: $spTotal'); + } + // 存储当前分包 - _packetBuffer[key]![spIndex - 1] = byte; + packets[spIndex - 1] = byte; - // 检查是否接收到所有分包 - if (_packetBuffer[key]!.every((packet) => packet.isNotEmpty)) { - // 重组所有分包 - Uint8List completePayload = Uint8List.fromList( - _packetBuffer[key]!.expand((packet) => packet).toList()); - // 清除已重组和超时的分包数据 + // 优化检查逻辑,使用循环替代every + var isComplete = true; + var totalLength = 0; + for (var i = 0; i < packets.length; i++) { + if (packets[i].isEmpty) { + isComplete = false; + } else { + totalLength += packets[i].length; + } + } + + if (isComplete) { + // 预分配确切大小的buffer,避免扩容 + final buffer = Uint8List(totalLength); + var offset = 0; + + // 直接复制数据,避免使用expand + for (var packet in packets) { + buffer.setRange(offset, offset + packet.length, packet); + offset += packet.length; + } + + // 清理资源 _clearPacketData(key); - // 使用重组的包构造成TalkData + // 构造TalkData if (payloadType == PayloadTypeConstant.talkData) { final talkData = TalkData(); - talkData.mergeFromBuffer(completePayload); + talkData.mergeFromBuffer(buffer); return talkData; } - } else { - // 如果分包尚未接收完全,返回 null 或其他指示符 - return null; } + + return null; + + // if (!_packetBuffer.containsKey(key)) { + // _packetBuffer[key] = List.filled(spTotal, []); + // _startTimer(key); + // } + // + // // 检查分包索引是否在合法范围内 + // if (spIndex < 1 || spIndex > spTotal) { + // // print( + // // 'Invalid spTotal: $spTotal spIndex: $spIndex for messageId: $messageId'); + // return null; + // } + // + // // 存储当前分包 + // _packetBuffer[key]![spIndex - 1] = byte; + // + // // 检查是否接收到所有分包 + // if (_packetBuffer[key]!.every((packet) => packet.isNotEmpty)) { + // // 重组所有分包 + // Uint8List completePayload = Uint8List.fromList( + // _packetBuffer[key]!.expand((packet) => packet).toList()); + // // 清除已重组和超时的分包数据 + // _clearPacketData(key); + // + // // 使用重组的包构造成TalkData + // if (payloadType == PayloadTypeConstant.talkData) { + // final talkData = TalkData(); + // talkData.mergeFromBuffer(completePayload); + // return talkData; + // } + // } else { + // // 如果分包尚未接收完全,返回 null 或其他指示符 + // return null; + // } } // 启动定时器 From 0fa0e1f3408b7acc351398efc3f8b099d0465498 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 13 Mar 2025 15:06:48 +0800 Subject: [PATCH 035/135] =?UTF-8?q?feat:=E5=BD=93=E4=B8=8D=E6=98=AF?= =?UTF-8?q?=E7=9B=91=E5=90=AC=E4=B8=AD=E6=96=87=E4=B8=8D=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sendElectronicKey/view/sendElectronicKeyView_page.dart | 3 ++- .../sendElectronicKey/view/sendElectronicKeyView_state.dart | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_page.dart b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_page.dart index 8fee41fd..da455907 100755 --- a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_page.dart +++ b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_page.dart @@ -531,7 +531,8 @@ class _SendElectronicKeyViewState extends State SizedBox( height: 10.h, ), - if (logic.emailOrPhone != null) + if (logic.emailOrPhone != null && + logic.state.currentLanguage.value == 'zh_CN') OutLineBtn( btnName: '微信通知'.tr, onClick: () { diff --git a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart index 353d884a..7ada2123 100755 --- a/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart +++ b/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart'; import 'package:get/get.dart'; import 'package:star_lock/tools/dateTool.dart'; +import 'package:star_lock/translations/current_locale_tool.dart'; class SendElectronicKeyViewState { //循环 @@ -42,4 +43,7 @@ class SendElectronicKeyViewState { final String permanentTips = '接收者可以使用此App开关锁'.tr; //永久 final String onceLimitTips = '单次钥匙有效期为1小时,只能使用一次'.tr; //单次 final String cycleLimitTips = '接收者可以在有效期内的固定时间段里,不限次数使用'.tr; + + RxString currentLanguage = + CurrentLocaleTool.getCurrentLocaleString().obs; // 当前选择语言 } From face4dfd4545e833d7a86b1b1a5363c94baa7884 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 13 Mar 2025 15:07:13 +0800 Subject: [PATCH 036/135] =?UTF-8?q?feat:=E4=BC=98=E5=8C=96=E5=B8=A7?= =?UTF-8?q?=E7=BC=93=E5=86=B2=E5=8C=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/talkView/talk_view_logic.dart | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index 63fbafc7..c901d5ab 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -47,7 +47,9 @@ class TalkViewLogic extends BaseGetXController { // 添加开始时间记录 int _startTime = 0; // 开始播放时间戳 + int _startAudioTime = 0; // 开始播放时间戳 bool _isFirstFrame = true; // 是否是第一帧 + bool _isFirstAudioFrame = true; // 是否是第一帧 // 定义音频帧缓冲和发送函数 final List _bufferedAudioFrames = []; @@ -90,16 +92,28 @@ class TalkViewLogic extends BaseGetXController { final contentType = talkData.contentType; final currentTime = DateTime.now().millisecondsSinceEpoch; - // 第一帧到达时记录开始时间 - if (_isFirstFrame) { - _startTime = currentTime; - _isFirstFrame = false; - } - // 判断数据类型,进行分发处理 switch (contentType) { case TalkData_ContentTypeE.G711: - if (state.audioBuffer.length >= bufferSize) { + // 第一帧到达时记录开始时间 + if (_isFirstAudioFrame) { + _startAudioTime = currentTime; + _isFirstAudioFrame = false; + } + + // 计算音频延迟 + final expectedTime = _startAudioTime + talkData.durationMs; + final audioDelay = currentTime - expectedTime; + + // 如果延迟太大,清空缓冲区并直接播放 + if (audioDelay > 500) { + state.audioBuffer.clear(); + if (state.isOpenVoice.value) { + _playAudioFrames(); + } + return; + } + if (state.audioBuffer.length >= audioBufferSize) { state.audioBuffer.removeAt(0); // 丢弃最旧的数据 } state.audioBuffer.add(talkData); // 添加新数据 @@ -107,9 +121,17 @@ class TalkViewLogic extends BaseGetXController { _playAudioFrames(); break; case TalkData_ContentTypeE.Image: - // 计算实际延迟:(当前系统时间 - 开始时间) - 帧的预期播放时间 + // 第一帧到达时记录开始时间 + if (_isFirstFrame) { + _startTime = currentTime; + _isFirstFrame = false; + AppLog.log('记录第一帧的时间戳${currentTime},${talkData.durationMs}'); + } + + // 计算实际延迟:当前时间 - 预期播放时间 final expectedTime = _startTime + talkData.durationMs; - final videoDelay = currentTime - expectedTime; + final videoDelay = currentTime - expectedTime; // 修改延迟计算方式 + // 动态调整缓冲区 _adjustBufferSize(videoDelay); // 然后添加到播放缓冲区 From f4c55687f531a76531d940ee146c22a3d13572ac Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 13 Mar 2025 15:07:26 +0800 Subject: [PATCH 037/135] =?UTF-8?q?style:=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../register/starLock_register_page.dart | 123 ++++++++++-------- 1 file changed, 67 insertions(+), 56 deletions(-) diff --git a/lib/login/register/starLock_register_page.dart b/lib/login/register/starLock_register_page.dart index 2e8174df..e9d599e9 100755 --- a/lib/login/register/starLock_register_page.dart +++ b/lib/login/register/starLock_register_page.dart @@ -1,4 +1,4 @@ - +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -87,7 +87,8 @@ class _StarLockRegisterPageState extends State { onTap: () { state.isIphoneType.value = true; }, - child: Obx(() => Container( + child: Obx( + () => Container( width: 170.w, height: 60.h, decoration: state.isIphoneType.value @@ -99,39 +100,52 @@ class _StarLockRegisterPageState extends State { width: 1.0, color: AppColors.greyLineColor)) : null, child: Center( - child: Text( - '手机'.tr, - style: TextStyle( - color: state.isIphoneType.value - ? Colors.white - : Colors.black), - )))), + child: Text( + '手机'.tr, + style: TextStyle( + color: state.isIphoneType.value + ? Colors.white + : Colors.black), + ), + ), + ), + ), ), Expanded( child: GestureDetector( onTap: () { state.isIphoneType.value = false; }, - child: Obx(() => Container( + child: Obx( + () => Container( height: 60.h, // color: Colors.red, decoration: state.isIphoneType.value ? null : BoxDecoration( color: AppColors.mainColor, - borderRadius: - BorderRadius.all(Radius.circular(30.h)), + borderRadius: BorderRadius.all( + Radius.circular( + 30.h, + ), + ), border: Border.all( - width: 1.0, - color: AppColors.greyLineColor)), + width: 1.0, + color: AppColors.greyLineColor, + ), + ), child: Center( - child: Text( - '邮箱'.tr, - style: TextStyle( + child: Text( + '邮箱'.tr, + style: TextStyle( color: state.isIphoneType.value ? Colors.black - : Colors.white), - )))), + : Colors.white, + ), + ), + ), + ), + ), ), ), ], @@ -157,8 +171,7 @@ class _StarLockRegisterPageState extends State { children: [ SizedBox(width: 5.w), Expanded( - child: Text( - '你所在的国家/地区'.tr, + child: Text('你所在的国家/地区'.tr, style: TextStyle( fontSize: 26.sp, color: AppColors.blackColor))), SizedBox(width: 20.w), @@ -213,8 +226,7 @@ class _StarLockRegisterPageState extends State { height: 30.w, ), ), - hintText: - state.isIphoneType.value ? '请输入手机号'.tr : '请输入邮箱'.tr, + hintText: state.isIphoneType.value ? '请输入手机号'.tr : '请输入邮箱'.tr, keyboardType: TextInputType.number, inputFormatters: [ // FilteringTextInputFormatter.allow(RegExp('[0-9]')), @@ -236,7 +248,7 @@ class _StarLockRegisterPageState extends State { height: 30.w, ), ), - hintText:'请输入密码'.tr, + hintText: '请输入密码'.tr, inputFormatters: [ LengthLimitingTextInputFormatter(20), ]), @@ -282,8 +294,7 @@ class _StarLockRegisterPageState extends State { height: 30.w, ), ), - hintText: - '请输入验证码'.tr, + hintText: '请输入验证码'.tr, inputFormatters: [ LengthLimitingTextInputFormatter(20), ]), @@ -292,29 +303,29 @@ class _StarLockRegisterPageState extends State { width: 20.w, ), Obx(() => GestureDetector( - onTap: - (state.canSendCode.value && state.canResend.value) - ? () async { - // Navigator.pushNamed(context, Routers.safetyVerificationPage, arguments: {"countryCode":"+86", "account":state.phoneOrEmailStr.value}); - final Object? result = await Navigator.pushNamed( - context, Routers.safetyVerificationPage, - arguments: { - 'countryCode': state.countryCode, - 'account': state.phoneOrEmailStr.value - }); - state.xWidth.value = - (result! as Map)['xWidth']; - logic.sendValidationCode(); - } - : null, + onTap: (state.canSendCode.value && state.canResend.value) + ? () async { + // Navigator.pushNamed(context, Routers.safetyVerificationPage, arguments: {"countryCode":"+86", "account":state.phoneOrEmailStr.value}); + final Object? result = await Navigator.pushNamed( + context, Routers.safetyVerificationPage, + arguments: { + 'countryCode': state.countryCode, + 'account': state.phoneOrEmailStr.value + }); + state.xWidth.value = + (result! as Map)['xWidth']; + logic.sendValidationCode(); + } + : null, child: Container( width: 180.w, // height: 60.h, padding: EdgeInsets.all(10.h), decoration: BoxDecoration( - color: (state.canSendCode.value && state.canResend.value) - ? AppColors.mainColor - : Colors.grey, + color: + (state.canSendCode.value && state.canResend.value) + ? AppColors.mainColor + : Colors.grey, borderRadius: BorderRadius.circular(5)), child: Center( child: Text(state.btnText.value, @@ -361,29 +372,29 @@ class _StarLockRegisterPageState extends State { WidgetSpan( alignment: PlaceholderAlignment.middle, child: GestureDetector( - child: Text( - '《${'用户协议'.tr}》', + child: Text('《${'用户协议'.tr}》', style: TextStyle( color: AppColors.mainColor, fontSize: 20.sp)), onTap: () { - Get.toNamed(Routers.webviewShowPage, arguments: { - 'url': XSConstantMacro.userAgreementURL, - 'title': '用户协议'.tr - }); + Get.toNamed(Routers.webviewShowPage, + arguments: { + 'url': XSConstantMacro.userAgreementURL, + 'title': '用户协议'.tr + }); }, )), WidgetSpan( alignment: PlaceholderAlignment.middle, child: GestureDetector( - child: Text( - '《${'隐私政策'.tr}》', + child: Text('《${'隐私政策'.tr}》', style: TextStyle( color: AppColors.mainColor, fontSize: 20.sp)), onTap: () { - Get.toNamed(Routers.webviewShowPage, arguments: { - 'url': XSConstantMacro.privacyPolicyURL, - 'title': '隐私政策'.tr - }); + Get.toNamed(Routers.webviewShowPage, + arguments: { + 'url': XSConstantMacro.privacyPolicyURL, + 'title': '隐私政策'.tr + }); }, )), ], From a59edfcfff6172bfc2e3938cff049caf2ef72e0e Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 13 Mar 2025 15:07:39 +0800 Subject: [PATCH 038/135] =?UTF-8?q?style:=E5=A2=9E=E5=8A=A0=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_en.json | 1 + lan/lan_hk.json | 22 +++++++++++----------- lan/lan_keys.json | 1 + lan/lan_tw.json | 12 ++++++------ lan/lan_zh.json | 1 + 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/lan/lan_en.json b/lan/lan_en.json index bf8243ca..f7fb0c49 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1145,5 +1145,6 @@ "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Enable the remote unlocking function of the lock in the APP (this function is turned off by default). If this option is not available, the lock will not support Google Home", "3.安装Google Home APP,点击左上角的加号按钮": "3. Install the Google Home app and click the plus button in the upper left corner", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "After the gateway is powered on, press and hold the reset button for 5 seconds. Click Next when the blue indicator light flashes", + "暂无最新记录": "There are currently no latest records available", "网关添加成功": "Gateway added successfully" } diff --git a/lan/lan_hk.json b/lan/lan_hk.json index 3d42492f..a314542e 100644 --- a/lan/lan_hk.json +++ b/lan/lan_hk.json @@ -1,10 +1,10 @@ { - "星锁": "星空鎖", - "锁通通": "鎖定直通", - "点击开锁,长按闭锁": "掂解鎖,按住鎖定", + "星锁": "星鎖", + "锁通通": "鎖通通", + "点击开锁,长按闭锁": "點擊開鎖,長按閉鎖", "考勤": "出席", "考勤设置": "考勤設置", - "电子钥匙": "eKey", + "电子钥匙": "電子鑰匙", "添加卡": "添加卡", "卡号": "卡號", "添加指纹": "添加指紋", @@ -185,7 +185,7 @@ "退出": "註銷", "删除账号": "刪除帳戶", "个人信息": "賬戶信息", - "头像": "化身", + "头像": "頭像", "昵称": "暱稱", "请输入昵称": "請輸入您的暱稱", "修改昵称": "重命名", @@ -373,7 +373,7 @@ "未打卡": "暫無記錄", "钥匙将在": "此ekey將在", "天后失效": "天", - "电量更新时间:": "電池更新時間:", + "电量更新时间:": "電量更新時間:", "新增配件": "加", "钥匙不可用": "密鑰不可用", "正在开锁中...": "解鎖。。。", @@ -505,7 +505,7 @@ "您的钥匙已过期": "您的密鑰已過期", "常开模式开启": "鎖處於Passage Mode", "超级管理员": "超級管理員", - "授权管理员": "設為admin", + "授权管理员": "授權管理員", "普通用户": "普通用戶", "余": "平衡", "天": "日", @@ -718,7 +718,7 @@ "钥匙无效": "密鑰無效", "操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "無法連接到鎖。請重新啟動手機嘅Blutooth並重試。", "如果是全自动锁,请使屏幕变亮": "如果係全自動鎖,請讓屏幕更光", - "正在尝试闭锁……": "嘗試鎖定。 請稍候。。。", + "正在尝试闭锁……": "正在嘗試閉鎖……", "清空记录": "清除記錄", "是否要删除操作记录?": "繼續刪除記錄?", "被删除的记录不能恢复": "刪除後無法恢復記錄。", @@ -815,7 +815,7 @@ "配置网络": "配置網絡", "你好": "你好", "成功": "成功的", - "类型选择": "鍵入select", + "类型选择": "類型選擇", "请选择要使用哪种类型": "請選擇要使用的類型", "系统邮件(推荐)": "系統電子郵件(推薦)", "系统短信(推荐)": "系統短信(推薦)", @@ -1100,8 +1100,8 @@ "英语": "英文", "Google Home操作流程的值": "1.使用智能鎖APP添加鎖和網關\n\n2.喺APP中開啟鎖嘅遠程解鎖功能(此功能默認關閉)。 如果冇此選項,鎖唔撐Google Home\n\n3.安裝Google Home APP,點擊左上角嘅“+”按鈕\n\n4.在“設置”頁面上,選擇“與Google合作”\n\n5.搜索“ScienerSmart”,使用智能鎖APP賬號和密碼進行授權", "密码需至少包含数字/字母/字符中的2种组合": "密碼必須至少包含以下2個:數字、字母同特殊字符", - "已开锁": "解鎖", - "已闭锁": "鎖", + "已开锁": "已開鎖", + "已闭锁": "已閉鎖", "两次密码不一致哦": "密碼不一緻", "中功率": "中等功率", "常规使用": "經常使用", diff --git a/lan/lan_keys.json b/lan/lan_keys.json index f3d9487d..81ba73e9 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1148,5 +1148,6 @@ "4.在设置页面,选择与Google协同工作": "4.在设置页面,选择与Google协同工作", "5.搜索": "5.搜索", ",并用智能锁APP的账号和密码进行授权": ",并用智能锁APP的账号和密码进行授权", + "暂无最新记录": "暂无最新记录", "网关添加成功": "网关添加成功" } diff --git a/lan/lan_tw.json b/lan/lan_tw.json index c2d9cfe6..46f4aaf7 100644 --- a/lan/lan_tw.json +++ b/lan/lan_tw.json @@ -1,6 +1,6 @@ { - "星锁": "星形鎖", - "锁通通": "鎖定通過", + "星锁": "星鎖", + "锁通通": "鎖通通", "点击开锁,长按闭锁": "觸摸以解鎖,按住以鎖定", "考勤": "出席情況", "考勤设置": "考勤設置", @@ -267,9 +267,9 @@ "您可通过邮件将密码、电子钥匙信息发给接收人。": "電子郵件可用於向收件人發送密碼和ekey信息。", "购买实名认证提示": "啟用該功能後,您需要使用指紋,臉部或帳戶密碼才能打開該應用程序。 3分鐘不用再驗證", "请选择你希望的实名认证频次": "請選擇您想要的實名認證頻率", - "仅首次": "第一次", + "仅首次": "僅首次", "每日一次": "每天一次", - "每周一次": "每周一次", + "每周一次": "每週一次", "每月一次": "每月一次", "当前状态": "當前狀態", "试用中": "在審判中", @@ -1081,8 +1081,8 @@ "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 是否確實要重置?", "在线": "在線", "离线": "離線", - "购买记录": "採購記錄", - "使用记录": "用戶記錄", + "购买记录": "購買記錄", + "使用记录": "使用記錄", "失效时间要大于当前时间": "過期時間必須長於當前時間", "修改名字": "編輯名稱", "时": "小時", diff --git a/lan/lan_zh.json b/lan/lan_zh.json index ea9e45d4..2a91849d 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1148,5 +1148,6 @@ "4.在设置页面,选择与Google协同工作": "4.在设置页面,选择与Google协同工作", "5.搜索": "5.搜索", ",并用智能锁APP的账号和密码进行授权": ",并用智能锁APP的账号和密码进行授权", + "暂无最新记录": "暂无最新记录", "网关添加成功": "网关添加成功" } From 3762ade84a05f99c5503153b88eddf54689d9709 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 13 Mar 2025 16:04:06 +0800 Subject: [PATCH 039/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E6=98=B5?= =?UTF-8?q?=E7=A7=B0=E8=BF=87=E9=95=BF=E6=BA=A2=E5=87=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../value_added_services_record_page.dart | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_page.dart b/lib/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_page.dart index 3366fca2..1808074b 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_page.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_page.dart @@ -71,6 +71,7 @@ class _ValueAddedServicesRecordPageState // 购买记录 class _PurchaseRecords extends StatelessWidget { const _PurchaseRecords({required this.buyRecordList, required this.logic}); + final List buyRecordList; final ValueAddedServicesRecordLogic logic; @@ -134,6 +135,7 @@ class _PurchaseRecords extends StatelessWidget { // 使用记录 class _UseRecordsTable extends StatelessWidget { const _UseRecordsTable({required this.useRecordList, required this.logic}); + final List useRecordList; final ValueAddedServicesRecordLogic logic; @@ -172,9 +174,12 @@ class _UseRecordsTable extends StatelessWidget { Text( logic.state.useCountStr.value, style: TextStyle( - fontSize: 24.sp, - color: AppColors.blackColor, - fontWeight: FontWeight.bold), + fontSize: 24.sp, + color: AppColors.blackColor, + fontWeight: FontWeight.bold, + ), + overflow: TextOverflow.ellipsis, // 超出显示省略号 + maxLines: 1, // 限制为单行 ), Expanded(child: Container()), if (itemData.authStatus == 0) From 92093b318287557622e6322c486943aa1a61549e Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 13 Mar 2025 16:13:14 +0800 Subject: [PATCH 040/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E9=93=83=E5=A3=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/res/raw/ring.mp3 | Bin 0 -> 254379 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 android/app/src/main/res/raw/ring.mp3 diff --git a/android/app/src/main/res/raw/ring.mp3 b/android/app/src/main/res/raw/ring.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..eee971acf6eef51a3718964c9d9ffe5563c74b03 GIT binary patch literal 254379 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%0D#ZOgTY@g&5qSL?XT&uxbCMwa0kn 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 Date: Fri, 14 Mar 2025 11:59:09 +0800 Subject: [PATCH 041/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E9=85=8D?= =?UTF-8?q?=E7=BD=91=E6=97=B6=E8=AF=BB=E5=8F=96=E6=89=8B=E6=9C=BA=E7=B3=BB?= =?UTF-8?q?=E7=BB=9Fwifi=EF=BC=8C=E5=B9=B6=E5=88=A4=E6=96=AD=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E6=98=AF5G=E7=BD=91=E7=BB=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuringWifi/configuringWifi_page.dart | 11 +++++++++ .../configuringWifi_state.dart | 11 +++++---- .../wifiList/wifiList_page.dart | 23 +++++++++++++++---- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart index 89ea1ee1..4e8f238a 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart @@ -51,6 +51,17 @@ class _ConfiguringWifiPageState extends State logic.senderConfiguringWifiAction(); }, ), + SizedBox( + height: 20.h, + ), + Text( + '请确保网络是2.4GHz Wi-Fi ', + style: TextStyle( + color: AppColors.blackColor, + fontSize: 20.sp, + fontWeight: FontWeight.w500, + ), + ), ], )); } diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_state.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_state.dart index 1a090780..513fede2 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_state.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_state.dart @@ -1,13 +1,13 @@ - import 'dart:async'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:network_info_plus/network_info_plus.dart'; import '../../lockSet/lockSetInfo_entity.dart'; import 'configuringWifiEntity.dart'; -class ConfiguringWifiState{ +class ConfiguringWifiState { ConfiguringWifiState() { var map = Get.arguments; lockSetInfoData.value = map['lockSetInfoData']; @@ -18,6 +18,7 @@ class ConfiguringWifiState{ wifiNameController.text = wifiName.value; } } + Rx configuringWifiEntity = ConfiguringWifiEntity().obs; Rx lockSetInfoData = LockSetInfoData().obs; Rx lockBasicInfo = LockBasicInfo().obs; @@ -25,12 +26,12 @@ class ConfiguringWifiState{ RxString wifiName = ''.obs; RxString pageName = ''.obs; RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - RxInt sureBtnState = 0.obs;// 0普通状态(可用) 1连接中(不可用) + RxInt sureBtnState = 0.obs; // 0普通状态(可用) 1连接中(不可用) TextEditingController wifiNameController = TextEditingController(); TextEditingController wifiPWDController = TextEditingController(); String getGatewayConfigurationStr = ''; - RxBool isLoading=false.obs; + RxBool isLoading = false.obs; Timer? loadingTimer; -} \ No newline at end of file +} diff --git a/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_page.dart b/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_page.dart index d00e360d..2508cc27 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_page.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:network_info_plus/network_info_plus.dart'; import 'package:star_lock/main/lockDetail/lockSet/configuringWifi/wifiList/wifiList_state.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; @@ -91,11 +92,23 @@ class _WifiListPageState extends State { fontSize: 28.sp, borderRadius: 20.w, padding: EdgeInsets.only(top: 25.w, bottom: 25.w), - onClick: () { - Get.toNamed(Routers.configuringWifiPage, arguments: { - 'lockSetInfoData': state.lockSetInfoData.value, - 'pageName': state.pageName.value, - }); + onClick: () async { + // 如果没有传wifi昵称,则使用当前系统连接的wifi + final info = NetworkInfo(); + + final wifiName = + (await info.getWifiName())?.replaceAll('"', '') ?? ''; + + // 判断是否为5G WiFi + if (wifiName.toLowerCase().contains('5g')) { + logic.showToast('请将手机切换至2.4G WiFi进行手动连接'.tr); + } else { + Get.toNamed(Routers.configuringWifiPage, arguments: { + 'lockSetInfoData': state.lockSetInfoData.value, + 'pageName': state.pageName.value, + 'wifiName': wifiName, + }); + } }, ), SizedBox( From 09ed89f90fcd74713788d776f9b79df6d52519e3 Mon Sep 17 00:00:00 2001 From: liyi Date: Fri, 14 Mar 2025 13:37:07 +0800 Subject: [PATCH 042/135] =?UTF-8?q?fix:=E5=88=A0=E9=99=A4=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/test.jpg | Bin 218614 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/test.jpg diff --git a/assets/test.jpg b/assets/test.jpg deleted file mode 100644 index f74d412c2bf8ac6b77220eb3fc631e89b7d3d3ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218614 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 From bb085767d5e1dbd5f2f23cc4fea39ce87f7b5315 Mon Sep 17 00:00:00 2001 From: liyi Date: Fri, 14 Mar 2025 16:12:30 +0800 Subject: [PATCH 043/135] =?UTF-8?q?fix:=E6=9B=B4=E6=96=B0=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_ar.json | 4 +++- lan/lan_bg.json | 4 +++- lan/lan_bn.json | 4 +++- lan/lan_cs.json | 4 +++- lan/lan_da.json | 4 +++- lan/lan_de.json | 4 +++- lan/lan_el.json | 4 +++- lan/lan_en.json | 1 + lan/lan_es.json | 4 +++- lan/lan_et.json | 4 +++- lan/lan_fi.json | 4 +++- lan/lan_fr.json | 4 +++- lan/lan_he.json | 4 +++- lan/lan_hi.json | 4 +++- lan/lan_hk.json | 4 +++- lan/lan_hr.json | 4 +++- lan/lan_hu.json | 4 +++- lan/lan_id.json | 4 +++- lan/lan_it.json | 4 +++- lan/lan_ja.json | 4 +++- lan/lan_keys.json | 1 + lan/lan_kk.json | 4 +++- lan/lan_ko.json | 4 +++- lan/lan_lt.json | 4 +++- lan/lan_ms.json | 4 +++- lan/lan_nl.json | 4 +++- lan/lan_pl.json | 4 +++- lan/lan_pt.json | 4 +++- lan/lan_ro.json | 4 +++- lan/lan_ru.json | 4 +++- lan/lan_sk.json | 4 +++- lan/lan_sr_cyrl.json | 4 +++- lan/lan_sv.json | 4 +++- lan/lan_th.json | 4 +++- lan/lan_tr.json | 4 +++- lan/lan_tw.json | 14 ++++++++------ lan/lan_uk.json | 4 +++- lan/lan_ur.json | 4 +++- lan/lan_vi.json | 4 +++- lan/lan_zh.json | 1 + 40 files changed, 119 insertions(+), 42 deletions(-) diff --git a/lan/lan_ar.json b/lan/lan_ar.json index fc977f2f..e53131c6 100644 --- a/lan/lan_ar.json +++ b/lan/lan_ar.json @@ -1145,5 +1145,7 @@ "双锁联动": "وصلة القفل المزدوج", "1.用智能锁APP添加锁和网关": "1. أضف أقفال وبوابات باستخدام تطبيق القفل الذكي", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. تمكين وظيفة الفتح عن بعد للقفل في APP (يتم إيقاف هذه الوظيفة بشكل افتراضي). إذا كان هذا الخيار غير متاح، لن يدعم القفل جوجل هوم", - "3.安装Google Home APP,点击左上角的加号按钮": "3. قم بتثبيت تطبيق Google Home وانقر فوق الزر زائد في الزاوية العلوية اليسرى" + "3.安装Google Home APP,点击左上角的加号按钮": "3. قم بتثبيت تطبيق Google Home وانقر فوق الزر زائد في الزاوية العلوية اليسرى", + "暂无最新记录": "لا توجد حاليا أحدث السجلات المتاحة", + "请将手机切换至2.4G WiFi进行手动连接": "الرجاء تحويل هاتفك إلى \"واي فاي 2.4\" للاتصال اليدوي" } \ No newline at end of file diff --git a/lan/lan_bg.json b/lan/lan_bg.json index ac25d40b..15c1f133 100644 --- a/lan/lan_bg.json +++ b/lan/lan_bg.json @@ -1145,5 +1145,7 @@ "双锁联动": "Връзка с двойно заключване", "1.用智能锁APP添加锁和网关": "1. Добавете брави и шлюзове с помощта на приложението Smart Lock", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Активирайте функцията за дистанционно отключване на ключалката в приложението (тази функция е изключена по подразбиране). Ако тази опция не е налице, заключването няма да поддържа Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Инсталирайте приложението Google Home и щракнете върху бутона плюс в горния ляв ъгъл" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Инсталирайте приложението Google Home и щракнете върху бутона плюс в горния ляв ъгъл", + "暂无最新记录": "В момента няма най-новите налични записи", + "请将手机切换至2.4G WiFi进行手动连接": "Моля, превключете телефона си на 2.4G WiFi за ръчно свързване" } \ No newline at end of file diff --git a/lan/lan_bn.json b/lan/lan_bn.json index a2f980ee..994bcdf0 100644 --- a/lan/lan_bn.json +++ b/lan/lan_bn.json @@ -1145,5 +1145,7 @@ "双锁联动": "ডাবল লক লিঙ্কেজ", "1.用智能锁APP添加锁和网关": "1. স্মার্ট লক অ্যাপ ব্যবহার করে লক ও গেটওয়ে যোগ করুন", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. অ্যাপে লকের রিমোট আনলকিং ফাংশন সক্ষম করুন (এই ফাংশনটি ডিফল্টরূপে বন্ধ রয়েছে)। যদি এই বিকল্পটি উপলভ্য না হয় তবে লকটি গুগল হোম সমর্থন করবে না", - "3.安装Google Home APP,点击左上角的加号按钮": "গুগল হোম অ্যাপ্লিকেশনটি ইনস্টল করুন এবং উপরের বাম কোণে প্লাস বোতামটি ক্লিক করুন" + "3.安装Google Home APP,点击左上角的加号按钮": "গুগল হোম অ্যাপ্লিকেশনটি ইনস্টল করুন এবং উপরের বাম কোণে প্লাস বোতামটি ক্লিক করুন", + "暂无最新记录": "বর্তমানে কোনও সাম্প্রতিকতম রেকর্ড সুলভ নেই", + "请将手机切换至2.4G WiFi进行手动连接": "ম্যানুয়াল সংযোগের জন্য দয়া করে আপনার ফোনটি 2.4 জি ওয়াইফাইতে স্যুইচ করুন" } \ No newline at end of file diff --git a/lan/lan_cs.json b/lan/lan_cs.json index 33e659a2..4830ba9c 100644 --- a/lan/lan_cs.json +++ b/lan/lan_cs.json @@ -1145,5 +1145,7 @@ "双锁联动": "Dvojitý zámek", "1.用智能锁APP添加锁和网关": "1. Přidejte zámky a brány pomocí aplikace chytrého zámku", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Povolte funkci dálkového odemykání zámku v APP (tato funkce je ve výchozím nastavení vypnutá). Pokud tato možnost není k dispozici, zámek nebude podporovat Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Nainstalujte aplikaci Google Home a klikněte na tlačítko plus v levém horním rohu" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Nainstalujte aplikaci Google Home a klikněte na tlačítko plus v levém horním rohu", + "暂无最新记录": "Momentálně nejsou k dispozici žádné nejnovější záznamy", + "请将手机切换至2.4G WiFi进行手动连接": "Přepněte prosím svůj telefon na 2.4G WiFi pro ruční připojení" } \ No newline at end of file diff --git a/lan/lan_da.json b/lan/lan_da.json index 3c6a2175..af956511 100644 --- a/lan/lan_da.json +++ b/lan/lan_da.json @@ -1145,5 +1145,7 @@ "双锁联动": "Dobbelt låseforbindelse", "1.用智能锁APP添加锁和网关": "1. Tilføj låse og gateways ved hjælp af smart lock-appen", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Aktiver fjernoplåsningsfunktionen for låsen i APP'en (denne funktion er slået fra som standard). Hvis denne mulighed ikke er tilgængelig, understøtter låsen ikke Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Installer Google Home-appen, og klik på plusknappen i øverste venstre hjørne" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installer Google Home-appen, og klik på plusknappen i øverste venstre hjørne", + "暂无最新记录": "Der er i øjeblikket ingen nyeste optegnelser tilgængelige", + "请将手机切换至2.4G WiFi进行手动连接": "Skift venligst din telefon til 2.4G WiFi for manuel forbindelse" } \ No newline at end of file diff --git a/lan/lan_de.json b/lan/lan_de.json index 3f68aeee..fc9ada5c 100644 --- a/lan/lan_de.json +++ b/lan/lan_de.json @@ -1145,5 +1145,7 @@ "双锁联动": "Ein doppelschloss verbindet sich", "1.用智能锁APP添加锁和网关": "1. Schlösser und gateway mit der anwendung intelligente schlösser hinzufügen", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Entsichern in einer APP, die ein schloss öffnet (standard abschalten) Wenn diese option nicht verfügbar ist, wird das schloss google nicht unterstützen", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Installiert die google-app und klicken auf den knopf hinzufügen in der oberen linken ecke" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installiert die google-app und klicken auf den knopf hinzufügen in der oberen linken ecke", + "暂无最新记录": "Wir haben keine neuen daten", + "请将手机切换至2.4G WiFi进行手动连接": "Wenn manuelle verbindung hergestellt wird, schalten sie das handy auf 2,4 G WiFi" } \ No newline at end of file diff --git a/lan/lan_el.json b/lan/lan_el.json index 833e8146..673d0f5b 100644 --- a/lan/lan_el.json +++ b/lan/lan_el.json @@ -1145,5 +1145,7 @@ "双锁联动": "Σύνδεσμος διπλού κλειδώματος", "1.用智能锁APP添加锁和网关": "1. Προσθέστε κλειδαριές και πύλες χρησιμοποιώντας την εφαρμογή Smart Lock", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Ενεργοποιήστε τη λειτουργία απομακρυσμένου ξεκλειδώματος της κλειδαριάς στην εφαρμογή (αυτή η λειτουργία είναι απενεργοποιημένη από προεπιλογή). Εάν αυτή η επιλογή δεν είναι διαθέσιμη, το κλείδωμα δεν θα υποστηρίζει το Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Εγκαταστήστε την εφαρμογή Google Home και κάντε κλικ στο κουμπί συν στην επάνω αριστερή γωνία" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Εγκαταστήστε την εφαρμογή Google Home και κάντε κλικ στο κουμπί συν στην επάνω αριστερή γωνία", + "暂无最新记录": "Προς το παρόν δεν υπάρχουν διαθέσιμες τελευταίες εγγραφές", + "请将手机切换至2.4G WiFi进行手动连接": "Αλλάξτε το τηλέφωνό σας σε 2.4G WiFi για χειροκίνητη σύνδεση" } \ No newline at end of file diff --git a/lan/lan_en.json b/lan/lan_en.json index f7fb0c49..748227b8 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1146,5 +1146,6 @@ "3.安装Google Home APP,点击左上角的加号按钮": "3. Install the Google Home app and click the plus button in the upper left corner", "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "After the gateway is powered on, press and hold the reset button for 5 seconds. Click Next when the blue indicator light flashes", "暂无最新记录": "There are currently no latest records available", + "请将手机切换至2.4G WiFi进行手动连接": "Please switch your phone to 2.4G WiFi for manual connection", "网关添加成功": "Gateway added successfully" } diff --git a/lan/lan_es.json b/lan/lan_es.json index efd54202..21e4cf83 100644 --- a/lan/lan_es.json +++ b/lan/lan_es.json @@ -1145,5 +1145,7 @@ "双锁联动": "Doble cierre", "1.用智能锁APP添加锁和网关": "1. Agregue bloqueos y puertas de enlace con la aplicación smart lock", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Habilitar la función de desbloqueo remoto del bloqueo en la aplicación (esta función se desactiva por defecto). Si esta opción no está disponible, el bloqueo no será compatible con Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Instale la aplicación de Google Home y haga clic en el botón más en la esquina superior izquierda" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Instale la aplicación de Google Home y haga clic en el botón más en la esquina superior izquierda", + "暂无最新记录": "Actualmente no hay registros más recientes disponibles", + "请将手机切换至2.4G WiFi进行手动连接": "Por favor cambia tu teléfono a 2.4G WiFi para la conexión manual" } \ No newline at end of file diff --git a/lan/lan_et.json b/lan/lan_et.json index 9fe1badb..8493c8cf 100644 --- a/lan/lan_et.json +++ b/lan/lan_et.json @@ -1145,5 +1145,7 @@ "双锁联动": "Kahekordne lukustusühendus", "1.用智能锁APP添加锁和网关": "1. Lisage lukke ja lüüse nutiluku rakenduse abil", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Lubage rakenduses APP luku kaugavamise funktsioon (see funktsioon on vaikimisi välja lülitatud). Kui see valik pole saadaval, ei toeta lukk Google Home'i", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Installige rakendus Google Home ja klõpsake vasakus ülanurgas plussnuppu" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installige rakendus Google Home ja klõpsake vasakus ülanurgas plussnuppu", + "暂无最新记录": "Praegu pole uusimaid andmeid saadaval", + "请将手机切换至2.4G WiFi进行手动连接": "Käsitsi ühendamiseks lülitage telefon 2.4G WiFi-le" } \ No newline at end of file diff --git a/lan/lan_fi.json b/lan/lan_fi.json index 0cd26944..c51e11f8 100644 --- a/lan/lan_fi.json +++ b/lan/lan_fi.json @@ -1145,5 +1145,7 @@ "双锁联动": "Kaksinkertainen lukitus", "1.用智能锁APP添加锁和网关": "1. Lisää lukkoja ja yhdyskäytäviä älylukkosovelluksella", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Ota lukon etälukituksen avaustoiminto käyttöön APP:ssa (tämä toiminto on oletuksena pois päältä). Jos tämä vaihtoehto ei ole käytettävissä, lukko ei tue Google Homea", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Asenna Google Home -sovellus ja napsauta vasemmassa yläkulmassa olevaa pluspainiketta" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Asenna Google Home -sovellus ja napsauta vasemmassa yläkulmassa olevaa pluspainiketta", + "暂无最新记录": "Viimeisimpiä tietoja ei ole tällä hetkellä saatavilla", + "请将手机切换至2.4G WiFi进行手动连接": "Vaihda puhelimesi 2.4G WiFi-verkkoon manuaalista yhteyttä varten" } \ No newline at end of file diff --git a/lan/lan_fr.json b/lan/lan_fr.json index b0d0bd3d..fcb50558 100644 --- a/lan/lan_fr.json +++ b/lan/lan_fr.json @@ -1145,5 +1145,7 @@ "双锁联动": "Double liaison de serrure", "1.用智能锁APP添加锁和网关": "1. Ajoutez des serrures et des passerelles à l’aide de l’application smart lock", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Activez la fonction de déverrouillage à distance de la serrure dans l’application (cette fonction est désactivée par défaut). Si cette option n’est pas disponible, le verrou ne prendra pas en charge Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Installez l’application Google Home et cliquez sur le bouton plus dans le coin supérieur gauche" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installez l’application Google Home et cliquez sur le bouton plus dans le coin supérieur gauche", + "暂无最新记录": "Il n’y a actuellement aucun dernier enregistrement disponible", + "请将手机切换至2.4G WiFi进行手动连接": "Veuillez passer votre téléphone à 2.4G WiFi pour une connexion manuelle" } \ No newline at end of file diff --git a/lan/lan_he.json b/lan/lan_he.json index f1110789..151f02c7 100644 --- a/lan/lan_he.json +++ b/lan/lan_he.json @@ -1145,5 +1145,7 @@ "双锁联动": "הצמדת נעילה כפולה", "1.用智能锁APP添加锁和网关": "1. הוסיפו מנעולים ושערים באמצעות אפליקציית Smart Lock", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. הפעל את פונקציית ביטול הנעילה מרחוק של המנעול באפליקציה (פונקציה זו כבויה כברירת מחדל). אם אפשרות זו אינה זמינה, המנעול לא יתמוך ב-Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. התקן את אפליקציית Google Home ולחץ על כפתור הפלוס בפינה השמאלית העליונה" + "3.安装Google Home APP,点击左上角的加号按钮": "3. התקן את אפליקציית Google Home ולחץ על כפתור הפלוס בפינה השמאלית העליונה", + "暂无最新记录": "אין כרגע רשומות עדכניות זמינות", + "请将手机切换至2.4G WiFi进行手动连接": "אנא העבר את הטלפון שלך ל- WiFi 2.4G לחיבור ידני" } \ No newline at end of file diff --git a/lan/lan_hi.json b/lan/lan_hi.json index 1360cfd5..463d1d90 100644 --- a/lan/lan_hi.json +++ b/lan/lan_hi.json @@ -1145,5 +1145,7 @@ "双锁联动": "द्वि पाश सहलग्नता", "1.用智能锁APP添加锁和网关": "1. स्मार्ट लॉक ऐप का उपयोग करके लॉक्स और गेटवे जोड़ें", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. एप्लिकेशन में लॉक का रिमोट अनलॉकिंग फ़ंक्शन सक्षम करें (यह फ़ंक्शन डिफ़ॉल्ट रूप से बंद है). यदि यह विकल्प उपलब्ध नहीं है, तो लॉक आपके गूगल होम को सपोर्ट नहीं करेगा।", - "3.安装Google Home APP,点击左上角的加号按钮": "3. गूगल होम ऐप को इंस्टॉल करें और ऊपरी बाएं कोने में प्लस बटन पर क्लिक करें।" + "3.安装Google Home APP,点击左上角的加号按钮": "3. गूगल होम ऐप को इंस्टॉल करें और ऊपरी बाएं कोने में प्लस बटन पर क्लिक करें।", + "暂无最新记录": "वर्तमान में कोई नवीनतम रिकॉर्ड उपलब्ध नहीं हैं", + "请将手机切换至2.4G WiFi进行手动连接": "मैन्युअल कनेक्शन के लिए कृपया अपना फोन 2.4 जी वाईफ़ाई पर स्विच करें।" } \ No newline at end of file diff --git a/lan/lan_hk.json b/lan/lan_hk.json index a314542e..be282c4f 100644 --- a/lan/lan_hk.json +++ b/lan/lan_hk.json @@ -1145,5 +1145,7 @@ "双锁联动": "雙鎖聯動", "1.用智能锁APP添加锁和网关": "1.使用智能鎖應用程序添加鎖和網關", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2.喺APP中開啟鎖嘅遠程解鎖功能(此功能默認關閉)。 如果此選項不可用,則鎖將唔撐Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3.安裝Google Home應用,點擊左上角嘅加號掣" + "3.安装Google Home APP,点击左上角的加号按钮": "3.安裝Google Home應用,點擊左上角嘅加號掣", + "暂无最新记录": "目前冇可用嘅最新記錄", + "请将手机切换至2.4G WiFi进行手动连接": "請把手機切換到2.4G WiFi進行手動連接" } \ No newline at end of file diff --git a/lan/lan_hr.json b/lan/lan_hr.json index 70897559..fd246ef3 100644 --- a/lan/lan_hr.json +++ b/lan/lan_hr.json @@ -1145,5 +1145,7 @@ "双锁联动": "Dvostruka brava", "1.用智能锁APP添加锁和网关": "1. Dodajte brave i pristupnike pomoću aplikacije pametne brave", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Omogućite funkciju daljinskog otključavanja brave u APP-u (ova je funkcija prema zadanim postavkama isključena). Ako ova opcija nije dostupna, zaključavanje neće podržavati Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Instalirajte aplikaciju Google Home i kliknite gumb plus u gornjem lijevom kutu" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Instalirajte aplikaciju Google Home i kliknite gumb plus u gornjem lijevom kutu", + "暂无最新记录": "Trenutno nema dostupnih najnovijih podataka", + "请将手机切换至2.4G WiFi进行手动连接": "Prebacite telefon na 2.4G WiFi za ručno povezivanje" } \ No newline at end of file diff --git a/lan/lan_hu.json b/lan/lan_hu.json index 3c5d41ce..38a5662e 100644 --- a/lan/lan_hu.json +++ b/lan/lan_hu.json @@ -1145,5 +1145,7 @@ "双锁联动": "Dupla reteszelő rudazat", "1.用智能锁APP添加锁和网关": "1. Adjon hozzá zárakat és átjárókat az intelligens zár alkalmazással", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Engedélyezze a zár távoli feloldási funkcióját az APP-ban (ez a funkció alapértelmezés szerint ki van kapcsolva). Ha ez az opció nem érhető el, a zár nem támogatja a Google Home szolgáltatást", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Telepítse a Google Home alkalmazást, és kattintson a plusz gombra a bal felső sarokban" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Telepítse a Google Home alkalmazást, és kattintson a plusz gombra a bal felső sarokban", + "暂无最新记录": "Jelenleg nem állnak rendelkezésre legfrissebb rekordok", + "请将手机切换至2.4G WiFi进行手动连接": "Kérjük, kapcsolja át telefonját 2.4G WiFi-re a kézi csatlakozáshoz" } \ No newline at end of file diff --git a/lan/lan_id.json b/lan/lan_id.json index 224692f6..5adea3d9 100644 --- a/lan/lan_id.json +++ b/lan/lan_id.json @@ -1145,5 +1145,7 @@ "双锁联动": "Kunci ganda hubungan", "1.用智能锁APP添加锁和网关": "1. Tambahkan kunci dan gerbang menggunakan aplikasi smart lock", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Aktifkan fungsi kunci pengunci jarak jauh di aplikasi (fungsi ini dimatikan secara standar). Jika opsi ini tidak tersedia, kunci tidak akan mendukung Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Instal aplikasi Google Home dan klik tombol plus di sudut kiri atas" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Instal aplikasi Google Home dan klik tombol plus di sudut kiri atas", + "暂无最新记录": "Saat ini tidak ada catatan terbaru yang tersedia", + "请将手机切换至2.4G WiFi进行手动连接": "Silahkan beralih ke 2.4G WiFi untuk koneksi manual" } \ No newline at end of file diff --git a/lan/lan_it.json b/lan/lan_it.json index 6eb09aab..1cbf97ea 100644 --- a/lan/lan_it.json +++ b/lan/lan_it.json @@ -1145,5 +1145,7 @@ "双锁联动": "Collegamento a doppio bloccaggio", "1.用智能锁APP添加锁和网关": "1. Aggiunge serrature e gateway usando l’applicazione smart lock", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Abilita la funzione di sblocco remoto del lock nella APP (questa funzione è disattivata in modo predefinito). Se questa opzione non è disponibile, il lock non supporta Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Installa l’applicazione Home di Google e fai clic sul pulsante più nell’angolo in alto a sinistra" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installa l’applicazione Home di Google e fai clic sul pulsante più nell’angolo in alto a sinistra", + "暂无最新记录": "Attualmente non sono disponibili dati più recenti", + "请将手机切换至2.4G WiFi进行手动连接": "Passa il telefono a 2,4g WiFi per la connessione manuale" } \ No newline at end of file diff --git a/lan/lan_ja.json b/lan/lan_ja.json index 7c81db90..cea8a5d0 100644 --- a/lan/lan_ja.json +++ b/lan/lan_ja.json @@ -1145,5 +1145,7 @@ "双锁联动": "二重ロック連動", "1.用智能锁APP添加锁和网关": "1. スマートロックappを使用してロックとゲートウェイを追加します", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. アプリでロックのリモートロック解除機能を有効にします(この機能はデフォルトでオフになっています)。このオプションが利用できない場合、ロックはgoogle homeをサポートしません", - "3.安装Google Home APP,点击左上角的加号按钮": "3. google homeアプリをインストールし、左上隅のプラスボタンをクリックします" + "3.安装Google Home APP,点击左上角的加号按钮": "3. google homeアプリをインストールし、左上隅のプラスボタンをクリックします", + "暂无最新记录": "最新の記録は残っていない", + "请将手机切换至2.4G WiFi进行手动连接": "手動接続のため、携帯電話を2.4 g wifiに切り替えてください" } \ No newline at end of file diff --git a/lan/lan_keys.json b/lan/lan_keys.json index 81ba73e9..6d2f3936 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1149,5 +1149,6 @@ "5.搜索": "5.搜索", ",并用智能锁APP的账号和密码进行授权": ",并用智能锁APP的账号和密码进行授权", "暂无最新记录": "暂无最新记录", + "请将手机切换至2.4G WiFi进行手动连接": "请将手机切换至2.4G WiFi进行手动连接", "网关添加成功": "网关添加成功" } diff --git a/lan/lan_kk.json b/lan/lan_kk.json index 27c9b22c..728c1946 100644 --- a/lan/lan_kk.json +++ b/lan/lan_kk.json @@ -1145,5 +1145,7 @@ "双锁联动": "Қос бұғаттау сілтемесі", "1.用智能锁APP添加锁和网关": "1. Смарт-құлыптау бағдарламасын пайдалана отырып құлыптар мен шлюздерді қосу", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. APP бағдарламасында құлыпты қашықтан ашу функциясын қосу (бұл функция әдепкі бойынша өшіріледі). Егер бұл параметр қол жетімді болмаса, бұғаттау Google Home-ды қолдамайды", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Google Home бағдарламасын орнатып, жоғарғы сол жақ бұрыштағы қосу түймешігін басыңыз" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Google Home бағдарламасын орнатып, жоғарғы сол жақ бұрыштағы қосу түймешігін басыңыз", + "暂无最新记录": "Қазіргі уақытта қол жетімді соңғы жазбалар жоқ", + "请将手机切换至2.4G WiFi进行手动连接": "Телефонды қолмен қосу үшін 2.4G WiFi бағдарламасына ауыстыруыңызды сұраймыз" } \ No newline at end of file diff --git a/lan/lan_ko.json b/lan/lan_ko.json index 7dcdfdf3..af0fab29 100644 --- a/lan/lan_ko.json +++ b/lan/lan_ko.json @@ -1145,5 +1145,7 @@ "双锁联动": "2 중 잠금 연결", "1.用智能锁APP添加锁和网关": "1. 스마트 잠금 앱을 사용하여 잠금 및 게이트웨이를 추가합니다", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. 앱에서 잠금의 원격 잠금 해제 기능을 활성화합니다 (이 기능은 기본적으로 꺼져 있습니다).이 옵션을 사용할 수 없는 경우 잠금은 Google Home을 지원하지 않습니다", - "3.安装Google Home APP,点击左上角的加号按钮": "3. 구글 홈 앱을 설치하고 왼쪽 상단 모서리에 있는 더하기 버튼을 클릭합니다" + "3.安装Google Home APP,点击左上角的加号按钮": "3. 구글 홈 앱을 설치하고 왼쪽 상단 모서리에 있는 더하기 버튼을 클릭합니다", + "暂无最新记录": "현재 사용 가능한 최신 레코드가 없습니다", + "请将手机切换至2.4G WiFi进行手动连接": "수동 연결을 위해 핸드폰을 2.4G WiFi로 바꿔주세요" } \ No newline at end of file diff --git a/lan/lan_lt.json b/lan/lan_lt.json index 9eedf503..4a84d77b 100644 --- a/lan/lan_lt.json +++ b/lan/lan_lt.json @@ -1145,5 +1145,7 @@ "双锁联动": "Dvigubo užrakto jungtis", "1.用智能锁APP添加锁和网关": "1. Pridėkite spynas ir šliuzus naudodami \"smart lock\" programą", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Įjunkite užrakto nuotolinio atrakinimo funkciją APP (ši funkcija yra išjungta pagal numatytuosius nustatymus). Jei ši parinktis nepasiekiama, užraktas nepalaikys \"Google Home\"", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Įdiekite \"Google Home\" programą ir spustelėkite pliuso mygtuką viršutiniame kairiajame kampe" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Įdiekite \"Google Home\" programą ir spustelėkite pliuso mygtuką viršutiniame kairiajame kampe", + "暂无最新记录": "Šiuo metu nėra naujausių įrašų", + "请将手机切换至2.4G WiFi进行手动连接": "Perjunkite telefoną į 2.4G WiFi, kad galėtumėte prisijungti rankiniu būdu" } \ No newline at end of file diff --git a/lan/lan_ms.json b/lan/lan_ms.json index 526575cc..a85297b6 100644 --- a/lan/lan_ms.json +++ b/lan/lan_ms.json @@ -1145,5 +1145,7 @@ "双锁联动": "Pautan kunci berganda", "1.用智能锁APP添加锁和网关": "1. Tambah kunci dan pintu masuk menggunakan apl kunci pintar", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Dayakan fungsi buka kunci jauh kunci dalam APP (fungsi ini dimatikan secara lalai). Jika pilihan ini tidak tersedia, kunci tidak akan menyokong Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Pasang apl Google Home dan klik butang tambah di penjuru kiri sebelah atas" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Pasang apl Google Home dan klik butang tambah di penjuru kiri sebelah atas", + "暂无最新记录": "Pada masa ini tiada rekod terkini tersedia", + "请将手机切换至2.4G WiFi进行手动连接": "Sila tukar telefon anda kepada WiFi 2.4G untuk sambungan manual" } \ No newline at end of file diff --git a/lan/lan_nl.json b/lan/lan_nl.json index 8f3575f0..ff92c9b7 100644 --- a/lan/lan_nl.json +++ b/lan/lan_nl.json @@ -1145,5 +1145,7 @@ "双锁联动": "Dubbele vergrendeling voor koppeling", "1.用智能锁APP添加锁和网关": "1. Voeg sloten en gateways toe met de smart lock app", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Open het slot op afstand in de APP (standaard uitgeschakeld). Als deze optie niet beschikbaar is, wordt google Home niet ondersteund", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Installeer de google home-app en klik op de plus-knop in de linkerbovenhoek" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installeer de google home-app en klik op de plus-knop in de linkerbovenhoek", + "暂无最新记录": "Er zijn momenteel geen recente gegevens beschikbaar", + "请将手机切换至2.4G WiFi进行手动连接": "Stel uw telefoon in op 2. 4g WiFi bij handmatige verbinding" } \ No newline at end of file diff --git a/lan/lan_pl.json b/lan/lan_pl.json index b9797859..9449d4c0 100644 --- a/lan/lan_pl.json +++ b/lan/lan_pl.json @@ -1145,5 +1145,7 @@ "双锁联动": "Podwójny zamek zawieszenia", "1.用智能锁APP添加锁和网关": "1. Dodaj zamki i bramy za pomocą aplikacji inteligentnego zamka", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Włącz funkcję zdalnego odblokowywania zamka w aplikacji (ta funkcja jest domyślnie wyłączona). Jeśli ta opcja nie jest dostępna, zamek nie będzie obsługiwał Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Zainstaluj aplikację Google Home i kliknij przycisk plusa w lewym górnym rogu" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Zainstaluj aplikację Google Home i kliknij przycisk plusa w lewym górnym rogu", + "暂无最新记录": "Obecnie nie ma dostępnych najnowszych rekordów", + "请将手机切换至2.4G WiFi进行手动连接": "Przełącz telefon na 2.4G Wi-Fi, aby uzyskać ręczne połączenie" } \ No newline at end of file diff --git a/lan/lan_pt.json b/lan/lan_pt.json index a4faac2a..0365fbd6 100644 --- a/lan/lan_pt.json +++ b/lan/lan_pt.json @@ -1145,5 +1145,7 @@ "双锁联动": "Articulação de trava dupla", "1.用智能锁APP添加锁和网关": "1. Adicione fechaduras e gateways usando o aplicativo Smart Lock", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Ative a função de desbloqueio remoto da fechadura no APP (esta função está desativada por padrão). Se esta opção não estiver disponível, o bloqueio não será compatível com o Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Instale o aplicativo Google Home e clique no botão de adição no canto superior esquerdo" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Instale o aplicativo Google Home e clique no botão de adição no canto superior esquerdo", + "暂无最新记录": "Atualmente não há registros mais recentes disponíveis", + "请将手机切换至2.4G WiFi进行手动连接": "Mude seu telefone para WiFi 2.4G para conexão manual" } \ No newline at end of file diff --git a/lan/lan_ro.json b/lan/lan_ro.json index 635bb36a..c25f3051 100644 --- a/lan/lan_ro.json +++ b/lan/lan_ro.json @@ -1145,5 +1145,7 @@ "双锁联动": "Legătură dublă de blocare", "1.用智能锁APP添加锁和网关": "1. Adăugați încuietori și gateway-uri folosind aplicația smart lock", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Activați funcția de deblocare de la distanță a încuietorului în aplicație (această funcție este dezactivată în mod implicit). Dacă această opțiune nu este disponibilă, blocarea nu va accepta Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Instalați aplicația Google Home și faceți clic pe butonul plus din colțul din stânga sus" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Instalați aplicația Google Home și faceți clic pe butonul plus din colțul din stânga sus", + "暂无最新记录": "În prezent nu există cele mai recente înregistrări disponibile", + "请将手机切换至2.4G WiFi进行手动连接": "Vă rugăm să comutați telefonul la WiFi 2.4G pentru conectarea manuală" } \ No newline at end of file diff --git a/lan/lan_ru.json b/lan/lan_ru.json index 10da744f..9daeed87 100644 --- a/lan/lan_ru.json +++ b/lan/lan_ru.json @@ -1145,5 +1145,7 @@ "双锁联动": "2.1.3 двойная блокировка", "1.用智能锁APP添加锁和网关": "1. Добавить замки и шлюзы с помощью приложения smart lock", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Включите функцию удаленного разблокирования замка в приложении (эта функция выключается по умолчанию). Если эта опция не доступна, блокировка не будет поддерживать Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Установите приложение Google Home и нажмите кнопку plus в левом верхнем углу" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Установите приложение Google Home и нажмите кнопку plus в левом верхнем углу", + "暂无最新记录": "В настоящее время последние данные отсутствуют", + "请将手机切换至2.4G WiFi进行手动连接": "Пожалуйста, переключите телефон на 2.4G WiFi для ручного подключения" } \ No newline at end of file diff --git a/lan/lan_sk.json b/lan/lan_sk.json index 284c99cb..4faea5d9 100644 --- a/lan/lan_sk.json +++ b/lan/lan_sk.json @@ -1145,5 +1145,7 @@ "双锁联动": "Dvojitý zámok", "1.用智能锁APP添加锁和网关": "1. Pridajte zámky a brány pomocou aplikácie inteligentného zámku", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Povoľte funkciu diaľkového odomykania zámku v aplikácii APP (táto funkcia je predvolene vypnutá). Ak táto možnosť nie je k dispozícii, zámok nebude podporovať Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Nainštalujte si aplikáciu Google Home a kliknite na tlačidlo plus v ľavom hornom rohu" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Nainštalujte si aplikáciu Google Home a kliknite na tlačidlo plus v ľavom hornom rohu", + "暂无最新记录": "Momentálne nie sú k dispozícii žiadne najnovšie záznamy", + "请将手机切换至2.4G WiFi进行手动连接": "Pre manuálne pripojenie prepnite telefón na 2.4G WiFi" } \ No newline at end of file diff --git a/lan/lan_sr_cyrl.json b/lan/lan_sr_cyrl.json index 3c3b8dec..7c61e6cd 100644 --- a/lan/lan_sr_cyrl.json +++ b/lan/lan_sr_cyrl.json @@ -1145,5 +1145,7 @@ "双锁联动": "Двострука брава веза", "1.用智能锁APP添加锁和网关": "1 . Додајте браве и гатеваи помоћу апликације Смарт Лоцк", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2 . Омогућите функцију даљинског откључавања браве у АПП-у (ова функција је подразумевано искључена). Ако ова опција није доступна, брава неће подржати Гоогле Хоме", - "3.安装Google Home APP,点击左上角的加号按钮": "3 . Инсталирајте апликацију Гоогле Хоме и кликните на дугме плус у горњем левом углу" + "3.安装Google Home APP,点击左上角的加号按钮": "3 . Инсталирајте апликацију Гоогле Хоме и кликните на дугме плус у горњем левом углу", + "暂无最新记录": "Тренутно нема доступних најновијих података", + "请将手机切换至2.4G WiFi进行手动连接": "Пребаците телефон на КСНУМКСГ ВиФи за ручно повезивање" } \ No newline at end of file diff --git a/lan/lan_sv.json b/lan/lan_sv.json index b81f6bef..4ec91309 100644 --- a/lan/lan_sv.json +++ b/lan/lan_sv.json @@ -1145,5 +1145,7 @@ "双锁联动": "Dubbel låslänkage", "1.用智能锁APP添加锁和网关": "1. Lägg till lås och gateways med hjälp av den smarta låsappen", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Aktivera fjärrupplåsningsfunktionen för låset i APP (den här funktionen är avstängd som standard). Om det här alternativet inte är tillgängligt kommer låset inte att stödja Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Installera Google Home-appen och klicka på plusknappen i det övre vänstra hörnet" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Installera Google Home-appen och klicka på plusknappen i det övre vänstra hörnet", + "暂无最新记录": "Det finns för närvarande inga senaste poster tillgängliga", + "请将手机切换至2.4G WiFi进行手动连接": "Byt din telefon till 2.4G WiFi för manuell anslutning" } \ No newline at end of file diff --git a/lan/lan_th.json b/lan/lan_th.json index 0bf0f6a4..234fce02 100644 --- a/lan/lan_th.json +++ b/lan/lan_th.json @@ -1145,5 +1145,7 @@ "双锁联动": "ดับเบิ้ลล็อคการเชื่อมต่อ", "1.用智能锁APP添加锁和网关": "1. เพิ่มล็อค และเกตเวย์โดยใช้แอพสมาร์ทล็อค", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. เปิดใช้งานฟังก์ชันการปลดล็อคระยะไกลของการล็อคในแอพ (ฟังก์ชันนี้ จะถูกปิดโดยค่าเริ่มต้น) หากไม่มีตัวเลือกนี้ การล็อคจะไม่สนับสนุนกูเกิ้ลโฮม", - "3.安装Google Home APP,点击左上角的加号按钮": "3. ติดตั้ง googlehome แอพ และคลิกปุ่มบวก ที่มุมบนซ้าย" + "3.安装Google Home APP,点击左上角的加号按钮": "3. ติดตั้ง googlehome แอพ และคลิกปุ่มบวก ที่มุมบนซ้าย", + "暂无最新记录": "ปัจจุบันยังไม่มีบันทึกล่าสุด ที่มีอยู่", + "请将手机切换至2.4G WiFi进行手动连接": "กรุณาเปลี่ยนโทรศัพท์เป็น 2.4 GWiFi สำหรับการเชื่อมต่อด้วยตนเอง" } \ No newline at end of file diff --git a/lan/lan_tr.json b/lan/lan_tr.json index d09053ca..34f5ab7e 100644 --- a/lan/lan_tr.json +++ b/lan/lan_tr.json @@ -1145,5 +1145,7 @@ "双锁联动": "Çift kilit bağlantısı", "1.用智能锁APP添加锁和网关": "1. Akıllı kilit uygulamasını kullanarak kilitler ve ağ geçitleri ekleyin", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. APP'de kilidin uzaktan kilit açma işlevini etkinleştirin (bu işlev varsayılan olarak kapalıdır). Bu seçenek mevcut değilse, kilit Google Home'u desteklemeyecektir", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Google Home uygulamasını yükleyin ve sol üst köşedeki artı düğmesini tıklayın" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Google Home uygulamasını yükleyin ve sol üst köşedeki artı düğmesini tıklayın", + "暂无最新记录": "Şu anda en son kayıt mevcut değil", + "请将手机切换至2.4G WiFi进行手动连接": "Manuel bağlantı için lütfen telefonunuzu 2.4G WiFi'ye getirin" } \ No newline at end of file diff --git a/lan/lan_tw.json b/lan/lan_tw.json index 46f4aaf7..69fd23f7 100644 --- a/lan/lan_tw.json +++ b/lan/lan_tw.json @@ -1125,11 +1125,11 @@ "网关添加成功": "已成功添加網關", "功能开启后,你将可以通过网关远程开锁。": "啓用該功能後,您可以通過網關遠程解鎖。", "录屏已保存到相册": "屏幕錄製文件保存到相冊", - "通话未接通,已挂断": "電話未接通,掛了", + "通话未接通,已挂断": "電話未接通,已掛斷", "通话异常中断": "異常呼叫中斷", "通话连接失败": "呼叫連接失敗", - "已挂断": "掛", - "正在说话...": "說現在…", + "已挂断": "已掛斷", + "正在说话...": "正在說話…", "设备不在线": "設備未在線", "设备未配网": "設備未連接到網絡", "已静音": "聲音已被關掉了", @@ -1140,10 +1140,12 @@ "呼叫目标": "調用目標", "管理员APP": "管理員應用", "可视门铃码": "可視門鈴碼", - "电子反锁": "電子防抱死裝置", - "双重认证": "雙因素身份驗證", + "电子反锁": "電子反鎖", + "双重认证": "雙重認證", "双锁联动": "雙鎖聯動", "1.用智能锁APP添加锁和网关": "1. 使用智能鎖應用程序添加鎖和網關", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. 在APP中開啓鎖的遠程開鎖功能(默認關閉)。如果這個選項不可用,鎖將不支持谷歌Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. 安裝谷歌Home應用程序並單擊左上角的加號按鈕" + "3.安装Google Home APP,点击左上角的加号按钮": "3. 安裝谷歌Home應用程序並單擊左上角的加號按鈕", + "暂无最新记录": "目前沒有最新的記錄", + "请将手机切换至2.4G WiFi进行手动连接": "手動連接時請將手機調至2.4G WiFi" } \ No newline at end of file diff --git a/lan/lan_uk.json b/lan/lan_uk.json index 426cbc1a..0ddc8868 100644 --- a/lan/lan_uk.json +++ b/lan/lan_uk.json @@ -1145,5 +1145,7 @@ "双锁联动": "Важіль з подвійним замком", "1.用智能锁APP添加锁和网关": "1. Додайте замки та шлюзи за допомогою програми Smart Lock", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Увімкніть функцію дистанційного розблокування замка в APP (ця функція вимкнена за замовчуванням). Якщо ця опція недоступна, замок не підтримуватиме Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Встановіть програму Google Home і натисніть кнопку плюс у верхньому лівому кутку" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Встановіть програму Google Home і натисніть кнопку плюс у верхньому лівому кутку", + "暂无最新记录": "Наразі немає останніх доступних записів", + "请将手机切换至2.4G WiFi进行手动连接": "Будь ласка, перемкніть свій телефон на 2.4G WiFi для ручного підключення" } \ No newline at end of file diff --git a/lan/lan_ur.json b/lan/lan_ur.json index 4c760df9..7bf3a227 100644 --- a/lan/lan_ur.json +++ b/lan/lan_ur.json @@ -1145,5 +1145,7 @@ "双锁联动": "ڈبل لاک لنک", "1.用智能锁APP添加锁和网关": "1. سمارٹ لاک ایپ کا استعمال کرتے ہوئے لاک اور گیٹ وے شامل کریں", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. اے پی پی میں لاک کے ریموٹ ان لاکنگ فنکشن کو فعال کریں (یہ فنکشن ڈیفالٹ طور پر بند ہے)۔ اگر یہ آپشن دستیاب نہیں ہے تو ، لاک گوگل ہوم کو سپورٹ نہیں کرے گا۔", - "3.安装Google Home APP,点击左上角的加号按钮": "3. گوگل ہوم ایپ انسٹال کریں اور اوپری بائیں کونے میں پلس بٹن پر کلک کریں۔" + "3.安装Google Home APP,点击左上角的加号按钮": "3. گوگل ہوم ایپ انسٹال کریں اور اوپری بائیں کونے میں پلس بٹن پر کلک کریں۔", + "暂无最新记录": "فی الحال کوئی تازہ ترین ریکارڈ دستیاب نہیں ہے", + "请将手机切换至2.4G WiFi进行手动连接": "براہ کرم دستی کنکشن کے لئے اپنے فون کو 2.4 جی وائی فائی پر سوئچ کریں" } \ No newline at end of file diff --git a/lan/lan_vi.json b/lan/lan_vi.json index 1517c8cf..e91661df 100644 --- a/lan/lan_vi.json +++ b/lan/lan_vi.json @@ -1145,5 +1145,7 @@ "双锁联动": "Liên kết hai khóa", "1.用智能锁APP添加锁和网关": "1. Thêm khoá và cổng bằng ứng dụng Smart Lock", "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Kích hoạt chức năng mở khóa từ xa trong ứng dụng (chức năng này bị tắt theo mặc định). Nếu tùy chọn này không có sẵn, khóa sẽ không hỗ trợ Google Home", - "3.安装Google Home APP,点击左上角的加号按钮": "3. Cài đặt ứng dụng Google Home và nhấn nút Plus ở góc trên bên trái" + "3.安装Google Home APP,点击左上角的加号按钮": "3. Cài đặt ứng dụng Google Home và nhấn nút Plus ở góc trên bên trái", + "暂无最新记录": "Hiện tại không có hồ sơ mới nhất", + "请将手机切换至2.4G WiFi进行手动连接": "Vui lòng chuyển điện thoại sang 2.4G WiFi để kết nối bằng tay" } \ No newline at end of file diff --git a/lan/lan_zh.json b/lan/lan_zh.json index 2a91849d..62c3fca0 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1149,5 +1149,6 @@ "5.搜索": "5.搜索", ",并用智能锁APP的账号和密码进行授权": ",并用智能锁APP的账号和密码进行授权", "暂无最新记录": "暂无最新记录", + "请将手机切换至2.4G WiFi进行手动连接": "请将手机切换至2.4G WiFi进行手动连接", "网关添加成功": "网关添加成功" } From fe6480430f2f40a2610a6a7e7f8e4113b4f7880b Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 20 Mar 2025 16:52:55 +0800 Subject: [PATCH 044/135] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E5=88=B0=E4=BF=84=E8=AF=AD=E6=96=87=E6=9C=AC=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E6=BA=A2=E5=87=BA=E7=9A=84=E6=83=85=E5=86=B5=E3=80=81?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=83=A8=E5=88=86=E5=9B=BD=E9=99=85=E5=8C=96?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_keys.json | 1 + lan/lan_ru.json | 3 +- lan/lan_zh.json | 1 + .../catEyeCustomMode_page.dart | 13 ++- .../catEyeWorkMode/catEyeWorkMode_page.dart | 93 ++++++++++--------- .../lockSet/liveVideo/liveVideo_page.dart | 2 +- .../msgNotification/msgNotification_page.dart | 14 ++- lib/tools/commonItem.dart | 14 ++- 8 files changed, 87 insertions(+), 54 deletions(-) diff --git a/lan/lan_keys.json b/lan/lan_keys.json index 6d2f3936..0ca0b455 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1150,5 +1150,6 @@ ",并用智能锁APP的账号和密码进行授权": ",并用智能锁APP的账号和密码进行授权", "暂无最新记录": "暂无最新记录", "请将手机切换至2.4G WiFi进行手动连接": "请将手机切换至2.4G WiFi进行手动连接", + "请扫描可视门铃码二维码": "请扫描可视门铃码二维码", "网关添加成功": "网关添加成功" } diff --git a/lan/lan_ru.json b/lan/lan_ru.json index 9daeed87..75878b41 100644 --- a/lan/lan_ru.json +++ b/lan/lan_ru.json @@ -504,7 +504,7 @@ "您的钥匙已过期": "Срок действия вашего ключа истек", "常开模式开启": "Замок находится в режиме прохода", "超级管理员": "Супер админ", - "授权管理员": "Авторизованный администратор", + "授权管理员": "Автор. администратор", "普通用户": "Обычный пользователь", "余": "Баланс", "天": "День", @@ -1147,5 +1147,6 @@ "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. Включите функцию удаленного разблокирования замка в приложении (эта функция выключается по умолчанию). Если эта опция не доступна, блокировка не будет поддерживать Google Home", "3.安装Google Home APP,点击左上角的加号按钮": "3. Установите приложение Google Home и нажмите кнопку plus в левом верхнем углу", "暂无最新记录": "В настоящее время последние данные отсутствуют", + "请扫描可视门铃码二维码": "Сканируйте код вызова", "请将手机切换至2.4G WiFi进行手动连接": "Пожалуйста, переключите телефон на 2.4G WiFi для ручного подключения" } \ No newline at end of file diff --git a/lan/lan_zh.json b/lan/lan_zh.json index 62c3fca0..4bf1ac49 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1150,5 +1150,6 @@ ",并用智能锁APP的账号和密码进行授权": ",并用智能锁APP的账号和密码进行授权", "暂无最新记录": "暂无最新记录", "请将手机切换至2.4G WiFi进行手动连接": "请将手机切换至2.4G WiFi进行手动连接", + "请扫描可视门铃码二维码": "请扫描可视门铃码二维码", "网关添加成功": "网关添加成功" } diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart index 45fed154..6e472015 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart @@ -48,9 +48,18 @@ class _CatEyeCustomModePageState extends State { isHaveLine: false, isHaveDirection: true, isHaveRightWidget: true, - rightWidget: Text(state.selectVideoSlot.value, + rightWidget: Container( + constraints: BoxConstraints(maxWidth: 150.w), // 限制最大宽度 + child: Text( + state.selectVideoSlot.value, style: TextStyle( - fontSize: 22.sp, color: AppColors.darkGrayTextColor)), + fontSize: 22.sp, color: AppColors.darkGrayTextColor), + textAlign: TextAlign.right, // 右对齐 + softWrap: true, // 允许换行 + maxLines: 2, + overflow: TextOverflow.ellipsis, // 文本溢出时显示 + ), + ), action: () { Navigator.pushNamed(context, Routers.videoSlotPage, arguments: { diff --git a/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_page.dart b/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_page.dart index 61052c00..66d15f9a 100755 --- a/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_page.dart +++ b/lib/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_page.dart @@ -37,48 +37,50 @@ class _CatEyeWorkModePageState extends State { Navigator.pop(context, true); }, backgroundColor: AppColors.mainColor), - body: Obx( - () => Column( - children: [ - SizedBox( - height: 30.h, - ), - _buildTipsView( - '省电模式'.tr + ':\n', - '适合门口较为安全的环境。'.tr + - '\n' + - '仅发生特定事件才录像,并可查看实时画面。'.tr + - '\n' + - '一般情况下,满电可使用7-8个月'.tr, - 0), - SizedBox( - height: 30.h, - ), - _buildTipsView( - '逗留抓拍模式'.tr + ':\n', - '有人逗留或发生特定事件才录像,可随时查看'.tr + - '\n' + - '实时画面。'.tr + - '\n' + - '一般情况下,满电可使用5~6个月。'.tr, - 1), - SizedBox( - height: 30.h, - ), - _buildTipsView( - '实时监控模式'.tr + ':\n', - '适合门口人员复杂、较不安全的环境。'.tr + - '\n' + - '有人出现就录像,可随时查看实时画面。'.tr + - '\n' + - '一般情况下,满电可使用2~4个月。'.tr, - 2), - SizedBox( - height: 30.h, - ), - _buildTipsView('自定义模式'.tr + ':\n', - '根据您家门口实际情况设置录像和实时画面功能。'.tr + '\n' + '可使用时长由具体设置决定。'.tr, 3) - ], + body: SingleChildScrollView( + child: Obx( + () => Column( + children: [ + SizedBox( + height: 30.h, + ), + _buildTipsView( + '省电模式'.tr + ':\n', + '适合门口较为安全的环境。'.tr + + '\n' + + '仅发生特定事件才录像,并可查看实时画面。'.tr + + '\n' + + '一般情况下,满电可使用7-8个月'.tr, + 0), + SizedBox( + height: 30.h, + ), + _buildTipsView( + '逗留抓拍模式'.tr + ':\n', + '有人逗留或发生特定事件才录像,可随时查看'.tr + + '\n' + + '实时画面。'.tr + + '\n' + + '一般情况下,满电可使用5~6个月。'.tr, + 1), + SizedBox( + height: 30.h, + ), + _buildTipsView( + '实时监控模式'.tr + ':\n', + '适合门口人员复杂、较不安全的环境。'.tr + + '\n' + + '有人出现就录像,可随时查看实时画面。'.tr + + '\n' + + '一般情况下,满电可使用2~4个月。'.tr, + 2), + SizedBox( + height: 30.h, + ), + _buildTipsView('自定义模式'.tr + ':\n', + '根据您家门口实际情况设置录像和实时画面功能。'.tr + '\n' + '可使用时长由具体设置决定。'.tr, 3) + ], + ), ), ), ); @@ -121,13 +123,14 @@ class _CatEyeWorkModePageState extends State { ), GestureDetector( child: Container( - width: 90.w, - height: 40.h, + padding: EdgeInsets.all(8.w), decoration: BoxDecoration( color: Colors.transparent, borderRadius: BorderRadius.circular(15.0), border: Border.all( - color: AppColors.placeholderTextColor, width: 1.w), + color: AppColors.placeholderTextColor, + width: 1.w, + ), ), child: Center( child: Text( diff --git a/lib/main/lockDetail/lockSet/liveVideo/liveVideo_page.dart b/lib/main/lockDetail/lockSet/liveVideo/liveVideo_page.dart index d07a8e5c..2f10c0a2 100755 --- a/lib/main/lockDetail/lockSet/liveVideo/liveVideo_page.dart +++ b/lib/main/lockDetail/lockSet/liveVideo/liveVideo_page.dart @@ -28,7 +28,7 @@ class _LiveVideoPageState extends State { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: '实时画面', + barTitle: '实时画面'.tr, haveBack: true, backAction: () { Navigator.pop(context, true); diff --git a/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_page.dart b/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_page.dart index 2fa56dd0..5e786d6f 100755 --- a/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_page.dart +++ b/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_page.dart @@ -155,10 +155,16 @@ class _MsgNotificationPageState extends State { SizedBox( height: 60.h, ), - Text( - '此模块功能需要锁联网后设置方可生效'.tr, - style: TextStyle(fontSize: 20.sp), - ) + Padding( + padding: EdgeInsets.symmetric(horizontal: 30.w), + child: Text( + '此模块功能需要锁联网后设置方可生效'.tr, + style: TextStyle(fontSize: 20.sp), + textAlign: TextAlign.center, // 文本居中对齐 + softWrap: true, // 允许文本换行 + overflow: TextOverflow.visible, // 文本溢出时显示 + ), + ), ], ); } diff --git a/lib/tools/commonItem.dart b/lib/tools/commonItem.dart index 2a9d1c1d..b5c40036 100755 --- a/lib/tools/commonItem.dart +++ b/lib/tools/commonItem.dart @@ -20,6 +20,7 @@ class CommonItem extends StatelessWidget { this.rightWidget, this.isTipsImg, this.action, + this.leftTitleMaxWidth, // 新增属性 this.tipsImgAction}) : super(key: key); String? leftTitel; @@ -34,6 +35,7 @@ class CommonItem extends StatelessWidget { bool? setHeight; bool? isTipsImg; bool? isPadding; + final double? leftTitleMaxWidth; // 新增属性声明 @override Widget build(BuildContext context) { @@ -57,7 +59,17 @@ class CommonItem extends StatelessWidget { ), child: Row( children: [ - Text(leftTitel!, style: TextStyle(fontSize: 22.sp)), + ConstrainedBox( + constraints: BoxConstraints( + maxWidth: leftTitleMaxWidth ?? 0.6.sw, // 默认最大宽度为屏幕宽度的40% + ), + child: Text( + leftTitel!, + style: TextStyle(fontSize: 22.sp), + overflow: TextOverflow.ellipsis, // 超出部分显示省略号 + maxLines: 3, // 最多显示2行 + ), + ), SizedBox(width: 6.w), if (isTipsImg == true) GestureDetector( From d3aee05534588582ab5f63c62acb1a04155db1d9 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 20 Mar 2025 17:35:11 +0800 Subject: [PATCH 045/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E7=AE=80?= =?UTF-8?q?=E4=BD=93=E4=B8=AD=E6=96=87=E4=B8=8B=E6=89=8D=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starChart/handle/impl/udp_talk_request_handler.dart | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart index c55043bc..44f26c29 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart @@ -17,9 +17,13 @@ import 'package:star_lock/talk/starChart/proto/talk_expect.pb.dart'; import 'package:star_lock/talk/starChart/proto/talk_request.pb.dart'; import 'package:star_lock/tools/push/xs_jPhush.dart'; import 'package:star_lock/tools/storage.dart'; +import 'package:star_lock/translations/current_locale_tool.dart'; class UdpTalkRequestHandler extends ScpMessageBaseHandle implements ScpMessageHandler { + RxString currentLanguage = + CurrentLocaleTool.getCurrentLocaleString().obs; // 当前选择语言 + @override void handleReq(ScpMessage scpMessage) async { // 回复成功 @@ -107,7 +111,9 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle } }; - XSJPushProvider().showCustomNotification(message); + if (currentLanguage.value == 'zh_CN') { + XSJPushProvider().showCustomNotification(message); + } } /* const AndroidNotificationDetails androidPlatformChannelSpecifics = From 8b61e3d5a606ba9f6d062d05003addf4bb43c972 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 20 Mar 2025 17:54:14 +0800 Subject: [PATCH 046/135] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E5=88=B0=E4=BF=84=E8=AF=AD=E6=96=87=E6=9C=AC=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E6=BA=A2=E5=87=BA=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../authorizedAdministratorList_page.dart | 6 +++-- lib/tools/submitBtn.dart | 26 ++++++++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/mine/mineSet/authorizedAdministrator/authorizedAdministrator/authorizedAdministratorList_page.dart b/lib/mine/mineSet/authorizedAdministrator/authorizedAdministrator/authorizedAdministratorList_page.dart index f885fa3a..597ddea1 100755 --- a/lib/mine/mineSet/authorizedAdministrator/authorizedAdministrator/authorizedAdministratorList_page.dart +++ b/lib/mine/mineSet/authorizedAdministrator/authorizedAdministrator/authorizedAdministratorList_page.dart @@ -109,8 +109,10 @@ class _AuthorizedAdministratorListPageState 64.h), Align( alignment: const Alignment(0.0, 0.2), - child: SizedBox( - width: 360.w, + child: Container( + constraints: BoxConstraints( + maxWidth: 0.9.sw, + ), child: SubmitBtn( btnName: '添加授权管理员'.tr, onClick: () { diff --git a/lib/tools/submitBtn.dart b/lib/tools/submitBtn.dart index 57b6ea69..01511077 100755 --- a/lib/tools/submitBtn.dart +++ b/lib/tools/submitBtn.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -9,9 +8,9 @@ import '../app_settings/app_colors.dart'; * */ class SubmitBtn extends StatelessWidget { - SubmitBtn({ - required this.btnName, Key? key, + required this.btnName, + Key? key, this.borderRadius, this.color, this.padding, @@ -49,7 +48,9 @@ class SubmitBtn extends StatelessWidget { Widget build(BuildContext context) { return Container( width: ScreenUtil().screenWidth - 40.w, - height: 60.h, + constraints: BoxConstraints( + minHeight: 60.h, // 设置最小高度 + ), child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: isDisabled == false @@ -63,7 +64,14 @@ class SubmitBtn extends StatelessWidget { }, child: Text( btnName!, - style: TextStyle(color: Colors.white, fontSize: 24.sp), + textAlign: TextAlign.center, // 文本居中对齐 + softWrap: true, // 允许换行 + overflow: TextOverflow.visible, // 文本溢出时显示 + style: TextStyle( + color: Colors.white, + fontSize: 24.sp, + height: 1.2, // 行高 + ), )), ); /* @@ -111,9 +119,9 @@ class SubmitBtn extends StatelessWidget { * */ class AddBottomWhiteBtn extends StatelessWidget { - AddBottomWhiteBtn({ - required this.btnName, Key? key, + required this.btnName, + Key? key, this.onClick, }) : super(key: key); String? btnName; @@ -164,9 +172,9 @@ class AddBottomWhiteBtn extends StatelessWidget { * */ class OutLineBtn extends StatelessWidget { - OutLineBtn({ - required this.btnName, Key? key, + required this.btnName, + Key? key, this.onClick, }) : super(key: key); String? btnName; From 65c82a34abea31cfa56bf3c521f3e53affef6353 Mon Sep 17 00:00:00 2001 From: liyi Date: Fri, 21 Mar 2025 16:19:50 +0800 Subject: [PATCH 047/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=AF=B9?= =?UTF-8?q?=E8=AE=B2=E6=B5=81=E7=A8=8B=E9=80=BB=E8=BE=91=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=AF=B9=E8=AE=B2=E8=AF=B7=E6=B1=82=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E4=B8=BA30=E7=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/talk/starChart/constant/talk_constant.dart | 2 +- .../starChart/handle/impl/udp_talk_request_handler.dart | 8 ++++++-- .../other/talke_request_over_time_timer_manager.dart | 2 ++ lib/talk/starChart/star_chart_manage.dart | 9 ++++----- lib/talk/starChart/views/talkView/talk_view_logic.dart | 6 +++--- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/talk/starChart/constant/talk_constant.dart b/lib/talk/starChart/constant/talk_constant.dart index 23b6934f..a3847d50 100644 --- a/lib/talk/starChart/constant/talk_constant.dart +++ b/lib/talk/starChart/constant/talk_constant.dart @@ -3,5 +3,5 @@ class TalkConstant { static const int talkePingOverTime = 10; static const int talkeDataOverTime = 10; // 收到TalkRequest 未处理超时时间(s) - static const int talkeRequestOverTime = 60; + static const int talkeRequestOverTime = 30; } diff --git a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart index 44f26c29..8517e46b 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart @@ -54,6 +54,12 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle startChartManage.startTalkExpectTimer(); // 停止发送对讲请求 startChartManage.stopCallRequestMessageTimer(); + // 收到应答后取消超时判断 + talkeRequestOverTimeTimerManager.cancel(); + // 启动发送ping + startChartManage.startTalkPingMessageTimer(); + // 启动ping命令超时判断 + talkePingOverTimeTimerManager.start(); } } @@ -74,8 +80,6 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle _showTalkRequestNotification(talkObjectName: talkObjectName); // 设置为等待接听状态 talkStatus.setPassiveCallWaitingAnswer(); - // 启动对讲请求超时定时器 - talkeRequestOverTimeTimerManager.start(); // 收到呼叫请求,跳转到接听页面 if (startChartManage .getDefaultTalkExpect() diff --git a/lib/talk/starChart/handle/other/talke_request_over_time_timer_manager.dart b/lib/talk/starChart/handle/other/talke_request_over_time_timer_manager.dart index 44bb1630..c4347317 100644 --- a/lib/talk/starChart/handle/other/talke_request_over_time_timer_manager.dart +++ b/lib/talk/starChart/handle/other/talke_request_over_time_timer_manager.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/talk/starChart/constant/talk_constant.dart'; import 'package:star_lock/talk/starChart/constant/talk_status.dart'; import 'package:star_lock/talk/starChart/star_chart_manage.dart'; @@ -34,6 +35,7 @@ class TalkeRequestOverTimeTimerManager { StartChartManage().startTalkRejectMessageTimer(); StartChartManage().stopSendingRbcuInfoMessages(); StartChartManage().stopSendingRbcuProBeMessages(); + StartChartManage().stopCallRequestMessageTimer(); talkStatus.setInitializationCompleted(); Get.back(); } diff --git a/lib/talk/starChart/star_chart_manage.dart b/lib/talk/starChart/star_chart_manage.dart index 1e53b7f0..d379ef01 100644 --- a/lib/talk/starChart/star_chart_manage.dart +++ b/lib/talk/starChart/star_chart_manage.dart @@ -417,8 +417,7 @@ class StartChartManage { void startCallRequestMessageTimer({required String ToPeerId}) async { // 如果已经处于等待接听状态就不发送 if (talkStatus.status != TalkStatus.proactivelyCallWaitingAnswer) { - // 停止播放铃声 - // AudioPlayerManager().playRingtone(); + // 如果是h264则跳转至webview if (_defaultTalkExpect.videoType.contains(VideoTypeE.H264)) { Get.toNamed( Routers.h264WebView, @@ -429,6 +428,7 @@ class StartChartManage { ); } } + // 启动定时器持续发送对讲请求 talkRequestTimer ??= Timer.periodic( Duration( seconds: _defaultIntervalTime, @@ -438,9 +438,8 @@ class StartChartManage { }, ); talkStatus.setProactivelyCallWaitingAnswer(); - startTalkPingMessageTimer(); - // 启动是否收到ping超时判断定时器 - talkePingOverTimeTimerManager.start(); + // 启动对讲请求应答超时判断 + talkeRequestOverTimeTimerManager.start(); } /// 停止持续发送对讲请求 diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index c901d5ab..a0a79f52 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -125,7 +125,7 @@ class TalkViewLogic extends BaseGetXController { if (_isFirstFrame) { _startTime = currentTime; _isFirstFrame = false; - AppLog.log('记录第一帧的时间戳${currentTime},${talkData.durationMs}'); + // AppLog.log('记录第一帧的时间戳${currentTime},${talkData.durationMs}'); } // 计算实际延迟:当前时间 - 预期播放时间 @@ -249,11 +249,11 @@ class TalkViewLogic extends BaseGetXController { if (delay > delayThresholdHigh && bufferSize < maxBufferSize) { // 延迟较大,增加缓冲区 bufferSize = min(bufferSize + adjustInterval, maxBufferSize); - AppLog.log('📈 增加缓冲区 - 当前大小: $bufferSize, 延迟: ${delay}ms'); + // AppLog.log('📈 增加缓冲区 - 当前大小: $bufferSize, 延迟: ${delay}ms'); } else if (delay < delayThresholdLow && bufferSize > minBufferSize) { // 延迟较小,减少缓冲区 bufferSize = max(bufferSize - adjustInterval, minBufferSize); - AppLog.log('📉 减少缓冲区 - 当前大小: $bufferSize, 延迟: ${delay}ms'); + // AppLog.log('📉 减少缓冲区 - 当前大小: $bufferSize, 延迟: ${delay}ms'); } } From 7f2c2369a3cecbe6627587d763320c1f75e2b9b8 Mon Sep 17 00:00:00 2001 From: liyi Date: Sat, 22 Mar 2025 14:25:43 +0800 Subject: [PATCH 048/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E4=BF=84?= =?UTF-8?q?=E8=AF=AD=E5=9B=BD=E9=99=85=E5=8C=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_en.json | 1 + lan/lan_keys.json | 2 ++ lan/lan_ru.json | 6 +++-- lan/lan_zh.json | 2 ++ .../configuringWifi/configuringWifi_page.dart | 2 +- .../videoLog/videoLog/videoLog_page.dart | 4 +-- .../gaode/lockAddressGaoDe_page.dart | 21 ++++++++++------ lib/tools/advancedCalendar/src/widget.dart | 25 +++++++++++++------ 8 files changed, 44 insertions(+), 19 deletions(-) diff --git a/lan/lan_en.json b/lan/lan_en.json index 748227b8..56c9bee8 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1147,5 +1147,6 @@ "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "After the gateway is powered on, press and hold the reset button for 5 seconds. Click Next when the blue indicator light flashes", "暂无最新记录": "There are currently no latest records available", "请将手机切换至2.4G WiFi进行手动连接": "Please switch your phone to 2.4G WiFi for manual connection", + "请确保网络是2.4GHz Wi-Fi": "Please ensure that the network is 2.4GHz Wi Fi", "网关添加成功": "Gateway added successfully" } diff --git a/lan/lan_keys.json b/lan/lan_keys.json index 0ca0b455..a284f512 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1151,5 +1151,7 @@ "暂无最新记录": "暂无最新记录", "请将手机切换至2.4G WiFi进行手动连接": "请将手机切换至2.4G WiFi进行手动连接", "请扫描可视门铃码二维码": "请扫描可视门铃码二维码", + "请确保网络是2.4GHz Wi-Fi": "请确保网络是2.4GHz Wi-Fi", + "已选": "已选", "网关添加成功": "网关添加成功" } diff --git a/lan/lan_ru.json b/lan/lan_ru.json index 75878b41..d74b4d67 100644 --- a/lan/lan_ru.json +++ b/lan/lan_ru.json @@ -630,12 +630,12 @@ "关锁": "Закрыть замок", "功能": "Функция", "配件": "Детали", - "云存": "Облачное хранилище", + "云存": "Cloud", "本地": "Эта местность", "3天滚动储存": "3 дня прокатного хранения", "去升级": "Обновить сейчас", "下载列表": "Скачать список", - "已下载": "Загружено", + "已下载": "Downloaded", "全部视频": "Все видео", "已为本设备免费提供3大滚动视频储存服务": "Для этого устройства бесплатно предоставлены три услуги по хранению видео с прокруткой.", "视频播放": "Воспроизведение видео", @@ -1148,5 +1148,7 @@ "3.安装Google Home APP,点击左上角的加号按钮": "3. Установите приложение Google Home и нажмите кнопку plus в левом верхнем углу", "暂无最新记录": "В настоящее время последние данные отсутствуют", "请扫描可视门铃码二维码": "Сканируйте код вызова", + "请确保网络是2.4GHz Wi-Fi": "Убедитесь, что сеть имеет 2,4 ГГц Wi - Fi", + "已选": "Выбранные", "请将手机切换至2.4G WiFi进行手动连接": "Пожалуйста, переключите телефон на 2.4G WiFi для ручного подключения" } \ No newline at end of file diff --git a/lan/lan_zh.json b/lan/lan_zh.json index 4bf1ac49..f2a7ff7d 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1151,5 +1151,7 @@ "暂无最新记录": "暂无最新记录", "请将手机切换至2.4G WiFi进行手动连接": "请将手机切换至2.4G WiFi进行手动连接", "请扫描可视门铃码二维码": "请扫描可视门铃码二维码", + "请确保网络是2.4GHz Wi-Fi": "请确保网络是2.4GHz Wi-Fi", + "已选": "已选", "网关添加成功": "网关添加成功" } diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart index 4e8f238a..1e6d6ac4 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart @@ -55,7 +55,7 @@ class _ConfiguringWifiPageState extends State height: 20.h, ), Text( - '请确保网络是2.4GHz Wi-Fi ', + '请确保网络是2.4GHz Wi-Fi'.tr, style: TextStyle( color: AppColors.blackColor, fontSize: 20.sp, diff --git a/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart b/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart index 97bd6ab6..5e83bee2 100755 --- a/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart +++ b/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart @@ -143,8 +143,8 @@ class _VideoLogPageState extends State { // nav按钮 Widget navBtn() { - return SizedBox( - width: 300.w, + return Container( + constraints: BoxConstraints(maxWidth: 310.w), // color: Colors.white, child: Row( mainAxisAlignment: MainAxisAlignment.center, diff --git a/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart b/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart index e219a237..952f56cd 100755 --- a/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart +++ b/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart @@ -6,6 +6,7 @@ import 'package:amap_flutter_location/amap_flutter_location.dart'; import 'package:amap_flutter_location/amap_location_option.dart'; import 'package:amap_flutter_map/amap_flutter_map.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -175,12 +176,16 @@ class _LockAddressGaoDePageState extends State body: ListView( children: [ Container( - margin: EdgeInsets.only(left: 25.w, top: 40.h, bottom: 40.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('地理位置'.tr, style: TextStyle(fontSize: 50.sp)), - ], + margin: EdgeInsets.only( + left: 25.w, right: 25.w, top: 40.h, bottom: 40.w), + child: Center( + child: Text( + '地理位置'.tr, + textAlign: TextAlign.center, + style: TextStyle(fontSize: 50.sp), + softWrap: true, + overflow: TextOverflow.visible, + ), ), ), SizedBox( @@ -272,7 +277,9 @@ class _LockAddressGaoDePageState extends State height: 1.sw / 5 * 4 + 65.h * 2, child: Center(child: Text('地图加载中,请稍候。。。'.tr))), ), - SizedBox(height: 200.h), + Container( + constraints: BoxConstraints(maxHeight: 150.h), + ), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ diff --git a/lib/tools/advancedCalendar/src/widget.dart b/lib/tools/advancedCalendar/src/widget.dart index 62dac000..7abd3fee 100755 --- a/lib/tools/advancedCalendar/src/widget.dart +++ b/lib/tools/advancedCalendar/src/widget.dart @@ -3,17 +3,24 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; +import 'package:star_lock/translations/current_locale_tool.dart'; import '../../../app_settings/app_settings.dart'; import 'controller.dart'; import 'datetime_util.dart'; part 'date_box.dart'; + part 'handlebar.dart'; + part 'header.dart'; + part 'month_view.dart'; + part 'month_view_bean.dart'; + part 'week_days.dart'; + part 'week_view.dart'; /// Advanced Calendar widget. @@ -162,13 +169,17 @@ class _AdvancedCalendarState extends State // return DateFormat("EEEE").format(list[index]).split('').first; // } // ); - //by DaisyWu 修改源文件为中文环境下 周一到周日 - _weekNames = List.generate(7, (int index) { - String fullWeekName = - DateFormat.E('zh_CN').format(list[index]); // 获取星期的完整形式 - return fullWeekName - .substring(fullWeekName.length - 1); // 获取最后一个字符,即星期的简称 - }); + + final currentLocaleString = CurrentLocaleTool.getCurrentLocaleString(); + if (currentLocaleString == 'zh_CN') { + //by DaisyWu 修改源文件为中文环境下 周一到周日 + _weekNames = List.generate(7, (int index) { + String fullWeekName = + DateFormat.E('zh_CN').format(list[index]); // 获取星期的完整形式 + return fullWeekName + .substring(fullWeekName.length - 1); // 获取最后一个字符,即星期的简称 + }); + } } } From af9a4b9ea1399c79b85f594829aa55091a35650d Mon Sep 17 00:00:00 2001 From: liyi Date: Sat, 22 Mar 2025 17:20:21 +0800 Subject: [PATCH 049/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_ar.json | 2 ++ lan/lan_bg.json | 2 ++ lan/lan_bn.json | 2 ++ lan/lan_cs.json | 2 ++ lan/lan_da.json | 2 ++ lan/lan_de.json | 2 ++ lan/lan_el.json | 2 ++ lan/lan_en.json | 2 ++ lan/lan_es.json | 2 ++ lan/lan_et.json | 2 ++ lan/lan_fi.json | 2 ++ lan/lan_fr.json | 2 ++ lan/lan_he.json | 2 ++ lan/lan_hi.json | 2 ++ lan/lan_hk.json | 2 ++ lan/lan_hr.json | 2 ++ lan/lan_hu.json | 2 ++ lan/lan_id.json | 2 ++ lan/lan_it.json | 2 ++ lan/lan_ja.json | 2 ++ lan/lan_keys.json | 2 ++ lan/lan_kk.json | 2 ++ lan/lan_ko.json | 2 ++ lan/lan_lt.json | 2 ++ lan/lan_ms.json | 2 ++ lan/lan_nl.json | 2 ++ lan/lan_pl.json | 2 ++ lan/lan_pt.json | 2 ++ lan/lan_ro.json | 2 ++ lan/lan_ru.json | 2 ++ lan/lan_sk.json | 2 ++ lan/lan_sr_cyrl.json | 2 ++ lan/lan_sv.json | 2 ++ lan/lan_th.json | 2 ++ lan/lan_tr.json | 2 ++ lan/lan_tw.json | 2 ++ lan/lan_uk.json | 2 ++ lan/lan_ur.json | 2 ++ lan/lan_vi.json | 2 ++ lan/lan_zh.json | 2 ++ lib/translations/app_dept.dart | 33 ++++++++++++++++++++++++++++++++- 41 files changed, 112 insertions(+), 1 deletion(-) diff --git a/lan/lan_ar.json b/lan/lan_ar.json index e53131c6..63371d82 100644 --- a/lan/lan_ar.json +++ b/lan/lan_ar.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "بعد إعادة الضبط ، سيتم حذف الأوردة المشطية للقفل. هل أنت متأكد أنك تريد إعادة الضبط ؟", "在线": "الإنترنت", "离线": "غير متصل", diff --git a/lan/lan_bg.json b/lan/lan_bg.json index 15c1f133..56750a26 100644 --- a/lan/lan_bg.json +++ b/lan/lan_bg.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "След нулиране, метакарпалните вени на ключалката ще бъдат изтрити. Сигурен ли сте, че искате да се възстанови?", "在线": "Онлайн", "离线": "Офлайн", diff --git a/lan/lan_bn.json b/lan/lan_bn.json index 994bcdf0..8a7d28df 100644 --- a/lan/lan_bn.json +++ b/lan/lan_bn.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "ব্যান্ডোটারআইসেট, হাসিপাল রিরিইনস্ফথেলকবইল্ডজেডড।?", "在线": "কনলাইন", "离线": "দেউন্টলাইনCity in Ontario Canada", diff --git a/lan/lan_cs.json b/lan/lan_cs.json index 4830ba9c..08925658 100644 --- a/lan/lan_cs.json +++ b/lan/lan_cs.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetování budou metakarpální žíly zámku odstraněny. Jste si jistý, že chcete resetovat?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_da.json b/lan/lan_da.json index af956511..d3db1465 100644 --- a/lan/lan_da.json +++ b/lan/lan_da.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter nulstilling, de metacarpal vener i låsen vil blive slettet. Er du sikker på at du vil nulstille?", "在线": "OnlineComment", "离线": "OfflineComment", diff --git a/lan/lan_de.json b/lan/lan_de.json index fc9ada5c..79e2516d 100644 --- a/lan/lan_de.json +++ b/lan/lan_de.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nach dem Zurücksetzen werden die Mittelhand adern des Schlosses gelöscht. Sind Sie sicher, dass Sie zurücksetzen wollen?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_el.json b/lan/lan_el.json index 673d0f5b..8eac3390 100644 --- a/lan/lan_el.json +++ b/lan/lan_el.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, οι μετακάρπιες φλέβες της κλειδαριάς θα διαγραφούν. Είστε σίγουροι ότι θέλετε να επαναφέρετε;", "在线": "Σε απευθείας σύνδεση", "离线": "Εκτός σύνδεσης:", diff --git a/lan/lan_en.json b/lan/lan_en.json index 56c9bee8..a84ceb62 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1080,6 +1080,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "After reset, the metacarpal veins of the lock will be deleted. Are you sure you want to reset?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_es.json b/lan/lan_es.json index 21e4cf83..4dabcf0d 100644 --- a/lan/lan_es.json +++ b/lan/lan_es.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Después del reinicio, se eliminarán las venas metacarpiales de la cerradura. ¿Está seguro de que desea restablecer?", "在线": "En línea", "离线": "Offline", diff --git a/lan/lan_et.json b/lan/lan_et.json index 8493c8cf..48888bd6 100644 --- a/lan/lan_et.json +++ b/lan/lan_et.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku metakarpaalveenid. Kas tõesti soovid lähtestada?", "在线": "Võrgus", "离线": "Mitte ühendust", diff --git a/lan/lan_fi.json b/lan/lan_fi.json index c51e11f8..a6cd4aba 100644 --- a/lan/lan_fi.json +++ b/lan/lan_fi.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Kun lukko on nollattu, metakarppinen suoneet poistetaan. Haluatko varmasti palauttaa?", "在线": "Verkossa", "离线": "Offline-verkosto", diff --git a/lan/lan_fr.json b/lan/lan_fr.json index fcb50558..ffcf5c00 100644 --- a/lan/lan_fr.json +++ b/lan/lan_fr.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Après réinitialisation, les veines métacarpiennes de la serrure seront supprimées. Êtes-vous sûr de vouloir réinitialiser?", "在线": "En ligne", "离线": "Hors ligne", diff --git a/lan/lan_he.json b/lan/lan_he.json index 151f02c7..acc3c4f2 100644 --- a/lan/lan_he.json +++ b/lan/lan_he.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "לאחר איפוס, הורידים של המנעול יימחקו. אתה בטוח שברצונך לאפס?", "在线": "באינטרנט", "离线": "מנותק", diff --git a/lan/lan_hi.json b/lan/lan_hi.json index 463d1d90..1e608b4f 100644 --- a/lan/lan_hi.json +++ b/lan/lan_hi.json @@ -1080,6 +1080,8 @@ "印度尼西亚语": "बाहसा इंडोनेशिया", "芬兰语": "सूमी", "丹麦语": "मूर्ख व्यक्ति", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "रीसेट के बाद, लॉक के मेटाकार्पल नसों को हटा दिया जाएगा। क्या आप निश्चित रूप से रीसेट करना चाहते हैं?", "在线": "ऑनलाइन", "离线": "ऑफ़लाइन", diff --git a/lan/lan_hk.json b/lan/lan_hk.json index be282c4f..754865ba 100644 --- a/lan/lan_hk.json +++ b/lan/lan_hk.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "索米", "丹麦语": "丹斯克", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 你確定要重置啊?", "在线": "在線", "离线": "離線", diff --git a/lan/lan_hr.json b/lan/lan_hr.json index fd246ef3..ece14b96 100644 --- a/lan/lan_hr.json +++ b/lan/lan_hr.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nakon resetiranja, metakarpalne vene brave će biti izbrisane. Jeste li sigurni da želite resetiranje?", "在线": "Na internetu", "离线": "Odspojeno", diff --git a/lan/lan_hu.json b/lan/lan_hu.json index 38a5662e..894a44e3 100644 --- a/lan/lan_hu.json +++ b/lan/lan_hu.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "A reset után a zár metakarpális erei törlődnek. Biztos vagy benne, hogy vissza akarsz állítani?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_id.json b/lan/lan_id.json index 5adea3d9..a0dd8c94 100644 --- a/lan/lan_id.json +++ b/lan/lan_id.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Setelah mengulang, pembuluh darah metakarpal dari kunci akan dihapus. Yakin ingin mengatur ulang?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_it.json b/lan/lan_it.json index 1cbf97ea..00fa3d12 100644 --- a/lan/lan_it.json +++ b/lan/lan_it.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Dopo il reset, le vene metacarpali della serratura verranno cancellate. Sei sicuro di voler reimpostare?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_ja.json b/lan/lan_ja.json index cea8a5d0..f58e6062 100644 --- a/lan/lan_ja.json +++ b/lan/lan_ja.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "リセット後、ロックの中手骨静脈が削除されます。リセットしてもよろしいですか。", "在线": "オンライン", "离线": "オフライン", diff --git a/lan/lan_keys.json b/lan/lan_keys.json index a284f512..174e1185 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1081,6 +1081,8 @@ "印度尼西亚语": "印度尼西亚语", "芬兰语": "芬兰语", "丹麦语": "丹麦语", + "印地语": "印地语", + "乌尔都语": "乌尔都语", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?", "在线": "在线", "离线": "离线", diff --git a/lan/lan_kk.json b/lan/lan_kk.json index 728c1946..cf4ec926 100644 --- a/lan/lan_kk.json +++ b/lan/lan_kk.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Қайта ысырып тастағаннан соң бұғаттағы метакарпалар өшіріледі. Шынымен ысырып тастауды қалайсыз ба?", "在线": "Онлайн", "离线": "Желіде емес", diff --git a/lan/lan_ko.json b/lan/lan_ko.json index af0fab29..5d8c6ef0 100644 --- a/lan/lan_ko.json +++ b/lan/lan_ko.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "재설정 후 잠금 장치의 중수골 정맥이 삭제됩니다. 당신은 당신이 재설정 하시겠습니까?", "在线": "온라인", "离线": "오프라인", diff --git a/lan/lan_lt.json b/lan/lan_lt.json index 4a84d77b..ebb9df23 100644 --- a/lan/lan_lt.json +++ b/lan/lan_lt.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po reset užrakto metakarpinės venos bus ištrintos. Ar tikrai norite atstatyti?", "在线": "Online", "离线": "Neprisijungęs", diff --git a/lan/lan_ms.json b/lan/lan_ms.json index a85297b6..d003ba80 100644 --- a/lan/lan_ms.json +++ b/lan/lan_ms.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, urat metacarpal kunci akan dipadamkan. Adakah anda pasti anda mahu menetapkan semula?", "在线": "Dalam talian", "离线": "Luar talian", diff --git a/lan/lan_nl.json b/lan/lan_nl.json index ff92c9b7..afdd971d 100644 --- a/lan/lan_nl.json +++ b/lan/lan_nl.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Na reset worden de middenhandsbeenaders van het slot verwijderd. Weet je zeker dat je wilt resetten?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_pl.json b/lan/lan_pl.json index 9449d4c0..120281a1 100644 --- a/lan/lan_pl.json +++ b/lan/lan_pl.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po zresetowaniu żyły śródręcza zamka zostaną usunięte. Czy na pewno chcesz zresetować?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_pt.json b/lan/lan_pt.json index 0365fbd6..4d3a3436 100644 --- a/lan/lan_pt.json +++ b/lan/lan_pt.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Após a reinicialização, as veias do metacarpo do bloqueio serão excluídas. Tens a certeza que queres reiniciar?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_ro.json b/lan/lan_ro.json index c25f3051..a439b5fa 100644 --- a/lan/lan_ro.json +++ b/lan/lan_ro.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "După resetare, venele metacarpale ale încuietorii vor fi şterse. Sigur doriți să resetați?", "在线": "Online", "离线": "Deconectat", diff --git a/lan/lan_ru.json b/lan/lan_ru.json index d74b4d67..3297d79a 100644 --- a/lan/lan_ru.json +++ b/lan/lan_ru.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "После сброса пястные вены замка будут удалены. Вы уверены, что хотите сбросить?", "在线": "Онлайн", "离线": "Оффлайн", diff --git a/lan/lan_sk.json b/lan/lan_sk.json index 4faea5d9..18c30d61 100644 --- a/lan/lan_sk.json +++ b/lan/lan_sk.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetovaní budú metakarpálne žily zámku vymazané. Ste si istí, že chcete obnoviť?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_sr_cyrl.json b/lan/lan_sr_cyrl.json index 7c61e6cd..67bc4ada 100644 --- a/lan/lan_sr_cyrl.json +++ b/lan/lan_sr_cyrl.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Након ресетовања, метакарпалне вене браве ће бити избрисане. Да ли сте сигурни да желите да ресетујете?", "在线": "Онлине", "离线": "Ванмрежне", diff --git a/lan/lan_sv.json b/lan/lan_sv.json index 4ec91309..22dcfa65 100644 --- a/lan/lan_sv.json +++ b/lan/lan_sv.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter återställd, de metakarpal venerna i låset tas bort. Är du säker på att du vill återställa?", "在线": "Online:", "离线": "Frånkoppling", diff --git a/lan/lan_th.json b/lan/lan_th.json index 234fce02..fb568c47 100644 --- a/lan/lan_th.json +++ b/lan/lan_th.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "หลังจากรีเซ็ตแล้วหลอดเลือดดำ metacarpal ของล็อคจะถูกลบออกคุณแน่ใจว่าอยากจะรีเซ็ต?", "在线": "ออนไลน์ผ่าน", "离线": "ออฟไลน์", diff --git a/lan/lan_tr.json b/lan/lan_tr.json index 34f5ab7e..34f6a7e9 100644 --- a/lan/lan_tr.json +++ b/lan/lan_tr.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sıfırlamadan sonra, kilidin metacarpal damarları silinecektir. Sıfırlamak istediğine emin misin?", "在线": "Çevrimiçi", "离线": "Çevrimdışı", diff --git a/lan/lan_tw.json b/lan/lan_tw.json index 69fd23f7..6de33a41 100644 --- a/lan/lan_tw.json +++ b/lan/lan_tw.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 是否確實要重置?", "在线": "在線", "离线": "離線", diff --git a/lan/lan_uk.json b/lan/lan_uk.json index 0ddc8868..a0451246 100644 --- a/lan/lan_uk.json +++ b/lan/lan_uk.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Після скидання п'ясткові вени замку будуть видалені. Ви впевнені, що хочете скинути налаштування?", "在线": "Онлайн", "离线": "Автономних", diff --git a/lan/lan_ur.json b/lan/lan_ur.json index 7bf3a227..90574a85 100644 --- a/lan/lan_ur.json +++ b/lan/lan_ur.json @@ -1080,6 +1080,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "ری سیٹ کرنے کے بعد ، لاک کی میٹاکارپل رگیں حذف کردی جائیں گی۔ کیا آپ واقعی دوبارہ ترتیب دینا چاہتے ہیں؟", "在线": "آن لائن", "离线": "آف لائن", diff --git a/lan/lan_vi.json b/lan/lan_vi.json index e91661df..4086e02f 100644 --- a/lan/lan_vi.json +++ b/lan/lan_vi.json @@ -1078,6 +1078,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sau khi đặt lại, các tĩnh mạch metacarpal của khóa sẽ bị xóa. Bạn có chắc muốn thiết lập lại không?", "在线": "Trực tuyến", "离线": "Ngoại tuyến", diff --git a/lan/lan_zh.json b/lan/lan_zh.json index f2a7ff7d..f622d613 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1081,6 +1081,8 @@ "印度尼西亚语": "Bahasa Indonesia", "芬兰语": "Suomi", "丹麦语": "Dansk", + "印地语": "हिंदीName", + "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?", "在线": "在线", "离线": "离线", diff --git a/lib/translations/app_dept.dart b/lib/translations/app_dept.dart index c58d5de8..1d60fe75 100755 --- a/lib/translations/app_dept.dart +++ b/lib/translations/app_dept.dart @@ -54,6 +54,8 @@ extension ExtensionAppDept on AppDept { const Locale fiL = Locale('fi', 'FI'); const Locale daL = Locale('da', 'DK'); const Locale ukL = Locale('uk', 'UA'); + const Locale hiL = Locale('hi', 'HI'); + const Locale urL = Locale('ur', 'UR'); const Locale srCyrillic = Locale('sr', 'RS'); return [ @@ -93,6 +95,8 @@ extension ExtensionAppDept on AppDept { fiL, daL, ukL, + hiL, + urL, srCyrillic ]; } @@ -177,7 +181,12 @@ enum LanguageType { // 丹麦语 danish, // 乌克兰语 - ukrainian + ukrainian, + //印地语、 + hindi, + //乌尔都语 + urdu, + } extension ExtensionLanguageType on LanguageType { @@ -295,6 +304,12 @@ extension ExtensionLanguageType on LanguageType { case LanguageType.ukrainian: str = '乌克兰语'.tr; break; + case LanguageType.hindi: + str = '印地语'.tr; + break; + case LanguageType.urdu: + str = '乌尔都语'.tr; + break; } return str; } @@ -415,6 +430,12 @@ extension ExtensionLanguageType on LanguageType { case 'uk': languageType = LanguageType.ukrainian; break; + case 'hi': + languageType = LanguageType.hindi; + break; + case 'ur': + languageType = LanguageType.urdu; + break; default: languageType = LanguageType.english; break; @@ -610,6 +631,16 @@ extension ExtensionLanguageType on LanguageType { return locale; } break; + case LanguageType.hindi: + if (locale.languageCode == 'hi' && locale.countryCode == 'HI') { + return locale; + } + break; + case LanguageType.urdu: + if (locale.languageCode == 'ur' && locale.countryCode == 'UR') { + return locale; + } + break; case LanguageType.system: // TODO: Handle this case. break; From ff8bfa8fd0cbaab79203844bc081388ab5221826 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 24 Mar 2025 14:14:12 +0800 Subject: [PATCH 050/135] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=BF=84=E8=AF=AD=E5=87=BA=E7=8E=B0=E7=9A=84=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=9B=BD=E9=99=85=E5=8C=96bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_en.json | 1 + lan/lan_keys.json | 1 + lan/lan_ru.json | 1 + lan/lan_zh.json | 1 + .../addFingerprint/addFingerprint_logic.dart | 319 ++++++++++-------- .../fingerprintList_logic.dart | 56 +-- .../fingerprintList/fingerprintList_page.dart | 28 +- .../lockDetail/lockDetail_page.dart | 32 +- .../passwordKeyDetail_logic.dart | 2 +- .../passwordKeyDetail_page.dart | 2 +- lib/tools/showCupertinoAlertView.dart | 2 +- 11 files changed, 235 insertions(+), 210 deletions(-) diff --git a/lan/lan_en.json b/lan/lan_en.json index a84ceb62..c2fbf2a7 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1150,5 +1150,6 @@ "暂无最新记录": "There are currently no latest records available", "请将手机切换至2.4G WiFi进行手动连接": "Please switch your phone to 2.4G WiFi for manual connection", "请确保网络是2.4GHz Wi-Fi": "Please ensure that the network is 2.4GHz Wi Fi", + "是否要远程开锁": "Do you want to unlock remotely", "网关添加成功": "Gateway added successfully" } diff --git a/lan/lan_keys.json b/lan/lan_keys.json index 174e1185..f93afdae 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1155,5 +1155,6 @@ "请扫描可视门铃码二维码": "请扫描可视门铃码二维码", "请确保网络是2.4GHz Wi-Fi": "请确保网络是2.4GHz Wi-Fi", "已选": "已选", + "是否要远程开锁": "是否要远程开锁", "网关添加成功": "网关添加成功" } diff --git a/lan/lan_ru.json b/lan/lan_ru.json index 3297d79a..07772f3b 100644 --- a/lan/lan_ru.json +++ b/lan/lan_ru.json @@ -1152,5 +1152,6 @@ "请扫描可视门铃码二维码": "Сканируйте код вызова", "请确保网络是2.4GHz Wi-Fi": "Убедитесь, что сеть имеет 2,4 ГГц Wi - Fi", "已选": "Выбранные", + "是否要远程开锁": "Нужно ли удалённо открывать замок", "请将手机切换至2.4G WiFi进行手动连接": "Пожалуйста, переключите телефон на 2.4G WiFi для ручного подключения" } \ No newline at end of file diff --git a/lan/lan_zh.json b/lan/lan_zh.json index f622d613..351e3fff 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1155,5 +1155,6 @@ "请扫描可视门铃码二维码": "请扫描可视门铃码二维码", "请确保网络是2.4GHz Wi-Fi": "请确保网络是2.4GHz Wi-Fi", "已选": "已选", + "是否要远程开锁": "是否要远程开锁", "网关添加成功": "网关添加成功" } diff --git a/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart b/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart index bab8f1f0..c8507a3f 100755 --- a/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart +++ b/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; @@ -26,20 +25,23 @@ class AddFingerprintLogic extends BaseGetXController { // 监听设备返回的数据 late StreamSubscription _replySubscription; + void _initReplySubscription() { - _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) async { + _replySubscription = + EventBusManager().eventBus!.on().listen((Reply reply) async { // 添加指纹开始 - if((reply is SenderAddFingerprintWithTimeCycleCoercionReply) && (state.ifCurrentScreen.value == true)) { + if ((reply is SenderAddFingerprintWithTimeCycleCoercionReply) && + (state.ifCurrentScreen.value == true)) { _replyAddFingerprintBegin(reply); } // 添加指纹过程 - if(reply is SenderAddFingerprintProcessReply) { + if (reply is SenderAddFingerprintProcessReply) { _replyAddFingerprintProcess(reply); } // 添加指纹确认 - if(reply is SenderAddFingerprintConfirmationReply) { + if (reply is SenderAddFingerprintConfirmationReply) { _replyAddFingerprintConfirmation(reply); } }); @@ -49,11 +51,10 @@ class AddFingerprintLogic extends BaseGetXController { BuglyTool.uploadException( message: '添加指纹开始,解析数据', detail: '添加指纹开始,解析数据 _replyAddFingerprintBegin:${reply.data}', - upload: false - ); + upload: false); final int status = reply.data[2]; - switch(status){ + switch (status) { case 0x00: //成功 state.ifConnectScuess.value = true; @@ -67,10 +68,13 @@ class AddFingerprintLogic extends BaseGetXController { break; case 0x06: //无权限 - final List? privateKey = await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); - final List? signKey = await Storage.getStringList(saveBlueSignKey); + final List? signKey = + await Storage.getStringList(saveBlueSignKey); final List signKeyDataList = changeStringListToIntList(signKey!); final List token = reply.data.sublist(5, 9); @@ -78,30 +82,33 @@ class AddFingerprintLogic extends BaseGetXController { Storage.setStringList(saveBlueToken, saveStrList); IoSenderManage.senderAddFingerprintWithTimeCycleCoercionCommand( - keyID:'1', - userID:await Storage.getUid(), - fingerNo:0, - useCountLimit:0xffff, - isForce:state.isCoerced.value == '1' ? 1 : 0, // 是否是胁迫 - isAdmin: state.isAdministrator.value == '2' ? 1 : 0, - operate: 0, - isRound:state.selectType.value == '2' ? 1: 0, // 是否是循环 - weekRound:DateTool().accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), // 周循环 - startDate: int.parse(state.startDate.value)~/1000, - endDate: int.parse(state.endDate.value)~/1000, - startTime:DateTool().dateToHNString(state.effectiveDateTime.value), - endTime:DateTool().dateToHNString(state.failureDateTime.value), - needAuthor:1, - signKey:signKeyDataList, - privateKey:getPrivateKeyList, - token: token, - isBeforeAddUser: false - ); + keyID: '1', + userID: await Storage.getUid(), + fingerNo: 0, + useCountLimit: 0xffff, + isForce: state.isCoerced.value == '1' ? 1 : 0, + // 是否是胁迫 + isAdmin: state.isAdministrator.value == '2' ? 1 : 0, + operate: 0, + isRound: state.selectType.value == '2' ? 1 : 0, + // 是否是循环 + weekRound: DateTool().accordingTheCycleIntoTheCorrespondingNumber( + state.weekDay.value), + // 周循环 + startDate: int.parse(state.startDate.value) ~/ 1000, + endDate: int.parse(state.endDate.value) ~/ 1000, + startTime: DateTool().dateToHNString(state.effectiveDateTime.value), + endTime: DateTool().dateToHNString(state.failureDateTime.value), + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + token: token, + isBeforeAddUser: false); break; default: //失败 state.ifAddState.value = false; - showToast('添加指纹失败'.tr, something: (){ + showToast('添加指纹失败'.tr, something: () { Get.back(); }); break; @@ -112,13 +119,12 @@ class AddFingerprintLogic extends BaseGetXController { BuglyTool.uploadException( message: '添加指纹过程,解析数据', detail: '添加指纹过程,解析数据 _replyAddFingerprintProcess:${reply.data}', - upload: false - ); + upload: false); final int status = reply.data[2]; - switch(status){ + switch (status) { case 0x00: //成功 - switch(reply.data[5]){ + switch (reply.data[5]) { case 0xff: // 注册指纹失败 showToast('退出添加'.tr); @@ -166,35 +172,37 @@ class AddFingerprintLogic extends BaseGetXController { Future _replyAddFingerprintConfirmation(Reply reply) async { final int status = reply.data[2]; final String getMobile = (await Storage.getMobile())!; - switch(status){ + switch (status) { case 0x00: //成功 - // var fingerprintNum = listChangInt(reply.data.sublist(9, 11)).toString(); + // var fingerprintNum = listChangInt(reply.data.sublist(9, 11)).toString(); ApmHelper.instance.trackEvent('add_fingerprint', { - 'lock_name':BlueManage().connectDeviceName, - 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, - 'date':DateTool().getNowDateWithType(1), - 'add_fingerprint_result':'成功', + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'add_fingerprint_result': '成功', }); BuglyTool.uploadException( message: '添加指纹确认结果,解析数据', - detail: '添加指纹确认结果,解析数据 _replyAddFingerprintConfirmation:${reply.data}', - upload: false - ); + detail: + '添加指纹确认结果,解析数据 _replyAddFingerprintConfirmation:${reply.data}', + upload: false); - final List fingerprintList = reply.data.sublist(reply.data.length - 2); + final List fingerprintList = + reply.data.sublist(reply.data.length - 2); final String fingerprintNum = listChangInt(fingerprintList).toString(); state.regIndex.value++; - if(state.fingerprintNumber.value == fingerprintNum){ + if (state.fingerprintNumber.value == fingerprintNum) { return; - }else{ + } else { state.fingerprintNumber.value = fingerprintNum; } // if(state.isCoerced.value == "1"){ - // 调用添加指纹接口 + // 调用添加指纹接口 state.ifAddState.value = false; - addFingerprintsData(); + await addFingerprintsData(); // }else{ // // 如果是胁迫指纹在 添加完之后以后再调用添加胁迫指纹的 // senderAddStressFingerprint(); @@ -203,18 +211,19 @@ class AddFingerprintLogic extends BaseGetXController { default: //失败 ApmHelper.instance.trackEvent('add_fingerprint', { - 'lock_name':BlueManage().connectDeviceName, - 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, - 'date':DateTool().getNowDateWithType(1), - 'add_fingerprint_result':'失败-${reply.data}', + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'add_fingerprint_result': '失败-${reply.data}', }); BuglyTool.uploadException( message: '添加指纹确认结果,解析数据', - detail: '添加指纹确认结果蓝牙返回失败结果,解析数据 _replyAddFingerprintConfirmation:${reply.data}', + detail: + '添加指纹确认结果蓝牙返回失败结果,解析数据 _replyAddFingerprintConfirmation:${reply.data}', eventStr: '添加指纹事件蓝牙返回失败结果', - upload: true - ); + upload: true); state.ifAddState.value = false; break; } @@ -222,7 +231,8 @@ class AddFingerprintLogic extends BaseGetXController { // 添加指纹开始 Future senderAddFingerprint() async { - final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); final List getPrivateKeyList = changeStringListToIntList(privateKey!); final List? signKey = await Storage.getStringList(saveBlueSignKey); @@ -232,90 +242,104 @@ class AddFingerprintLogic extends BaseGetXController { final List getTokenList = changeStringListToIntList(token!); final String command = SenderAddFingerprintWithTimeCycleCoercionCommand( - keyID:'1', - userID:await Storage.getUid(), - fingerNo:0, - useCountLimit:0xffff, - isForce:state.isCoerced.value == '1' ? 1 : 0, // 是否是胁迫 + keyID: '1', + userID: await Storage.getUid(), + fingerNo: 0, + useCountLimit: 0xffff, + isForce: state.isCoerced.value == '1' ? 1 : 0, + // 是否是胁迫 isAdmin: state.isAdministrator.value == '2' ? 1 : 0, operate: 0, - isRound:state.selectType.value == '2' ? 1: 0, // 是否是循环 - weekRound:DateTool().accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), // 周循环 - startDate: int.parse(state.startDate.value)~/1000, - endDate: int.parse(state.endDate.value)~/1000, - startTime:DateTool().dateToHNString(state.effectiveDateTime.value), - endTime:DateTool().dateToHNString(state.failureDateTime.value), - needAuthor:1, - signKey:signKeyDataList, - privateKey:getPrivateKeyList, + isRound: state.selectType.value == '2' ? 1 : 0, + // 是否是循环 + weekRound: DateTool() + .accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), + // 周循环 + startDate: int.parse(state.startDate.value) ~/ 1000, + endDate: int.parse(state.endDate.value) ~/ 1000, + startTime: DateTool().dateToHNString(state.effectiveDateTime.value), + endTime: DateTool().dateToHNString(state.failureDateTime.value), + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, token: getTokenList, ).toString(); showBlueConnetctToastTimer(action: () async { final String getMobile = (await Storage.getMobile())!; ApmHelper.instance.trackEvent('add_fingerprint', { - 'lock_name':BlueManage().connectDeviceName, - 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, - 'date':DateTool().getNowDateWithType(1), - 'add_fingerprint_result':'超时', + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'add_fingerprint_result': '超时', }); BuglyTool.uploadException( message: '添加指纹超时处理-添加指纹失败', - detail: '添加指纹超时处理,断开连接,添加指纹失败--SenderAddFingerprintWithTimeCycleCoercionCommand:$command', + detail: + '添加指纹超时处理,断开连接,添加指纹失败--SenderAddFingerprintWithTimeCycleCoercionCommand:$command', eventStr: '添加指纹事件超时', - upload: true - ); + upload: true); Get.close(1); }); - BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { - if (deviceConnectionState == BluetoothConnectionState.connected){ - final List? privateKey = await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = changeStringListToIntList(privateKey!); + BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState deviceConnectionState) async { + if (deviceConnectionState == BluetoothConnectionState.connected) { + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); - final List? signKey = await Storage.getStringList(saveBlueSignKey); + final List? signKey = + await Storage.getStringList(saveBlueSignKey); final List signKeyDataList = changeStringListToIntList(signKey!); final List? token = await Storage.getStringList(saveBlueToken); final List getTokenList = changeStringListToIntList(token!); IoSenderManage.senderAddFingerprintWithTimeCycleCoercionCommand( - keyID:'1', - userID:await Storage.getUid(), - fingerNo:0, - useCountLimit:0xffff, - isForce:state.isCoerced.value == '1' ? 1 : 0, // 是否是胁迫 - isAdmin: state.isAdministrator.value == '2' ? 1 : 0, - operate: 0, - isRound:state.selectType.value == '2' ? 1: 0, // 是否是循环 - weekRound:DateTool().accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), // 周循环 - startDate: int.parse(state.startDate.value)~/1000, - endDate: int.parse(state.endDate.value)~/1000, - startTime:DateTool().dateToHNString(state.effectiveDateTime.value), - endTime:DateTool().dateToHNString(state.failureDateTime.value), - needAuthor:1, - signKey:signKeyDataList, - privateKey:getPrivateKeyList, - token: getTokenList, - isBeforeAddUser: false - ); - }else if (deviceConnectionState == BluetoothConnectionState.disconnected){ + keyID: '1', + userID: await Storage.getUid(), + fingerNo: 0, + useCountLimit: 0xffff, + isForce: state.isCoerced.value == '1' ? 1 : 0, + // 是否是胁迫 + isAdmin: state.isAdministrator.value == '2' ? 1 : 0, + operate: 0, + isRound: state.selectType.value == '2' ? 1 : 0, + // 是否是循环 + weekRound: DateTool().accordingTheCycleIntoTheCorrespondingNumber( + state.weekDay.value), + // 周循环 + startDate: int.parse(state.startDate.value) ~/ 1000, + endDate: int.parse(state.endDate.value) ~/ 1000, + startTime: DateTool().dateToHNString(state.effectiveDateTime.value), + endTime: DateTool().dateToHNString(state.failureDateTime.value), + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + token: getTokenList, + isBeforeAddUser: false); + } else if (deviceConnectionState == + BluetoothConnectionState.disconnected) { final String getMobile = (await Storage.getMobile())!; ApmHelper.instance.trackEvent('add_fingerprint', { - 'lock_name':BlueManage().connectDeviceName, - 'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, - 'date':DateTool().getNowDateWithType(1), - 'add_fingerprint_result':'断开', + 'lock_name': BlueManage().connectDeviceName, + 'account': + getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, + 'date': DateTool().getNowDateWithType(1), + 'add_fingerprint_result': '断开', }); BuglyTool.uploadException( message: '添加指纹断开连接-添加指纹失败', - detail: '添加指纹断开连接-添加指纹失败--SenderAddFingerprintWithTimeCycleCoercionCommand:$command', + detail: + '添加指纹断开连接-添加指纹失败--SenderAddFingerprintWithTimeCycleCoercionCommand:$command', eventStr: '添加指纹事件断开连接', - upload: true - ); + upload: true); - if(state.ifCurrentScreen.value == true){ + if (state.ifCurrentScreen.value == true) { showBlueConnetctToast(); } cancelBlueConnetctToastTimer(); @@ -326,27 +350,32 @@ class AddFingerprintLogic extends BaseGetXController { // 取消添加指纹 Future senderCancelAddFingerprintCommand() async { - BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { - if (deviceConnectionState == BluetoothConnectionState.connected){ - final List? privateKey = await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = changeStringListToIntList(privateKey!); + BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState deviceConnectionState) async { + if (deviceConnectionState == BluetoothConnectionState.connected) { + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); - final List? signKey = await Storage.getStringList(saveBlueSignKey); + final List? signKey = + await Storage.getStringList(saveBlueSignKey); final List signKeyDataList = changeStringListToIntList(signKey!); final List? token = await Storage.getStringList(saveBlueToken); final List getTokenList = changeStringListToIntList(token!); IoSenderManage.senderCancelAddFingerprintCommand( - keyID:'1', - userID:await Storage.getUid(), - needAuthor:1, - signKey:signKeyDataList, - privateKey:getPrivateKeyList, + keyID: '1', + userID: await Storage.getUid(), + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, token: getTokenList, ); - }else if (deviceConnectionState == BluetoothConnectionState.disconnected){ - if(state.ifCurrentScreen.value == true){ + } else if (deviceConnectionState == + BluetoothConnectionState.disconnected) { + if (state.ifCurrentScreen.value == true) { showBlueConnetctToast(); } cancelBlueConnetctToastTimer(); @@ -356,53 +385,54 @@ class AddFingerprintLogic extends BaseGetXController { } // 添加指纹 - Future addFingerprintsData() async{ - final AddFingerprintEntity entity = await ApiRepository.to.addFingerprintsData( + Future addFingerprintsData() async { + final AddFingerprintEntity entity = + await ApiRepository.to.addFingerprintsData( lockId: state.lockId.value.toString(), endDate: state.endDate.value, - addType:state.addType.value, + addType: state.addType.value, fingerprintName: state.fingerprintName.value, fingerprintNumber: state.fingerprintNumber.value, fingerprintType: state.fingerprintType.value, isCoerced: state.isCoerced.value, startDate: state.startDate.value, weekDay: state.weekDay.value, - fingerRight:state.isAdministrator.value == '2' ? 1 : 0, + fingerRight: state.isAdministrator.value == '2' ? 1 : 0, startTime: int.parse(state.effectiveDateTime.value), endTime: int.parse(state.failureDateTime.value), ); - if(entity.errorCode!.codeIsSuccessful){ + if (entity.errorCode!.codeIsSuccessful) { updateFingerprintUserNoLoadData(entity.data!.fingerprintId.toString()); BuglyTool.uploadException( message: '添加指纹调用接口成功', detail: '添加指纹调用接口成功', eventStr: '添加指纹事件用接口成功', - upload: true - ); - }else{ + upload: true); + } else { updateFingerprintUserNoLoadData(entity.data!.fingerprintId.toString()); BuglyTool.uploadException( message: '添加指纹调用接口失败', detail: '添加指纹调用接口添加指纹调用接口失败 - ${entity.errorMsg}', eventStr: '添加指纹事件接口失败', - upload: true - ); + upload: true); } } // 更新指纹用户账号 - Future updateFingerprintUserNoLoadData(String fingerprintId) async{ - final LoginEntity entity = await ApiRepository.to.updateFingerprintUserNoLoadData( - fingerprintId: fingerprintId, - lockId: state.lockId.value.toString(), - fingerprintUserNo: state.fingerprintNumber.value, + Future updateFingerprintUserNoLoadData(String fingerprintId) async { + final LoginEntity entity = + await ApiRepository.to.updateFingerprintUserNoLoadData( + fingerprintId: fingerprintId, + lockId: state.lockId.value.toString(), + fingerprintUserNo: state.fingerprintNumber.value, ); - if(entity.errorCode!.codeIsSuccessful){ - showToast('添加成功'.tr, something: (){ - if(state.fromType.value == 2){ + if (entity.errorCode!.codeIsSuccessful) { + showToast('添加成功'.tr, something: () { + if (state.fromType.value == 2) { // 回调指纹号 - eventBus.fire(ChickInAddStaffCardAndFingerprintBlockNumberEvent(state.fingerprintNumber.value)); - }else if(state.fromType.value == 1){ + eventBus.fire(ChickInAddStaffCardAndFingerprintBlockNumberEvent( + state.fingerprintNumber.value)); + } else if (state.fromType.value == 1) { eventBus.fire(OtherTypeRefreshListEvent()); } Get.close(2); @@ -430,5 +460,4 @@ class AddFingerprintLogic extends BaseGetXController { _replySubscription.cancel(); } - -} \ No newline at end of file +} diff --git a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart index 37d56740..09523db0 100755 --- a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart +++ b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart @@ -23,6 +23,7 @@ class FingerprintListLogic extends BaseGetXController { // 获取解析后的数据 late StreamSubscription _replySubscription; + void _initReplySubscription() { _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { @@ -74,11 +75,15 @@ class FingerprintListLogic extends BaseGetXController { userID: (await Storage.getUid())!, fingerNo: state.deletFingerNo, useCountLimit: 0xffff, - operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 + operate: state.isDeletAll == true ? 3 : 2, + // 0:注册 1:修改 2:删除 3:删除全部 isAdmin: 0, - isForce: 0, // 是否是胁迫 - isRound: 0, // 是否是循环 - weekRound: 0, // 周循环 + isForce: 0, + // 是否是胁迫 + isRound: 0, + // 是否是循环 + weekRound: 0, + // 周循环 startDate: 0x11223344, endDate: 0x11223344, startTime: '0', @@ -275,11 +280,15 @@ class FingerprintListLogic extends BaseGetXController { userID: (await Storage.getUid())!, fingerNo: state.deletFingerNo, useCountLimit: 0xffff, - operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 + operate: state.isDeletAll == true ? 3 : 2, + // 0:注册 1:修改 2:删除 3:删除全部 isAdmin: 0, - isForce: 0, // 是否是胁迫 - isRound: 0, // 是否是循环 - weekRound: 0, // 周循环 + isForce: 0, + // 是否是胁迫 + isRound: 0, + // 是否是循环 + weekRound: 0, + // 周循环 startDate: 0x11223344, endDate: 0x11223344, startTime: '0', @@ -299,30 +308,31 @@ class FingerprintListLogic extends BaseGetXController { } }); } + /** * //请求密码钥匙列表 - Future mockNetworkDataRequest( + Future mockNetworkDataRequest( {required bool isRefresh}) async { - // 如果是下拉刷新,清空已有数据 - if (isRefresh) { + // 如果是下拉刷新,清空已有数据 + if (isRefresh) { state.itemDataList.clear(); pageNo = 1; - } + } - final PasswordKeyListEntity entity = await ApiRepository.to.passwordKeyList( - state.keyInfo.value.keyStatus.toString(), - state.keyInfo.value.lockId.toString(), - pageNo.toString(), - pageSize.toString(), - state.searchController.text); - if (entity.errorCode!.codeIsSuccessful) { + final PasswordKeyListEntity entity = await ApiRepository.to.passwordKeyList( + state.keyInfo.value.keyStatus.toString(), + state.keyInfo.value.lockId.toString(), + pageNo.toString(), + pageSize.toString(), + state.searchController.text); + if (entity.errorCode!.codeIsSuccessful) { // 更新数据列表 state.itemDataList.addAll(entity.data!.itemList!); // 更新页码 pageNo++; - } - return entity; - } + } + return entity; + } */ @@ -390,6 +400,7 @@ class FingerprintListLogic extends BaseGetXController { // 监听修改完详情之后刷新列表 late StreamSubscription _teamEvent; + void _initRefreshAction() { _teamEvent = eventBus .on() @@ -450,6 +461,7 @@ class FingerprintListLogic extends BaseGetXController { _initReplySubscription(); _initRefreshAction(); + getFingerprintsListData(isRefresh: true); } } diff --git a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart index acfb8e9a..15c16dbd 100755 --- a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart +++ b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart @@ -31,24 +31,9 @@ class _FingerprintListPageState extends State final FingerprintListLogic logic = Get.put(FingerprintListLogic()); final FingerprintListState state = Get.find().state; - Future getHttpData({required bool isRefresh}) async { - final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); - if (isDemoMode == false) { - logic - .getFingerprintsListData(isRefresh: isRefresh) - .then((FingerprintListDataEntity value) { - if (mounted) { - setState(() {}); - } - }); - } - } - @override void initState() { super.initState(); - - getHttpData(isRefresh: true); } @override @@ -91,17 +76,17 @@ class _FingerprintListPageState extends State ), body: EasyRefreshTool( onRefresh: () { - getHttpData(isRefresh: true); + logic.getFingerprintsListData(isRefresh: true); }, onLoad: () { - getHttpData(isRefresh: false); + logic.getFingerprintsListData(isRefresh: false); }, child: Column( children: [ KeySearchWidget( editingController: state.searchController, - onSubmittedAction: () { - getHttpData(isRefresh: true); + onSubmittedAction: () async { + await logic.getFingerprintsListData(isRefresh: true); }, ), SizedBox( @@ -116,7 +101,8 @@ class _FingerprintListPageState extends State 'lockId': state.lockId.value, 'fromType': 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入 })! - .then((value) => getHttpData(isRefresh: true)); + .then((value) => + logic.getFingerprintsListData(isRefresh: true)); // if (data != null) { // getHttpData(isRefresh: true); // } @@ -179,7 +165,7 @@ class _FingerprintListPageState extends State 'fingerprintItemData': fingerprintItemData, })! .then((value) { - getHttpData(isRefresh: true); + logic.getFingerprintsListData(isRefresh: true); }); // if (data == 'deletScuess') { // // state.fingerprintItemListData.removeWhere((FingerprintItemData item) => item.fingerprintId == fingerprintItemData.fingerprintId!); diff --git a/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/lib/main/lockDetail/lockDetail/lockDetail_page.dart index d6740553..fc69d86b 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -55,7 +55,19 @@ class _LockDetailPageState extends State void initState() { super.initState(); - listeningAnimations(); + state.animationController = + AnimationController(duration: const Duration(seconds: 1), vsync: this); + state.animationController!.repeat(); + //动画开始、结束、向前移动或向后移动时会调用StatusListener + state.animationController!.addStatusListener((AnimationStatus status) { + if (status == AnimationStatus.completed) { + state.animationController!.reset(); + state.animationController!.forward(); + } else if (status == AnimationStatus.dismissed) { + state.animationController!.reset(); + state.animationController!.forward(); + } + }); state.pageController.addListener(() { state.currentPage.value = state.pageController.page!.round(); @@ -1321,24 +1333,6 @@ class _LockDetailPageState extends State ); } - Future listeningAnimations() async { - await Future.delayed(Duration.zero, () { - state.animationController = AnimationController( - duration: const Duration(seconds: 1), vsync: this); - state.animationController!.repeat(); - //动画开始、结束、向前移动或向后移动时会调用StatusListener - state.animationController!.addStatusListener((AnimationStatus status) { - if (status == AnimationStatus.completed) { - state.animationController!.reset(); - state.animationController!.forward(); - } else if (status == AnimationStatus.dismissed) { - state.animationController!.reset(); - state.animationController!.forward(); - } - }); - }); - } - String showElectricIcon(int electricnumber) { if (electricnumber >= 100) { return 'images/main/icon_lockElectricLevel_5.png'; diff --git a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart index 9ed38957..04059392 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart @@ -202,7 +202,7 @@ class PasswordKeyDetailLogic extends BaseGetXController { break; case 2: //永久 2 从开始时间开始永久有效,必需在开始时间24小时内使用一次,否则将失效 - useDateStr = '永久'; + useDateStr = '永久'.tr; state.isCirculation.value = false; break; case 3: diff --git a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart index 65be1a07..cc02af47 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart @@ -205,7 +205,7 @@ class _PasswordKeyDetailPageState extends State children: [ Expanded( child: Text( - '密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。'.tr, + '密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。'.tr, textAlign: TextAlign.start, style: TextStyle(fontSize: 20.sp), )), diff --git a/lib/tools/showCupertinoAlertView.dart b/lib/tools/showCupertinoAlertView.dart index d973cc78..cf585bf1 100755 --- a/lib/tools/showCupertinoAlertView.dart +++ b/lib/tools/showCupertinoAlertView.dart @@ -297,7 +297,7 @@ class ShowCupertinoAlertView { builder: (BuildContext context) { return CupertinoAlertDialog( title: Container(), - content: Text('是否要远程开锁?'.tr), + content: Text('是否要远程开锁'.tr), actions: [ CupertinoDialogAction( onPressed: Get.back, From 09a8d7b3449678e01406aeb589e6c83d0bc881ec Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 24 Mar 2025 15:14:49 +0800 Subject: [PATCH 051/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E9=85=8D?= =?UTF-8?q?=E7=BD=91=E5=90=8E=E8=AF=BB=E5=8F=96=E9=94=81=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=B9=B6=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuringWifi_logic.dart | 91 ++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart index 1ed6f736..52241914 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart @@ -12,6 +12,7 @@ import 'package:star_lock/appRouters.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/blue/io_gateway/io_gateway_configuringWifi.dart'; import 'package:star_lock/blue/io_gateway/io_gateway_getStatus.dart'; +import 'package:star_lock/blue/io_protocol/io_updataLockSet.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockDetail/lockDetail/device_network_info.dart'; import 'package:star_lock/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifiEntity.dart'; @@ -20,6 +21,7 @@ import 'package:star_lock/mine/gateway/addGateway/selectGateway/getGatewayInfo_m import 'package:star_lock/talk/starChart/entity/star_chart_register_node_entity.dart'; import 'package:star_lock/talk/starChart/star_chart_manage.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/tools/commonDataManage.dart'; import '../../../../../blue/blue_manage.dart'; import '../../../../../blue/io_protocol/io_configuringWifi.dart'; @@ -59,7 +61,8 @@ class ConfiguringWifiLogic extends BaseGetXController { peerId: peerId, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('配网成功'.tr, something: () { + showToast('配网成功'.tr, something: () async { + await _getUploadLockSet(); eventBus .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); // 设置锁的peerID @@ -101,6 +104,10 @@ class ConfiguringWifiLogic extends BaseGetXController { if (reply is GatewayGetStatusReply) { _replyStatusInfo(reply); } + // 上传数据获取锁设置 + if (reply is UpdataLockSetReply) { + _replyUpdataLockSetReply(reply); + } AppLog.log('蓝牙回调处理完毕${EasyLoading.isShow}'); }); } @@ -389,6 +396,88 @@ class ConfiguringWifiLogic extends BaseGetXController { void _replyStatusInfo(reply) {} + // 上传数据获取设置 + Future _getUploadLockSet() async { + // showBlueConnetctToastTimer(action: (){ + // }); + BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState connectionState) async { + if (connectionState == BluetoothConnectionState.connected) { + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); + + _uploadLockSet(getTokenList); + } else if (connectionState == BluetoothConnectionState.disconnected) { + // cancelBlueConnetctToastTimer(); + // if(state.ifCurrentScreen.value == true){ + // showBlueConnetctToast(); + // } + } + }); + } + + // 公共的上传锁设置 + Future _uploadLockSet(List token) async { + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); + + final List? signKey = await Storage.getStringList(saveBlueSignKey); + final List signKeyDataList = changeStringListToIntList(signKey!); + + IoSenderManage.updataLockSetCommand( + lockID: BlueManage().connectDeviceName, + userID: await Storage.getUid(), + token: token, + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList); + } + + // 上传数据获取锁设置解析 + Future _replyUpdataLockSetReply(Reply reply) async { + final int status = reply.data[2]; + switch (status) { + case 0x00: + //成功 + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + _lockDataUpload( + uploadType: 1, + recordType: 0, + records: reply.data.sublist(7, reply.data.length)); + break; + case 0x06: + //无权限 + final List token = reply.data.sublist(3, 7); + final List saveStrList = changeIntListToStringList(token); + Storage.setStringList(saveBlueToken, saveStrList); + + _uploadLockSet(token); + break; + default: + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + break; + } + } + + // 锁数据上传服务器 + Future _lockDataUpload( + {required int uploadType, + required int recordType, + required List records}) async { + final LoginEntity entity = await ApiRepository.to.lockDataUpload( + lockId: CommonDataManage().currentKeyInfo.lockId!, + uploadType: uploadType, + recordType: recordType, + records: records, + isUnShowLoading: true); + if (entity.errorCode!.codeIsSuccessful) { + update(); + } + } + @override void dispose() { // TODO: implement dispose From 6bf20abc28a721d001a2a9797d6e0202d3e066b5 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 24 Mar 2025 15:16:04 +0800 Subject: [PATCH 052/135] =?UTF-8?q?fix:=E5=8F=96=E6=B6=88=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=AE=8C=E6=88=90=E5=90=8E=E6=96=AD=E5=BC=80=E8=93=9D?= =?UTF-8?q?=E7=89=99=E8=BF=9E=E6=8E=A5=E7=9A=84=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mine/addLock/saveLock/saveLock_logic.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mine/addLock/saveLock/saveLock_logic.dart b/lib/mine/addLock/saveLock/saveLock_logic.dart index 9290d735..f9e20f38 100755 --- a/lib/mine/addLock/saveLock/saveLock_logic.dart +++ b/lib/mine/addLock/saveLock/saveLock_logic.dart @@ -487,7 +487,7 @@ class SaveLockLogic extends BaseGetXController { void backAction() async { eventBus.fire(RefreshLockListInfoDataEvent(clearScanDevices: true)); - BlueManage().disconnect(); + // BlueManage().disconnect(); // 查询锁设置信息 final LockSetInfoEntity entity = From 6d066a722d2bf2c199fe9dc328a7525a03fa8950 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 24 Mar 2025 16:30:38 +0800 Subject: [PATCH 053/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E7=8C=AB?= =?UTF-8?q?=E7=9C=BC=E8=AE=BE=E7=BD=AE=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuringWifi/configuringWifi/configuringWifi_logic.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart index 52241914..ca0be0d9 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart @@ -61,8 +61,8 @@ class ConfiguringWifiLogic extends BaseGetXController { peerId: peerId, ); if (entity.errorCode!.codeIsSuccessful) { + await _getUploadLockSet(); showToast('配网成功'.tr, something: () async { - await _getUploadLockSet(); eventBus .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); // 设置锁的peerID From 70d549d04d9073787e3c6f252b56ccccaf88d41e Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 25 Mar 2025 14:05:18 +0800 Subject: [PATCH 054/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E9=85=8D?= =?UTF-8?q?=E7=BD=91=E5=90=8E=E7=9A=84=E5=86=8D=E6=AC=A1=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E4=B8=80=E9=81=8D=E4=B8=8A=E4=BC=A0=E4=B8=80=E9=81=8D=E9=94=81?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuringWifi_logic.dart | 39 ++++++++++--------- .../configuringWifi/configuringWifi_page.dart | 17 +++++--- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart index ca0be0d9..4373a087 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart @@ -72,17 +72,6 @@ class ConfiguringWifiLogic extends BaseGetXController { secretKey: secretKey, peerId: peerId, ); - - if (state.pageName.value == 'lockSet') { - Get.close(2); - } else { - Get.offAllNamed(Routers.starLockMain); - } - dismissEasyLoading(); - if (state.loadingTimer != null) { - state.loadingTimer!.cancel(); - state.loadingTimer = null; - } }); } } @@ -398,8 +387,10 @@ class ConfiguringWifiLogic extends BaseGetXController { // 上传数据获取设置 Future _getUploadLockSet() async { - // showBlueConnetctToastTimer(action: (){ - // }); + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); + }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { @@ -408,10 +399,10 @@ class ConfiguringWifiLogic extends BaseGetXController { _uploadLockSet(getTokenList); } else if (connectionState == BluetoothConnectionState.disconnected) { - // cancelBlueConnetctToastTimer(); - // if(state.ifCurrentScreen.value == true){ - // showBlueConnetctToast(); - // } + cancelBlueConnetctToastTimer(); + if (state.ifCurrentScreen.value == true) { + showBlueConnetctToast(); + } } }); } @@ -468,13 +459,23 @@ class ConfiguringWifiLogic extends BaseGetXController { required int recordType, required List records}) async { final LoginEntity entity = await ApiRepository.to.lockDataUpload( - lockId: CommonDataManage().currentKeyInfo.lockId!, + lockId: state.lockBasicInfo.value.lockId ?? -1, uploadType: uploadType, recordType: recordType, records: records, isUnShowLoading: true); if (entity.errorCode!.codeIsSuccessful) { - update(); + await Future.delayed((Duration(seconds: 1))); + if (state.pageName.value == 'lockSet') { + Get.close(2); + } else { + Get.offAllNamed(Routers.starLockMain); + } + dismissEasyLoading(); + if (state.loadingTimer != null) { + state.loadingTimer!.cancel(); + state.loadingTimer = null; + } } } diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart index 1e6d6ac4..ed653308 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_page.dart @@ -44,12 +44,17 @@ class _ConfiguringWifiPageState extends State SizedBox( height: 50.h, ), - SubmitBtn( - btnName: '确定'.tr, - onClick: () { - FocusScope.of(context).requestFocus(FocusNode()); - logic.senderConfiguringWifiAction(); - }, + Obx( + () => SubmitBtn( + btnName: '确定'.tr, + isDisabled: state.isLoading.isFalse, + onClick: state.isLoading.isTrue + ? null + : () { + FocusScope.of(context).requestFocus(FocusNode()); + logic.senderConfiguringWifiAction(); + }, + ), ), SizedBox( height: 20.h, From ea3dfa2286e04a7dadeb0329723c560d8802b25d Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 25 Mar 2025 14:05:36 +0800 Subject: [PATCH 055/135] =?UTF-8?q?fix:=E5=BD=93=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=88=B0=E7=9A=84=E8=AE=BE=E5=A4=87=E6=98=B5=E7=A7=B0=E4=B8=BA?= =?UTF-8?q?=E7=A9=BA=E6=97=B6=E4=B8=8D=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mine/addLock/nearbyLock/nearbyLock_page.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/mine/addLock/nearbyLock/nearbyLock_page.dart b/lib/mine/addLock/nearbyLock/nearbyLock_page.dart index 25413554..a06d469a 100755 --- a/lib/mine/addLock/nearbyLock/nearbyLock_page.dart +++ b/lib/mine/addLock/nearbyLock/nearbyLock_page.dart @@ -105,6 +105,11 @@ class _NearbyLockPageState extends State with RouteAware { Widget nearbyLockItem( String lockTypeIcon, ScanResult scanResult, Function() action) { + // 如果广播名称为空或空字符串,则不显示该项 + if (scanResult.advertisementData.advName.isEmpty) { + return const SizedBox.shrink(); + } + return GestureDetector( onTap: () { final String? serviceUuid = From df3b4c65c5374934d5bcdc9c81b15345025eab6d Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 25 Mar 2025 14:06:10 +0800 Subject: [PATCH 056/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0crc=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E4=BD=8D=E7=9A=84=E6=A0=A1=E9=AA=8C=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E3=80=81=E8=B0=83=E6=95=B4sm4=E8=A7=A3=E5=AF=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/blue/reciver_data.dart | 301 ++++++++++++++++++++++++++++++++++ lib/blue/sm4Encipher/sm4.dart | 30 +++- 2 files changed, 327 insertions(+), 4 deletions(-) diff --git a/lib/blue/reciver_data.dart b/lib/blue/reciver_data.dart index 8f1db2af..2fc7fe54 100755 --- a/lib/blue/reciver_data.dart +++ b/lib/blue/reciver_data.dart @@ -57,7 +57,20 @@ class CommandReciverManager { if (data.isEmpty) { return; } + final int dataSize = data.length; + + // 验证CRC校验 + if (dataSize >= 2) { + final int calculatedCrc = + _calculateCRC16(data.sublist(0, dataSize - 2), dataSize - 2); + final int receivedCrc = (data[dataSize - 2] << 8) | data[dataSize - 1]; + + if (calculatedCrc != receivedCrc) { + AppLog.log('CRC校验失败'); + return; + } + } // 当小于包头加起来13个字节 if (dataSize < 13) { return; @@ -123,6 +136,16 @@ class CommandReciverManager { } } +// CRC16 校验计算 + static int _calculateCRC16(List bytes, int len) { + int value = 0x0000; + for (int i = 0; i < len; i++) { + int tmp = _reverse8(bytes[i]); + value = ((value << 8) ^ _crcTable[(value >> 8) ^ tmp & 0xFF]) & 0xFFFF; + } + return _reverse16(value); + } + static Future parseData(List data) async { if (data.isNotEmpty) { final int cmd = data[0] * 256 + data[1]; @@ -472,4 +495,282 @@ class CommandReciverManager { } return null; } + + // CRC16 查找表 + static const List _crcTable = [ + 0x0000, + 0x1021, + 0x2042, + 0x3063, + 0x4084, + 0x50a5, + 0x60c6, + 0x70e7, + 0x8108, + 0x9129, + 0xa14a, + 0xb16b, + 0xc18c, + 0xd1ad, + 0xe1ce, + 0xf1ef, + 0x1231, + 0x0210, + 0x3273, + 0x2252, + 0x52b5, + 0x4294, + 0x72f7, + 0x62d6, + 0x9339, + 0x8318, + 0xb37b, + 0xa35a, + 0xd3bd, + 0xc39c, + 0xf3ff, + 0xe3de, + 0x2462, + 0x3443, + 0x0420, + 0x1401, + 0x64e6, + 0x74c7, + 0x44a4, + 0x5485, + 0xa56a, + 0xb54b, + 0x8528, + 0x9509, + 0xe5ee, + 0xf5cf, + 0xc5ac, + 0xd58d, + 0x3653, + 0x2672, + 0x1611, + 0x0630, + 0x76d7, + 0x66f6, + 0x5695, + 0x46b4, + 0xb75b, + 0xa77a, + 0x9719, + 0x8738, + 0xf7df, + 0xe7fe, + 0xd79d, + 0xc7bc, + 0x48c4, + 0x58e5, + 0x6886, + 0x78a7, + 0x0840, + 0x1861, + 0x2802, + 0x3823, + 0xc9cc, + 0xd9ed, + 0xe98e, + 0xf9af, + 0x8948, + 0x9969, + 0xa90a, + 0xb92b, + 0x5af5, + 0x4ad4, + 0x7ab7, + 0x6a96, + 0x1a71, + 0x0a50, + 0x3a33, + 0x2a12, + 0xdbfd, + 0xcbdc, + 0xfbbf, + 0xeb9e, + 0x9b79, + 0x8b58, + 0xbb3b, + 0xab1a, + 0x6ca6, + 0x7c87, + 0x4ce4, + 0x5cc5, + 0x2c22, + 0x3c03, + 0x0c60, + 0x1c41, + 0xedae, + 0xfd8f, + 0xcdec, + 0xddcd, + 0xad2a, + 0xbd0b, + 0x8d68, + 0x9d49, + 0x7e97, + 0x6eb6, + 0x5ed5, + 0x4ef4, + 0x3e13, + 0x2e32, + 0x1e51, + 0x0e70, + 0xff9f, + 0xefbe, + 0xdfdd, + 0xcffc, + 0xbf1b, + 0xaf3a, + 0x9f59, + 0x8f78, + 0x9188, + 0x81a9, + 0xb1ca, + 0xa1eb, + 0xd10c, + 0xc12d, + 0xf14e, + 0xe16f, + 0x1080, + 0x00a1, + 0x30c2, + 0x20e3, + 0x5004, + 0x4025, + 0x7046, + 0x6067, + 0x83b9, + 0x9398, + 0xa3fb, + 0xb3da, + 0xc33d, + 0xd31c, + 0xe37f, + 0xf35e, + 0x02b1, + 0x1290, + 0x22f3, + 0x32d2, + 0x4235, + 0x5214, + 0x6277, + 0x7256, + 0xb5ea, + 0xa5cb, + 0x95a8, + 0x8589, + 0xf56e, + 0xe54f, + 0xd52c, + 0xc50d, + 0x34e2, + 0x24c3, + 0x14a0, + 0x0481, + 0x7466, + 0x6447, + 0x5424, + 0x4405, + 0xa7db, + 0xb7fa, + 0x8799, + 0x97b8, + 0xe75f, + 0xf77e, + 0xc71d, + 0xd73c, + 0x26d3, + 0x36f2, + 0x0691, + 0x16b0, + 0x6657, + 0x7676, + 0x4615, + 0x5634, + 0xd94c, + 0xc96d, + 0xf90e, + 0xe92f, + 0x99c8, + 0x89e9, + 0xb98a, + 0xa9ab, + 0x5844, + 0x4865, + 0x7806, + 0x6827, + 0x18c0, + 0x08e1, + 0x3882, + 0x28a3, + 0xcb7d, + 0xdb5c, + 0xeb3f, + 0xfb1e, + 0x8bf9, + 0x9bd8, + 0xabbb, + 0xbb9a, + 0x4a75, + 0x5a54, + 0x6a37, + 0x7a16, + 0x0af1, + 0x1ad0, + 0x2ab3, + 0x3a92, + 0xfd2e, + 0xed0f, + 0xdd6c, + 0xcd4d, + 0xbdaa, + 0xad8b, + 0x9de8, + 0x8dc9, + 0x7c26, + 0x6c07, + 0x5c64, + 0x4c45, + 0x3ca2, + 0x2c83, + 0x1ce0, + 0x0cc1, + 0xef1f, + 0xff3e, + 0xcf5d, + 0xdf7c, + 0xaf9b, + 0xbfba, + 0x8fd9, + 0x9ff8, + 0x6e17, + 0x7e36, + 0x4e55, + 0x5e74, + 0x2e93, + 0x3eb2, + 0x0ed1, + 0x1ef0 + ]; + + // 8位字节反转 + static int _reverse8(int data) { + int temp = 0; + for (int i = 0; i < 8; i++) { + temp |= ((data >> i) & 0x01) << (7 - i); + } + return temp; + } + + // 16位字反转 + static int _reverse16(int data) { + int temp = 0; + for (int i = 0; i < 16; i++) { + temp |= ((data >> i) & 0x0001) << (15 - i); + } + return temp; + } } diff --git a/lib/blue/sm4Encipher/sm4.dart b/lib/blue/sm4Encipher/sm4.dart index 38df45db..382cd5fa 100755 --- a/lib/blue/sm4Encipher/sm4.dart +++ b/lib/blue/sm4Encipher/sm4.dart @@ -263,7 +263,12 @@ class SM4 { 0x48 ]; - static const List FK = [0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC]; + static const List FK = [ + 0xA3B1BAC6, + 0x56AA3350, + 0x677D9197, + 0xB27022DC + ]; static const List CK = [ 0x00070e15, @@ -411,11 +416,27 @@ class SM4 { } return paddedList; } else { + // 解密时去除PKCS7填充 + final int lastByte = input.last; + if (lastByte > 0 && lastByte <= blockSize) { + // 验证填充是否合法 + bool isValidPadding = true; + for (int i = input.length - lastByte; i < input.length; i++) { + if (input[i] != lastByte) { + isValidPadding = false; + break; + } + } + if (isValidPadding) { + return input.sublist(0, input.length - lastByte); + } + } + return input; // final lastByte = input.last; // final cutLen = input.length - lastByte; - // AppLog.log("object input.length:${input.length} lastByte:$lastByte input:$input cutLen:$cutLen"); + // // AppLog.log("object input.length:${input.length} lastByte:$lastByte input:$input cutLen:$cutLen"); // return input.sublist(0, cutLen); - return input; + // return input; } } @@ -480,7 +501,8 @@ class SM4 { final List supplementList = List.filled(16, 0x00); /// complete list - final List completeList = [...list, ...supplementList].sublist(0, 16); + final List completeList = + [...list, ...supplementList].sublist(0, 16); return completeList; } From 4742dac3ee3b3dc1521926c3299255d120473b75 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 27 Mar 2025 09:11:36 +0800 Subject: [PATCH 057/135] =?UTF-8?q?fix:bug=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_en.json | 3 + lan/lan_hk.json | 4 +- lan/lan_keys.json | 5 ++ lan/lan_tw.json | 4 +- lan/lan_zh.json | 6 ++ .../starLock_forgetPassword_logic.dart | 55 ++++++++++--------- .../starLock_forgetPassword_page.dart | 4 +- lib/login/login/starLock_login_logic.dart | 4 +- .../lockSet/lockSet/lockSet_page.dart | 2 +- .../remoteUnlocking/remoteUnlocking_page.dart | 3 +- 10 files changed, 56 insertions(+), 34 deletions(-) diff --git a/lan/lan_en.json b/lan/lan_en.json index c2fbf2a7..f0fb0b45 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1151,5 +1151,8 @@ "请将手机切换至2.4G WiFi进行手动连接": "Please switch your phone to 2.4G WiFi for manual connection", "请确保网络是2.4GHz Wi-Fi": "Please ensure that the network is 2.4GHz Wi Fi", "是否要远程开锁": "Do you want to unlock remotely", + "国家地区的选择将影响数据安全,你当前选择的是": "The choice of country or region will affect data security. What is your current choice", + "请确认后再继续": "Please confirm before continuing", + "此功能的开启和关闭只能在锁附近通过手机蓝牙进行": "The activation and deactivation of this feature can only be done through Bluetooth on the phone near the lock", "网关添加成功": "Gateway added successfully" } diff --git a/lan/lan_hk.json b/lan/lan_hk.json index 754865ba..9f3a2e13 100644 --- a/lan/lan_hk.json +++ b/lan/lan_hk.json @@ -152,7 +152,7 @@ "升级": "更新", "空闲": "空置", "已入住": "佔領", - "多语言": "語言", + "多语言": "多語言", "添加锁": "添加鎖", "锁地址": "鎖定地址", "选择锁类型": "選擇鎖類型", @@ -1149,5 +1149,7 @@ "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2.喺APP中開啟鎖嘅遠程解鎖功能(此功能默認關閉)。 如果此選項不可用,則鎖將唔撐Google Home", "3.安装Google Home APP,点击左上角的加号按钮": "3.安裝Google Home應用,點擊左上角嘅加號掣", "暂无最新记录": "目前冇可用嘅最新記錄", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "请将手机切换至2.4G WiFi进行手动连接": "請把手機切換到2.4G WiFi進行手動連接" } \ No newline at end of file diff --git a/lan/lan_keys.json b/lan/lan_keys.json index f93afdae..5f37ad05 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1156,5 +1156,10 @@ "请确保网络是2.4GHz Wi-Fi": "请确保网络是2.4GHz Wi-Fi", "已选": "已选", "是否要远程开锁": "是否要远程开锁", + "繁体中文(中国台湾)": "繁体中文(中国台湾)", + "繁体中文(中国香港)": "繁体中文(中国香港)", + "国家地区的选择将影响数据安全,你当前选择的是": "国家地区的选择将影响数据安全,你当前选择的是", + "请确认后再继续": "请确认后再继续", + "此功能的开启和关闭只能在锁附近通过手机蓝牙进行": "此功能的开启和关闭只能在锁附近通过手机蓝牙进行", "网关添加成功": "网关添加成功" } diff --git a/lan/lan_tw.json b/lan/lan_tw.json index 6de33a41..8f32a68e 100644 --- a/lan/lan_tw.json +++ b/lan/lan_tw.json @@ -151,7 +151,7 @@ "升级": "更新", "空闲": "空缺", "已入住": "已占用", - "多语言": "語言", + "多语言": "多語言", "添加锁": "添加鎖定", "锁地址": "鎖地址", "选择锁类型": "選擇鎖定類型", @@ -1149,5 +1149,7 @@ "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. 在APP中開啓鎖的遠程開鎖功能(默認關閉)。如果這個選項不可用,鎖將不支持谷歌Home", "3.安装Google Home APP,点击左上角的加号按钮": "3. 安裝谷歌Home應用程序並單擊左上角的加號按鈕", "暂无最新记录": "目前沒有最新的記錄", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "请将手机切换至2.4G WiFi进行手动连接": "手動連接時請將手機調至2.4G WiFi" } \ No newline at end of file diff --git a/lan/lan_zh.json b/lan/lan_zh.json index 351e3fff..a2c5906f 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -62,6 +62,8 @@ "批量授权锁": "批量授权锁", "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人": "授权管理员拥有操作这把锁的重要权限,请确保只发给我你信任的人", "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。": "功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。", + "此功能的开启和关闭只能在锁附近通过手机蓝牙进行": "此功能的开启和关闭只能在锁附近通过手机蓝牙进行", + "功能开启后,你将可以通过网关远程开锁。": "功能开启后,你将可以通过网关远程开锁。", "排列方式": "排列方式", "早到榜": "早到榜", @@ -1156,5 +1158,9 @@ "请确保网络是2.4GHz Wi-Fi": "请确保网络是2.4GHz Wi-Fi", "已选": "已选", "是否要远程开锁": "是否要远程开锁", + "繁体中文(中国台湾)": "繁体中文(中国台湾)", + "繁体中文(中国香港)": "繁体中文(中国香港)", + "国家地区的选择将影响数据安全,你当前选择的是": "国家地区的选择将影响数据安全,你当前选择的是", + "请确认后再继续": "请确认后再继续", "网关添加成功": "网关添加成功" } diff --git a/lib/login/forgetPassword/starLock_forgetPassword_logic.dart b/lib/login/forgetPassword/starLock_forgetPassword_logic.dart index 7036c80c..8015cc6b 100755 --- a/lib/login/forgetPassword/starLock_forgetPassword_logic.dart +++ b/lib/login/forgetPassword/starLock_forgetPassword_logic.dart @@ -19,6 +19,7 @@ class StarLockForgetPasswordLogic extends BaseGetXController { final StarLockForgetPasswordState state = StarLockForgetPasswordState(); late Timer _timer; + void _startTimer() { _timer = Timer.periodic(1.seconds, (Timer timer) { if (state.currentSecond > 1) { @@ -37,12 +38,12 @@ class StarLockForgetPasswordLogic extends BaseGetXController { } Future resetPassword() async { - if(state.pwd.value != state.surePwd.value){ + if (state.pwd.value != state.surePwd.value) { showToast('两次密码不一致哦'.tr); return; } - if(!RegularExpression().validateString(state.pwd.value)){ + if (!RegularExpression().validateString(state.pwd.value)) { showToast('密码需至少包含数字/字母/字符中的2种组合'.tr); return; } @@ -56,42 +57,44 @@ class StarLockForgetPasswordLogic extends BaseGetXController { state.verificationCode.value); if (entity.errorCode!.codeIsSuccessful) { ApmHelper.instance.trackEvent('resetPassword_result', { - 'account':state.phoneStr.value, - 'date':DateTool().getNowDateWithType(1), - 'resetPassword_res':'成功', + 'account': state.phoneStr.value, + 'date': DateTool().getNowDateWithType(1), + 'resetPassword_res': '成功', }); showToast('重置成功'.tr); Get.back(); - }else{ + } else { ApmHelper.instance.trackEvent('resetPassword_result', { - 'account':state.phoneStr.value, - 'date':DateTool().getNowDateWithType(1), - 'resetPassword_res':'${entity.errorCode}--${entity.errorMsg}', + 'account': state.phoneStr.value, + 'date': DateTool().getNowDateWithType(1), + 'resetPassword_res': '${entity.errorCode}--${entity.errorMsg}', }); } } Future sendValidationCode() async { - final SendValidationCodeEntity entity = await ApiRepository.to.sendValidationCodeUnLogin( - // state.countryCode.value, - countryCode:state.countryCode.value, - account:state.phoneStr.value, - channel:state.codeType.value, - codeType:'2', - xWidth:state.xWidth.value.toString()); + final SendValidationCodeEntity entity = + await ApiRepository.to.sendValidationCodeUnLogin( + // state.countryCode.value, + countryCode: state.countryCode.value, + account: state.phoneStr.value, + channel: state.codeType.value, + codeType: '2', + xWidth: state.xWidth.value.toString()); if (entity.errorCode!.codeIsSuccessful) { _startTimer(); } } Future checkIpAction() async { - final CheckIPEntity entity = await ApiRepository.to.checkIpAction( - ip: '' - ); + final CheckIPEntity entity = await ApiRepository.to.checkIpAction(ip: ''); if (entity.errorCode!.codeIsSuccessful) { - if(state.countryName.value == entity.data!.name){ - ShowTipView().showSureAlertDialog('国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续'.tr, tipTitle: '确认国家或地区'.tr, sureStr: '我知道了'.tr); + if (state.countryName.value != entity.data!.name) { + ShowTipView().showSureAlertDialog( + '国家地区的选择将影响数据安全,你当前选择的是' + state.countryName.value + '请确认后再继续'.tr, + tipTitle: '确认国家或地区'.tr, + sureStr: '我知道了'.tr); } } } @@ -103,9 +106,9 @@ class StarLockForgetPasswordLogic extends BaseGetXController { void changeInput(TextEditingController controller) { if (controller == state.phoneController) { state.phoneStr.value = controller.text; - if(state.phoneStr.value.contains('@')){ + if (state.phoneStr.value.contains('@')) { state.codeType.value = '2'; - }else{ + } else { state.codeType.value = '1'; } } @@ -120,11 +123,13 @@ class StarLockForgetPasswordLogic extends BaseGetXController { } _resetCanSendCode(); _resetCanSub(); - AppLog.log('state.canSub.value:${state.canSub.value} state.pwdIsOK:${state.pwdIsOK} state.codeIsOK:${state.codeIsOK} state.phoneStr.value:${state.phoneStr.value}'); + AppLog.log( + 'state.canSub.value:${state.canSub.value} state.pwdIsOK:${state.pwdIsOK} state.codeIsOK:${state.codeIsOK} state.phoneStr.value:${state.phoneStr.value}'); } void _resetCanSub() { - state.canSub.value = state.pwdIsOK && state.codeIsOK && state.phoneStr.value.isNotEmpty; + state.canSub.value = + state.pwdIsOK && state.codeIsOK && state.phoneStr.value.isNotEmpty; } void _resetCanSendCode() { diff --git a/lib/login/forgetPassword/starLock_forgetPassword_page.dart b/lib/login/forgetPassword/starLock_forgetPassword_page.dart index 9e20dc8f..7cc992e6 100755 --- a/lib/login/forgetPassword/starLock_forgetPassword_page.dart +++ b/lib/login/forgetPassword/starLock_forgetPassword_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -58,8 +57,7 @@ class _StarLockForgetPasswordPageState children: [ SizedBox(width: 5.w), Expanded( - child: Text( - '国家/地区'.tr, + child: Text('国家/地区'.tr, style: TextStyle( fontSize: 26.sp, color: AppColors.blackColor))), SizedBox(width: 20.w), diff --git a/lib/login/login/starLock_login_logic.dart b/lib/login/login/starLock_login_logic.dart index 570fa80c..4dfa2b5d 100755 --- a/lib/login/login/starLock_login_logic.dart +++ b/lib/login/login/starLock_login_logic.dart @@ -141,9 +141,9 @@ class StarLockLoginLogic extends BaseGetXController { Future checkIpAction() async { final CheckIPEntity entity = await ApiRepository.to.checkIpAction(ip: ''); if (entity.errorCode!.codeIsSuccessful) { - if (state.countryName == entity.data!.name) { + if (state.countryName != entity.data!.name) { ShowTipView().showSureAlertDialog( - '国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续'.tr, + '国家地区的选择将影响数据安全,你当前选择的是'+state.countryName+'请确认后再继续'.tr, tipTitle: '确认国家或地区'.tr, sureStr: '我知道了'.tr); } diff --git a/lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart b/lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart index a0011308..6760a1c0 100755 --- a/lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart +++ b/lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart @@ -362,7 +362,7 @@ class _LockSetPageState extends State //todo: 双重认证、双锁联动国际化、API接口 //双重认证 Obx(() => Visibility( - visible: true, + visible: state.lockFeature.value.doubleAuthentication == 1, child: CommonItem( leftTitel: '双重认证'.tr, rightTitle: '', diff --git a/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart b/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart index dd061929..191fd5a9 100755 --- a/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart +++ b/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart @@ -35,6 +35,7 @@ class _RemoteUnlockingPageState extends State body: Container( padding: EdgeInsets.all(30.w), child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.start, @@ -65,7 +66,7 @@ class _RemoteUnlockingPageState extends State }), Padding( padding: EdgeInsets.only(top: 20.h), - child: Text('功能开启后,你将可以通过网关远程开锁。此功能的开启和关闭只能在锁附近通过手机蓝牙进行。'.tr, + child: Text('此功能的开启和关闭只能在锁附近通过手机蓝牙进行'.tr, style: TextStyle(fontSize: 20.sp)), ), SizedBox( From fab0f9d4ca78e4bcad33972ad65343f508343309 Mon Sep 17 00:00:00 2001 From: liyi Date: Fri, 28 Mar 2025 10:43:18 +0800 Subject: [PATCH 058/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E5=A4=B4=E5=83=8F=E6=97=B6=E7=9A=84=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_en.json | 1 + lan/lan_keys.json | 1 + lan/lan_zh.json | 1 + .../minePersonInfo_logic.dart | 98 +++++++++++++++---- 4 files changed, 80 insertions(+), 21 deletions(-) diff --git a/lan/lan_en.json b/lan/lan_en.json index f0fb0b45..99767e88 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1153,6 +1153,7 @@ "是否要远程开锁": "Do you want to unlock remotely", "国家地区的选择将影响数据安全,你当前选择的是": "The choice of country or region will affect data security. What is your current choice", "请确认后再继续": "Please confirm before continuing", + "需要相机权限": "Camera permission required", "此功能的开启和关闭只能在锁附近通过手机蓝牙进行": "The activation and deactivation of this feature can only be done through Bluetooth on the phone near the lock", "网关添加成功": "Gateway added successfully" } diff --git a/lan/lan_keys.json b/lan/lan_keys.json index 5f37ad05..b9e8172d 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1160,6 +1160,7 @@ "繁体中文(中国香港)": "繁体中文(中国香港)", "国家地区的选择将影响数据安全,你当前选择的是": "国家地区的选择将影响数据安全,你当前选择的是", "请确认后再继续": "请确认后再继续", + "需要相机权限": "需要相机权限", "此功能的开启和关闭只能在锁附近通过手机蓝牙进行": "此功能的开启和关闭只能在锁附近通过手机蓝牙进行", "网关添加成功": "网关添加成功" } diff --git a/lan/lan_zh.json b/lan/lan_zh.json index a2c5906f..bde3239c 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1162,5 +1162,6 @@ "繁体中文(中国香港)": "繁体中文(中国香港)", "国家地区的选择将影响数据安全,你当前选择的是": "国家地区的选择将影响数据安全,你当前选择的是", "请确认后再继续": "请确认后再继续", + "需要相机权限": "需要相机权限", "网关添加成功": "网关添加成功" } diff --git a/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart b/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart index 810038cf..6f12d9f5 100755 --- a/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart +++ b/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart @@ -1,7 +1,7 @@ - import 'dart:async'; import 'dart:io'; import 'dart:typed_data'; +import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -31,27 +31,30 @@ class MinePersonInfoLogic extends BaseGetXController { //上传头像 先获取upToken 再调用updateUserInfo Future getUpTokenRequest(String filename, int size) async { - final MinePersonGetUploadFileInfoEntity entity = await ApiRepository.to.getUpToken( - userId: state.mineInfoData.value.uid!.toString(), - filename: filename, - size: size); + final MinePersonGetUploadFileInfoEntity entity = await ApiRepository.to + .getUpToken( + userId: state.mineInfoData.value.uid!.toString(), + filename: filename, + size: size); if (entity.errorCode!.codeIsSuccessful) { uploadFile(entity); } } // 上传头像 - Future uploadFile(MinePersonGetUploadFileInfoEntity minePersonGetUploadFileInfoEntity) async { + Future uploadFile( + MinePersonGetUploadFileInfoEntity + minePersonGetUploadFileInfoEntity) async { final File bytes = File(state.image!.path); final Uint8List enc = await bytes.readAsBytes(); - final FormData form = FormData(minePersonGetUploadFileInfoEntity.data!.formData!); - form.files.add( - MapEntry( - minePersonGetUploadFileInfoEntity.data!.fileField!, - MultipartFile(enc, filename: minePersonGetUploadFileInfoEntity.data!.formData!['key']) - ) - ); + final FormData form = + FormData(minePersonGetUploadFileInfoEntity.data!.formData!); + form.files.add(MapEntry( + minePersonGetUploadFileInfoEntity.data!.fileField!, + MultipartFile(enc, + filename: + minePersonGetUploadFileInfoEntity.data!.formData!['key']))); final LoginEntity entity = await ApiRepository.to.uploadFile( url: minePersonGetUploadFileInfoEntity.data!.uploadUrl!, body: form); @@ -63,7 +66,8 @@ class MinePersonInfoLogic extends BaseGetXController { //更新个人信息-头像 Future updateUserInfoRequest(String headUrl) async { - final PasswordKeyListEntity entity = await ApiRepository.to.updateUserHeadUrlInfo(headUrl: headUrl); + final PasswordKeyListEntity entity = + await ApiRepository.to.updateUserHeadUrlInfo(headUrl: headUrl); if (entity.errorCode!.codeIsSuccessful) { state.headUrl.value = headUrl; state.mineInfoData.value.headUrl = state.headUrl.value; @@ -88,9 +92,9 @@ class MinePersonInfoLogic extends BaseGetXController { ///拍摄照片 Future selectCamera() async { final XFile? photo = await state.imagePicker.pickImage( - source: ImageSource.camera, - maxHeight: 250, - maxWidth: 250, + source: ImageSource.camera, + maxHeight: 250, + maxWidth: 250, ); if (photo != null) { state.image = photo; @@ -117,16 +121,68 @@ class MinePersonInfoLogic extends BaseGetXController { //权限判断 访问相机 Future _checkCameraPermission() async { - final bool status = await PermissionDialog.request(Permission.camera); - if (status) { + final PermissionStatus status = await Permission.camera.status; + if (status.isPermanentlyDenied) { + // 用户永久拒绝了权限,引导用户去设置中心开启 + Get.dialog( + AlertDialog( + title: Text('需要相机权限'.tr), + content: Text('请在设置中允许访问相机'.tr), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text('取消'.tr), + ), + TextButton( + onPressed: () { + Get.back(); + openAppSettings(); + }, + child: Text('去设置'.tr), + ), + ], + ), + ); + return; + } + + // 权限未被永久拒绝,尝试请求权限 + final bool granted = await PermissionDialog.request(Permission.camera); + if (granted) { selectCamera(); } } //权限判断 访问相册 Future _checkPhotoPermission() async { - final bool status = await PermissionDialog.requestPhotos(); - if (status) { + final PermissionStatus status = await Permission.photos.status; + if (status.isPermanentlyDenied) { + // 用户永久拒绝了权限,引导用户去设置中心开启 + Get.dialog( + AlertDialog( + title: Text('需要相册权限'.tr), + content: Text('请在设置中允许访问相册'.tr), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text('取消'.tr), + ), + TextButton( + onPressed: () { + Get.back(); + openAppSettings(); + }, + child: Text('去设置'.tr), + ), + ], + ), + ); + return; + } + + // 权限未被永久拒绝,尝试请求权限 + final bool granted = await PermissionDialog.requestPhotos(); + if (granted) { selectImage(); } } From d78d4ab957ef3ad37222b8d293af51c19f562062 Mon Sep 17 00:00:00 2001 From: liyi Date: Fri, 28 Mar 2025 10:43:31 +0800 Subject: [PATCH 059/135] =?UTF-8?q?fix:xhj=E4=B8=8D=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E6=98=9F=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/talk/starChart/star_chart_manage.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/talk/starChart/star_chart_manage.dart b/lib/talk/starChart/star_chart_manage.dart index d379ef01..328e80b8 100644 --- a/lib/talk/starChart/star_chart_manage.dart +++ b/lib/talk/starChart/star_chart_manage.dart @@ -123,6 +123,10 @@ class StartChartManage { // 星图服务初始化 Future init() async { + if (F.isXHJ) { + return; + } + // 判断是否登录账户 final loginData = await Storage.getLoginData(); From 6546b3ed178fcfa26eac74372ba95154fee9d84e Mon Sep 17 00:00:00 2001 From: Liuyf Date: Mon, 31 Mar 2025 12:49:47 +0800 Subject: [PATCH 060/135] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E6=9D=83=E9=99=90=E7=94=B3=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../minePersonInfoPage/minePersonInfo_logic.dart | 2 ++ lib/widget/permission/permission_dialog.dart | 12 +++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart b/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart index 6f12d9f5..f301059f 100755 --- a/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart +++ b/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart @@ -13,6 +13,7 @@ import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_ import 'package:star_lock/widget/permission/permission_dialog.dart'; import '../../../../network/api_repository.dart'; import '../../../../tools/baseGetXController.dart'; +import '../../../app_settings/app_settings.dart'; import '../../../tools/eventBusEventManage.dart'; import '../../../tools/storage.dart'; import 'minePersonGetUploadFileInfo_entity.dart'; @@ -156,6 +157,7 @@ class MinePersonInfoLogic extends BaseGetXController { //权限判断 访问相册 Future _checkPhotoPermission() async { final PermissionStatus status = await Permission.photos.status; + AppLog.log('status:$status status:$status'); if (status.isPermanentlyDenied) { // 用户永久拒绝了权限,引导用户去设置中心开启 Get.dialog( diff --git a/lib/widget/permission/permission_dialog.dart b/lib/widget/permission/permission_dialog.dart index 23d9a6cc..3d74e1bd 100755 --- a/lib/widget/permission/permission_dialog.dart +++ b/lib/widget/permission/permission_dialog.dart @@ -132,9 +132,7 @@ class PermissionDialog { List permissions; if (isAndroid33) { permissions = [ - Permission.mediaLibrary, Permission.photos, - Permission.videos, ]; } else { permissions = [ @@ -150,11 +148,11 @@ class PermissionDialog { isGranted = isGranted && (await permission.status) == PermissionStatus.granted; } - if (isAndroid33) { - // android 33以上需要申请媒体库权限 - isGranted = - (await Permission.mediaLibrary.status) == PermissionStatus.granted; - } + // if (isAndroid33) { + // // android 33以上需要申请媒体库权限 + // isGranted = + // (await Permission.mediaLibrary.status) == PermissionStatus.granted; + // } return isGranted; } From 1dd9da1bef70fc94ecbd3a373d02344fbeb66196 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Mon, 31 Mar 2025 15:00:14 +0800 Subject: [PATCH 061/135] =?UTF-8?q?fix=EF=BC=9A=E3=80=90=E5=BC=80=E9=94=81?= =?UTF-8?q?=E9=A1=B5-=E5=AF=86=E7=A0=81-=E4=BF=AE=E6=94=B9=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=AF=86=E7=A0=81=E4=B8=BA=E5=B7=B2=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E5=AF=86=E7=A0=81=E4=B8=80=E7=9B=B4=E8=BD=AC=E5=9C=88?= =?UTF-8?q?=E6=97=A0=E6=8F=90=E7=A4=BA=EF=BC=8C=E4=B9=8B=E5=89=8D=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/blue/io_reply.dart | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/blue/io_reply.dart b/lib/blue/io_reply.dart index be395c47..856eb0d9 100755 --- a/lib/blue/io_reply.dart +++ b/lib/blue/io_reply.dart @@ -1,11 +1,10 @@ - import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; import '../app_settings/app_settings.dart'; import 'io_type.dart'; -abstract class Reply{ +abstract class Reply { Reply.parseData(this.commandType, List dataDetail); CommandType? commandType; @@ -13,10 +12,10 @@ abstract class Reply{ //command key flag int status = 0; List data = []; - static String logTag= '锁 -> App,指令订阅类型 :'; + static String logTag = '锁 -> App,指令订阅类型 :'; - void errorWithStstus(int status){ - switch(status){ + void errorWithStstus(int status) { + switch (status) { case 0x00: // 成功 AppLog.log('$logTag ${commandType?.typeName} 0x00 成功'); @@ -39,7 +38,7 @@ abstract class Reply{ case 0x04: // 用户未登记 AppLog.log('$logTag ${commandType!.typeName} 0x04 用户未登记'); - // showErrorMessage('用户未登记'); + showErrorMessage('用户未登记'.tr); break; case 0x05: // 参数错误 @@ -133,7 +132,7 @@ abstract class Reply{ } } - void showErrorMessage(String message){ + void showErrorMessage(String message) { EasyLoading.showToast(message, duration: 2000.milliseconds); } From 867dadd7b7cf29fbcbbc0d6857402d3d9ad27648 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 31 Mar 2025 15:51:31 +0800 Subject: [PATCH 062/135] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E6=97=B6=E9=80=89=E4=B8=AD=E5=9B=BD=E5=AE=B6=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/register/starLock_register_logic.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/login/register/starLock_register_logic.dart b/lib/login/register/starLock_register_logic.dart index 93890b8e..5796d422 100755 --- a/lib/login/register/starLock_register_logic.dart +++ b/lib/login/register/starLock_register_logic.dart @@ -100,9 +100,11 @@ class StarLockRegisterLogic extends BaseGetXController { Future checkIpAction() async { final CheckIPEntity entity = await ApiRepository.to.checkIpAction(ip: ''); if (entity.errorCode!.codeIsSuccessful) { - if (state.countryName.value == entity.data!.name) { + if (state.countryName.value != entity.data!.name) { ShowTipView().showSureAlertDialog( - '国家地区的选择将影响数据安全,你当前选择的是阿尔巴尼亚,请确认后再继续'.tr, + '国家地区的选择将影响数据安全,你当前选择的是'.tr + + '${state.countryName.value},' + + '请确认后再继续'.tr, tipTitle: '确认国家或地区'.tr, sureStr: '我知道了'.tr); } From 51e519bd7b6afb872acf34b381d154ccae4f0a87 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 31 Mar 2025 15:56:47 +0800 Subject: [PATCH 063/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E8=BF=9C?= =?UTF-8?q?=E7=A8=8B=E5=BC=80=E9=94=81=E7=9A=84=E6=96=87=E6=9C=AC=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remoteUnlocking/remoteUnlocking_page.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart b/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart index 191fd5a9..b18d0286 100755 --- a/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart +++ b/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_page.dart @@ -42,7 +42,7 @@ class _RemoteUnlockingPageState extends State children: [ Expanded( child: Text( - '功能开启后,你将可以通过网关远程开锁。'.tr, + '功能开启后,你将可以通过网关远程开锁。'.tr + '此功能的开启和关闭只能在锁附近通过手机蓝牙进行'.tr, style: TextStyle( fontSize: 20.sp, color: AppColors.darkGrayTextColor), )), @@ -64,11 +64,11 @@ class _RemoteUnlockingPageState extends State ], ); }), - Padding( - padding: EdgeInsets.only(top: 20.h), - child: Text('此功能的开启和关闭只能在锁附近通过手机蓝牙进行'.tr, - style: TextStyle(fontSize: 20.sp)), - ), + // Padding( + // padding: EdgeInsets.only(top: 20.h), + // child: Text('此功能的开启和关闭只能在锁附近通过手机蓝牙进行'.tr, + // style: TextStyle(fontSize: 20.sp)), + // ), SizedBox( height: 40.h, ), From fae8e9872fcddb5b397e6c3043aba117529a1d3f Mon Sep 17 00:00:00 2001 From: Liuyf Date: Mon, 31 Mar 2025 16:09:57 +0800 Subject: [PATCH 064/135] =?UTF-8?q?fix=EF=BC=9A=E3=80=90=E5=BC=80=E9=94=81?= =?UTF-8?q?=E9=A1=B5-=E5=9B=BE=E6=A0=87=E7=BA=BF=E4=B8=8A=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=BA=94=E6=98=AF=E7=BB=BF=E8=89=B2=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=EF=BC=8C=E7=8E=B0=E4=B8=BA=E9=BB=91=E8=89=B2=E3=80=82=E5=8F=A6?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8F=90=E9=86=92=E5=BA=94=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lockDetail/lockDetail_page.dart | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/lib/main/lockDetail/lockDetail/lockDetail_page.dart index fc69d86b..3d0e818a 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -1262,16 +1262,13 @@ class _LockDetailPageState extends State SizedBox( width: 42.w, height: 42.h, - child: FlavorsImg( - black: true, - child: Image.asset(iconUrl, - width: 42.w, - height: 42.w, - color: bottomBtnisEable - ? AppColors.mainColor - : AppColors.lockDetailBottomBtnUneable, - fit: BoxFit.fitWidth), - ), + child: Image.asset(iconUrl, + width: 42.w, + height: 42.w, + color: bottomBtnisEable + ? AppColors.mainColor + : AppColors.lockDetailBottomBtnUneable, + fit: BoxFit.fitWidth), ), SizedBox(height: 5.h), Expanded( @@ -1295,16 +1292,13 @@ class _LockDetailPageState extends State SizedBox( width: 42.w, height: 42.w, - child: FlavorsImg( - black: true, - child: Image.asset(iconUrl, - width: 42.w, - height: 42.w, - color: bottomBtnisEable - ? AppColors.mainColor - : AppColors.lockDetailBottomBtnUneable, - fit: BoxFit.fitWidth), - ), + child: Image.asset(iconUrl, + width: 42.w, + height: 42.w, + color: bottomBtnisEable + ? AppColors.mainColor + : AppColors.lockDetailBottomBtnUneable, + fit: BoxFit.fitWidth), ), SizedBox(height: 15.h), Text( From ec3d4109b1c107caa409bcb08c43ae507ca46167 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Mon, 31 Mar 2025 17:20:55 +0800 Subject: [PATCH 065/135] =?UTF-8?q?fix=EF=BC=9A=E3=80=90=E5=BC=80=E9=94=81?= =?UTF-8?q?=E9=A1=B5-=E8=AE=BE=E7=BD=AE-=E5=8F=8C=E9=87=8D=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=20=E8=BF=98=E6=9C=AA=E8=B0=83=E8=AF=95=20=E5=BB=BA?= =?UTF-8?q?=E8=AE=AE=E9=9A=90=E8=97=8F=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart | 3 ++- lib/main_local.dart | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart b/lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart index 6760a1c0..4d8fac0e 100755 --- a/lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart +++ b/lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart @@ -362,7 +362,8 @@ class _LockSetPageState extends State //todo: 双重认证、双锁联动国际化、API接口 //双重认证 Obx(() => Visibility( - visible: state.lockFeature.value.doubleAuthentication == 1, + //state.lockFeature.value.doubleAuthentication == 1, + visible: false, child: CommonItem( leftTitel: '双重认证'.tr, rightTitle: '', diff --git a/lib/main_local.dart b/lib/main_local.dart index bd256362..9e30d007 100755 --- a/lib/main_local.dart +++ b/lib/main_local.dart @@ -4,7 +4,7 @@ import 'flavors.dart'; import 'main.dart' as runner; Future main() async { - F.appFlavor = Flavor.sky; + F.appFlavor = Flavor.xhj; // AppLog.log('local调用了main函数'); await runner.main(); } From 79e21e7e4e5619f64e60c9fd6aaf2d3e54b683a5 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 31 Mar 2025 18:07:45 +0800 Subject: [PATCH 066/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E9=A6=99?= =?UTF-8?q?=E6=B8=AF=E7=9A=84=E8=AF=AD=E8=A8=80=E6=98=BE=E7=A4=BA=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_hk.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lan/lan_hk.json b/lan/lan_hk.json index 9f3a2e13..bf486ffa 100644 --- a/lan/lan_hk.json +++ b/lan/lan_hk.json @@ -1042,42 +1042,42 @@ "导出锁数据": "導出鎖定數據", "一键开锁": "一鍵解鎖", "已开通": "打開", - "英文": "英文", - "简体中文": "簡體中文", + "英文": "English", + "简体中文": "简体中文", "繁体中文": "繁體中文", - "法语": "法文", + "法语": "Français", "俄语": "Русский", - "德语": "德文", + "德语": "Deutsch", "日语": "日本語", "韩语": "한국어", "意大利语": "Italiano", "乌克兰语": "Українська", "葡萄牙语": "Português", - "西班牙语": "西班牙人", + "西班牙语": "Español", "阿拉伯语": "العربية", "越南语": "Tiếng Việt", - "马来语": "馬來文", - "荷兰语": "荷蘭", - "罗马尼亚语": "羅曼", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", "立陶宛语": "Lietuvių", - "瑞典语": "斯文斯卡", - "爱沙尼亚语": "埃斯蒂", - "波兰语": "波蘭", - "斯洛伐克语": "斯洛文尼亞", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", "捷克语": "Čeština", "希腊语": "Ελληνικά", "希伯来语": "עברית", "塞尔维亚语": "Српски", "土耳其语": "Türkçe", - "匈牙利语": "匈牙利嘅", + "匈牙利语": "Magyar", "保加利亚语": "Български", "哈萨克斯坦语": "Қазақ", "孟加拉语": "বাংলা", - "克罗地亚语": "赫尔瓦茨基", + "克罗地亚语": "Hrvatski", "泰语": "ไทย", "印度尼西亚语": "Bahasa Indonesia", - "芬兰语": "索米", - "丹麦语": "丹斯克", + "芬兰语": "Suomi", + "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 你確定要重置啊?", From 22b063b7654ce7e4f96475f4292ef4d50480c199 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 31 Mar 2025 18:36:39 +0800 Subject: [PATCH 067/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=AF=86=E7=A0=81=E8=BE=93=E5=85=A5=E6=A1=86=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/login/starLock_login_page.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/login/login/starLock_login_page.dart b/lib/login/login/starLock_login_page.dart index 351125c0..1875d334 100755 --- a/lib/login/login/starLock_login_page.dart +++ b/lib/login/login/starLock_login_page.dart @@ -133,6 +133,7 @@ class _StarLockLoginPageState extends State { inputFormatters: [ // FilteringTextInputFormatter.allow(RegExp('[0-9]')), LengthLimitingTextInputFormatter(30), + FilteringTextInputFormatter.singleLineFormatter ]), SizedBox(height: 10.h), LoginInput( From 5846c0914dfda39b285f9de1be1ad88cc749e186 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 1 Apr 2025 09:08:13 +0800 Subject: [PATCH 068/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=AF=86=E7=A0=81=E8=BE=93=E5=85=A5=E6=A1=86=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tools/tf_loginInput.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tools/tf_loginInput.dart b/lib/tools/tf_loginInput.dart index ba08fb72..3ab4c6b8 100755 --- a/lib/tools/tf_loginInput.dart +++ b/lib/tools/tf_loginInput.dart @@ -93,7 +93,7 @@ class _LoginInputState extends State { onTap: widget.onTapAction, autofocus: false, inputFormatters: widget.inputFormatters, - textInputAction: TextInputAction.next, + textInputAction: isPwd ? TextInputAction.done : TextInputAction.next, // 修改键盘类型为密码类型 keyboardType: isPwd ? TextInputType.visiblePassword From d37e0c720f2a65a72b662571397e5c8a828e6ea6 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 1 Apr 2025 09:17:17 +0800 Subject: [PATCH 069/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customSMSTemplateList_page.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_page.dart b/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_page.dart index 143de483..e39cb1b1 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_page.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_page.dart @@ -121,8 +121,13 @@ class _CustomSMSTemplateListPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + // Text( + // '${'当前状态'.tr}:${'试用中'.tr}', + // style: TextStyle( + // fontSize: 20.sp, fontWeight: FontWeight.w600), + // ), Text( - '${'当前状态'.tr}:${'试用中'.tr}', + '该功能是高级功能,请开通后再使用'.tr, style: TextStyle( fontSize: 20.sp, fontWeight: FontWeight.w600), ), From 81949d1d330ff255b3217a3c5d27b340a5778714 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Tue, 1 Apr 2025 11:10:10 +0800 Subject: [PATCH 070/135] =?UTF-8?q?fix:=20iOS=E7=BC=BA=E5=B0=91=E5=87=BA?= =?UTF-8?q?=E5=8F=A3=E5=90=88=E8=A7=84=E8=AF=81=E6=98=8E,=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=A0=87=E5=87=86=E5=8A=A0=E5=AF=86=E7=94=B3=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/Runner/Info.plist | 2 ++ ios/Runner/info_dev.plist | 2 ++ ios/Runner/info_pre.plist | 2 ++ ios/Runner/info_sky.plist | 2 ++ ios/Runner/info_xhj.plist | 2 ++ 5 files changed, 10 insertions(+) diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 38dc1aee..0da50486 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + ITSAppUsesNonExemptEncryption + CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion diff --git a/ios/Runner/info_dev.plist b/ios/Runner/info_dev.plist index b9594e80..d3ace927 100755 --- a/ios/Runner/info_dev.plist +++ b/ios/Runner/info_dev.plist @@ -2,6 +2,8 @@ + ITSAppUsesNonExemptEncryption + CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion diff --git a/ios/Runner/info_pre.plist b/ios/Runner/info_pre.plist index 23ea7388..eb46f32d 100755 --- a/ios/Runner/info_pre.plist +++ b/ios/Runner/info_pre.plist @@ -2,6 +2,8 @@ + ITSAppUsesNonExemptEncryption + CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion diff --git a/ios/Runner/info_sky.plist b/ios/Runner/info_sky.plist index 89605593..9ccafa1f 100755 --- a/ios/Runner/info_sky.plist +++ b/ios/Runner/info_sky.plist @@ -2,6 +2,8 @@ + ITSAppUsesNonExemptEncryption + CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion diff --git a/ios/Runner/info_xhj.plist b/ios/Runner/info_xhj.plist index a21ee95c..fee509c2 100755 --- a/ios/Runner/info_xhj.plist +++ b/ios/Runner/info_xhj.plist @@ -2,6 +2,8 @@ + ITSAppUsesNonExemptEncryption + CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion From 205ddd34f86522532cd463fa504617e5feb076f3 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 1 Apr 2025 16:22:20 +0800 Subject: [PATCH 071/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=94=81=E6=97=B6=E8=8E=B7=E5=8F=96wifi=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main/lockDetail/lockDetail/lockDetail_logic.dart | 10 +++++----- lib/main/lockMian/lockList/lockList_logic.dart | 8 ++++---- lib/mine/addLock/nearbyLock/nearbyLock_logic.dart | 4 ++-- lib/mine/addLock/saveLock/saveLock_logic.dart | 2 +- lib/tools/storage.dart | 4 ++++ 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index 9ee17ec3..ee7ba5f8 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -285,20 +285,20 @@ class LockDetailLogic extends BaseGetXController { final List publicKeyData = state.keyInfos.value.bluetooth!.publicKey!.cast(); final List saveStrList = changeIntListToStringList(publicKeyData); - Storage.setStringList(saveBluePublicKey, saveStrList); + await Storage.setStringList(saveBluePublicKey, saveStrList); // 私钥 final List privateKeyData = state.keyInfos.value.bluetooth!.privateKey!.cast(); final List savePrivateKeyList = changeIntListToStringList(privateKeyData); - Storage.setStringList(saveBluePrivateKey, savePrivateKeyList); + await Storage.setStringList(saveBluePrivateKey, savePrivateKeyList); // signKey final List signKeyData = state.keyInfos.value.bluetooth!.signKey!.cast(); final List saveSignKeyList = changeIntListToStringList(signKeyData); - Storage.setStringList(saveBlueSignKey, saveSignKeyList); + await Storage.setStringList(saveBlueSignKey, saveSignKeyList); final bool ifHaveKey = await Storage.ifHaveKey(saveBlueToken); if (!ifHaveKey) { @@ -741,7 +741,7 @@ class LockDetailLogic extends BaseGetXController { } /// 请求设备网络信息并设置 - void _requestDeviceNetworkInfo() async { + void requestDeviceNetworkInfo() async { final DeviceNetwork deviceNetworkInfo = await ApiRepository.to.getDeviceNetwork( deviceType: 2, @@ -787,7 +787,7 @@ class LockDetailLogic extends BaseGetXController { getServerDatetime(); await PermissionDialog.request(Permission.location); await PermissionDialog.requestBluetooth(); - _requestDeviceNetworkInfo(); + requestDeviceNetworkInfo(); } @override diff --git a/lib/main/lockMian/lockList/lockList_logic.dart b/lib/main/lockMian/lockList/lockList_logic.dart index f16dba13..dab00451 100755 --- a/lib/main/lockMian/lockList/lockList_logic.dart +++ b/lib/main/lockMian/lockList/lockList_logic.dart @@ -270,25 +270,25 @@ class LockListLogic extends BaseGetXController { state.lockListInfoItemEntity.bluetooth!.publicKey!.cast(); final List saveStrList = changeIntListToStringList(publicKeyData); - Storage.setStringList(saveBluePublicKey, saveStrList); + await Storage.setStringList(saveBluePublicKey, saveStrList); // 私钥 final List privateKeyData = state.lockListInfoItemEntity.bluetooth!.privateKey!.cast(); final List savePrivateKeyList = changeIntListToStringList(privateKeyData); - Storage.setStringList(saveBluePrivateKey, savePrivateKeyList); + await Storage.setStringList(saveBluePrivateKey, savePrivateKeyList); // signKey final List signKeyData = state.lockListInfoItemEntity.bluetooth!.signKey!.cast(); final List saveSignKeyList = changeIntListToStringList(signKeyData); - Storage.setStringList(saveBlueSignKey, saveSignKeyList); + await Storage.setStringList(saveBlueSignKey, saveSignKeyList); final List saveTokenList = changeIntListToStringList([0, 0, 0, 0]); - Storage.setStringList(saveBlueToken, saveTokenList); + await Storage.setStringList(saveBlueToken, saveTokenList); IoSenderManage.senderFactoryDataReset( lockID: BlueManage().connectDeviceName, diff --git a/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart b/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart index b607e6d1..77872c3c 100755 --- a/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart +++ b/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart @@ -136,12 +136,12 @@ class NearbyLockLogic extends BaseGetXController { final List privateKey = reply.data.sublist(0, 16); final List savePrivateKeyList = changeIntListToStringList(privateKey); - Storage.setStringList(saveBluePrivateKey, savePrivateKeyList); + await Storage.setStringList(saveBluePrivateKey, savePrivateKeyList); // signKey final List signKey = reply.data.sublist(16, 32); final List saveSignKeyList = changeIntListToStringList(signKey); - Storage.setStringList(saveBlueSignKey, saveSignKeyList); + await Storage.setStringList(saveBlueSignKey, saveSignKeyList); // 时间戳 final List timestamp = reply.data.sublist(32, 36); diff --git a/lib/mine/addLock/saveLock/saveLock_logic.dart b/lib/mine/addLock/saveLock/saveLock_logic.dart index f9e20f38..5b9c3ce3 100755 --- a/lib/mine/addLock/saveLock/saveLock_logic.dart +++ b/lib/mine/addLock/saveLock/saveLock_logic.dart @@ -486,7 +486,7 @@ class SaveLockLogic extends BaseGetXController { // } void backAction() async { - eventBus.fire(RefreshLockListInfoDataEvent(clearScanDevices: true)); + // eventBus.fire(RefreshLockListInfoDataEvent(clearScanDevices: true)); // BlueManage().disconnect(); // 查询锁设置信息 diff --git a/lib/tools/storage.dart b/lib/tools/storage.dart index 2ed936aa..12bd5a0b 100755 --- a/lib/tools/storage.dart +++ b/lib/tools/storage.dart @@ -287,6 +287,10 @@ class Storage { await Storage.setString(lockNetWorkInfo, json.encode(info)); } + static Future removeLockNetWorkInfoCache() async { + removeData(lockNetWorkInfo); + } + // 获取锁板的配网信息 static Future?> getLockNetWorkInfo() async { Map? info = null; From 9f43b3e7c133e1d0f75344533d5bc7bc3e796982 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 1 Apr 2025 16:23:02 +0800 Subject: [PATCH 072/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E6=97=B6=E4=BF=9D=E8=AF=81=E8=8E=B7=E5=8F=96=E5=88=B0?= =?UTF-8?q?=E7=9A=84=E6=98=AF=E6=9C=80=E6=96=B0=E7=9A=84=E9=94=81=E9=85=8D?= =?UTF-8?q?=E7=BD=91=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main/lockDetail/lockDetail/lockDetail_page.dart | 2 ++ .../configuringWifi/configuringWifi/configuringWifi_logic.dart | 1 + 2 files changed, 3 insertions(+) diff --git a/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/lib/main/lockDetail/lockDetail/lockDetail_page.dart index 3d0e818a..4352d93d 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -88,6 +88,8 @@ class _LockDetailPageState extends State /// 路由订阅 AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!); state.isOpenLockNeedOnline.refresh(); + + logic.requestDeviceNetworkInfo(); } StreamSubscription? _lockRefreshLockDetailInfoDataEvent; diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart index 4373a087..7a52e347 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart @@ -109,6 +109,7 @@ class ConfiguringWifiLogic extends BaseGetXController { switch (status) { case 0x00: + await Storage.removeLockNetWorkInfoCache(); final int secretKeyJsonLength = (reply.data[4] << 8) + reply.data[3]; final List secretKeyList = From 3f022ed878ab13bc1edfa66f2b6a4b9507af15f7 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 2 Apr 2025 09:32:40 +0800 Subject: [PATCH 073/135] =?UTF-8?q?fix:=E5=9B=9E=E6=BB=9A=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E6=A1=86=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tools/tf_loginInput.dart | 57 +++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/lib/tools/tf_loginInput.dart b/lib/tools/tf_loginInput.dart index 3ab4c6b8..e4627341 100755 --- a/lib/tools/tf_loginInput.dart +++ b/lib/tools/tf_loginInput.dart @@ -28,7 +28,7 @@ class LoginInput extends StatefulWidget { BlockStrCallback? onchangeAction; BlockStrCallback? onSubmitted; BlockClickCallback? onTapAction; - bool? isLogin; // 是否是登录之前,因为登录之前的密码框文字显示缩在左上角 默认是false + bool? isLogin;// 是否是登录之前,因为登录之前的密码框文字显示缩在左上角 默认是false LoginInput({ Key? key, @@ -93,17 +93,20 @@ class _LoginInputState extends State { onTap: widget.onTapAction, autofocus: false, inputFormatters: widget.inputFormatters, - textInputAction: isPwd ? TextInputAction.done : TextInputAction.next, - // 修改键盘类型为密码类型 - keyboardType: isPwd - ? TextInputType.visiblePassword - : TextInputType.emailAddress, - // 添加密码隐藏属性 - obscureText: isPwd, + textInputAction: TextInputAction.next, + keyboardType: isPwd ? TextInputType.emailAddress : null, + style: isPwd + ? TextStyle( + fontSize: 22.sp, + color: Colors.transparent, + letterSpacing: 2.5, + fontFamily: 'Monospace', + ) + : null, decoration: InputDecoration( //输入里面输入文字内边距设置 - // contentPadding: const EdgeInsets.only( - // top: 8.0, right: -10.0, bottom: 8.0), + contentPadding: const EdgeInsets.only( + top: 8.0, right: -10.0, bottom: 8.0), labelText: widget.label, labelStyle: TextStyle( fontSize: 22.sp, color: AppColors.darkGrayTextColor), @@ -113,12 +116,26 @@ class _LoginInputState extends State { border: InputBorder.none, suffixIcon: (widget.isSuffixIcon ?? false) ? IconButton( - icon: const Icon(Icons.clear), - onPressed: widget.controller!.clear, - ) + icon: const Icon(Icons.clear), + onPressed: widget.controller!.clear, + ) : null, ), ), + if (isPwd) + Padding( + padding: EdgeInsets.only( + top: F.sw(skyCall: () => 27.h, xhjCall: () => widget.isLogin! ? 27.h : 39.h)), + child: Text( + pwd, + style: TextStyle( + fontSize: 22.sp, + color: AppColors.darkGrayTextColor, + letterSpacing: 2.0, + fontFamily: 'Monospace', + ), + ), + ), ], ), ), @@ -146,24 +163,24 @@ class _LoginInputState extends State { top: 8.0, left: -10.0, right: -10.0, bottom: 8.0), labelText: widget.label, labelStyle: - TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor), + TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor), hintStyle: TextStyle(fontSize: 22.sp), hintText: widget.hintText, //不需要输入框下划线 border: InputBorder.none, suffixIcon: (widget.isSuffixIcon ?? false) ? IconButton( - icon: const Icon(Icons.clear), - onPressed: widget.controller!.clear, - ) + icon: const Icon(Icons.clear), + onPressed: widget.controller!.clear, + ) : null, //左边图标设置 icon: widget.isHaveLeftWidget == true ? widget.leftWidget : SizedBox( - width: 20.w, - height: 40.w, - ), + width: 20.w, + height: 40.w, + ), ), obscureText: widget.isPwd ?? false, ), From 6efbc05225f6236c20ce99d06de6d3c2a6a6bd54 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 2 Apr 2025 09:33:11 +0800 Subject: [PATCH 074/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E5=80=92?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E7=BB=93=E6=9D=9F=E3=80=81=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=BD=93=E8=AE=A1=E6=97=B6=E5=BC=80=E5=A7=8B=E6=97=B6=E6=89=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/talk/starChart/views/talkView/talk_view_logic.dart | 2 ++ lib/talk/starChart/views/talkView/talk_view_page.dart | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index a0a79f52..b5862b3c 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -278,6 +278,8 @@ class TalkViewLogic extends BaseGetXController { if (state.oneMinuteTime.value >= 60) { t.cancel(); // 取消定时器 state.oneMinuteTime.value = 0; + // 倒计时结束挂断 + udpHangUpAction(); } } }); diff --git a/lib/talk/starChart/views/talkView/talk_view_page.dart b/lib/talk/starChart/views/talkView/talk_view_page.dart index 021d1616..9492bc59 100644 --- a/lib/talk/starChart/views/talkView/talk_view_page.dart +++ b/lib/talk/starChart/views/talkView/talk_view_page.dart @@ -159,7 +159,8 @@ class _TalkViewPageState extends State )) : Container()), Obx( - () => state.listData.value.isNotEmpty + () => state.listData.value.isNotEmpty && + state.oneMinuteTime.value > 0 ? Positioned( top: ScreenUtil().statusBarHeight + 75.h, width: 1.sw, From f1b52437dc7a394ebbd7125afe834caeaa73dbb3 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 2 Apr 2025 09:33:26 +0800 Subject: [PATCH 075/135] =?UTF-8?q?fix:=E6=9A=82=E6=97=B6=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E8=B0=83rbcu=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/talk/starChart/handle/impl/udp_talk_accept_handler.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/talk/starChart/handle/impl/udp_talk_accept_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_accept_handler.dart index 39745372..5f71aafa 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_accept_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_accept_handler.dart @@ -41,8 +41,8 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle talkeRequestOverTimeTimerManager.renew(); talkeRequestOverTimeTimerManager.cancel(); // 启动发送rbcuInfo数据 - startChartManage.startSendingRbcuInfoMessages( - ToPeerId: startChartManage.lockPeerId); + // startChartManage.startSendingRbcuInfoMessages( + // ToPeerId: startChartManage.lockPeerId); } } From 9cc130cc55cb6b3ecc9e38433d8082feb813b863 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 2 Apr 2025 09:33:43 +0800 Subject: [PATCH 076/135] =?UTF-8?q?fix:=E5=8F=96=E6=B6=88h264=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/talk/starChart/handle/impl/udp_talk_data_handler.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart index 35412daf..e2caed39 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart @@ -161,8 +161,8 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle final TalkDataH264Frame talkDataH264Frame = TalkDataH264Frame(); talkDataH264Frame.mergeFromBuffer(talkData.content); frameHandler.handleFrame(talkDataH264Frame); - AppLog.log( - "帧:${talkDataH264Frame.frameType},帧序号:${talkDataH264Frame.frameSeq},对应I帧序号:${talkDataH264Frame.frameSeqI}"); + // AppLog.log( + // "帧:${talkDataH264Frame.frameType},帧序号:${talkDataH264Frame.frameSeq},对应I帧序号:${talkDataH264Frame.frameSeqI}"); } /// 处理图片数据 From bd0fac6d46ab6f86df682fc65ea5831ebbf9eb9a Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 2 Apr 2025 09:34:02 +0800 Subject: [PATCH 077/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E5=90=8C?= =?UTF-8?q?=E4=BA=8B=E8=BF=9B=E8=A1=8C=E7=9B=91=E8=A7=86=E5=92=8C=E5=91=BC?= =?UTF-8?q?=E5=8F=AB=E6=97=B6=E7=9A=84=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/talk/starChart/handle/impl/udp_talk_request_handler.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart index 8517e46b..122cbdc4 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart @@ -30,8 +30,9 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle replySuccessMessage(scpMessage); // 判断是否登录账户 final loginData = await Storage.getLoginData(); + // 如果登录账户不为空,且不是被动接听状态,且不是接听成功状态 if (loginData != null && - talkStatus.status != TalkStatus.passiveCallWaitingAnswer) { + (talkStatus.status != TalkStatus.passiveCallWaitingAnswer && talkStatus.status!=TalkStatus.answeredSuccessfully)) { // 收到对讲请求 final TalkReq talkReq = scpMessage.Payload; startChartManage.FromPeerId = scpMessage.ToPeerId!; From e3cf148b507a7c0ebf111aaffdce10da4362903a Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 2 Apr 2025 09:51:22 +0800 Subject: [PATCH 078/135] =?UTF-8?q?fix:=E5=8F=96=E6=B6=88=E5=80=92?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E7=BB=93=E6=9D=9F=E6=8C=82=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/talk/starChart/views/talkView/talk_view_logic.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index b5862b3c..19633e75 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -279,7 +279,7 @@ class TalkViewLogic extends BaseGetXController { t.cancel(); // 取消定时器 state.oneMinuteTime.value = 0; // 倒计时结束挂断 - udpHangUpAction(); + // udpHangUpAction(); } } }); From 0aaaecede947b135e3d7f2f92bd8bca0f5e6461b Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 2 Apr 2025 09:58:52 +0800 Subject: [PATCH 079/135] =?UTF-8?q?fix:=E5=8F=96=E6=B6=88=E5=80=92?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E7=BB=93=E6=9D=9F=E6=8C=82=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/talkView/talk_view_logic.dart | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index 19633e75..fb7abd92 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -275,12 +275,12 @@ class TalkViewLogic extends BaseGetXController { Timer.periodic(const Duration(seconds: 1), (Timer t) { if (state.listData.value.length > 0) { state.oneMinuteTime.value++; - if (state.oneMinuteTime.value >= 60) { - t.cancel(); // 取消定时器 - state.oneMinuteTime.value = 0; - // 倒计时结束挂断 - // udpHangUpAction(); - } + // if (state.oneMinuteTime.value >= 60) { + // t.cancel(); // 取消定时器 + // state.oneMinuteTime.value = 0; + // // 倒计时结束挂断 + // // udpHangUpAction(); + // } } }); break; @@ -492,7 +492,9 @@ class TalkViewLogic extends BaseGetXController { stopProcessingAudio(); // 清理图片缓存 _imageCache.clear(); - + state.oneMinuteTimeTimer?.cancel(); // 取消旧定时器 + state.oneMinuteTimeTimer = null; // 取消旧定时器 + state.oneMinuteTime.value = 0; super.onClose(); } From cb2e5ea03d0a81869e69ffe473e8eb992791b0c0 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 2 Apr 2025 12:09:07 +0800 Subject: [PATCH 080/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/translations/app_dept.dart | 6 +++--- lib/translations/translation_loader.dart | 6 ++++++ lib/translations/translation_message.dart | 2 ++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/translations/app_dept.dart b/lib/translations/app_dept.dart index 1d60fe75..40695a8d 100755 --- a/lib/translations/app_dept.dart +++ b/lib/translations/app_dept.dart @@ -1,5 +1,6 @@ import 'dart:ui'; import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import '../tools/app_manager.dart'; @@ -54,8 +55,8 @@ extension ExtensionAppDept on AppDept { const Locale fiL = Locale('fi', 'FI'); const Locale daL = Locale('da', 'DK'); const Locale ukL = Locale('uk', 'UA'); - const Locale hiL = Locale('hi', 'HI'); - const Locale urL = Locale('ur', 'UR'); + const Locale hiL = Locale('hi', 'IN'); + const Locale urL = Locale('ur', 'PK'); const Locale srCyrillic = Locale('sr', 'RS'); return [ @@ -186,7 +187,6 @@ enum LanguageType { hindi, //乌尔都语 urdu, - } extension ExtensionLanguageType on LanguageType { diff --git a/lib/translations/translation_loader.dart b/lib/translations/translation_loader.dart index 9dddc4d9..c54dcc68 100755 --- a/lib/translations/translation_loader.dart +++ b/lib/translations/translation_loader.dart @@ -78,6 +78,8 @@ class TranslationLoader { static Map _idMap = {}; static Map _fiMap = {}; static Map _daMap = {}; + static Map _hiMap = {}; + static Map _urMap = {}; static Map get zhDic => _zhMap; static Map get enDic => _enMap; @@ -118,6 +120,8 @@ class TranslationLoader { static Map get daDic => _daMap; static Map get ukMap => _ukMap; static Map get srMap => _srMap; + static Map get hiMap => _hiMap; + static Map get urMap => _urMap; static Future loadTranslation() async { _zhMap = await _loadJsonFile('lan/lan_zh.json'); @@ -159,6 +163,8 @@ class TranslationLoader { _daMap = await _loadJsonFile('lan/lan_da.json'); _ukMap = await _loadJsonFile('lan/lan_uk.json'); _srMap = await _loadJsonFile('lan/lan_sr_cyrl.json'); + _hiMap = await _loadJsonFile('lan/lan_hi.json'); + _urMap = await _loadJsonFile('lan/lan_ur.json'); } static Future> _loadJsonFile(String filePath) async => diff --git a/lib/translations/translation_message.dart b/lib/translations/translation_message.dart index 4f41e0fd..335560e6 100755 --- a/lib/translations/translation_message.dart +++ b/lib/translations/translation_message.dart @@ -40,6 +40,8 @@ class TranslationMessage extends Translations { 'id_ID': TranslationLoader.idDic, 'fi_FI': TranslationLoader.fiDic, 'da_DK': TranslationLoader.daDic, + 'hi_IN': TranslationLoader.hiMap, + 'ur_PK': TranslationLoader.urMap, }; void updateLocal(Locale l) => Get.updateLocale(l); From 3e565ab7d78b6e88058031743735b3c84f03d3db Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 2 Apr 2025 13:39:32 +0800 Subject: [PATCH 081/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E7=B9=81?= =?UTF-8?q?=E4=BD=93=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_zh.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lan/lan_zh.json b/lan/lan_zh.json index bde3239c..b9a66d9f 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1158,8 +1158,8 @@ "请确保网络是2.4GHz Wi-Fi": "请确保网络是2.4GHz Wi-Fi", "已选": "已选", "是否要远程开锁": "是否要远程开锁", - "繁体中文(中国台湾)": "繁体中文(中国台湾)", - "繁体中文(中国香港)": "繁体中文(中国香港)", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "国家地区的选择将影响数据安全,你当前选择的是": "国家地区的选择将影响数据安全,你当前选择的是", "请确认后再继续": "请确认后再继续", "需要相机权限": "需要相机权限", From ee66d43c156ca7a17db4a6ff0c2984845f993ea3 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 2 Apr 2025 16:44:46 +0800 Subject: [PATCH 082/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=AF=B9?= =?UTF-8?q?=E8=AE=B2=E6=97=B6=E7=9A=84=E9=9F=B3=E9=A2=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/talkView/talk_view_logic.dart | 81 +++++++++++++++---- 1 file changed, 64 insertions(+), 17 deletions(-) diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index fb7abd92..7ed217f6 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -658,8 +658,22 @@ class TalkViewLogic extends BaseGetXController { // 音频帧处理 Future _onFrame(List frame) async { + // 添加数据监控 + int maxVal = 0; + int minVal = 0; + int sum = 0; + for (int val in frame) { + maxVal = max(maxVal, val); + minVal = min(minVal, val); + sum += val; + } + double average = sum / frame.length; + AppLog.log('音频数据特征 - 最大值: $maxVal, 最小值: $minVal, 平均值: $average'); + final List processedFrame = preprocessAudio(frame); - final List list = listLinearToALaw(processedFrame); + // 添加平滑处理 + final List smoothedFrame = smoothAudio(processedFrame); + final List list = listLinearToALaw(smoothedFrame); _bufferedAudioFrames.addAll(list); final int ms = DateTime.now().millisecondsSinceEpoch - @@ -671,6 +685,15 @@ class TalkViewLogic extends BaseGetXController { } if (_bufferedAudioFrames.length >= getFrameLength) { + // 添加数据监控 + int maxVal = 0; + int minVal = 255; + for (int val in _bufferedAudioFrames) { + maxVal = max(maxVal, val); + minVal = min(minVal, val); + } + AppLog.log( + '发送音频数据 - G711编码后 - 最大值: $maxVal, 最小值: $minVal, 长度: ${_bufferedAudioFrames.length}'); // 发送音频数据到UDP await StartChartManage() .sendTalkDataMessage( @@ -691,19 +714,46 @@ class TalkViewLogic extends BaseGetXController { AppLog.log(error.message!); } + // 简化的音频预处理函数 List preprocessAudio(List pcmList) { - // 简单的降噪处理 final List processedList = []; + final int noiseThreshold = 300; // 噪音阈值 + for (int pcmVal in pcmList) { - // 简单的降噪示例:将小于阈值的信号置为0 - if (pcmVal.abs() < 200) { - pcmVal = 0; + // 简单的噪音门控:小于阈值的信号会被减弱 + if (pcmVal.abs() < noiseThreshold) { + pcmVal = (pcmVal * 0.3).round(); // 减弱噪音 } + + // 简单的压缩:防止大信号失真 + if (pcmVal.abs() > 20000) { + double factor = 1.0 - ((pcmVal.abs() - 20000) / 12768) * 0.3; + pcmVal = (pcmVal * factor).round(); + } + processedList.add(pcmVal); } + return processedList; } +// 简单的平滑处理 + List smoothAudio(List pcmList) { + final List smoothedList = []; + + for (int i = 0; i < pcmList.length; i++) { + if (i > 0 && i < pcmList.length - 1) { + // 简单的三点平均 + int avg = (pcmList[i - 1] + pcmList[i] * 2 + pcmList[i + 1]) ~/ 4; + smoothedList.add(avg); + } else { + smoothedList.add(pcmList[i]); + } + } + + return smoothedList; + } + //test测试降噪算法 // List preprocessAudio(List pcmList) { // final List processedList = []; @@ -753,34 +803,31 @@ class TalkViewLogic extends BaseGetXController { // return processedList; // } +// 简化的音量调整 List adjustVolume(List pcmList, double volume) { final List adjustedPcmList = []; + for (final int pcmVal in pcmList) { - // 调整音量 int adjustedPcmVal = (pcmVal * volume).round(); - - // 裁剪到 16-bit PCM 范围 - if (adjustedPcmVal > 32767) { - adjustedPcmVal = 32767; - } else if (adjustedPcmVal < -32768) { - adjustedPcmVal = -32768; - } - + adjustedPcmVal = adjustedPcmVal.clamp(-32768, 32767); adjustedPcmList.add(adjustedPcmVal); } + return adjustedPcmList; } +// 简化的A-law编码 List listLinearToALaw(List pcmList) { - // 先调节音量 - final List adjustedPcmList = adjustVolume(pcmList, 5.0); + // 调整音量,使用适中的增益值 + final List adjustedPcmList = adjustVolume(pcmList, 2.2); - // 再进行 A-law 编码 + // 执行A-law编码 final List aLawList = []; for (final int pcmVal in adjustedPcmList) { final int aLawVal = linearToALaw(pcmVal); aLawList.add(aLawVal); } + return aLawList; } From 295995abd78bbd536f06252a4c59f748c084de89 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 2 Apr 2025 17:06:49 +0800 Subject: [PATCH 083/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_hi.json | 2 ++ lan/lan_ur.json | 20 ++++++++++--------- .../lockMian/lockMain/lockMain_logic.dart | 13 +++++++++++- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lan/lan_hi.json b/lan/lan_hi.json index 1e608b4f..070bc036 100644 --- a/lan/lan_hi.json +++ b/lan/lan_hi.json @@ -1149,5 +1149,7 @@ "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. एप्लिकेशन में लॉक का रिमोट अनलॉकिंग फ़ंक्शन सक्षम करें (यह फ़ंक्शन डिफ़ॉल्ट रूप से बंद है). यदि यह विकल्प उपलब्ध नहीं है, तो लॉक आपके गूगल होम को सपोर्ट नहीं करेगा।", "3.安装Google Home APP,点击左上角的加号按钮": "3. गूगल होम ऐप को इंस्टॉल करें और ऊपरी बाएं कोने में प्लस बटन पर क्लिक करें।", "暂无最新记录": "वर्तमान में कोई नवीनतम रिकॉर्ड उपलब्ध नहीं हैं", + "繁体中文(中国台湾)": "पारंपरिक चीनी (ताइवान, चीनी)", + "繁体中文(中国香港)": "पारंपरिक चीनी (हांग कांग, चीनी)", "请将手机切换至2.4G WiFi进行手动连接": "मैन्युअल कनेक्शन के लिए कृपया अपना फोन 2.4 जी वाईफ़ाई पर स्विच करें।" } \ No newline at end of file diff --git a/lan/lan_ur.json b/lan/lan_ur.json index 90574a85..528ad145 100644 --- a/lan/lan_ur.json +++ b/lan/lan_ur.json @@ -1045,15 +1045,15 @@ "一键开锁": "ایک کلک ان لاک", "已开通": "کھولی", "英文": "انگريزی", - "简体中文": "简体中文", - "繁体中文": "繁體中文", - "法语": "Francis", - "俄语": "Русский", - "德语": "Deutsch", - "日语": "日本語", - "韩语": "한국어", - "意大利语": "Italiano", - "乌克兰语": "Українська", + "简体中文": "ساده چینی", + "繁体中文": "سنتی چینی", + "法语": "فرانسوی", + "俄语": "روسی", + "德语": "جرمن", + "日语": "جاپانی", + "韩语": "کوریا", + "意大利语": "ایتالیایی", + "乌克兰语": "Ukrainian", "葡萄牙语": "Português", "西班牙语": "Español", "阿拉伯语": "العربية", @@ -1149,5 +1149,7 @@ "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. اے پی پی میں لاک کے ریموٹ ان لاکنگ فنکشن کو فعال کریں (یہ فنکشن ڈیفالٹ طور پر بند ہے)۔ اگر یہ آپشن دستیاب نہیں ہے تو ، لاک گوگل ہوم کو سپورٹ نہیں کرے گا۔", "3.安装Google Home APP,点击左上角的加号按钮": "3. گوگل ہوم ایپ انسٹال کریں اور اوپری بائیں کونے میں پلس بٹن پر کلک کریں۔", "暂无最新记录": "فی الحال کوئی تازہ ترین ریکارڈ دستیاب نہیں ہے", + "繁体中文(中国台湾)": "(تائیوان، چین)سنتی چینی", + "繁体中文(中国香港)": "(ہنگ کنگ، چین)سنتی چینی", "请将手机切换至2.4G WiFi进行手动连接": "براہ کرم دستی کنکشن کے لئے اپنے فون کو 2.4 جی وائی فائی پر سوئچ کریں" } \ No newline at end of file diff --git a/lib/main/lockMian/lockMain/lockMain_logic.dart b/lib/main/lockMian/lockMain/lockMain_logic.dart index bd859377..802e9bbe 100755 --- a/lib/main/lockMian/lockMain/lockMain_logic.dart +++ b/lib/main/lockMian/lockMain/lockMain_logic.dart @@ -381,7 +381,8 @@ class LockMainLogic extends BaseGetXController { _initSubscription(); getUserInfoRequest(); // connectListener(); - + // 添加语言变化监听 + listenToLanguageChanges(); // AppLog.log('onInit() updateZoneOffsetsAndLanguages'); // updateZoneOffsetsAndLanguages(); } @@ -394,6 +395,16 @@ class LockMainLogic extends BaseGetXController { super.onClose(); } + // 监听语言变化并刷新列表 + void listenToLanguageChanges() { + // 收到切换语言消息,重新拉取一下列表 + eventBus + .on() + .listen((ChangeLanguageBlockLastLanguageEvent event) { + getStarLockInfo(isUnShowLoading: true); + }); + } + static LockMainLogic? to() { if (Get.isRegistered()) { return Get.find(); From 41a197f25e169f0a76b40ee5b7a945693b87a320 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 2 Apr 2025 17:36:27 +0800 Subject: [PATCH 084/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E9=9F=B3?= =?UTF-8?q?=E9=A2=91=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/talkView/talk_view_logic.dart | 202 +------------ lib/tools/G711Tool.dart | 273 ++++++++++++++++++ 2 files changed, 278 insertions(+), 197 deletions(-) create mode 100644 lib/tools/G711Tool.dart diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index 7ed217f6..f4de250b 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -28,6 +28,7 @@ import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart'; import 'package:star_lock/talk/starChart/proto/talk_expect.pb.dart'; import 'package:star_lock/talk/starChart/star_chart_manage.dart'; import 'package:star_lock/talk/starChart/views/talkView/talk_view_state.dart'; +import 'package:star_lock/tools/G711Tool.dart'; import 'package:star_lock/tools/bugly/bugly_tool.dart'; import '../../../../tools/baseGetXController.dart'; @@ -658,23 +659,11 @@ class TalkViewLogic extends BaseGetXController { // 音频帧处理 Future _onFrame(List frame) async { - // 添加数据监控 - int maxVal = 0; - int minVal = 0; - int sum = 0; - for (int val in frame) { - maxVal = max(maxVal, val); - minVal = min(minVal, val); - sum += val; - } - double average = sum / frame.length; - AppLog.log('音频数据特征 - 最大值: $maxVal, 最小值: $minVal, 平均值: $average'); - final List processedFrame = preprocessAudio(frame); - // 添加平滑处理 - final List smoothedFrame = smoothAudio(processedFrame); - final List list = listLinearToALaw(smoothedFrame); - _bufferedAudioFrames.addAll(list); + // 编码为G711数据 + List encodedData = G711Tool.encode(frame, 0); // 0表示A-law + + _bufferedAudioFrames.addAll(encodedData); final int ms = DateTime.now().millisecondsSinceEpoch - state.startRecordingAudioTime.value.millisecondsSinceEpoch; @@ -685,15 +674,6 @@ class TalkViewLogic extends BaseGetXController { } if (_bufferedAudioFrames.length >= getFrameLength) { - // 添加数据监控 - int maxVal = 0; - int minVal = 255; - for (int val in _bufferedAudioFrames) { - maxVal = max(maxVal, val); - minVal = min(minVal, val); - } - AppLog.log( - '发送音频数据 - G711编码后 - 最大值: $maxVal, 最小值: $minVal, 长度: ${_bufferedAudioFrames.length}'); // 发送音频数据到UDP await StartChartManage() .sendTalkDataMessage( @@ -714,177 +694,5 @@ class TalkViewLogic extends BaseGetXController { AppLog.log(error.message!); } - // 简化的音频预处理函数 - List preprocessAudio(List pcmList) { - final List processedList = []; - final int noiseThreshold = 300; // 噪音阈值 - for (int pcmVal in pcmList) { - // 简单的噪音门控:小于阈值的信号会被减弱 - if (pcmVal.abs() < noiseThreshold) { - pcmVal = (pcmVal * 0.3).round(); // 减弱噪音 - } - - // 简单的压缩:防止大信号失真 - if (pcmVal.abs() > 20000) { - double factor = 1.0 - ((pcmVal.abs() - 20000) / 12768) * 0.3; - pcmVal = (pcmVal * factor).round(); - } - - processedList.add(pcmVal); - } - - return processedList; - } - -// 简单的平滑处理 - List smoothAudio(List pcmList) { - final List smoothedList = []; - - for (int i = 0; i < pcmList.length; i++) { - if (i > 0 && i < pcmList.length - 1) { - // 简单的三点平均 - int avg = (pcmList[i - 1] + pcmList[i] * 2 + pcmList[i + 1]) ~/ 4; - smoothedList.add(avg); - } else { - smoothedList.add(pcmList[i]); - } - } - - return smoothedList; - } - - //test测试降噪算法 - // List preprocessAudio(List pcmList) { - // final List processedList = []; - // final int windowSize = 5; - // final int thresholdFactor = 2; // 动态阈值的倍数 - - // for (int i = 0; i < pcmList.length; i++) { - // int pcmVal = pcmList[i]; - - // // 计算当前窗口内的标准差 - // int sum = 0; - // int count = 0; - // for (int j = i; j < i + windowSize && j < pcmList.length; j++) { - // sum += pcmList[j]; - // count++; - // } - // int mean = sum ~/ count; - - // // 计算标准差 - // int varianceSum = 0; - // for (int j = i; j < i + windowSize && j < pcmList.length; j++) { - // varianceSum += (pcmList[j] - mean) * (pcmList[j] - mean); - // } - // double standardDeviation = - // sqrt(varianceSum / count); // Use sqrt from dart:math - - // // 动态阈值 - // int dynamicThreshold = (standardDeviation * thresholdFactor).toInt(); - - // // 动态降噪:如果信号小于动态阈值,则设为0 - // if (pcmVal.abs() < dynamicThreshold) { - // pcmVal = 0; - // } - - // // 移动平均滤波器 - // int sumFilter = 0; - // int countFilter = 0; - // for (int j = i; j < i + windowSize && j < pcmList.length; j++) { - // sumFilter += pcmList[j]; - // countFilter++; - // } - // int average = sumFilter ~/ countFilter; - - // processedList.add(average); - // } - - // return processedList; - // } - -// 简化的音量调整 - List adjustVolume(List pcmList, double volume) { - final List adjustedPcmList = []; - - for (final int pcmVal in pcmList) { - int adjustedPcmVal = (pcmVal * volume).round(); - adjustedPcmVal = adjustedPcmVal.clamp(-32768, 32767); - adjustedPcmList.add(adjustedPcmVal); - } - - return adjustedPcmList; - } - -// 简化的A-law编码 - List listLinearToALaw(List pcmList) { - // 调整音量,使用适中的增益值 - final List adjustedPcmList = adjustVolume(pcmList, 2.2); - - // 执行A-law编码 - final List aLawList = []; - for (final int pcmVal in adjustedPcmList) { - final int aLawVal = linearToALaw(pcmVal); - aLawList.add(aLawVal); - } - - return aLawList; - } - - int linearToALaw(int pcmVal) { - const int alawMax = 0x7FFF; // 32767 - const int alawBias = 0x84; // 132 - - int mask; - int seg; - int aLawVal; - - // Handle sign - if (pcmVal < 0) { - pcmVal = -pcmVal; - mask = 0x7F; // 127 (sign bit is 1) - } else { - mask = 0xFF; // 255 (sign bit is 0) - } - - // Add bias and clamp to ALAW_MAX - pcmVal += alawBias; - if (pcmVal > alawMax) { - pcmVal = alawMax; - } - - // Determine segment - seg = search(pcmVal); - - // Calculate A-law value - if (seg >= 8) { - aLawVal = 0x7F ^ mask; // Clamp to maximum value - } else { - final int quantized = (pcmVal >> (seg + 3)) & 0xF; - aLawVal = (seg << 4) | quantized; - aLawVal ^= 0xD5; // XOR with 0xD5 to match standard A-law table - } - - return aLawVal; - } - - int search(int val) { - final List table = [ - 0xFF, // Segment 0 - 0x1FF, // Segment 1 - 0x3FF, // Segment 2 - 0x7FF, // Segment 3 - 0xFFF, // Segment 4 - 0x1FFF, // Segment 5 - 0x3FFF, // Segment 6 - 0x7FFF // Segment 7 - ]; - const int size = 8; - for (int i = 0; i < size; i++) { - if (val <= table[i]) { - return i; - } - } - return size; - } } diff --git a/lib/tools/G711Tool.dart b/lib/tools/G711Tool.dart new file mode 100644 index 00000000..1d8069a7 --- /dev/null +++ b/lib/tools/G711Tool.dart @@ -0,0 +1,273 @@ +/** + * G711Tool - G.711音频编解码工具类 + * + * G.711是一种用于音频压缩的ITU-T标准,主要用于电话系统。 + * 它有两种主要变体:A-law(主要用于欧洲和国际电话系统)和μ-law(主要用于北美和日本)。 + * + * 该类提供了PCM线性音频数据与G.711 A-law/μ-law格式之间的转换功能。 + * 编码过程将16位线性PCM样本压缩为8位,解码过程则相反。 + */ +class G711Tool { + // 常量定义 + static const int SIGN_BIT = 0x80; // A-law字节的符号位 + static const int QUANT_MASK = 0xf; // 量化字段掩码 + static const int NSEGS = 8; // A-law段数 + static const int SEG_SHIFT = 4; // 段号左移位数 + static const int SEG_MASK = 0x70; // 段字段掩码 + static const int BIAS = 0x84; // 线性编码的偏置值 + + // 查找表 + /** + * μ-law到A-law的转换表 + * 用于在两种编码格式之间进行转换而不需要先解码为线性PCM + */ + static final List _u2a = [ + // u- to A-law conversions + 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 27, 29, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128 + ]; + + /** + * A-law到μ-law的转换表 + * 用于在两种编码格式之间进行转换而不需要先解码为线性PCM + */ + static final List _a2u = [ + // A- to u-law conversions + 1, 3, 5, 7, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 48, 49, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127 + ]; + + /** + * 段结束值表 + * 用于确定PCM值应该映射到哪个段 + * 每个段代表不同的量化步长 + */ + static final List _segEnd = [ + 0xFF, + 0x1FF, + 0x3FF, + 0x7FF, + 0xFFF, + 0x1FFF, + 0x3FFF, + 0x7FFF + ]; + + /** + * 在表中搜索值所属的段 + * + * @param val 要搜索的值 + * @param table 段结束值表 + * @param size 表大小 + * @return 段索引 + */ + static int _search(int val, List table, int size) { + for (int i = 0; i < size; i++) { + if (val <= table[i]) return i; + } + return size; + } + + /** + * 将线性PCM值转换为A-law编码值 + * + * 转换步骤: + * 1. 确定符号位和掩码 + * 2. 对负值进行特殊处理 + * 3. 确定段号 + * 4. 根据段号计算A-law值 + * + * @param pcmVal 16位线性PCM值 + * @return 8位A-law编码值 + */ + static int _linear2alaw(int pcmVal) { + int mask; + int seg; + int aval; + + if (pcmVal >= 0) { + mask = 0xD5; // sign (7th) bit = 1 + } else { + mask = 0x55; // sign bit = 0 + pcmVal = -pcmVal - 1; + if (pcmVal < 0) pcmVal = 32767; + } + + seg = _search(pcmVal, _segEnd, 8); + + if (seg >= 8) return 0x7F ^ mask; + + aval = seg << SEG_SHIFT; + if (seg < 2) { + aval |= (pcmVal >> 4) & QUANT_MASK; + } else { + aval |= (pcmVal >> (seg + 3)) & QUANT_MASK; + } + return aval ^ mask; + } + + /** + * 将A-law编码值转换为线性PCM值 + * + * 转换步骤: + * 1. 异或操作恢复原始位模式 + * 2. 提取量化值和段号 + * 3. 根据段号计算线性值 + * 4. 应用符号位 + * + * @param aVal 8位A-law编码值 + * @return 16位线性PCM值 + */ + static int _alaw2linear(int aVal) { + int t; + int seg; + + aVal ^= 0x55; + + t = (aVal & QUANT_MASK) << 4; + seg = (aVal & SEG_MASK) >> SEG_SHIFT; + + switch (seg) { + case 0: + t += 8; + break; + case 1: + t += 0x108; + break; + default: + t += 0x108; + t <<= seg - 1; + } + return (aVal & SIGN_BIT) != 0 ? t : -t; + } + + /** + * 将线性PCM值转换为μ-law编码值 + * + * 转换步骤与A-law类似,但使用不同的偏置和掩码 + * + * @param pcmVal 16位线性PCM值 + * @return 8位μ-law编码值 + */ + static int _linear2ulaw(int pcmVal) { + int mask; + int seg; + int uval; + + if (pcmVal < 0) { + pcmVal = BIAS - pcmVal; + mask = 0x7F; + } else { + pcmVal += BIAS; + mask = 0xFF; + } + + seg = _search(pcmVal, _segEnd, 8); + + if (seg >= 8) return 0x7F ^ mask; + + uval = (seg << 4) | ((pcmVal >> (seg + 3)) & 0xF); + return uval ^ mask; + } + + /** + * 将μ-law编码值转换为线性PCM值 + * + * @param uVal 8位μ-law编码值 + * @return 16位线性PCM值 + */ + static int _ulaw2linear(int uVal) { + uVal = ~uVal; + int t = ((uVal & QUANT_MASK) << 3) + BIAS; + t <<= (uVal & SEG_MASK) >> SEG_SHIFT; + return (uVal & SIGN_BIT) != 0 ? (BIAS - t) : (t - BIAS); + } + + /** + * 将A-law编码值转换为μ-law编码值 + * + * 使用查找表直接转换,避免解码再编码的性能损失 + * + * @param aval 8位A-law编码值 + * @return 8位μ-law编码值 + */ + static int alaw2ulaw(int aval) { + aval &= 0xff; + return (aval & 0x80) != 0 + ? (0xFF ^ _a2u[aval ^ 0xD5]) + : (0x7F ^ _a2u[aval ^ 0x55]); + } + + /** + * 将μ-law编码值转换为A-law编码值 + * + * 使用查找表直接转换,避免解码再编码的性能损失 + * + * @param uval 8位μ-law编码值 + * @return 8位A-law编码值 + */ + static int ulaw2alaw(int uval) { + uval &= 0xff; + return (uval & 0x80) != 0 + ? (0xD5 ^ (_u2a[0xFF ^ uval] - 1)) + : (0x55 ^ (_u2a[0x7F ^ uval] - 1)); + } + + /** + * 将PCM数据编码为G.711格式 + * + * @param pcm 输入PCM数据 + * @param lawFlag 编码类型标志: 0表示A-law, 1表示μ-law + * @return 编码后的G.711数据 + */ + static List encode(List pcm, int lawFlag) { + List code = List.filled(pcm.length, 0); + + if (lawFlag == 0) { + for (int i = 0; i < pcm.length; i++) { + code[i] = _linear2alaw(pcm[i]); + } + } else { + for (int i = 0; i < pcm.length; i++) { + code[i] = _linear2ulaw(pcm[i]); + } + } + return code; + } + + /** + * 将G.711数据解码为PCM格式 + * + * @param code 输入G.711数据 + * @param lawFlag 编码类型标志: 0表示A-law, 1表示μ-law + * @return 解码后的PCM数据 + */ + static List decode(List code, int lawFlag) { + List pcm = List.filled(code.length, 0); + + if (lawFlag == 0) { + for (int i = 0; i < code.length; i++) { + pcm[i] = _alaw2linear(code[i]); + } + } else { + for (int i = 0; i < code.length; i++) { + pcm[i] = _ulaw2linear(code[i]); + } + } + return pcm; + } +} From df439d3fe3ff1b37eaa207882fcdd26d4a19a309 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 3 Apr 2025 09:21:27 +0800 Subject: [PATCH 085/135] =?UTF-8?q?fix:=E6=96=B0=E5=A2=9E=E5=AE=8C?= =?UTF-8?q?=E9=94=81=E5=90=8E=E5=88=B7=E6=96=B0=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mine/addLock/saveLock/saveLock_logic.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/mine/addLock/saveLock/saveLock_logic.dart b/lib/mine/addLock/saveLock/saveLock_logic.dart index 5b9c3ce3..9dd9878c 100755 --- a/lib/mine/addLock/saveLock/saveLock_logic.dart +++ b/lib/mine/addLock/saveLock/saveLock_logic.dart @@ -486,7 +486,7 @@ class SaveLockLogic extends BaseGetXController { // } void backAction() async { - // eventBus.fire(RefreshLockListInfoDataEvent(clearScanDevices: true)); + // BlueManage().disconnect(); // 查询锁设置信息 @@ -503,6 +503,7 @@ class SaveLockLogic extends BaseGetXController { 'pageName': 'saveLock' }); } else { + eventBus.fire(RefreshLockListInfoDataEvent(clearScanDevices: true)); Future.delayed(const Duration(seconds: 1), () { Get.close(state.isFromMap == 1 ? (CommonDataManage().seletLockType == 0 ? 4 : 5) @@ -518,6 +519,7 @@ class SaveLockLogic extends BaseGetXController { }); } } else { + eventBus.fire(RefreshLockListInfoDataEvent(clearScanDevices: true)); Future.delayed(const Duration(seconds: 1), () { Get.close(state.isFromMap == 1 ? (CommonDataManage().seletLockType == 0 ? 4 : 5) From 237f8913d43b40d4454a566f434212ed204555e9 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 3 Apr 2025 09:21:43 +0800 Subject: [PATCH 086/135] =?UTF-8?q?fix:=E7=AE=80=E4=BD=93=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E6=89=8D=E6=98=BE=E7=A4=BA=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/login/starLock_login_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/login/login/starLock_login_page.dart b/lib/login/login/starLock_login_page.dart index 1875d334..f9a46982 100755 --- a/lib/login/login/starLock_login_page.dart +++ b/lib/login/login/starLock_login_page.dart @@ -283,7 +283,7 @@ class _StarLockLoginPageState extends State { width: 10.sp, )), Obx(() => Visibility( - visible: state.isCheckVerifyEnable.value, + visible: state.isCheckVerifyEnable.value && state.currentLanguage == 'zh_CN', child: GestureDetector( child: SizedBox( // width: 150.w, From 16dac17a48473ef6dbc8cb1f0400dd138d66e563 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 3 Apr 2025 09:21:51 +0800 Subject: [PATCH 087/135] =?UTF-8?q?fix:=E7=AE=80=E4=BD=93=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E6=89=8D=E6=98=BE=E7=A4=BA=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/login/starLock_login_state.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/login/login/starLock_login_state.dart b/lib/login/login/starLock_login_state.dart index ec224880..b623b61d 100755 --- a/lib/login/login/starLock_login_state.dart +++ b/lib/login/login/starLock_login_state.dart @@ -46,7 +46,8 @@ class StarLockLoginState { }.obs; RxBool isCheckVerifyEnable = false.obs; - + RxString currentLanguage = + CurrentLocaleTool.getCurrentLocaleString().obs; // 当前选择语言 void onClose() { // emailOrPhoneController.dispose(); // pwdController.dispose(); From 2d4ae946075964c00975467bf5f67eddd10d8c5d Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 3 Apr 2025 10:35:30 +0800 Subject: [PATCH 088/135] =?UTF-8?q?fix:=E6=8E=92=E6=9F=A5=E9=85=8D?= =?UTF-8?q?=E7=BD=91=E5=A4=B1=E8=B4=A5=E5=8E=9F=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuringWifi/configuringWifi_logic.dart | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart index 7a52e347..f4688019 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart @@ -16,6 +16,7 @@ import 'package:star_lock/blue/io_protocol/io_updataLockSet.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockDetail/lockDetail/device_network_info.dart'; import 'package:star_lock/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifiEntity.dart'; +import 'package:star_lock/mine/gateway/addGateway/gatewayConfigurationWifi/gatewayConfigurationWifi_page.dart'; import 'package:star_lock/mine/gateway/addGateway/gatewayConfigurationWifi/getGatewayConfiguration_entity.dart'; import 'package:star_lock/mine/gateway/addGateway/selectGateway/getGatewayInfo_model.dart'; import 'package:star_lock/talk/starChart/entity/star_chart_register_node_entity.dart'; @@ -45,7 +46,7 @@ class ConfiguringWifiLogic extends BaseGetXController { } } - Future updateNetworkInfo({ + void updateNetworkInfo({ required String peerId, required String wifiName, required String secretKey, @@ -82,17 +83,19 @@ class ConfiguringWifiLogic extends BaseGetXController { void _initReplySubscription() { _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) async { - AppLog.log('收到蓝牙回调${EasyLoading.isShow}'); // WIFI配网结果 if (reply is GatewayConfiguringWifiResultReply) { _replySenderConfiguringWifiResult(reply); } + if (reply is GatewayConfiguringWifiReply) { + _replySenderConfiguringWifiResult(reply); + } if (reply is GatewayGetStatusReply) { _replyGatewayGetStatusReply(reply); } - if (reply is GatewayGetStatusReply) { - _replyStatusInfo(reply); - } + // if (reply is GatewayGetStatusReply) { + // _replyStatusInfo(reply); + // } // 上传数据获取锁设置 if (reply is UpdataLockSetReply) { _replyUpdataLockSetReply(reply); @@ -132,7 +135,7 @@ class ConfiguringWifiLogic extends BaseGetXController { // 保存到缓存 await Storage.saveLockNetWorkInfo(jsonMap); // 上报服务器 - updateNetworkInfo( + updateNetworkInfo( peerId: peerId ?? '', wifiName: wifiName ?? '', secretKey: secretKey ?? '', @@ -482,6 +485,7 @@ class ConfiguringWifiLogic extends BaseGetXController { @override void dispose() { + dismissEasyLoading(); // TODO: implement dispose super.dispose(); state.isLoading.value = false; @@ -489,5 +493,6 @@ class ConfiguringWifiLogic extends BaseGetXController { state.loadingTimer!.cancel(); state.loadingTimer = null; } + } } From 557576ea5ea047d8ad29fa40ac0d34e5796dedc8 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 3 Apr 2025 10:36:00 +0800 Subject: [PATCH 089/135] =?UTF-8?q?fix:=E6=B3=A8=E9=87=8A=E9=80=80?= =?UTF-8?q?=E5=87=BA=E7=99=BB=E5=BD=95=E9=A1=B5=E5=90=8E=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96=E6=96=87=E6=9C=AC=E4=B8=8D=E8=B7=9F=E9=9A=8F=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E7=9A=84=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mine/mineSet/mineSet/mineSet_logic.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mine/mineSet/mineSet/mineSet_logic.dart b/lib/mine/mineSet/mineSet/mineSet_logic.dart index 845ec23b..a7b19862 100755 --- a/lib/mine/mineSet/mineSet/mineSet_logic.dart +++ b/lib/mine/mineSet/mineSet/mineSet_logic.dart @@ -143,8 +143,8 @@ class MineSetLogic extends BaseGetXController { // UdpHelp().closeUDP(); logOut(); - StoreService.to.saveLanguageCode(''); - Get.updateLocale(Get.deviceLocale!); + // StoreService.to.saveLanguageCode(''); + // Get.updateLocale(Get.deviceLocale!); BlueManage().disconnect(); StartChartManage().destruction(); From df215dda609d894856e8d60640b9427b56b5a36a Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 3 Apr 2025 10:36:18 +0800 Subject: [PATCH 090/135] =?UTF-8?q?fix:=E6=B7=BB=E5=8A=A0=E9=94=81?= =?UTF-8?q?=E5=90=8E=E6=9B=B4=E6=96=B0=E9=94=81=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mine/addLock/saveLock/saveLock_logic.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mine/addLock/saveLock/saveLock_logic.dart b/lib/mine/addLock/saveLock/saveLock_logic.dart index 9dd9878c..391ffa4b 100755 --- a/lib/mine/addLock/saveLock/saveLock_logic.dart +++ b/lib/mine/addLock/saveLock/saveLock_logic.dart @@ -503,7 +503,7 @@ class SaveLockLogic extends BaseGetXController { 'pageName': 'saveLock' }); } else { - eventBus.fire(RefreshLockListInfoDataEvent(clearScanDevices: true)); + eventBus.fire(RefreshLockListInfoDataEvent(clearScanDevices: true,isUnShowLoading: true)); Future.delayed(const Duration(seconds: 1), () { Get.close(state.isFromMap == 1 ? (CommonDataManage().seletLockType == 0 ? 4 : 5) @@ -519,7 +519,7 @@ class SaveLockLogic extends BaseGetXController { }); } } else { - eventBus.fire(RefreshLockListInfoDataEvent(clearScanDevices: true)); + eventBus.fire(RefreshLockListInfoDataEvent(clearScanDevices: true,isUnShowLoading: true)); Future.delayed(const Duration(seconds: 1), () { Get.close(state.isFromMap == 1 ? (CommonDataManage().seletLockType == 0 ? 4 : 5) From 64304bca62ca78752db184ca2db317d627f2c426 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 3 Apr 2025 10:36:30 +0800 Subject: [PATCH 091/135] =?UTF-8?q?fix:=E5=AF=B9=E8=AE=B2=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handle/impl/udp_talk_request_handler.dart | 13 +++++++-- .../handle/scp_message_base_handle.dart | 9 ++++++ lib/talk/starChart/star_chart_manage.dart | 13 ++++++--- .../views/talkView/talk_view_logic.dart | 29 ++++++++++++++++--- 4 files changed, 53 insertions(+), 11 deletions(-) diff --git a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart index 122cbdc4..06b79ad6 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart @@ -6,6 +6,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/talk/starChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/starChart/constant/talk_status.dart'; import 'package:star_lock/talk/starChart/entity/scp_message.dart'; @@ -26,13 +27,13 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle @override void handleReq(ScpMessage scpMessage) async { - // 回复成功 - replySuccessMessage(scpMessage); // 判断是否登录账户 final loginData = await Storage.getLoginData(); + // 如果登录账户不为空,且不是被动接听状态,且不是接听成功状态 if (loginData != null && - (talkStatus.status != TalkStatus.passiveCallWaitingAnswer && talkStatus.status!=TalkStatus.answeredSuccessfully)) { + (talkStatus.status != TalkStatus.passiveCallWaitingAnswer || + talkStatus.status != TalkStatus.answeredSuccessfully)) { // 收到对讲请求 final TalkReq talkReq = scpMessage.Payload; startChartManage.FromPeerId = scpMessage.ToPeerId!; @@ -40,6 +41,12 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle startChartManage.lockPeerId = scpMessage.FromPeerId!; // 处理收到接听请求后的事件 _talkRequestEvent(talkObjectName: talkReq.callerName); + + // 回复成功 + replySuccessMessage(scpMessage); + } else { + // 拒绝接听,回复失败 + replyErrorMessage(scpMessage); } } diff --git a/lib/talk/starChart/handle/scp_message_base_handle.dart b/lib/talk/starChart/handle/scp_message_base_handle.dart index f4b68024..11328f46 100644 --- a/lib/talk/starChart/handle/scp_message_base_handle.dart +++ b/lib/talk/starChart/handle/scp_message_base_handle.dart @@ -71,6 +71,15 @@ class ScpMessageBaseHandle { messageId: scpMessage.MessageId!, ); } + // 回复失败消息 + void replyErrorMessage(ScpMessage scpMessage) { + startChartManage.sendGenericRespErrorMessage( + ToPeerId: scpMessage.FromPeerId!, + FromPeerId: scpMessage.ToPeerId!, + PayloadType: scpMessage.PayloadType!, + messageId: scpMessage.MessageId!, + ); + } bool checkGenericRespSuccess(GenericResp genericResp) { if (genericResp == null) return false; diff --git a/lib/talk/starChart/star_chart_manage.dart b/lib/talk/starChart/star_chart_manage.dart index 328e80b8..7f60fc25 100644 --- a/lib/talk/starChart/star_chart_manage.dart +++ b/lib/talk/starChart/star_chart_manage.dart @@ -650,10 +650,15 @@ class StartChartManage { } // 回复失败消息 - void sendGenericRespErrorMessage( - {required String ToPeerId, - required String FromPeerId, - required int PayloadType}) async { + void sendGenericRespErrorMessage({ + required String ToPeerId, + required String FromPeerId, + required int PayloadType, + required int messageId, + }) async { + if (messageId == null) { + messageId = MessageCommand.getNextMessageId(ToPeerId, increment: false); + } final message = MessageCommand.genericRespErrorMessage( ToPeerId: ToPeerId, FromPeerId: FromPeerId, diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index f4de250b..523742c4 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -659,15 +659,14 @@ class TalkViewLogic extends BaseGetXController { // 音频帧处理 Future _onFrame(List frame) async { - + // 首先应用固定增益提升基础音量 + List amplifiedFrame = _applyGain(frame, 1.6); // 编码为G711数据 - List encodedData = G711Tool.encode(frame, 0); // 0表示A-law - + List encodedData = G711Tool.encode(amplifiedFrame, 0); // 0表示A-law _bufferedAudioFrames.addAll(encodedData); final int ms = DateTime.now().millisecondsSinceEpoch - state.startRecordingAudioTime.value.millisecondsSinceEpoch; - int getFrameLength = state.frameLength; if (Platform.isIOS) { getFrameLength = state.frameLength * 2; @@ -694,5 +693,27 @@ class TalkViewLogic extends BaseGetXController { AppLog.log(error.message!); } +// 添加音频增益处理方法 + List _applyGain(List pcmData, double gainFactor) { + List result = List.filled(pcmData.length, 0); + for (int i = 0; i < pcmData.length; i++) { + // PCM数据通常是有符号的16位整数 + int sample = pcmData[i]; + + // 应用增益 + double amplified = sample * gainFactor; + + // 限制在有效范围内,防止溢出 + if (amplified > 32767) { + amplified = 32767; + } else if (amplified < -32768) { + amplified = -32768; + } + + result[i] = amplified.toInt(); + } + + return result; + } } From d7e55f2af6818a7be997102db3e51c48741b29ee Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 3 Apr 2025 10:51:12 +0800 Subject: [PATCH 092/135] =?UTF-8?q?fix:=E5=9B=BD=E9=99=85=E5=8C=96?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_hi.json | 78 ++++++++++++++++++++++++------------------------- lan/lan_hk.json | 1 + lan/lan_ur.json | 22 +++++++------- lan/lan_zh.json | 1 + 4 files changed, 52 insertions(+), 50 deletions(-) diff --git a/lan/lan_hi.json b/lan/lan_hi.json index 070bc036..3a12b142 100644 --- a/lan/lan_hi.json +++ b/lan/lan_hi.json @@ -245,7 +245,7 @@ "摸亮触摸屏": "कीपैड को सक्रिय करने के लिए किसी भी कुंजी को स्पर्श करें", "摸亮触摸屏,锁进入可添加状态,点击下一步": "लॉक को सक्रिय करने के लिए कृपया किसी भी कुंजी को स्पर्श करें और उसे युग्मन मोड में रखें। अगला दबाओ", "附近的锁": "पास के ताले", - "如需修改名字请重新命名,点击确定添加锁": "यदि आप नाम बदलना चाहते हैं, तो कृपया नाम बदलें, लॉक जोड़ने के लिए OK पर क्लिक करें।", + "如需修改名字请重新命名,点击确定添加锁": "यदि आपको नाम बदलने की जरूरत है, कृपया इसे नाम बदलें और ताला जोड़ने के लिए ठीक है क्लिक करें", "添加锁时,手机必须在锁旁边": "लॉक जोड़ते समय, फ़ोन लॉक के बगल में होना चाहिए।", "登录": "प्रवेश करना", "注册": "रजिस्टर", @@ -1044,42 +1044,42 @@ "导出锁数据": "निर्यात लॉक डेटा", "一键开锁": "एक क्लिक अनलॉक", "已开通": "खुल गया", - "英文": "अंग्रेज़ी", - "简体中文": "पर", - "繁体中文": "पर", - "法语": "फ़्रैंकैइस", - "俄语": "सांद्रता सांद्रता सांद्रता", - "德语": "काटकर अलग कर देना", - "日语": "सोच।", - "韩语": "सोच।", - "意大利语": "इटालियनो", - "乌克兰语": "टाइप टाइप टाइप", - "葡萄牙语": "पुर्तगाओं", - "西班牙语": "स्पैनिश", - "阿拉伯语": "ए ए सेंटर सेंटर सेंटर सेंटर सेंटर।", - "越南语": "तिवारी पॅटर्न Vi पेंट टी", - "马来语": "बाहास मेलायु", - "荷兰语": "नेडरलैंड्स", - "罗马尼亚语": "रोमन पैन", - "立陶宛语": "लिटूवी हदीन", - "瑞典语": "स्का", - "爱沙尼亚语": "ईस्टी", - "波兰语": "पोल्की", - "斯洛伐克语": "चेपक", - "捷克语": "पुरआपसे", - "希腊语": "मोम मोम निर्देशिकाएँ", - "希伯来语": "।", - "塞尔维亚语": "टाइप टाइप", - "土耳其语": "तुरकी", - "匈牙利语": "माँजू", - "保加利亚语": "टाइप ने वाई", - "哈萨克斯坦语": "और और और और", - "孟加拉语": "कितना पैसा", - "克罗地亚语": "ह्रवत्स्की", - "泰语": "सोच।", - "印度尼西亚语": "बाहसा इंडोनेशिया", - "芬兰语": "सूमी", - "丹麦语": "मूर्ख व्यक्ति", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", + "葡萄牙语": "Português", + "西班牙语": "Español", + "阿拉伯语": "العربية", + "越南语": "Tiếng Việt", + "马来语": "Bahasa Melayu", + "荷兰语": "Nederlands", + "罗马尼亚语": "Română", + "立陶宛语": "Lietuvių", + "瑞典语": "Svenska", + "爱沙尼亚语": "Eesti", + "波兰语": "Polski", + "斯洛伐克语": "Slovenčina", + "捷克语": "Čeština", + "希腊语": "Ελληνικά", + "希伯来语": "עברית", + "塞尔维亚语": "Српски", + "土耳其语": "Türkçe", + "匈牙利语": "Magyar", + "保加利亚语": "Български", + "哈萨克斯坦语": "Қазақ", + "孟加拉语": "বাংলা", + "克罗地亚语": "Hrvatski", + "泰语": "ไทย", + "印度尼西亚语": "Bahasa Indonesia", + "芬兰语": "Suomi", + "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "रीसेट के बाद, लॉक के मेटाकार्पल नसों को हटा दिया जाएगा। क्या आप निश्चित रूप से रीसेट करना चाहते हैं?", @@ -1097,8 +1097,8 @@ "支持的国家值": "यूएसए, कनाडा, यूके, ऑस्ट्रेलिया, भारत, जर्मनी, जर्मनी, इटली, स्पेन, जापान", "操作流程": "ऑपरेशन प्रक्रिया", "操作流程值": "1 स्मार्ट लॉक ऐप के साथ लॉक और गेटवे जोड़ें\n\n2 एप्लिकेशन में लॉक का रिमोट अनलॉकिंग फ़ंक्शन सक्षम करें (यह फ़ंक्शन डिफ़ॉल्ट रूप से बंद है). अगर आपके पास यह विकल्प नहीं है, लॉक एलेक्सा का समर्थन नहीं करता है\n\n3 एलेक्सा के लिए कौशल जोड़ें और उन्हें स्मार्ट लॉक ऐप के खाते और पासवर्ड के साथ अधिकृत करें। प्राधिकरण सफल होने के बाद, आप खाते के अंतर्गत उपकरणों की खोज कर सकते हैं।\n\n4 एलेक्सए ऐप में लॉक का पता लगाएं, वॉयस अनलॉक फ़ंक्शन चालू करें, और भाषा का पासवर्ड सेट करें।\n\n5 लॉक को एलेक्सा के माध्यम से संचालित किया जा सकता है", - "Google Home": "गूगल होम", - "Action name": "क्रिया नाम", + "Google Home": "Google Home", + "Action name": "Action name", "ScienerSmart": "विज्ञानचतुर", "支持的语言": "समर्थित भाषाएं", "英语": "अंग्रेज़ी", diff --git a/lan/lan_hk.json b/lan/lan_hk.json index bf486ffa..24d17e4e 100644 --- a/lan/lan_hk.json +++ b/lan/lan_hk.json @@ -1043,6 +1043,7 @@ "一键开锁": "一鍵解鎖", "已开通": "打開", "英文": "English", + "英文": "English", "简体中文": "简体中文", "繁体中文": "繁體中文", "法语": "Français", diff --git a/lan/lan_ur.json b/lan/lan_ur.json index 528ad145..016ab0b3 100644 --- a/lan/lan_ur.json +++ b/lan/lan_ur.json @@ -1044,23 +1044,23 @@ "导出锁数据": "ایکسپورٹ لاک ڈیٹا", "一键开锁": "ایک کلک ان لاک", "已开通": "کھولی", - "英文": "انگريزی", - "简体中文": "ساده چینی", - "繁体中文": "سنتی چینی", - "法语": "فرانسوی", - "俄语": "روسی", - "德语": "جرمن", - "日语": "جاپانی", - "韩语": "کوریا", - "意大利语": "ایتالیایی", - "乌克兰语": "Ukrainian", + "英文": "English", + "简体中文": "简体中文", + "繁体中文": "繁體中文", + "法语": "Français", + "俄语": "Русский", + "德语": "Deutsch", + "日语": "日本語", + "韩语": "한국어", + "意大利语": "Italiano", + "乌克兰语": "Українська", "葡萄牙语": "Português", "西班牙语": "Español", "阿拉伯语": "العربية", "越南语": "Tiếng Việt", "马来语": "Bahasa Melayu", "荷兰语": "Nederlands", - "罗马尼亚语": "Romunaă", + "罗马尼亚语": "Română", "立陶宛语": "Lietuvių", "瑞典语": "Svenska", "爱沙尼亚语": "Eesti", diff --git a/lan/lan_zh.json b/lan/lan_zh.json index b9a66d9f..47f94f0c 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1163,5 +1163,6 @@ "国家地区的选择将影响数据安全,你当前选择的是": "国家地区的选择将影响数据安全,你当前选择的是", "请确认后再继续": "请确认后再继续", "需要相机权限": "需要相机权限", + "一键登录": "一键登录", "网关添加成功": "网关添加成功" } From acb0a5860fe0f249b4be1835d116519f6df30f60 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 3 Apr 2025 13:41:42 +0800 Subject: [PATCH 093/135] =?UTF-8?q?fix:=E5=9B=BD=E9=99=85=E5=8C=96?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_ar.json | 2 ++ lan/lan_bg.json | 2 ++ lan/lan_bn.json | 2 ++ lan/lan_cs.json | 2 ++ lan/lan_da.json | 2 ++ lan/lan_de.json | 2 ++ lan/lan_el.json | 2 ++ lan/lan_en.json | 2 ++ lan/lan_es.json | 2 ++ lan/lan_et.json | 2 ++ lan/lan_fi.json | 2 ++ lan/lan_fr.json | 2 ++ lan/lan_he.json | 2 ++ lan/lan_hi.json | 4 ++-- lan/lan_hk.json | 4 ++-- lan/lan_hr.json | 2 ++ lan/lan_hu.json | 2 ++ lan/lan_id.json | 2 ++ lan/lan_it.json | 2 ++ lan/lan_ja.json | 2 ++ lan/lan_keys.json | 4 ++-- lan/lan_kk.json | 2 ++ lan/lan_ko.json | 2 ++ lan/lan_lt.json | 2 ++ lan/lan_ms.json | 2 ++ lan/lan_nl.json | 2 ++ lan/lan_pl.json | 2 ++ lan/lan_pt.json | 2 ++ lan/lan_ro.json | 2 ++ lan/lan_ru.json | 2 ++ lan/lan_sk.json | 2 ++ lan/lan_sr_cyrl.json | 2 ++ lan/lan_sv.json | 2 ++ lan/lan_th.json | 2 ++ lan/lan_tr.json | 2 ++ lan/lan_tw.json | 4 ++-- lan/lan_uk.json | 2 ++ lan/lan_ur.json | 4 ++-- lan/lan_vi.json | 2 ++ 39 files changed, 78 insertions(+), 10 deletions(-) diff --git a/lan/lan_ar.json b/lan/lan_ar.json index 63371d82..4e2581f1 100644 --- a/lan/lan_ar.json +++ b/lan/lan_ar.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "بعد إعادة الضبط ، سيتم حذف الأوردة المشطية للقفل. هل أنت متأكد أنك تريد إعادة الضبط ؟", "在线": "الإنترنت", "离线": "غير متصل", diff --git a/lan/lan_bg.json b/lan/lan_bg.json index 56750a26..8df65927 100644 --- a/lan/lan_bg.json +++ b/lan/lan_bg.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "След нулиране, метакарпалните вени на ключалката ще бъдат изтрити. Сигурен ли сте, че искате да се възстанови?", "在线": "Онлайн", "离线": "Офлайн", diff --git a/lan/lan_bn.json b/lan/lan_bn.json index 8a7d28df..c355399d 100644 --- a/lan/lan_bn.json +++ b/lan/lan_bn.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "ব্যান্ডোটারআইসেট, হাসিপাল রিরিইনস্ফথেলকবইল্ডজেডড।?", "在线": "কনলাইন", "离线": "দেউন্টলাইনCity in Ontario Canada", diff --git a/lan/lan_cs.json b/lan/lan_cs.json index 08925658..3eb9ea5c 100644 --- a/lan/lan_cs.json +++ b/lan/lan_cs.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetování budou metakarpální žíly zámku odstraněny. Jste si jistý, že chcete resetovat?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_da.json b/lan/lan_da.json index d3db1465..4a98c3fd 100644 --- a/lan/lan_da.json +++ b/lan/lan_da.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter nulstilling, de metacarpal vener i låsen vil blive slettet. Er du sikker på at du vil nulstille?", "在线": "OnlineComment", "离线": "OfflineComment", diff --git a/lan/lan_de.json b/lan/lan_de.json index 79e2516d..2cee0e49 100644 --- a/lan/lan_de.json +++ b/lan/lan_de.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nach dem Zurücksetzen werden die Mittelhand adern des Schlosses gelöscht. Sind Sie sicher, dass Sie zurücksetzen wollen?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_el.json b/lan/lan_el.json index 8eac3390..ae84fe33 100644 --- a/lan/lan_el.json +++ b/lan/lan_el.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, οι μετακάρπιες φλέβες της κλειδαριάς θα διαγραφούν. Είστε σίγουροι ότι θέλετε να επαναφέρετε;", "在线": "Σε απευθείας σύνδεση", "离线": "Εκτός σύνδεσης:", diff --git a/lan/lan_en.json b/lan/lan_en.json index 99767e88..b37a5be7 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1082,6 +1082,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "After reset, the metacarpal veins of the lock will be deleted. Are you sure you want to reset?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_es.json b/lan/lan_es.json index 4dabcf0d..cd9dc765 100644 --- a/lan/lan_es.json +++ b/lan/lan_es.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Después del reinicio, se eliminarán las venas metacarpiales de la cerradura. ¿Está seguro de que desea restablecer?", "在线": "En línea", "离线": "Offline", diff --git a/lan/lan_et.json b/lan/lan_et.json index 48888bd6..7e8261bd 100644 --- a/lan/lan_et.json +++ b/lan/lan_et.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku metakarpaalveenid. Kas tõesti soovid lähtestada?", "在线": "Võrgus", "离线": "Mitte ühendust", diff --git a/lan/lan_fi.json b/lan/lan_fi.json index a6cd4aba..f3572450 100644 --- a/lan/lan_fi.json +++ b/lan/lan_fi.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Kun lukko on nollattu, metakarppinen suoneet poistetaan. Haluatko varmasti palauttaa?", "在线": "Verkossa", "离线": "Offline-verkosto", diff --git a/lan/lan_fr.json b/lan/lan_fr.json index ffcf5c00..f85e8e41 100644 --- a/lan/lan_fr.json +++ b/lan/lan_fr.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Après réinitialisation, les veines métacarpiennes de la serrure seront supprimées. Êtes-vous sûr de vouloir réinitialiser?", "在线": "En ligne", "离线": "Hors ligne", diff --git a/lan/lan_he.json b/lan/lan_he.json index acc3c4f2..4e71d9e0 100644 --- a/lan/lan_he.json +++ b/lan/lan_he.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "לאחר איפוס, הורידים של המנעול יימחקו. אתה בטוח שברצונך לאפס?", "在线": "באינטרנט", "离线": "מנותק", diff --git a/lan/lan_hi.json b/lan/lan_hi.json index 3a12b142..07cbe806 100644 --- a/lan/lan_hi.json +++ b/lan/lan_hi.json @@ -1082,6 +1082,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "रीसेट के बाद, लॉक के मेटाकार्पल नसों को हटा दिया जाएगा। क्या आप निश्चित रूप से रीसेट करना चाहते हैं?", "在线": "ऑनलाइन", "离线": "ऑफ़लाइन", @@ -1149,7 +1151,5 @@ "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. एप्लिकेशन में लॉक का रिमोट अनलॉकिंग फ़ंक्शन सक्षम करें (यह फ़ंक्शन डिफ़ॉल्ट रूप से बंद है). यदि यह विकल्प उपलब्ध नहीं है, तो लॉक आपके गूगल होम को सपोर्ट नहीं करेगा।", "3.安装Google Home APP,点击左上角的加号按钮": "3. गूगल होम ऐप को इंस्टॉल करें और ऊपरी बाएं कोने में प्लस बटन पर क्लिक करें।", "暂无最新记录": "वर्तमान में कोई नवीनतम रिकॉर्ड उपलब्ध नहीं हैं", - "繁体中文(中国台湾)": "पारंपरिक चीनी (ताइवान, चीनी)", - "繁体中文(中国香港)": "पारंपरिक चीनी (हांग कांग, चीनी)", "请将手机切换至2.4G WiFi进行手动连接": "मैन्युअल कनेक्शन के लिए कृपया अपना फोन 2.4 जी वाईफ़ाई पर स्विच करें।" } \ No newline at end of file diff --git a/lan/lan_hk.json b/lan/lan_hk.json index 24d17e4e..101c334c 100644 --- a/lan/lan_hk.json +++ b/lan/lan_hk.json @@ -1081,6 +1081,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 你確定要重置啊?", "在线": "在線", "离线": "離線", @@ -1150,7 +1152,5 @@ "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2.喺APP中開啟鎖嘅遠程解鎖功能(此功能默認關閉)。 如果此選項不可用,則鎖將唔撐Google Home", "3.安装Google Home APP,点击左上角的加号按钮": "3.安裝Google Home應用,點擊左上角嘅加號掣", "暂无最新记录": "目前冇可用嘅最新記錄", - "繁体中文(中国台湾)": "繁體中文(中國臺灣)", - "繁体中文(中国香港)": "繁體中文(中國香港)", "请将手机切换至2.4G WiFi进行手动连接": "請把手機切換到2.4G WiFi進行手動連接" } \ No newline at end of file diff --git a/lan/lan_hr.json b/lan/lan_hr.json index ece14b96..b1963cef 100644 --- a/lan/lan_hr.json +++ b/lan/lan_hr.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nakon resetiranja, metakarpalne vene brave će biti izbrisane. Jeste li sigurni da želite resetiranje?", "在线": "Na internetu", "离线": "Odspojeno", diff --git a/lan/lan_hu.json b/lan/lan_hu.json index 894a44e3..9e94a29f 100644 --- a/lan/lan_hu.json +++ b/lan/lan_hu.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "A reset után a zár metakarpális erei törlődnek. Biztos vagy benne, hogy vissza akarsz állítani?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_id.json b/lan/lan_id.json index a0dd8c94..517e433a 100644 --- a/lan/lan_id.json +++ b/lan/lan_id.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Setelah mengulang, pembuluh darah metakarpal dari kunci akan dihapus. Yakin ingin mengatur ulang?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_it.json b/lan/lan_it.json index 00fa3d12..8b7bd0eb 100644 --- a/lan/lan_it.json +++ b/lan/lan_it.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Dopo il reset, le vene metacarpali della serratura verranno cancellate. Sei sicuro di voler reimpostare?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_ja.json b/lan/lan_ja.json index f58e6062..bc162e44 100644 --- a/lan/lan_ja.json +++ b/lan/lan_ja.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "リセット後、ロックの中手骨静脈が削除されます。リセットしてもよろしいですか。", "在线": "オンライン", "离线": "オフライン", diff --git a/lan/lan_keys.json b/lan/lan_keys.json index b9e8172d..7c6ab214 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1083,6 +1083,8 @@ "丹麦语": "丹麦语", "印地语": "印地语", "乌尔都语": "乌尔都语", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?", "在线": "在线", "离线": "离线", @@ -1156,8 +1158,6 @@ "请确保网络是2.4GHz Wi-Fi": "请确保网络是2.4GHz Wi-Fi", "已选": "已选", "是否要远程开锁": "是否要远程开锁", - "繁体中文(中国台湾)": "繁体中文(中国台湾)", - "繁体中文(中国香港)": "繁体中文(中国香港)", "国家地区的选择将影响数据安全,你当前选择的是": "国家地区的选择将影响数据安全,你当前选择的是", "请确认后再继续": "请确认后再继续", "需要相机权限": "需要相机权限", diff --git a/lan/lan_kk.json b/lan/lan_kk.json index cf4ec926..3a24c6f2 100644 --- a/lan/lan_kk.json +++ b/lan/lan_kk.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Қайта ысырып тастағаннан соң бұғаттағы метакарпалар өшіріледі. Шынымен ысырып тастауды қалайсыз ба?", "在线": "Онлайн", "离线": "Желіде емес", diff --git a/lan/lan_ko.json b/lan/lan_ko.json index 5d8c6ef0..a9f94fbf 100644 --- a/lan/lan_ko.json +++ b/lan/lan_ko.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "재설정 후 잠금 장치의 중수골 정맥이 삭제됩니다. 당신은 당신이 재설정 하시겠습니까?", "在线": "온라인", "离线": "오프라인", diff --git a/lan/lan_lt.json b/lan/lan_lt.json index ebb9df23..d2b2769f 100644 --- a/lan/lan_lt.json +++ b/lan/lan_lt.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po reset užrakto metakarpinės venos bus ištrintos. Ar tikrai norite atstatyti?", "在线": "Online", "离线": "Neprisijungęs", diff --git a/lan/lan_ms.json b/lan/lan_ms.json index d003ba80..73acbf41 100644 --- a/lan/lan_ms.json +++ b/lan/lan_ms.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, urat metacarpal kunci akan dipadamkan. Adakah anda pasti anda mahu menetapkan semula?", "在线": "Dalam talian", "离线": "Luar talian", diff --git a/lan/lan_nl.json b/lan/lan_nl.json index afdd971d..aee4925b 100644 --- a/lan/lan_nl.json +++ b/lan/lan_nl.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Na reset worden de middenhandsbeenaders van het slot verwijderd. Weet je zeker dat je wilt resetten?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_pl.json b/lan/lan_pl.json index 120281a1..7fd23413 100644 --- a/lan/lan_pl.json +++ b/lan/lan_pl.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po zresetowaniu żyły śródręcza zamka zostaną usunięte. Czy na pewno chcesz zresetować?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_pt.json b/lan/lan_pt.json index 4d3a3436..c7f6d34b 100644 --- a/lan/lan_pt.json +++ b/lan/lan_pt.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Após a reinicialização, as veias do metacarpo do bloqueio serão excluídas. Tens a certeza que queres reiniciar?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_ro.json b/lan/lan_ro.json index a439b5fa..49545760 100644 --- a/lan/lan_ro.json +++ b/lan/lan_ro.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "După resetare, venele metacarpale ale încuietorii vor fi şterse. Sigur doriți să resetați?", "在线": "Online", "离线": "Deconectat", diff --git a/lan/lan_ru.json b/lan/lan_ru.json index 07772f3b..16bb2060 100644 --- a/lan/lan_ru.json +++ b/lan/lan_ru.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "После сброса пястные вены замка будут удалены. Вы уверены, что хотите сбросить?", "在线": "Онлайн", "离线": "Оффлайн", diff --git a/lan/lan_sk.json b/lan/lan_sk.json index 18c30d61..4106d4b7 100644 --- a/lan/lan_sk.json +++ b/lan/lan_sk.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetovaní budú metakarpálne žily zámku vymazané. Ste si istí, že chcete obnoviť?", "在线": "Online", "离线": "Offline", diff --git a/lan/lan_sr_cyrl.json b/lan/lan_sr_cyrl.json index 67bc4ada..4ce74a59 100644 --- a/lan/lan_sr_cyrl.json +++ b/lan/lan_sr_cyrl.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Након ресетовања, метакарпалне вене браве ће бити избрисане. Да ли сте сигурни да желите да ресетујете?", "在线": "Онлине", "离线": "Ванмрежне", diff --git a/lan/lan_sv.json b/lan/lan_sv.json index 22dcfa65..93f03550 100644 --- a/lan/lan_sv.json +++ b/lan/lan_sv.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter återställd, de metakarpal venerna i låset tas bort. Är du säker på att du vill återställa?", "在线": "Online:", "离线": "Frånkoppling", diff --git a/lan/lan_th.json b/lan/lan_th.json index fb568c47..85638d6a 100644 --- a/lan/lan_th.json +++ b/lan/lan_th.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "หลังจากรีเซ็ตแล้วหลอดเลือดดำ metacarpal ของล็อคจะถูกลบออกคุณแน่ใจว่าอยากจะรีเซ็ต?", "在线": "ออนไลน์ผ่าน", "离线": "ออฟไลน์", diff --git a/lan/lan_tr.json b/lan/lan_tr.json index 34f6a7e9..059d3cc1 100644 --- a/lan/lan_tr.json +++ b/lan/lan_tr.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sıfırlamadan sonra, kilidin metacarpal damarları silinecektir. Sıfırlamak istediğine emin misin?", "在线": "Çevrimiçi", "离线": "Çevrimdışı", diff --git a/lan/lan_tw.json b/lan/lan_tw.json index 8f32a68e..f1ed8445 100644 --- a/lan/lan_tw.json +++ b/lan/lan_tw.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 是否確實要重置?", "在线": "在線", "离线": "離線", @@ -1149,7 +1151,5 @@ "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. 在APP中開啓鎖的遠程開鎖功能(默認關閉)。如果這個選項不可用,鎖將不支持谷歌Home", "3.安装Google Home APP,点击左上角的加号按钮": "3. 安裝谷歌Home應用程序並單擊左上角的加號按鈕", "暂无最新记录": "目前沒有最新的記錄", - "繁体中文(中国台湾)": "繁體中文(中國臺灣)", - "繁体中文(中国香港)": "繁體中文(中國香港)", "请将手机切换至2.4G WiFi进行手动连接": "手動連接時請將手機調至2.4G WiFi" } \ No newline at end of file diff --git a/lan/lan_uk.json b/lan/lan_uk.json index a0451246..2cd002c7 100644 --- a/lan/lan_uk.json +++ b/lan/lan_uk.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Після скидання п'ясткові вени замку будуть видалені. Ви впевнені, що хочете скинути налаштування?", "在线": "Онлайн", "离线": "Автономних", diff --git a/lan/lan_ur.json b/lan/lan_ur.json index 016ab0b3..c1c0cd42 100644 --- a/lan/lan_ur.json +++ b/lan/lan_ur.json @@ -1082,6 +1082,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "ری سیٹ کرنے کے بعد ، لاک کی میٹاکارپل رگیں حذف کردی جائیں گی۔ کیا آپ واقعی دوبارہ ترتیب دینا چاہتے ہیں؟", "在线": "آن لائن", "离线": "آف لائن", @@ -1149,7 +1151,5 @@ "2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home": "2. اے پی پی میں لاک کے ریموٹ ان لاکنگ فنکشن کو فعال کریں (یہ فنکشن ڈیفالٹ طور پر بند ہے)۔ اگر یہ آپشن دستیاب نہیں ہے تو ، لاک گوگل ہوم کو سپورٹ نہیں کرے گا۔", "3.安装Google Home APP,点击左上角的加号按钮": "3. گوگل ہوم ایپ انسٹال کریں اور اوپری بائیں کونے میں پلس بٹن پر کلک کریں۔", "暂无最新记录": "فی الحال کوئی تازہ ترین ریکارڈ دستیاب نہیں ہے", - "繁体中文(中国台湾)": "(تائیوان، چین)سنتی چینی", - "繁体中文(中国香港)": "(ہنگ کنگ، چین)سنتی چینی", "请将手机切换至2.4G WiFi进行手动连接": "براہ کرم دستی کنکشن کے لئے اپنے فون کو 2.4 جی وائی فائی پر سوئچ کریں" } \ No newline at end of file diff --git a/lan/lan_vi.json b/lan/lan_vi.json index 4086e02f..89b433f7 100644 --- a/lan/lan_vi.json +++ b/lan/lan_vi.json @@ -1080,6 +1080,8 @@ "丹麦语": "Dansk", "印地语": "हिंदीName", "乌尔都语": "اوردو", + "繁体中文(中国台湾)": "繁體中文(中國臺灣)", + "繁体中文(中国香港)": "繁體中文(中國香港)", "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sau khi đặt lại, các tĩnh mạch metacarpal của khóa sẽ bị xóa. Bạn có chắc muốn thiết lập lại không?", "在线": "Trực tuyến", "离线": "Ngoại tuyến", From 72326851ca306f1e7eebe8898ef53f7e26d102b6 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 3 Apr 2025 15:39:27 +0800 Subject: [PATCH 094/135] =?UTF-8?q?fix:=E5=8E=BB=E9=99=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=E6=96=B9=E6=B3=95=E5=BC=95=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/udp_ble_passthrough_handler.dart | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/lib/talk/starChart/handle/impl/udp_ble_passthrough_handler.dart b/lib/talk/starChart/handle/impl/udp_ble_passthrough_handler.dart index ba052eb9..5d140492 100644 --- a/lib/talk/starChart/handle/impl/udp_ble_passthrough_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_ble_passthrough_handler.dart @@ -1,33 +1,15 @@ -import 'dart:async'; -import 'dart:convert'; -import 'dart:typed_data'; -import 'package:flutter_easyloading/flutter_easyloading.dart'; -import 'package:get/get.dart'; -import 'package:star_lock/appRouters.dart'; +import 'dart:convert'; + import 'package:star_lock/app_settings/app_settings.dart'; -import 'package:star_lock/blue/blue_manage.dart'; -import 'package:star_lock/blue/io_protocol/io_openLock.dart'; -import 'package:star_lock/blue/io_reply.dart'; -import 'package:star_lock/blue/io_tool/io_tool.dart'; -import 'package:star_lock/blue/io_tool/manager_event_bus.dart'; + import 'package:star_lock/blue/reciver_data.dart'; -import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_logic.dart'; -import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_state.dart'; import 'package:star_lock/talk/starChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/starChart/entity/scp_message.dart'; import 'package:star_lock/talk/starChart/handle/scp_message_base_handle.dart'; import 'package:star_lock/talk/starChart/handle/scp_message_handle.dart'; import 'package:star_lock/talk/starChart/proto/ble_message.pbserver.dart'; -import 'package:star_lock/talk/starChart/proto/gateway_reset.pb.dart'; -import 'package:star_lock/talk/starChart/proto/generic.pb.dart'; -import 'package:star_lock/tools/bugly/bugly_tool.dart'; -import 'package:star_lock/tools/dateTool.dart'; -import 'package:star_lock/tools/eventBusEventManage.dart'; -import 'package:star_lock/tools/storage.dart'; -import 'package:umeng_common_sdk/umeng_common_sdk.dart'; -import '../../star_chart_manage.dart'; class UdpBlePassThroughHandler extends ScpMessageBaseHandle implements ScpMessageHandler { From 7f29cfcbf03ed1462b303dab5111b2e61f22edd9 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Mon, 7 Apr 2025 09:35:44 +0800 Subject: [PATCH 095/135] =?UTF-8?q?fix:=20=E3=80=90[=E9=9C=80=E6=B1=82?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4]=E6=88=91=E7=9A=84=E9=A1=B5-=E5=A2=9E?= =?UTF-8?q?=E5=80=BC=E6=9C=8D=E5=8A=A1-=E9=AB=98=E7=BA=A7=E5=8A=9F?= =?UTF-8?q?=E8=83=BD-=E7=BA=BF=E4=B8=8A=E7=8E=AF=E5=A2=83=E7=82=B9?= =?UTF-8?q?=E9=83=BD=E6=8F=90=E7=A4=BA=E8=AF=B7=E5=85=88=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E9=94=81=EF=BC=8C=E4=B8=8D=E8=83=BD=E8=B4=AD=E4=B9=B0=EF=BC=88?= =?UTF-8?q?=E5=B7=B2=E6=B7=BB=E5=8A=A0=E6=9C=89=E9=94=81=EF=BC=89=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../valueAddedServicesList_page.dart | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart b/lib/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart index 760a0993..52a21ea9 100755 --- a/lib/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart +++ b/lib/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart @@ -68,15 +68,16 @@ class _ValueAddedServicesPageListState '高级功能'.tr, () async { final bool? isVip = await Storage.getBool(saveIsVip); if (isVip == null || !isVip) { - if (CommonDataManage().currentKeyInfo.isLockOwner != 1) { - logic.showToast('请先添加锁'.tr); - } else { - //刷新购买状态 - Get.toNamed(Routers.advancedFeaturesWebPage, - arguments: { - 'webBuyType': XSConstantMacro.webBuyTypeVip, - })?.then((value) => logic.getUserInfoRequest()); - } + // vip状态是和账号绑定,这里判断用户打开的某个锁是不是LockOwner没意义 + // if (CommonDataManage().currentKeyInfo.isLockOwner != 1) { + // logic.showToast('请先添加锁'.tr); + // } else { + //刷新购买状态 + Get.toNamed(Routers.advancedFeaturesWebPage, + arguments: { + 'webBuyType': XSConstantMacro.webBuyTypeVip, + })?.then((value) => logic.getUserInfoRequest()); + // } } else { Get.toNamed(Routers.valueAddedServicesHighFunctionPage); } From 903cacab3785b30ac90764a6a824f6c53fd480b5 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 7 Apr 2025 09:50:46 +0800 Subject: [PATCH 096/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=AD=97?= =?UTF-8?q?=E8=8A=82=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io_changeAdministratorPassword.dart | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/blue/io_protocol/io_changeAdministratorPassword.dart b/lib/blue/io_protocol/io_changeAdministratorPassword.dart index 17862cfe..12172139 100755 --- a/lib/blue/io_protocol/io_changeAdministratorPassword.dart +++ b/lib/blue/io_protocol/io_changeAdministratorPassword.dart @@ -1,6 +1,6 @@ - import 'dart:convert'; +import 'package:star_lock/flavors.dart'; import 'package:star_lock/tools/dateTool.dart'; import '../../app_settings/app_settings.dart'; @@ -13,7 +13,6 @@ import 'package:crypto/crypto.dart' as crypto; // 修改管理员密码 class ChangeAdministratorPasswordCommand extends SenderProtocol { - ChangeAdministratorPasswordCommand({ this.keyID, this.userID, @@ -40,7 +39,6 @@ class ChangeAdministratorPasswordCommand extends SenderProtocol { List? signKey; List? privateKey; - @override String toString() { return 'ChangeAdministratorPasswordCommand{keyID: $keyID, userID: $userID,' @@ -80,7 +78,12 @@ class ChangeAdministratorPasswordCommand extends SenderProtocol { subData = getFixedLengthList(subData, 20 - userIDLength); // PwdNo - subData.addAll(intChangList(pwdNo!)); + if (F.isSKY) { + subData.add(pwdNo! & 0xFF); // 低字节 + subData.add((pwdNo! >> 8) & 0xFF); // 高字节 + } else { + subData.addAll(intChangList(pwdNo!)); + } // pwd 20 final int pwdLength = utf8.encode(pwd!).length; @@ -105,7 +108,7 @@ class ChangeAdministratorPasswordCommand extends SenderProtocol { subData.add((endTime! & 0xff00) >> 8); subData.add(endTime! & 0xff); - if(needAuthor == 0){ + if (needAuthor == 0) { //AuthCodeLen 1 subData.add(0); } else { @@ -147,10 +150,11 @@ class ChangeAdministratorPasswordCommand extends SenderProtocol { } class ChangeAdministratorPasswordReply extends Reply { - ChangeAdministratorPasswordReply.parseData(CommandType commandType, List dataDetail) + ChangeAdministratorPasswordReply.parseData( + CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; final int status = data[2]; errorWithStstus(status); } -} \ No newline at end of file +} From 68a13c4b6c4b3a12f5128b838de83bab866f3436 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 7 Apr 2025 14:31:26 +0800 Subject: [PATCH 097/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=90=8C?= =?UTF-8?q?=E6=84=8F=E9=9A=90=E7=A7=81=E5=8D=8F=E8=AE=AE=E5=90=8E=E6=89=8D?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=B8=80=E9=94=AE=E7=99=BB=E5=BD=95=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/login/starLock_login_logic.dart | 5 +---- lib/main.dart | 9 +++++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/login/login/starLock_login_logic.dart b/lib/login/login/starLock_login_logic.dart index 4dfa2b5d..d7244068 100755 --- a/lib/login/login/starLock_login_logic.dart +++ b/lib/login/login/starLock_login_logic.dart @@ -179,10 +179,7 @@ class StarLockLoginLogic extends BaseGetXController { Future onInit() async { super.onInit(); - JverifyOneClickLoginManage(); - oneClickLoginAction(); - state.isCheckVerifyEnable.value = - await JverifyOneClickLoginManage().checkVerifyEnable(); + } @override diff --git a/lib/main.dart b/lib/main.dart index 872b7a26..9e20bdd8 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,6 +9,7 @@ import 'package:get/get.dart'; import 'package:path/path.dart' as path; import 'package:provider/provider.dart'; import 'package:star_lock/flavors.dart'; +import 'package:star_lock/login/login/starLock_login_logic.dart'; import 'package:star_lock/mine/about/debug/debug_tool.dart'; import 'package:star_lock/network/api_provider.dart'; import 'package:star_lock/network/api_repository.dart'; @@ -17,6 +18,7 @@ import 'package:star_lock/talk/starChart/handle/impl/debug_Info_model.dart'; import 'package:star_lock/talk/starChart/status/appLifecycle_observer.dart'; import 'package:star_lock/tools/bugly/bugly_tool.dart'; import 'package:star_lock/tools/device_info_service.dart'; +import 'package:star_lock/tools/jverify_one_click_login.dart'; import 'package:star_lock/tools/platform_info_services.dart'; import 'package:star_lock/tools/push/notification_service.dart'; import 'package:star_lock/tools/push/xs_jPhush.dart'; @@ -99,4 +101,11 @@ Future privacySDKInitialization() async { final XSJPushProvider jpushProvider = XSJPushProvider(); await jpushProvider.initJPushService(); NotificationService().init(); // 初始化通知服务 + + // 初始化一键登录服务 + final StarLockLoginLogic loginLogic = Get.put(StarLockLoginLogic()); + JverifyOneClickLoginManage(); + loginLogic.oneClickLoginAction(); + loginLogic.state.isCheckVerifyEnable.value = + await JverifyOneClickLoginManage().checkVerifyEnable(); } From 59fb9384cad8f348eec253f70d359281cc47bd56 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 7 Apr 2025 14:44:49 +0800 Subject: [PATCH 098/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E9=9F=B3?= =?UTF-8?q?=E9=A2=91=E5=8F=91=E9=80=81=E7=BC=93=E5=86=B2=E5=8C=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/talkView/talk_view_logic.dart | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index 523742c4..2c9c4cc0 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -659,32 +659,39 @@ class TalkViewLogic extends BaseGetXController { // 音频帧处理 Future _onFrame(List frame) async { + // 添加最大缓冲限制 + if (_bufferedAudioFrames.length > state.frameLength * 3) { + _bufferedAudioFrames.clear(); // 清空过多积累的数据 + return; + } + // 首先应用固定增益提升基础音量 List amplifiedFrame = _applyGain(frame, 1.6); // 编码为G711数据 List encodedData = G711Tool.encode(amplifiedFrame, 0); // 0表示A-law _bufferedAudioFrames.addAll(encodedData); - - final int ms = DateTime.now().millisecondsSinceEpoch - - state.startRecordingAudioTime.value.millisecondsSinceEpoch; + // 使用相对时间戳 + final int ms = DateTime.now().millisecondsSinceEpoch % 1000000; // 使用循环时间戳 int getFrameLength = state.frameLength; if (Platform.isIOS) { getFrameLength = state.frameLength * 2; } - if (_bufferedAudioFrames.length >= getFrameLength) { - // 发送音频数据到UDP - await StartChartManage() - .sendTalkDataMessage( - talkData: TalkData( - content: _bufferedAudioFrames, - contentType: TalkData_ContentTypeE.G711, - durationMs: ms, - ), - ) - .then((value) { - _bufferedAudioFrames.clear(); - }); + // 添加发送间隔控制 + if (_bufferedAudioFrames.length >= state.frameLength) { + try { + await StartChartManage().sendTalkDataMessage( + talkData: TalkData( + content: _bufferedAudioFrames, + contentType: TalkData_ContentTypeE.G711, + durationMs: ms, + ), + ); + } finally { + _bufferedAudioFrames.clear(); // 确保清理缓冲区 + } + } else { + _bufferedAudioFrames.addAll(encodedData); } } From a9450a7f7b1714885640898292918431ebb55c7a Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 7 Apr 2025 18:32:29 +0800 Subject: [PATCH 099/135] =?UTF-8?q?fix:=E5=8E=BB=E9=99=A4=E5=BD=95?= =?UTF-8?q?=E5=B1=8F=E6=8F=92=E4=BB=B6=EF=BC=88goole=E4=B8=8A=E6=9E=B6?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E6=9D=83=E9=99=90=E7=94=A8=E9=80=94=EF=BC=89?= =?UTF-8?q?=E3=80=81=E5=A2=9E=E5=8A=A0=E5=AF=B9=E8=AE=B2=E6=97=B6=E7=9A=84?= =?UTF-8?q?fps=E8=B0=83=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/talkView/talk_view_logic.dart | 70 ++++++++++++------- .../views/talkView/talk_view_state.dart | 3 +- .../starChart/webView/h264_web_logic.dart | 1 - pubspec.yaml | 2 +- 4 files changed, 46 insertions(+), 30 deletions(-) diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index 2c9c4cc0..8c0e3737 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -7,7 +7,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter_pcm_sound/flutter_pcm_sound.dart'; -import 'package:flutter_screen_recording/flutter_screen_recording.dart'; import 'package:flutter_voice_processor/flutter_voice_processor.dart'; import 'package:gallery_saver/gallery_saver.dart'; import 'package:get/get.dart'; @@ -57,6 +56,11 @@ class TalkViewLogic extends BaseGetXController { final Map _imageCache = {}; + // 添加帧率计算相关变量 + int _frameCount = 0; + int _lastFpsUpdateTime = 0; + Timer? _fpsTimer; + /// 初始化音频播放器 void _initFlutterPcmSound() { const int sampleRate = 8000; @@ -176,6 +180,17 @@ class TalkViewLogic extends BaseGetXController { state.listData.value = Uint8List.fromList(oldestFrame.content); state.videoBuffer.removeAt(oldestIndex); // 移除已播放的帧 + // 更新帧率计算 + _frameCount++; + final currentTime = DateTime.now().millisecondsSinceEpoch; + final elapsed = currentTime - _lastFpsUpdateTime; + + if (elapsed >= 1000) { + // 每秒更新一次 + state.fps.value = (_frameCount * 1000 / elapsed).round(); + _frameCount = 0; + _lastFpsUpdateTime = currentTime; + } // AppLog.log('🎬 播放帧 - 缓冲区剩余: ${state.videoBuffer.length}/${bufferSize}, ' // '播放延迟: ${currentTime - oldestFrame.durationMs}ms, ' // '帧时间戳: ${oldestFrame.durationMs}'); @@ -420,35 +435,35 @@ class TalkViewLogic extends BaseGetXController { } Future startRecording() async { - requestPermissions(); - if (state.isRecordingScreen.value) { - showToast('录屏已开始,请勿重复点击'); - } - bool start = await FlutterScreenRecording.startRecordScreen( - "Screen Recording", // 视频文件名 - titleNotification: "Recording in progress", // 通知栏标题 - messageNotification: "Tap to stop recording", // 通知栏内容 - ); - - if (start) { - state.isRecordingScreen.value = true; - } + // requestPermissions(); + // if (state.isRecordingScreen.value) { + // showToast('录屏已开始,请勿重复点击'); + // } + // bool start = await FlutterScreenRecording.startRecordScreen( + // "Screen Recording", // 视频文件名 + // titleNotification: "Recording in progress", // 通知栏标题 + // messageNotification: "Tap to stop recording", // 通知栏内容 + // ); + // + // if (start) { + // state.isRecordingScreen.value = true; + // } } Future stopRecording() async { - String path = await FlutterScreenRecording.stopRecordScreen; - print("Recording saved to: $path"); - - // 将视频保存到系统相册 - bool? success = await GallerySaver.saveVideo(path); - if (success == true) { - print("Video saved to gallery"); - } else { - print("Failed to save video to gallery"); - } - - showToast('录屏结束,已保存到系统相册'); - state.isRecordingScreen.value = false; + // String path = await FlutterScreenRecording.stopRecordScreen; + // print("Recording saved to: $path"); + // + // // 将视频保存到系统相册 + // bool? success = await GallerySaver.saveVideo(path); + // if (success == true) { + // print("Video saved to gallery"); + // } else { + // print("Failed to save video to gallery"); + // } + // + // showToast('录屏结束,已保存到系统相册'); + // state.isRecordingScreen.value = false; } @override @@ -496,6 +511,7 @@ class TalkViewLogic extends BaseGetXController { state.oneMinuteTimeTimer?.cancel(); // 取消旧定时器 state.oneMinuteTimeTimer = null; // 取消旧定时器 state.oneMinuteTime.value = 0; + super.onClose(); } diff --git a/lib/talk/starChart/views/talkView/talk_view_state.dart b/lib/talk/starChart/views/talkView/talk_view_state.dart index 1ff29b5e..aafc8605 100644 --- a/lib/talk/starChart/views/talkView/talk_view_state.dart +++ b/lib/talk/starChart/views/talkView/talk_view_state.dart @@ -45,6 +45,7 @@ class TalkViewState { late Timer answerTimer; late Timer hangUpTimer; late Timer openDoorTimer; + Timer? fpsTimer; late AnimationController animationController; late Timer autoBackTimer = @@ -79,7 +80,7 @@ class TalkViewState { Rx startRecordingAudioTime = DateTime.now().obs; // 开始录音时间 Rx endRecordingAudioTime = DateTime.now().obs; // 结束录音时间 RxInt recordingAudioTime = 0.obs; // 录音时间持续时间 - RxDouble fps = 0.0.obs; // 添加 FPS 计数 + RxInt fps = 0.obs; // 添加 FPS 计数 late VoiceProcessor? voiceProcessor; // 音频处理器、录音 final int frameLength = 320; //录音视频帧长度为640 final int sampleRate = 8000; //录音频采样率为8000 diff --git a/lib/talk/starChart/webView/h264_web_logic.dart b/lib/talk/starChart/webView/h264_web_logic.dart index e8e28784..4b7edc5e 100644 --- a/lib/talk/starChart/webView/h264_web_logic.dart +++ b/lib/talk/starChart/webView/h264_web_logic.dart @@ -7,7 +7,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter_pcm_sound/flutter_pcm_sound.dart'; -import 'package:flutter_screen_recording/flutter_screen_recording.dart'; import 'package:flutter_voice_processor/flutter_voice_processor.dart'; import 'package:gallery_saver/gallery_saver.dart'; import 'package:get/get.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index 12e5cd85..f0f95559 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -266,7 +266,7 @@ dependencies: # fast_rsa: ^3.6.6 protobuf: ^3.1.0 #录屏 - flutter_screen_recording: 2.0.16 + #flutter_screen_recording: 2.0.16 #图库保存 gallery_saver: ^2.3.2 fixnum: ^1.1.1 From 7b235718c5c723f773b80e60e54df5e9c46d6001 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Tue, 8 Apr 2025 09:07:37 +0800 Subject: [PATCH 100/135] =?UTF-8?q?other:=20=E4=BF=AE=E6=94=B9=E8=81=94?= =?UTF-8?q?=E8=B0=83=20=EF=BC=8C=E9=A2=84=E5=8F=91=E5=B8=83=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=9F=9F=E5=90=8D=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/flavors.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/flavors.dart b/lib/flavors.dart index 0d4fbe8f..f2c54c95 100755 --- a/lib/flavors.dart +++ b/lib/flavors.dart @@ -140,11 +140,11 @@ class F { case Flavor.dev: case Flavor.xhj_dev: case Flavor.sky_dev: - return 'https://dev.lock.star-lock.cn'; + return 'https://lock.dev.star-lock.cn'; case Flavor.pre: case Flavor.xhj_pre: case Flavor.sky_pre: - return 'https://pre.lock.star-lock.cn'; + return 'https://lock.pre.star-lock.cn'; case Flavor.sky: return 'https://lock.skychip.top'; case Flavor.xhj: From eb801de7c3f4128a2389b411f68ed0051f4cbd8d Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 8 Apr 2025 14:33:27 +0800 Subject: [PATCH 101/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=E5=B7=B2=E6=BB=A1=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fingerprint/addFingerprint/addFingerprint_logic.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart b/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart index c8507a3f..6bd97fb8 100755 --- a/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart +++ b/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart @@ -105,6 +105,13 @@ class AddFingerprintLogic extends BaseGetXController { token: token, isBeforeAddUser: false); break; + case 0xFE: + // 管理员已满 + state.ifAddState.value = false; + showToast('管理员已满'.tr, something: () { + Get.back(); + }); + break; default: //失败 state.ifAddState.value = false; From 066aff8fdf834817b93988859c876f7efa539386 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 8 Apr 2025 14:33:54 +0800 Subject: [PATCH 102/135] =?UTF-8?q?fix:=E5=AF=B9=E8=AE=B2=E6=97=B6?= =?UTF-8?q?=E8=BF=9B=E5=85=A5=E5=90=8E=E5=8F=B0=E5=85=B3=E9=97=AD=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starChart/status/appLifecycle_observer.dart | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/talk/starChart/status/appLifecycle_observer.dart b/lib/talk/starChart/status/appLifecycle_observer.dart index 03a0a37f..37b70152 100644 --- a/lib/talk/starChart/status/appLifecycle_observer.dart +++ b/lib/talk/starChart/status/appLifecycle_observer.dart @@ -28,17 +28,16 @@ class AppLifecycleObserver extends WidgetsBindingObserver { void onAppPaused() { // 处理应用程序进入后台的逻辑 - print('App has entered the background.'); - if (StartChartManage().talkStatus.status == - TalkStatus.passiveCallWaitingAnswer || - StartChartManage().talkStatus.status == - TalkStatus.proactivelyCallWaitingAnswer) { - StartChartManage().startTalkHangupMessageTimer(); - StartChartManage().startTalkRejectMessageTimer(); - // 如果是等待接听时就退出页面 + + final status = StartChartManage().talkStatus.status; + + if (status == TalkStatus.passiveCallWaitingAnswer || + status == TalkStatus.proactivelyCallWaitingAnswer || + status == TalkStatus.answeredSuccessfully || + status == TalkStatus.uninitialized) { + StartChartManage().destruction(); Get.back(); } - StartChartManage().destruction(); } void onAppResumed() async { From 823b268380043b92f97f9d331cd0b00994548364 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 8 Apr 2025 14:34:25 +0800 Subject: [PATCH 103/135] =?UTF-8?q?fix:=E9=85=8D=E7=BD=91=E6=97=B6?= =?UTF-8?q?=E8=93=9D=E7=89=99=E8=B6=85=E6=97=B6=E8=BF=9B=E8=A1=8C=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=EF=BC=8C=E8=B0=83=E6=95=B4=E9=85=8D=E7=BD=91=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E5=90=8E=E7=9A=84=E4=B8=8A=E6=8A=A5=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuringWifi_logic.dart | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart index f4688019..c38d4761 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart @@ -62,10 +62,8 @@ class ConfiguringWifiLogic extends BaseGetXController { peerId: peerId, ); if (entity.errorCode!.codeIsSuccessful) { - await _getUploadLockSet(); + showToast('配网成功'.tr, something: () async { - eventBus - .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); // 设置锁的peerID StartChartManage().lockNetworkInfo = DeviceNetworkInfo( wifiName: wifiName, @@ -74,6 +72,7 @@ class ConfiguringWifiLogic extends BaseGetXController { peerId: peerId, ); }); + _getUploadLockSet(); } } @@ -135,7 +134,7 @@ class ConfiguringWifiLogic extends BaseGetXController { // 保存到缓存 await Storage.saveLockNetWorkInfo(jsonMap); // 上报服务器 - updateNetworkInfo( + updateNetworkInfo( peerId: peerId ?? '', wifiName: wifiName ?? '', secretKey: secretKey ?? '', @@ -231,6 +230,13 @@ class ConfiguringWifiLogic extends BaseGetXController { password: state.wifiPWDController.text, gatewayConfigurationStr: state.getGatewayConfigurationStr, ); + } else if (connectionState == BluetoothConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + state.sureBtnState.value = 0; + if (state.ifCurrentScreen.value == true) { + showBlueConnetctToast(); + } } }, isAddEquipment: true, @@ -391,10 +397,10 @@ class ConfiguringWifiLogic extends BaseGetXController { // 上传数据获取设置 Future _getUploadLockSet() async { - showEasyLoading(); - showBlueConnetctToastTimer(action: () { - dismissEasyLoading(); - }); + // showEasyLoading(); + // showBlueConnetctToastTimer(action: () { + // dismissEasyLoading(); + // }); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { @@ -476,6 +482,8 @@ class ConfiguringWifiLogic extends BaseGetXController { Get.offAllNamed(Routers.starLockMain); } dismissEasyLoading(); + eventBus + .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); if (state.loadingTimer != null) { state.loadingTimer!.cancel(); state.loadingTimer = null; @@ -493,6 +501,5 @@ class ConfiguringWifiLogic extends BaseGetXController { state.loadingTimer!.cancel(); state.loadingTimer = null; } - } } From 3552d154294ce44d4919f0a273f5856611f24ed8 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 8 Apr 2025 14:34:59 +0800 Subject: [PATCH 104/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E5=90=8C?= =?UTF-8?q?=E6=84=8F=E9=9A=90=E7=A7=81=E5=8D=8F=E8=AE=AE=E4=B9=8B=E5=90=8E?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=B8=80=E9=94=AE=E7=99=BB=E5=BD=95=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/login/starLock_login_logic.dart | 22 ++++++++++++++++------ lib/main.dart | 4 +++- lib/tools/eventBusEventManage.dart | 5 +++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/lib/login/login/starLock_login_logic.dart b/lib/login/login/starLock_login_logic.dart index d7244068..d0f5d2cd 100755 --- a/lib/login/login/starLock_login_logic.dart +++ b/lib/login/login/starLock_login_logic.dart @@ -1,18 +1,17 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/apm/apm_helper.dart'; -import 'package:jverify/jverify.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/blue/blue_manage.dart'; +import 'package:star_lock/blue/io_tool/manager_event_bus.dart'; import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/mine/mine/starLockMine_state.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart'; import 'package:star_lock/network/start_chart_api.dart'; import 'package:star_lock/talk/starChart/entity/star_chart_register_node_entity.dart'; +import 'package:star_lock/tools/appFirstEnterHandle.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../main/lockMian/lockMain/lockMain_logic.dart'; @@ -143,7 +142,7 @@ class StarLockLoginLogic extends BaseGetXController { if (entity.errorCode!.codeIsSuccessful) { if (state.countryName != entity.data!.name) { ShowTipView().showSureAlertDialog( - '国家地区的选择将影响数据安全,你当前选择的是'+state.countryName+'请确认后再继续'.tr, + '国家地区的选择将影响数据安全,你当前选择的是' + state.countryName + '请确认后再继续'.tr, tipTitle: '确认国家或地区'.tr, sureStr: '我知道了'.tr); } @@ -175,11 +174,22 @@ class StarLockLoginLogic extends BaseGetXController { state.canNext.value = state.pwdIsOK && state.isEmailOrPhone; } + void _initEventListen() { + eventBus + .on() + .listen((AgreePrivacyAgreement event) async { + await JverifyOneClickLoginManage(); + oneClickLoginAction(); + state.isCheckVerifyEnable.value = + await JverifyOneClickLoginManage().checkVerifyEnable(); + AppLog.log('一键登录初始化认证结果:${state.isCheckVerifyEnable.value}'); + }); + } + @override Future onInit() async { + _initEventListen(); super.onInit(); - - } @override diff --git a/lib/main.dart b/lib/main.dart index 9e20bdd8..9e9f5927 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,6 +18,7 @@ import 'package:star_lock/talk/starChart/handle/impl/debug_Info_model.dart'; import 'package:star_lock/talk/starChart/status/appLifecycle_observer.dart'; import 'package:star_lock/tools/bugly/bugly_tool.dart'; import 'package:star_lock/tools/device_info_service.dart'; +import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/jverify_one_click_login.dart'; import 'package:star_lock/tools/platform_info_services.dart'; import 'package:star_lock/tools/push/notification_service.dart'; @@ -104,8 +105,9 @@ Future privacySDKInitialization() async { // 初始化一键登录服务 final StarLockLoginLogic loginLogic = Get.put(StarLockLoginLogic()); - JverifyOneClickLoginManage(); + await JverifyOneClickLoginManage(); loginLogic.oneClickLoginAction(); loginLogic.state.isCheckVerifyEnable.value = await JverifyOneClickLoginManage().checkVerifyEnable(); + eventBus.fire(AgreePrivacyAgreement()); } diff --git a/lib/tools/eventBusEventManage.dart b/lib/tools/eventBusEventManage.dart index 5d5e7416..a1791c6e 100755 --- a/lib/tools/eventBusEventManage.dart +++ b/lib/tools/eventBusEventManage.dart @@ -195,3 +195,8 @@ class RogerThatLockInfoDataEvent { class GetGatewayListRefreshUI { GetGatewayListRefreshUI(); } +/// 同意隐私协议 +class AgreePrivacyAgreement { + AgreePrivacyAgreement(); +} + From 99813877b6839e19f8d74a038411ece19594befb Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 8 Apr 2025 14:35:15 +0800 Subject: [PATCH 105/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E4=BA=BA?= =?UTF-8?q?=E8=84=B8=E5=88=97=E8=A1=A8=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../face/faceList/faceList_logic.dart | 39 ++++++++++------- .../face/faceList/faceList_page.dart | 42 ++++++------------- 2 files changed, 38 insertions(+), 43 deletions(-) diff --git a/lib/main/lockDetail/face/faceList/faceList_logic.dart b/lib/main/lockDetail/face/faceList/faceList_logic.dart index debdc5ce..9781a916 100755 --- a/lib/main/lockDetail/face/faceList/faceList_logic.dart +++ b/lib/main/lockDetail/face/faceList/faceList_logic.dart @@ -22,6 +22,7 @@ class FaceListLogic extends BaseGetXController { // 获取解析后的数据 late StreamSubscription _replySubscription; + void _initReplySubscription() { _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { @@ -77,11 +78,15 @@ class FaceListLogic extends BaseGetXController { userID: (await Storage.getUid())!, faceNo: state.deletFaceNo, useCountLimit: 0xffff, - operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 + operate: state.isDeletAll == true ? 3 : 2, + // 0:注册 1:修改 2:删除 3:删除全部 isAdmin: 0, - isForce: 0, // 是否是胁迫 - isRound: 0, // 是否是循环 - weekRound: 0, // 周循环 + isForce: 0, + // 是否是胁迫 + isRound: 0, + // 是否是循环 + weekRound: 0, + // 周循环 startDate: 0x11223344, endDate: 0x11223344, startTime: '0', @@ -277,11 +282,15 @@ class FaceListLogic extends BaseGetXController { userID: (await Storage.getUid())!, faceNo: state.deletFaceNo, useCountLimit: 0xffff, - operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 + operate: state.isDeletAll == true ? 3 : 2, + // 0:注册 1:修改 2:删除 3:删除全部 isAdmin: 0, - isForce: 0, // 是否是胁迫 - isRound: 0, // 是否是循环 - weekRound: 0, // 周循环 + isForce: 0, + // 是否是胁迫 + isRound: 0, + // 是否是循环 + weekRound: 0, + // 周循环 startDate: 0x11223344, endDate: 0x11223344, startTime: '0', @@ -348,8 +357,8 @@ class FaceListLogic extends BaseGetXController { lockId: state.lockId.value, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('删除成功'.tr, something: () { - getFaceListData(isRefresh: true); + showToast('删除成功'.tr, something: () async { + await getFaceListData(isRefresh: true); }); } } @@ -366,8 +375,8 @@ class FaceListLogic extends BaseGetXController { lockId: state.lockId.value, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('重置成功'.tr, something: () { - getFaceListData(isRefresh: true); + showToast('重置成功'.tr, something: () async{ + await getFaceListData(isRefresh: true); }); } } @@ -403,11 +412,12 @@ class FaceListLogic extends BaseGetXController { // 监听修改完详情之后刷新列表 late StreamSubscription _teamEvent; + void _initRefreshAction() { _teamEvent = eventBus .on() - .listen((OtherTypeRefreshListEvent event) { - getFaceListData(isRefresh: true); + .listen((OtherTypeRefreshListEvent event) async { + await getFaceListData(isRefresh: true); }); } @@ -434,6 +444,7 @@ class FaceListLogic extends BaseGetXController { // senderCheckingUserInfoCount(); } + getFaceListData(isRefresh: true); } @override diff --git a/lib/main/lockDetail/face/faceList/faceList_page.dart b/lib/main/lockDetail/face/faceList/faceList_page.dart index 5758785b..43248d26 100755 --- a/lib/main/lockDetail/face/faceList/faceList_page.dart +++ b/lib/main/lockDetail/face/faceList/faceList_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -31,24 +30,6 @@ class _FaceListPageState extends State with RouteAware { final FaceListLogic logic = Get.put(FaceListLogic()); final FaceListState state = Get.find().state; - Future getHttpData({required bool isRefresh}) async { - final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); - if (isDemoMode == false) { - logic.getFaceListData(isRefresh: isRefresh).then((FingerprintListDataEntity value) { - if (mounted) { - setState(() {}); - } - }); - } - } - - @override - void initState() { - super.initState(); - - getHttpData(isRefresh: true); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -92,17 +73,17 @@ class _FaceListPageState extends State with RouteAware { ), body: EasyRefreshTool( onRefresh: () { - getHttpData(isRefresh: true); + logic.getFaceListData(isRefresh: true); }, onLoad: () { - getHttpData(isRefresh: false); + logic.getFaceListData(isRefresh: false); }, child: Column( children: [ KeySearchWidget( editingController: state.searchController, onSubmittedAction: () { - getHttpData(isRefresh: true); + logic.getFaceListData(isRefresh: true); }, ), SizedBox( @@ -110,14 +91,15 @@ class _FaceListPageState extends State with RouteAware { ), Expanded(child: _buildMainUI()), AddBottomWhiteBtn( - btnName: - '添加人脸'.tr, + btnName: '添加人脸'.tr, onClick: () async { - await Get.toNamed(Routers.addFaceTypePage, arguments: { + await Get.toNamed(Routers.addFaceTypePage, + arguments: { 'lockId': state.lockId.value, 'fromType': 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入 - })!.then((value) { - getHttpData(isRefresh: true); + })! + .then((value) { + logic.getFaceListData(isRefresh: true); }); }, ), @@ -154,9 +136,11 @@ class _FaceListPageState extends State with RouteAware { logic.getKeyType(getFaceItemData), logic.getKeyDateType(getFaceItemData), () async { await Get.toNamed(Routers.faceDetailPage, - arguments: { + arguments: { 'faceItemData': getFaceItemData, - })!.then((value) => getHttpData(isRefresh: true)); + })! + .then((value) => + logic.getFaceListData(isRefresh: true)); }), ); } From fe82f87200e1b65092f4937af4179615eb111ab4 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 8 Apr 2025 14:35:36 +0800 Subject: [PATCH 106/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E5=AF=B9=E8=AE=B2=E8=AF=B7=E6=B1=82=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handle/impl/udp_talk_request_handler.dart | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart index 06b79ad6..be2f4565 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart @@ -25,8 +25,24 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle RxString currentLanguage = CurrentLocaleTool.getCurrentLocaleString().obs; // 当前选择语言 + // 添加上次处理请求的时间戳 + int _lastRequestTime = 0; + @override void handleReq(ScpMessage scpMessage) async { + + final currentTime = DateTime.now().millisecondsSinceEpoch; + // 确保与上次请求间隔至少1秒 + if (currentTime - _lastRequestTime < 1000) { + // 如果间隔小于1秒,直接拒绝请求 + replyErrorMessage(scpMessage); + AppLog.log('对讲请求过于频繁,已拒绝'); + return; + } + + // 更新最后处理时间 + _lastRequestTime = currentTime; + // 判断是否登录账户 final loginData = await Storage.getLoginData(); @@ -47,6 +63,7 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle } else { // 拒绝接听,回复失败 replyErrorMessage(scpMessage); + AppLog.log('正在接听,回复拒绝'); } } From 5864b290557005543af2b581949c4ef2ee248c8e Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 8 Apr 2025 14:35:43 +0800 Subject: [PATCH 107/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_hk.json | 6 +++--- lan/lan_tw.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lan/lan_hk.json b/lan/lan_hk.json index 101c334c..49b5232c 100644 --- a/lan/lan_hk.json +++ b/lan/lan_hk.json @@ -173,9 +173,9 @@ "接收人信息": "收件人", "转移网关": "傳輸網關", "锁屏": "屏幕鎖定", - "已关闭": "關閉", - "已开启": "上", - "开启": "開", + "已关闭": "已關閉", + "已开启": "已開啟", + "开启": "開啟", "确定要开启重置键?": "繼續啟用Reset掣?", "确定要关闭重置键?": "繼續禁用Reset掣?", "隐藏无效开锁权限": "隱藏無效訪問權限", diff --git a/lan/lan_tw.json b/lan/lan_tw.json index f1ed8445..7110352a 100644 --- a/lan/lan_tw.json +++ b/lan/lan_tw.json @@ -172,9 +172,9 @@ "接收人信息": "收件人", "转移网关": "傳輸網關", "锁屏": "屏幕鎖定", - "已关闭": "關", - "已开启": "開啟", - "开启": "打開", + "已关闭": "已關閉", + "已开启": "已開啟", + "开启": "開啟", "确定要开启重置键?": "是否繼續啟用重置按鈕?", "确定要关闭重置键?": "是否繼續禁用重置按鈕?", "隐藏无效开锁权限": "隱藏無效訪問", From 47b0a18ef3d998ea238fa172a1d7657c35b6fb17 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 8 Apr 2025 16:43:11 +0800 Subject: [PATCH 108/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E5=B8=A7=E7=BC=93=E5=86=B2=E5=8C=BA=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=BC=93=E5=86=B2=E5=8C=BA=E6=9C=80=E5=A4=A7=E5=A4=A7=E5=B0=8F?= =?UTF-8?q?=E8=87=B320=E5=B8=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/talkView/talk_view_logic.dart | 48 +++++++++++-------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index 8c0e3737..05d0636c 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -56,6 +56,9 @@ class TalkViewLogic extends BaseGetXController { final Map _imageCache = {}; + // 添加一个变量用于记录上一帧的时间戳 + int _lastFrameTimestamp = 0; // 初始值为 0 + // 添加帧率计算相关变量 int _frameCount = 0; int _lastFpsUpdateTime = 0; @@ -100,11 +103,11 @@ class TalkViewLogic extends BaseGetXController { // 判断数据类型,进行分发处理 switch (contentType) { case TalkData_ContentTypeE.G711: - // 第一帧到达时记录开始时间 - if (_isFirstAudioFrame) { - _startAudioTime = currentTime; - _isFirstAudioFrame = false; - } + // // 第一帧到达时记录开始时间 + // if (_isFirstAudioFrame) { + // _startAudioTime = currentTime; + // _isFirstAudioFrame = false; + // } // 计算音频延迟 final expectedTime = _startAudioTime + talkData.durationMs; @@ -130,15 +133,16 @@ class TalkViewLogic extends BaseGetXController { if (_isFirstFrame) { _startTime = currentTime; _isFirstFrame = false; - // AppLog.log('记录第一帧的时间戳${currentTime},${talkData.durationMs}'); + AppLog.log('第一帧帧的时间戳:${talkData.durationMs}'); } + // AppLog.log('其他帧的时间戳:${talkData.durationMs}'); + // 计算帧间间隔 + if (_lastFrameTimestamp != 0) { + final int frameInterval = talkData.durationMs - _lastFrameTimestamp; + _adjustBufferSize(frameInterval); // 根据帧间间隔调整缓冲区 + } + _lastFrameTimestamp = talkData.durationMs; // 更新上一帧时间戳 - // 计算实际延迟:当前时间 - 预期播放时间 - final expectedTime = _startTime + talkData.durationMs; - final videoDelay = currentTime - expectedTime; // 修改延迟计算方式 - - // 动态调整缓冲区 - _adjustBufferSize(videoDelay); // 然后添加到播放缓冲区 if (state.videoBuffer.length >= bufferSize) { state.videoBuffer.removeAt(0); @@ -257,19 +261,21 @@ class TalkViewLogic extends BaseGetXController { } // 新增:动态调整缓冲区大小的方法 - void _adjustBufferSize(int delay) { - const int delayThresholdHigh = 250; // 高延迟阈值(约3帧的时间) - const int delayThresholdLow = 166; // 低延迟阈值(约2帧的时间) + void _adjustBufferSize(int frameInterval) { + const int frameDuration = 83; // 假设每帧的时间间隔为 83ms(12fps) + const int delayThresholdHigh = frameDuration * 2; // 高延迟阈值(2帧时间) + const int delayThresholdLow = frameDuration; // 低延迟阈值(1帧时间) const int adjustInterval = 1; // 每次调整1帧 - if (delay > delayThresholdHigh && bufferSize < maxBufferSize) { - // 延迟较大,增加缓冲区 + if (frameInterval > delayThresholdHigh && bufferSize < maxBufferSize) { + // 帧间间隔较大,增加缓冲区 bufferSize = min(bufferSize + adjustInterval, maxBufferSize); - // AppLog.log('📈 增加缓冲区 - 当前大小: $bufferSize, 延迟: ${delay}ms'); - } else if (delay < delayThresholdLow && bufferSize > minBufferSize) { - // 延迟较小,减少缓冲区 + AppLog.log('📈 增加缓冲区 - 当前大小: $bufferSize, 帧间间隔: ${frameInterval}ms'); + } else if (frameInterval < delayThresholdLow && + bufferSize > minBufferSize) { + // 帧间间隔较小,减少缓冲区 bufferSize = max(bufferSize - adjustInterval, minBufferSize); - // AppLog.log('📉 减少缓冲区 - 当前大小: $bufferSize, 延迟: ${delay}ms'); + AppLog.log('📉 减少缓冲区 - 当前大小: $bufferSize, 帧间间隔: ${frameInterval}ms'); } } From c373cc402a5b258c27b1173eedaba1508d16dbeb Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 9 Apr 2025 10:40:15 +0800 Subject: [PATCH 109/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=A1=B9=E7=9B=AE=E8=B6=85=E5=87=BA=E5=B1=8F=E5=B9=95?= =?UTF-8?q?=E6=97=B6=E6=97=A0=E6=B3=95=E4=B8=8B=E6=BB=91=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main/lockDetail/lockDetail/lockDetail_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/lib/main/lockDetail/lockDetail/lockDetail_page.dart index 4352d93d..db230836 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -1024,7 +1024,7 @@ class _LockDetailPageState extends State Widget widget = getBottomWidget()[index]; return widget; }, - physics: const NeverScrollableScrollPhysics(), + // physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, ) From 80787fd0ea8e93c18d17ddef05744e587670890a Mon Sep 17 00:00:00 2001 From: Liuyf Date: Thu, 10 Apr 2025 09:50:36 +0800 Subject: [PATCH 110/135] =?UTF-8?q?fix:=20=E4=B8=87=E5=B8=88=E5=82=85?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E9=81=AE=E7=9B=96=E4=BD=8F=E4=BA=86=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E8=B4=A6=E5=8F=B7=E5=8A=9F=E8=83=BD=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E5=AF=BC=E8=87=B4=E5=AE=A1=E6=A0=B8=E4=B8=8D=E9=80=9A?= =?UTF-8?q?=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/mine/mineSet/mineSet/mineSet_page.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mine/mineSet/mineSet/mineSet_page.dart b/lib/mine/mineSet/mineSet/mineSet_page.dart index a098bb8b..a2926a55 100755 --- a/lib/mine/mineSet/mineSet/mineSet_page.dart +++ b/lib/mine/mineSet/mineSet/mineSet_page.dart @@ -456,10 +456,10 @@ class _MineSetPageState extends State // showLoginOutAlertTipDialog(); }), Container( - padding: EdgeInsets.only(right: 30.w, top: 30.h), + padding: EdgeInsets.only(left: 30.w, top: 30.h), // color: Colors.red, child: Row( - mainAxisAlignment: MainAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.start, children: [ TextButton( child: Text( From 49ed1695069bd42d331edcad92c8e8b84e7da017 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 10 Apr 2025 11:05:09 +0800 Subject: [PATCH 111/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E9=85=8D=E7=BD=91=E4=BF=A1=E6=81=AF=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main/lockDetail/lockDetail/lockDetail_logic.dart | 11 +++++++++-- lib/main/lockDetail/lockDetail/lockDetail_page.dart | 1 - .../configuringWifi/configuringWifi_logic.dart | 2 ++ lib/tools/eventBusEventManage.dart | 4 ++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index ee7ba5f8..80198af5 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -285,7 +285,7 @@ class LockDetailLogic extends BaseGetXController { final List publicKeyData = state.keyInfos.value.bluetooth!.publicKey!.cast(); final List saveStrList = changeIntListToStringList(publicKeyData); - await Storage.setStringList(saveBluePublicKey, saveStrList); + await Storage.setStringList(saveBluePublicKey, saveStrList); // 私钥 final List privateKeyData = @@ -298,7 +298,7 @@ class LockDetailLogic extends BaseGetXController { final List signKeyData = state.keyInfos.value.bluetooth!.signKey!.cast(); final List saveSignKeyList = changeIntListToStringList(signKeyData); - await Storage.setStringList(saveBlueSignKey, saveSignKeyList); + await Storage.setStringList(saveBlueSignKey, saveSignKeyList); final bool ifHaveKey = await Storage.ifHaveKey(saveBlueToken); if (!ifHaveKey) { @@ -838,5 +838,12 @@ class LockDetailLogic extends BaseGetXController { state.keyInfos.refresh(); } }); + + eventBus + .on() + .listen((SuccessfulDistributionNetwork event) { + // 配网成功获取一下配网信息 + requestDeviceNetworkInfo(); + }); } } diff --git a/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/lib/main/lockDetail/lockDetail/lockDetail_page.dart index db230836..1040b5ba 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -89,7 +89,6 @@ class _LockDetailPageState extends State AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!); state.isOpenLockNeedOnline.refresh(); - logic.requestDeviceNetworkInfo(); } StreamSubscription? _lockRefreshLockDetailInfoDataEvent; diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart index c38d4761..9b25bf55 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart @@ -484,6 +484,8 @@ class ConfiguringWifiLogic extends BaseGetXController { dismissEasyLoading(); eventBus .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + eventBus + .fire(SuccessfulDistributionNetwork()); if (state.loadingTimer != null) { state.loadingTimer!.cancel(); state.loadingTimer = null; diff --git a/lib/tools/eventBusEventManage.dart b/lib/tools/eventBusEventManage.dart index a1791c6e..810ad0a6 100755 --- a/lib/tools/eventBusEventManage.dart +++ b/lib/tools/eventBusEventManage.dart @@ -200,3 +200,7 @@ class AgreePrivacyAgreement { AgreePrivacyAgreement(); } +/// 配网成功 +class SuccessfulDistributionNetwork { + SuccessfulDistributionNetwork(); +} From cd41dd4ccf8e1b25872267799bd3479df09bb8d6 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 10 Apr 2025 16:54:59 +0800 Subject: [PATCH 112/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E9=85=8D?= =?UTF-8?q?=E7=BD=91loading=E5=8D=A1=E4=B8=BB=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuringWifi_logic.dart | 156 +++++++----------- .../addLock/nearbyLock/nearbyLock_logic.dart | 4 +- 2 files changed, 61 insertions(+), 99 deletions(-) diff --git a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart index 9b25bf55..25c8e43d 100755 --- a/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart +++ b/lib/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifi_logic.dart @@ -62,17 +62,15 @@ class ConfiguringWifiLogic extends BaseGetXController { peerId: peerId, ); if (entity.errorCode!.codeIsSuccessful) { + // 设置锁的peerID + StartChartManage().lockNetworkInfo = DeviceNetworkInfo( + wifiName: wifiName, + networkMac: networkMac, + secretKey: secretKey, + peerId: peerId, + ); - showToast('配网成功'.tr, something: () async { - // 设置锁的peerID - StartChartManage().lockNetworkInfo = DeviceNetworkInfo( - wifiName: wifiName, - networkMac: networkMac, - secretKey: secretKey, - peerId: peerId, - ); - }); - _getUploadLockSet(); + await _getUploadLockSet(); } } @@ -106,8 +104,11 @@ class ConfiguringWifiLogic extends BaseGetXController { // WIFI配网结果 Future _replySenderConfiguringWifiResult(Reply reply) async { final int status = reply.data[2]; - state.sureBtnState.value = 0; - state.isLoading.value = false; + // state.sureBtnState.value = 0; + + // 取消loading超时定时器 + state.loadingTimer?.cancel(); + state.loadingTimer = null; switch (status) { case 0x00: @@ -140,15 +141,17 @@ class ConfiguringWifiLogic extends BaseGetXController { secretKey: secretKey ?? '', deviceMac: deviceMac ?? '', networkMac: networkMac ?? ''); + break; default: //失败 - dismissEasyLoading(); + dismissEasyLoading(); // 关闭loading + cancelBlueConnetctToastTimer(); if (state.loadingTimer != null) { state.loadingTimer!.cancel(); state.loadingTimer = null; } - cancelBlueConnetctToastTimer(); + showToast('配网失败'.tr); state.isLoading.value = false; break; @@ -164,7 +167,7 @@ class ConfiguringWifiLogic extends BaseGetXController { // 点击配置wifi Future senderConfiguringWifiAction() async { AppLog.log('开始配网${EasyLoading.isShow}'); - EasyLoading.show(); + if (state.isLoading.isTrue) { AppLog.log('正在配网中请勿重复点击'); return; @@ -178,10 +181,10 @@ class ConfiguringWifiLogic extends BaseGetXController { showToast('请输入WiFi密码'.tr); return; } - if (state.sureBtnState.value == 1) { - return; - } - state.sureBtnState.value = 1; + // if (state.sureBtnState.value == 1) { + // return; + // } + // state.sureBtnState.value = 1; final GetGatewayConfigurationEntity entity = await ApiRepository.to.getGatewayConfigurationNotLoading(timeout: 60); @@ -218,9 +221,13 @@ class ConfiguringWifiLogic extends BaseGetXController { // 如果为空,则直接赋值 state.getGatewayConfigurationStr = "{\"userPeerld\": \"$appPeerId\"}"; } + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); + state.isLoading.value = false; + }); - AppLog.log('获取到配网信息===开始发送蓝牙指令${EasyLoading.isShow}'); - + // 发送配网指令 BlueManage().blueSendData( BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { @@ -233,35 +240,16 @@ class ConfiguringWifiLogic extends BaseGetXController { } else if (connectionState == BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); - state.sureBtnState.value = 0; + state.isLoading.value = false; + // state.sureBtnState.value = 0; if (state.ifCurrentScreen.value == true) { showBlueConnetctToast(); } } }, - isAddEquipment: true, + isAddEquipment: false, ); - state.loadingTimer ??= Timer.periodic(Duration(milliseconds: 100), (timer) { - if (!EasyLoading.isShow) { - EasyLoading.show(); - } - }); - state.isLoading.value = true; - // 添加15秒超时检查 - Future.delayed(const Duration(seconds: 15), () { - if (state.isLoading.isTrue) { - EasyLoading.dismiss(); - state.isLoading.value = false; - state.sureBtnState.value = 0; - if (state.loadingTimer != null) { - state.loadingTimer!.cancel(); - state.loadingTimer = null; - } - showToast('配网失败'.tr); - } - }); - AppLog.log('发送方法执行完毕${EasyLoading.isShow}'); } // 获取设备状态 @@ -320,7 +308,7 @@ class ConfiguringWifiLogic extends BaseGetXController { getWifiLockServiceIpAndPort(); _initReplySubscription(); - getDevicesStatusAction(); + // getDevicesStatusAction(); } @override @@ -336,13 +324,13 @@ class ConfiguringWifiLogic extends BaseGetXController { void _replyGatewayGetStatusReply(GatewayGetStatusReply reply) { final int status = reply.data[2]; - + //成功 + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); switch (status) { case 0x00: //成功 - // state.sureBtnState.value = 0; - cancelBlueConnetctToastTimer(); - dismissEasyLoading(); + // state.sureBtnState.value = 0; final GetGatewayInfoModel gatewayModel = GetGatewayInfoModel(); // 网关MAC地址 @@ -393,28 +381,17 @@ class ConfiguringWifiLogic extends BaseGetXController { } } - void _replyStatusInfo(reply) {} - // 上传数据获取设置 Future _getUploadLockSet() async { - // showEasyLoading(); - // showBlueConnetctToastTimer(action: () { - // dismissEasyLoading(); - // }); - BlueManage().blueSendData(BlueManage().connectDeviceName, - (BluetoothConnectionState connectionState) async { - if (connectionState == BluetoothConnectionState.connected) { - final List? token = await Storage.getStringList(saveBlueToken); - final List getTokenList = changeStringListToIntList(token!); - - _uploadLockSet(getTokenList); - } else if (connectionState == BluetoothConnectionState.disconnected) { - cancelBlueConnetctToastTimer(); - if (state.ifCurrentScreen.value == true) { - showBlueConnetctToast(); - } - } + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); }); + + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); + + await _uploadLockSet(getTokenList); } // 公共的上传锁设置 @@ -438,15 +415,15 @@ class ConfiguringWifiLogic extends BaseGetXController { // 上传数据获取锁设置解析 Future _replyUpdataLockSetReply(Reply reply) async { final int status = reply.data[2]; + dismissEasyLoading(); // 关闭loading + cancelBlueConnetctToastTimer(); switch (status) { case 0x00: - //成功 - dismissEasyLoading(); - cancelBlueConnetctToastTimer(); - _lockDataUpload( + await _lockDataUpload( uploadType: 1, recordType: 0, records: reply.data.sublist(7, reply.data.length)); + break; case 0x06: //无权限 @@ -475,33 +452,18 @@ class ConfiguringWifiLogic extends BaseGetXController { records: records, isUnShowLoading: true); if (entity.errorCode!.codeIsSuccessful) { - await Future.delayed((Duration(seconds: 1))); - if (state.pageName.value == 'lockSet') { - Get.close(2); - } else { - Get.offAllNamed(Routers.starLockMain); - } - dismissEasyLoading(); - eventBus - .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - eventBus - .fire(SuccessfulDistributionNetwork()); - if (state.loadingTimer != null) { - state.loadingTimer!.cancel(); - state.loadingTimer = null; - } - } - } + showToast('配网成功'.tr, something: () { + state.isLoading.value = false; + if (state.pageName.value == 'lockSet') { + Get.close(2); + } else { + Get.offAllNamed(Routers.starLockMain); + } - @override - void dispose() { - dismissEasyLoading(); - // TODO: implement dispose - super.dispose(); - state.isLoading.value = false; - if (state.loadingTimer != null) { - state.loadingTimer!.cancel(); - state.loadingTimer = null; + eventBus + .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + eventBus.fire(SuccessfulDistributionNetwork()); + }); } } } diff --git a/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart b/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart index 77872c3c..05b499f0 100755 --- a/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart +++ b/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart @@ -93,7 +93,6 @@ class NearbyLockLogic extends BaseGetXController { showToast('固件升级完成'.tr); closeOTADAta(); } - dismissEasyLoading(); }); } @@ -160,6 +159,7 @@ class NearbyLockLogic extends BaseGetXController { // 获取星锁状态 Future _replyGetStarLockStatusInfo(Reply reply) async { final int status = reply.data[2]; + dismissEasyLoading(); switch (status) { case 0x00: //成功 @@ -743,8 +743,8 @@ class NearbyLockLogic extends BaseGetXController { @override void onClose() { - super.onClose(); _replySubscription?.cancel(); + super.onClose(); } Future getNearByLimits() async { From 807c71b614abbb21813c2009be84e083a10d560e Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 10 Apr 2025 18:16:48 +0800 Subject: [PATCH 113/135] =?UTF-8?q?fix:=E5=9B=BA=E5=AE=9A=E4=B8=BA20?= =?UTF-8?q?=E9=92=88=E7=BC=93=E5=86=B2=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/talkView/talk_view_logic.dart | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index 05d0636c..d4fd18f5 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -39,7 +39,7 @@ class TalkViewLogic extends BaseGetXController { final int minBufferSize = 2; // 最小缓冲2帧,约166ms final int maxBufferSize = 8; // 最大缓冲8帧,约666ms - int bufferSize = 3; // 初始化为默认大小 + int bufferSize = 20; // 初始化为默认大小 // 修改音频相关的成员变量 final int minAudioBufferSize = 1; // 音频最小缓冲1帧 final int maxAudioBufferSize = 3; // 音频最大缓冲3帧 @@ -137,11 +137,11 @@ class TalkViewLogic extends BaseGetXController { } // AppLog.log('其他帧的时间戳:${talkData.durationMs}'); // 计算帧间间隔 - if (_lastFrameTimestamp != 0) { - final int frameInterval = talkData.durationMs - _lastFrameTimestamp; - _adjustBufferSize(frameInterval); // 根据帧间间隔调整缓冲区 - } - _lastFrameTimestamp = talkData.durationMs; // 更新上一帧时间戳 + // if (_lastFrameTimestamp != 0) { + // final int frameInterval = talkData.durationMs - _lastFrameTimestamp; + // _adjustBufferSize(frameInterval); // 根据帧间间隔调整缓冲区 + // } + // _lastFrameTimestamp = talkData.durationMs; // 更新上一帧时间戳 // 然后添加到播放缓冲区 if (state.videoBuffer.length >= bufferSize) { @@ -185,16 +185,16 @@ class TalkViewLogic extends BaseGetXController { state.videoBuffer.removeAt(oldestIndex); // 移除已播放的帧 // 更新帧率计算 - _frameCount++; - final currentTime = DateTime.now().millisecondsSinceEpoch; - final elapsed = currentTime - _lastFpsUpdateTime; - - if (elapsed >= 1000) { - // 每秒更新一次 - state.fps.value = (_frameCount * 1000 / elapsed).round(); - _frameCount = 0; - _lastFpsUpdateTime = currentTime; - } + // _frameCount++; + // final currentTime = DateTime.now().millisecondsSinceEpoch; + // final elapsed = currentTime - _lastFpsUpdateTime; + // + // if (elapsed >= 1000) { + // // 每秒更新一次 + // state.fps.value = (_frameCount * 1000 / elapsed).round(); + // _frameCount = 0; + // _lastFpsUpdateTime = currentTime; + // } // AppLog.log('🎬 播放帧 - 缓冲区剩余: ${state.videoBuffer.length}/${bufferSize}, ' // '播放延迟: ${currentTime - oldestFrame.durationMs}ms, ' // '帧时间戳: ${oldestFrame.durationMs}'); From c4191dbc95559b48e6c07b02f0729ebb415cd9c5 Mon Sep 17 00:00:00 2001 From: liyi Date: Fri, 11 Apr 2025 10:06:09 +0800 Subject: [PATCH 114/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8D=A1=E7=89=87=E6=97=B6=E4=BC=9A=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E5=88=97=E8=A1=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../card/cardList/cardList_logic.dart | 27 +++++++++---- .../card/cardList/cardList_page.dart | 40 +++++++++---------- 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/lib/main/lockDetail/card/cardList/cardList_logic.dart b/lib/main/lockDetail/card/cardList/cardList_logic.dart index a11cd18c..022ff0fb 100755 --- a/lib/main/lockDetail/card/cardList/cardList_logic.dart +++ b/lib/main/lockDetail/card/cardList/cardList_logic.dart @@ -28,6 +28,7 @@ class CardListLogic extends BaseGetXController { // 获取解析后的数据 late StreamSubscription _replySubscription; + void _initReplySubscription() { _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { @@ -69,11 +70,15 @@ class CardListLogic extends BaseGetXController { userID: (await Storage.getUid())!, cardNo: state.deletCardNo, useCountLimit: 0xffff, - operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 + operate: state.isDeletAll == true ? 3 : 2, + // 0:注册 1:修改 2:删除 3:删除全部 isAdmin: 0, - isForce: 0, // 是否是胁迫 - isRound: 0, // 是否是循环 - weekRound: 0, // 周循环 + isForce: 0, + // 是否是胁迫 + isRound: 0, + // 是否是循环 + weekRound: 0, + // 周循环 startDate: 0x11223344, endDate: 0x11223344, startTime: '0', @@ -116,11 +121,15 @@ class CardListLogic extends BaseGetXController { userID: (await Storage.getUid())!, cardNo: state.deletCardNo, useCountLimit: 0xffff, - operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 + operate: state.isDeletAll == true ? 3 : 2, + // 0:注册 1:修改 2:删除 3:删除全部 isAdmin: 0, - isForce: 0, // 是否是胁迫 - isRound: 0, // 是否是循环 - weekRound: 0, // 周循环 + isForce: 0, + // 是否是胁迫 + isRound: 0, + // 是否是循环 + weekRound: 0, + // 周循环 startDate: 0x11223344, endDate: 0x11223344, startTime: '0', @@ -193,6 +202,7 @@ class CardListLogic extends BaseGetXController { // 监听修改完详情之后刷新列表 late StreamSubscription _teamEvent; + void _initRefreshAction() { _teamEvent = eventBus .on() @@ -240,6 +250,7 @@ class CardListLogic extends BaseGetXController { _initRefreshAction(); } + await getICCardListData(isRefresh: true); } @override diff --git a/lib/main/lockDetail/card/cardList/cardList_page.dart b/lib/main/lockDetail/card/cardList/cardList_page.dart index 705d5c8c..f5fe77e1 100755 --- a/lib/main/lockDetail/card/cardList/cardList_page.dart +++ b/lib/main/lockDetail/card/cardList/cardList_page.dart @@ -31,24 +31,24 @@ class _CardListPageState extends State with RouteAware { final CardListLogic logic = Get.put(CardListLogic()); final CardListState state = Get.find().state; - Future getHttpData({required bool isRefresh}) async { - final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); - if (isDemoMode == false) { - logic - .getICCardListData(isRefresh: isRefresh) - .then((FingerprintListDataEntity value) { - if (mounted) { - setState(() {}); - } - }); - } - } + // Future logic.getICCardListData({required bool isRefresh}) async { + // final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + // if (isDemoMode == false) { + // logic + // .getICCardListData(isRefresh: isRefresh) + // .then((FingerprintListDataEntity value) { + // if (mounted) { + // setState(() {}); + // } + // }); + // } + // } @override void initState() { super.initState(); - getHttpData(isRefresh: true); + // logic.getICCardListData(isRefresh: true); } @override @@ -92,17 +92,17 @@ class _CardListPageState extends State with RouteAware { ), body: EasyRefreshTool( onRefresh: () { - getHttpData(isRefresh: true); + logic.getICCardListData(isRefresh: true); }, onLoad: () { - getHttpData(isRefresh: false); + logic.getICCardListData(isRefresh: false); }, child: Column( children: [ KeySearchWidget( editingController: state.searchController, onSubmittedAction: () { - getHttpData(isRefresh: true); + logic.getICCardListData(isRefresh: true); }, ), SizedBox(height: 20.h), @@ -115,10 +115,10 @@ class _CardListPageState extends State with RouteAware { 'fromType': 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入 })! .then((value) { - getHttpData(isRefresh: true); + logic.getICCardListData(isRefresh: true); }); // if (data != null) { - // getHttpData(isRefresh: true); + // logic.getICCardListData(isRefresh: true); // } }, ), @@ -180,9 +180,9 @@ class _CardListPageState extends State with RouteAware { arguments: { 'fingerprintItemData': fingerprintItemData, })! - .then((value) => getHttpData(isRefresh: true)); + .then((value) => logic.getICCardListData(isRefresh: true)); // if (data != null) { - // getHttpData(isRefresh: true); + // logic.getICCardListData(isRefresh: true); // } }), ); From c9690430f70e86c07c5552ec62eeb36313ac8af1 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 15 Apr 2025 16:01:16 +0800 Subject: [PATCH 115/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=E5=B7=B2=E6=BB=A1=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lockDetail/card/addICCard/addICCard_logic.dart | 11 ++++++++++- lib/main/lockDetail/face/addFace/addFace_logic.dart | 12 +++++++++--- .../addFingerprint/addFingerprint_logic.dart | 9 ++++++--- lib/main/lockDetail/palm/addPalm/addPalm_logic.dart | 7 +++++++ .../addRemoteControl/addRemoteControl_logic.dart | 8 ++++++++ 5 files changed, 40 insertions(+), 7 deletions(-) diff --git a/lib/main/lockDetail/card/addICCard/addICCard_logic.dart b/lib/main/lockDetail/card/addICCard/addICCard_logic.dart index dda931b0..2729347b 100755 --- a/lib/main/lockDetail/card/addICCard/addICCard_logic.dart +++ b/lib/main/lockDetail/card/addICCard/addICCard_logic.dart @@ -80,7 +80,7 @@ class AddICCardLogic extends BaseGetXController { final List token = reply.data.sublist(5, 9); final List saveStrList = changeIntListToStringList(token); Storage.setStringList(saveBlueToken, saveStrList); - // AppLog.log('添加卡token:$token'); + AppLog.log('添加卡token:$token'); IoSenderManage.senderAddCardWithTimeCycleCoercionCommand( keyID: '1', @@ -107,6 +107,14 @@ class AddICCardLogic extends BaseGetXController { token: token, isBeforeAddUser: false); break; + case 0xFE: + case 12: + // 管理员已满 + state.ifAddState.value = false; + showToast('管理员已满'.tr, something: () { + Get.back(); + }); + break; default: //失败 state.ifAddState.value = false; @@ -146,6 +154,7 @@ class AddICCardLogic extends BaseGetXController { Get.close(1); break; case 0xFE: + case 0x12: // 管理员已满 showToast('管理员已满'.tr); Get.close(1); diff --git a/lib/main/lockDetail/face/addFace/addFace_logic.dart b/lib/main/lockDetail/face/addFace/addFace_logic.dart index d7fe6bd3..5900580c 100755 --- a/lib/main/lockDetail/face/addFace/addFace_logic.dart +++ b/lib/main/lockDetail/face/addFace/addFace_logic.dart @@ -54,7 +54,7 @@ class AddFaceLogic extends BaseGetXController { // 最大图片数 state.maxRegCount.value = reply.data[11]; - // AppLog.log('人脸开始state.maxRegCount.value:${state.maxRegCount.value}'); + AppLog.log('人脸开始state.maxRegCount.value:${state.maxRegCount.value}'); break; case 0x06: //无权限 @@ -89,6 +89,12 @@ class AddFaceLogic extends BaseGetXController { isBeforeAddUser: false ); break; + case 0xFE: + case 12: + // 管理员已满 + showToast('管理员已满'.tr); + Get.close(1); + break; default: //失败 state.ifAddState.value = false; @@ -112,9 +118,9 @@ class AddFaceLogic extends BaseGetXController { Get.close(1); break; case 0xFE: + case 12: // 管理员已满 showToast('管理员已满'.tr); - state.ifAddState.value = false; Get.close(1); break; case 0xFD: @@ -138,7 +144,7 @@ class AddFaceLogic extends BaseGetXController { // 添加人脸中 // 当前注册数 state.regIndex.value = reply.data[6]; - // AppLog.log('注册人脸过程state.regIndex.value:${state.regIndex.value}'); + AppLog.log('注册人脸过程state.regIndex.value:${state.regIndex.value}'); break; } diff --git a/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart b/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart index 6bd97fb8..c5ff8d1c 100755 --- a/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart +++ b/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart @@ -106,6 +106,7 @@ class AddFingerprintLogic extends BaseGetXController { isBeforeAddUser: false); break; case 0xFE: + case 12: // 管理员已满 state.ifAddState.value = false; showToast('管理员已满'.tr, something: () { @@ -139,10 +140,12 @@ class AddFingerprintLogic extends BaseGetXController { Get.close(1); break; case 0xFE: - // 管理员已满 - showToast('管理员已满'.tr); + case 12: + // 管理员已满 state.ifAddState.value = false; - Get.close(1); + showToast('管理员已满'.tr, something: () { + Get.back(); + }); break; case 0xFD: // 用户已满 diff --git a/lib/main/lockDetail/palm/addPalm/addPalm_logic.dart b/lib/main/lockDetail/palm/addPalm/addPalm_logic.dart index 19ca548d..eb843a3a 100755 --- a/lib/main/lockDetail/palm/addPalm/addPalm_logic.dart +++ b/lib/main/lockDetail/palm/addPalm/addPalm_logic.dart @@ -90,6 +90,12 @@ class AddPalmLogic extends BaseGetXController { isBeforeAddUser: false ); break; + case 0xFE: + case 12: + // 管理员已满 + showToast('管理员已满'.tr); + Get.close(1); + break; default: //失败 state.ifAddState.value = false; @@ -111,6 +117,7 @@ class AddPalmLogic extends BaseGetXController { Get.close(1); break; case 0xFE: + case 12: // 管理员已满 showToast('管理员已满'.tr); Get.close(1); diff --git a/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_logic.dart b/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_logic.dart index 7916fd7e..35d5a10e 100644 --- a/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_logic.dart +++ b/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_logic.dart @@ -90,6 +90,13 @@ class AddRemoteControlLogic extends BaseGetXController{ isBeforeAddUser: false ); break; + case 0xFE: + case 12: + // 管理员已满 + showToast('管理员已满'.tr); + state.ifAddState.value = false; + Get.close(1); + break; default: //失败 state.ifAddState.value = false; @@ -110,6 +117,7 @@ class AddRemoteControlLogic extends BaseGetXController{ Get.close(1); break; case 0xFE: + case 0x12: // 管理员已满 showToast('管理员已满'.tr); Get.close(1); From 02d0bc49d329d813cd96448307c8519233b9ebd3 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 16 Apr 2025 14:11:38 +0800 Subject: [PATCH 116/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E6=8C=87?= =?UTF-8?q?=E7=BA=B9=E5=88=B7=E6=96=B0=E5=A4=9A=E4=B8=AA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fingerprint/fingerprintList/fingerprintList_logic.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart index 09523db0..3c886df8 100755 --- a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart +++ b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart @@ -404,8 +404,8 @@ class FingerprintListLogic extends BaseGetXController { void _initRefreshAction() { _teamEvent = eventBus .on() - .listen((OtherTypeRefreshListEvent event) { - getFingerprintsListData(isRefresh: true); + .listen((OtherTypeRefreshListEvent event) async { + await getFingerprintsListData(isRefresh: true); }); } @@ -460,7 +460,7 @@ class FingerprintListLogic extends BaseGetXController { if (isDemoMode == false) { _initReplySubscription(); - _initRefreshAction(); + // _initRefreshAction(); getFingerprintsListData(isRefresh: true); } } From 2e340921c19b433caa18e7b40c95eb5d4d5f618a Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 16 Apr 2025 14:12:00 +0800 Subject: [PATCH 117/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E4=B8=80=E9=94=AE=E7=99=BB=E5=BD=95=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/login/starLock_login_logic.dart | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/login/login/starLock_login_logic.dart b/lib/login/login/starLock_login_logic.dart index d0f5d2cd..a03eca9f 100755 --- a/lib/login/login/starLock_login_logic.dart +++ b/lib/login/login/starLock_login_logic.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/apm/apm_helper.dart'; @@ -174,8 +176,10 @@ class StarLockLoginLogic extends BaseGetXController { state.canNext.value = state.pwdIsOK && state.isEmailOrPhone; } + late StreamSubscription _agreePrivacySubscription; + void _initEventListen() { - eventBus + _agreePrivacySubscription = eventBus .on() .listen((AgreePrivacyAgreement event) async { await JverifyOneClickLoginManage(); @@ -194,6 +198,8 @@ class StarLockLoginLogic extends BaseGetXController { @override void onClose() { + // 取消事件监听 + _agreePrivacySubscription.cancel(); state.onClose(); super.onClose(); } From 204affd6b1e217bdea2dbb600f86cde54a51d14f Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 16 Apr 2025 14:13:31 +0800 Subject: [PATCH 118/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E5=8F=82=E6=95=B0=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passwordKeyDetail/passwordKeyDetail_logic.dart | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart index 04059392..33b2f2f7 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart @@ -152,6 +152,13 @@ class PasswordKeyDetailLogic extends BaseGetXController { final List? token = await Storage.getStringList(saveBlueToken); final List getTokenList = changeStringListToIntList(token!); + int startTime = 0; + int endTime = 0; + if (state.itemData.value.keyboardPwdType != 2) { + startTime = state.itemData.value.startDate! ~/ 1000; + endTime = state.itemData.value.endDate! ~/ 1000; + } + IoSenderManage.senderCustomPasswordsCommand( keyID: state.itemData.value.keyboardPwdId!.toString(), userID: await Storage.getUid(), @@ -162,8 +169,8 @@ class PasswordKeyDetailLogic extends BaseGetXController { ? (state.isDeletPasswordKey.value == true ? 2 : 1) : 3, isAdmin: state.isAdministrator.value == true ? 1 : 0, - startTime: state.itemData.value.startDate! ~/ 1000, - endTime: state.itemData.value.endDate! ~/ 1000, + startTime: startTime, + endTime: endTime, needAuthor: 1, isBeforeAddUser: false, signKey: signKeyDataList, From 7f2d591e674cb7b5993170538819a1f66d486e3c Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 16 Apr 2025 14:13:50 +0800 Subject: [PATCH 119/135] =?UTF-8?q?style:=E5=8E=BB=E9=99=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../addLock/nearbyLock/nearbyLock_logic.dart | 44 ------------------- 1 file changed, 44 deletions(-) diff --git a/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart b/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart index 05b499f0..75d52cf4 100755 --- a/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart +++ b/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart @@ -449,50 +449,6 @@ class NearbyLockLogic extends BaseGetXController { } } - /// 判断 128-bit UUID 是否已配对 - bool isPaired128Bit(String serviceUuid) { - if (serviceUuid.length != 36) return false; // 确保是 128-bit UUID - try { - String status = serviceUuid.substring(30, 32); // 获取第 31 和 32 位 - return status == '01'; // '01' 表示已配对 - } catch (e) { - return false; // 如果索引越界或其他错误,返回 false - } - } - - /// 判断 128-bit UUID 是否休眠 - bool isSleeping128Bit(String serviceUuid) { - if (serviceUuid.length != 36) return false; // 确保是 128-bit UUID - try { - String status = serviceUuid.substring(32, 34); // 获取第 33 和 34 位 - return status == '00'; // '00' 表示休眠 - } catch (e) { - return false; // 如果索引越界或其他错误,返回 false - } - } - - /// 判断 32-bit UUID 是否已配对 - bool isPaired32Bit(String serviceUuid) { - if (serviceUuid.length != 8) return false; // 确保是 32-bit UUID - try { - String status = serviceUuid.substring(3, 5); // 获取第 4 和 5 位 - return status == '01'; // '01' 表示已配对 - } catch (e) { - return false; // 如果索引越界或其他错误,返回 false - } - } - - /// 判断 32-bit UUID 是否休眠 - bool isSleeping32Bit(String serviceUuid) { - if (serviceUuid.length != 8) return false; // 确保是 32-bit UUID - try { - String status = serviceUuid.substring(5, 7); // 获取第 6 和 7 位 - return status == '00'; // '00' 表示休眠 - } catch (e) { - return false; // 如果索引越界或其他错误,返回 false - } - } - void stopScanBlueList() { BlueManage().disconnect(); BlueManage().stopScan(); From 084f887e899966bad33bc223fe9f11e4cad54579 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 16 Apr 2025 14:14:06 +0800 Subject: [PATCH 120/135] =?UTF-8?q?style:=E8=B0=83=E6=95=B4=E4=B8=80?= =?UTF-8?q?=E9=94=AE=E7=99=BB=E5=BD=95=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index 9e9f5927..ee1c0ca7 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -106,7 +106,6 @@ Future privacySDKInitialization() async { // 初始化一键登录服务 final StarLockLoginLogic loginLogic = Get.put(StarLockLoginLogic()); await JverifyOneClickLoginManage(); - loginLogic.oneClickLoginAction(); loginLogic.state.isCheckVerifyEnable.value = await JverifyOneClickLoginManage().checkVerifyEnable(); eventBus.fire(AgreePrivacyAgreement()); From 4234464533ffa2425dda20f7901ad832a4b167d6 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 16 Apr 2025 14:15:11 +0800 Subject: [PATCH 121/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E7=9B=91=E5=90=AC=E5=AF=B9=E5=BA=94=E5=8F=98=E9=87=8F?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=90=8E=E7=BB=AD=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main/lockDetail/lockDetail/lockDetail_logic.dart | 4 ++-- lib/main/lockDetail/lockDetail/lockDetail_state.dart | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index 80198af5..03b69a5b 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -814,7 +814,7 @@ class LockDetailLogic extends BaseGetXController { } }); - eventBus + state.DetailLockInfo = eventBus .on() .listen((PassCurrentLockInformationEvent event) { if (event.lockSetInfoData.lockSettingInfo != null && @@ -839,7 +839,7 @@ class LockDetailLogic extends BaseGetXController { } }); - eventBus + state.SuccessfulDistributionNetworkEvent = eventBus .on() .listen((SuccessfulDistributionNetwork event) { // 配网成功获取一下配网信息 diff --git a/lib/main/lockDetail/lockDetail/lockDetail_state.dart b/lib/main/lockDetail/lockDetail/lockDetail_state.dart index 760f1289..01178f52 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_state.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_state.dart @@ -14,6 +14,8 @@ class LockDetailState { late StreamSubscription replySubscription; StreamSubscription? lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent; StreamSubscription? LockSetChangeSetRefreshLockDetailWithTypeSubscription; + StreamSubscription? DetailLockInfo; + StreamSubscription? SuccessfulDistributionNetworkEvent; String lockNetToken = '0'; int differentialTime = 0;// 服务器时间与本地时间差值 From a259ed9dd3d6e9ec3d6ccf4c896efdbd0c1f9251 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 16 Apr 2025 14:16:27 +0800 Subject: [PATCH 122/135] =?UTF-8?q?fix:=E5=A2=9E=E5=8A=A0=E7=BC=93?= =?UTF-8?q?=E5=86=B2=E5=8C=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handle/other/talk_data_repository.dart | 28 ++----------------- .../views/talkView/talk_view_logic.dart | 21 +++++++------- 2 files changed, 13 insertions(+), 36 deletions(-) diff --git a/lib/talk/starChart/handle/other/talk_data_repository.dart b/lib/talk/starChart/handle/other/talk_data_repository.dart index 864aa4aa..062835cb 100644 --- a/lib/talk/starChart/handle/other/talk_data_repository.dart +++ b/lib/talk/starChart/handle/other/talk_data_repository.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart'; class TalkDataRepository { - // 创建一个私有的构造函数,防止外部创建实例 TalkDataRepository._() { _talkDataStreamController = StreamController.broadcast( onListen: () { @@ -11,47 +10,26 @@ class TalkDataRepository { onCancel: () { _isListening = false; }, - sync: false, // 异步模式 + sync: false, // 改为同步模式以提高实时性 ); } - // 使用 _instance 来保存单例对象 static final TalkDataRepository _instance = TalkDataRepository._(); - // 提供一个静态方法来获取单例实例 static TalkDataRepository get instance => _instance; - // 创建一个 StreamController late final StreamController _talkDataStreamController; - bool _isListening = false; - // 用于存储数据的缓冲区 - final List _buffer = []; + // 直接返回原始流,不做转换 + Stream get talkDataStream => _talkDataStreamController.stream; - // 提供一个方法来获取 Stream - Stream get talkDataStream => - _talkDataStreamController.stream.transform( - StreamTransformer.fromHandlers( - handleData: (TalkData data, EventSink sink) { - // 限制缓冲区大小为 100 - if (_buffer.length >= 100) { - _buffer.removeAt(0); // 丢弃最旧的数据 - } - _buffer.add(data); - sink.add(data); - }, - ), - ); - - // 提供一个方法来添加 TalkData 到 Stream void addTalkData(TalkData talkData) { if (_isListening) { _talkDataStreamController.add(talkData); } } - // 提供一个方法来关闭 StreamController void dispose() { _talkDataStreamController.close(); } diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index d4fd18f5..779e44e9 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -38,8 +38,8 @@ class TalkViewLogic extends BaseGetXController { final LockDetailState lockDetailState = Get.put(LockDetailLogic()).state; final int minBufferSize = 2; // 最小缓冲2帧,约166ms - final int maxBufferSize = 8; // 最大缓冲8帧,约666ms - int bufferSize = 20; // 初始化为默认大小 + final int maxBufferSize = 20; // 最大缓冲8帧,约666ms + int bufferSize = 8; // 初始化为默认大小 // 修改音频相关的成员变量 final int minAudioBufferSize = 1; // 音频最小缓冲1帧 final int maxAudioBufferSize = 3; // 音频最大缓冲3帧 @@ -137,11 +137,11 @@ class TalkViewLogic extends BaseGetXController { } // AppLog.log('其他帧的时间戳:${talkData.durationMs}'); // 计算帧间间隔 - // if (_lastFrameTimestamp != 0) { - // final int frameInterval = talkData.durationMs - _lastFrameTimestamp; - // _adjustBufferSize(frameInterval); // 根据帧间间隔调整缓冲区 - // } - // _lastFrameTimestamp = talkData.durationMs; // 更新上一帧时间戳 + if (_lastFrameTimestamp != 0) { + final int frameInterval = talkData.durationMs - _lastFrameTimestamp; + _adjustBufferSize(frameInterval); // 根据帧间间隔调整缓冲区 + } + _lastFrameTimestamp = talkData.durationMs; // 更新上一帧时间戳 // 然后添加到播放缓冲区 if (state.videoBuffer.length >= bufferSize) { @@ -184,7 +184,7 @@ class TalkViewLogic extends BaseGetXController { state.listData.value = Uint8List.fromList(oldestFrame.content); state.videoBuffer.removeAt(oldestIndex); // 移除已播放的帧 - // 更新帧率计算 + // // 更新帧率计算 // _frameCount++; // final currentTime = DateTime.now().millisecondsSinceEpoch; // final elapsed = currentTime - _lastFpsUpdateTime; @@ -195,9 +195,7 @@ class TalkViewLogic extends BaseGetXController { // _frameCount = 0; // _lastFpsUpdateTime = currentTime; // } - // AppLog.log('🎬 播放帧 - 缓冲区剩余: ${state.videoBuffer.length}/${bufferSize}, ' - // '播放延迟: ${currentTime - oldestFrame.durationMs}ms, ' - // '帧时间戳: ${oldestFrame.durationMs}'); + } else { // AppLog.log('⚠️ 帧未找到缓存 - Key: $cacheKey'); state.videoBuffer.removeAt(oldestIndex); // 移除无法播放的帧 @@ -499,6 +497,7 @@ class TalkViewLogic extends BaseGetXController { _initAudioRecorder(); requestPermissions(); + } @override From 50944a082b088532849bb2d73c9c2a0e14b816ac Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 16 Apr 2025 14:28:18 +0800 Subject: [PATCH 123/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=90=8E=E4=B8=AD=E6=96=AD=E6=8C=81=E7=BB=AD=E5=8F=91?= =?UTF-8?q?=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/talk/starChart/star_chart_manage.dart | 44 ++++++++++++----------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/lib/talk/starChart/star_chart_manage.dart b/lib/talk/starChart/star_chart_manage.dart index 7f60fc25..0e0e9eb8 100644 --- a/lib/talk/starChart/star_chart_manage.dart +++ b/lib/talk/starChart/star_chart_manage.dart @@ -595,27 +595,31 @@ class StartChartManage { // 发送拒绝接听消息 void startTalkRejectMessageTimer() async { - talkRejectTimer ??= Timer.periodic( - Duration(seconds: _defaultIntervalTime), - (Timer timer) async { - _sendTalkRejectMessage(); - }, - ); + try { + talkRejectTimer ??= Timer.periodic( + Duration(seconds: _defaultIntervalTime), + (Timer timer) async { + _sendTalkRejectMessage(); + }, + ); + } catch (e) { + AppLog.log("startTalkRejectMessageTimer e:${e}"); + } finally { + // 设置状态为拒绝 + StartChartTalkStatus.instance.setRejected(); + // 停止播放铃声 + AudioPlayerManager().stopRingtone(); + // 停止发送通话保持消息、通话预期数据请求 + stopTalkExpectMessageTimer(); + stopTalkPingMessageTimer(); + stopCallRequestMessageTimer(); + stopSendingRbcuInfoMessages(); + stopSendingRbcuProBeMessages(); + // 取消定时器 - // 设置状态为拒绝 - StartChartTalkStatus.instance.setRejected(); - // 停止播放铃声 - AudioPlayerManager().stopRingtone(); - // 停止发送通话保持消息、通话预期数据请求 - stopTalkExpectMessageTimer(); - stopTalkPingMessageTimer(); - stopCallRequestMessageTimer(); - stopSendingRbcuInfoMessages(); - stopSendingRbcuProBeMessages(); - // 取消定时器 - - talkePingOverTimeTimerManager.cancel(); - talkDataOverTimeTimerManager.cancel(); + talkePingOverTimeTimerManager.cancel(); + talkDataOverTimeTimerManager.cancel(); + } } // 发送期望接受消息 From 7ca848d61b99de89bde7af4b9c7a7cfaa4f2e031 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 16 Apr 2025 17:59:21 +0800 Subject: [PATCH 124/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E6=98=AF=E5=9B=BD=E5=86=85=E6=89=8D=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E4=B8=80=E9=94=AE=E7=99=BB=E5=BD=95=E7=9A=84sdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/login/starLock_login_logic.dart | 21 +++++++++++++------ lib/main.dart | 25 +++++++++++++++++------ 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/lib/login/login/starLock_login_logic.dart b/lib/login/login/starLock_login_logic.dart index a03eca9f..f6130c6b 100755 --- a/lib/login/login/starLock_login_logic.dart +++ b/lib/login/login/starLock_login_logic.dart @@ -15,6 +15,7 @@ import 'package:star_lock/network/start_chart_api.dart'; import 'package:star_lock/talk/starChart/entity/star_chart_register_node_entity.dart'; import 'package:star_lock/tools/appFirstEnterHandle.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/translations/current_locale_tool.dart'; import '../../main/lockMian/lockMain/lockMain_logic.dart'; import '../../mine/mine/starLockMine_logic.dart'; @@ -182,11 +183,19 @@ class StarLockLoginLogic extends BaseGetXController { _agreePrivacySubscription = eventBus .on() .listen((AgreePrivacyAgreement event) async { - await JverifyOneClickLoginManage(); - oneClickLoginAction(); - state.isCheckVerifyEnable.value = - await JverifyOneClickLoginManage().checkVerifyEnable(); - AppLog.log('一键登录初始化认证结果:${state.isCheckVerifyEnable.value}'); + /// 检查ip如果属于国内才进行初始化 + final CheckIPEntity entity = await ApiRepository.to.checkIpAction(ip: ''); + String currentLanguage = + CurrentLocaleTool.getCurrentLocaleString(); // 当前选择语言 + // 判断如果ip是国内的且选的是中文才初始化一键登录 + if (entity.data!.abbreviation?.toLowerCase() == 'cn' && + currentLanguage == 'zh_CN') { + // 初始化一键登录服务 + await JverifyOneClickLoginManage(); + state.isCheckVerifyEnable.value = + await JverifyOneClickLoginManage().checkVerifyEnable(); + AppLog.log('一键登录初始化认证结果:${state.isCheckVerifyEnable.value}'); + } }); } @@ -204,7 +213,7 @@ class StarLockLoginLogic extends BaseGetXController { super.onClose(); } - //刷新设备信息 +//刷新设备信息 Future flushedDeviceInfo() async { XSConstantMacro().getDeviceInfoData().then((Map data) { state.deviceInfoMap.value = data; diff --git a/lib/main.dart b/lib/main.dart index ee1c0ca7..69901fff 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,12 +10,14 @@ import 'package:path/path.dart' as path; import 'package:provider/provider.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/login/login/starLock_login_logic.dart'; +import 'package:star_lock/login/register/entity/checkIP_entity.dart'; import 'package:star_lock/mine/about/debug/debug_tool.dart'; import 'package:star_lock/network/api_provider.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/network/start_chart_api.dart'; import 'package:star_lock/talk/starChart/handle/impl/debug_Info_model.dart'; import 'package:star_lock/talk/starChart/status/appLifecycle_observer.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/bugly/bugly_tool.dart'; import 'package:star_lock/tools/device_info_service.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; @@ -24,6 +26,7 @@ import 'package:star_lock/tools/platform_info_services.dart'; import 'package:star_lock/tools/push/notification_service.dart'; import 'package:star_lock/tools/push/xs_jPhush.dart'; import 'package:star_lock/tools/storage.dart'; +import 'package:star_lock/translations/current_locale_tool.dart'; import 'package:star_lock/translations/trans_lib.dart'; import 'apm/apm_helper.dart'; @@ -103,10 +106,20 @@ Future privacySDKInitialization() async { await jpushProvider.initJPushService(); NotificationService().init(); // 初始化通知服务 - // 初始化一键登录服务 - final StarLockLoginLogic loginLogic = Get.put(StarLockLoginLogic()); - await JverifyOneClickLoginManage(); - loginLogic.state.isCheckVerifyEnable.value = - await JverifyOneClickLoginManage().checkVerifyEnable(); - eventBus.fire(AgreePrivacyAgreement()); + /// 检查ip如果属于国内才进行初始化 + final CheckIPEntity entity = await ApiRepository.to.checkIpAction(ip: ''); + if (entity.errorCode!.codeIsSuccessful) { + String currentLanguage = + CurrentLocaleTool.getCurrentLocaleString(); // 当前选择语言 + // 判断如果ip是国内的且选的是中文才初始化一键登录 + if (entity.data!.abbreviation?.toLowerCase() == 'cn' && + currentLanguage == 'zh_CN') { + // 初始化一键登录服务 + final StarLockLoginLogic loginLogic = Get.put(StarLockLoginLogic()); + await JverifyOneClickLoginManage(); + loginLogic.state.isCheckVerifyEnable.value = + await JverifyOneClickLoginManage().checkVerifyEnable(); + eventBus.fire(AgreePrivacyAgreement()); + } + } } From 0d8d5cb0c83c92d40aec0aa78661fd0d2230d5a5 Mon Sep 17 00:00:00 2001 From: liyi Date: Fri, 18 Apr 2025 10:33:51 +0800 Subject: [PATCH 125/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4h264=20webview?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/html/h264.html | 133 +++++----- .../lockDetail/lockDetail_logic.dart | 1 + .../normallyOpenMode_logic.dart | 73 +++--- .../starChart/constant/talk_constant.dart | 12 + .../handle/impl/udp_talk_data_handler.dart | 78 ++---- .../handle/other/h264_frame_handler.dart | 94 +------ .../handle/other/packet_loss_statistics.dart | 94 +++++++ lib/talk/starChart/star_chart_manage.dart | 36 ++- .../views/talkView/talk_view_page.dart | 2 +- .../starChart/webView/h264_web_logic.dart | 231 +++++++++--------- 10 files changed, 391 insertions(+), 363 deletions(-) create mode 100644 lib/talk/starChart/handle/other/packet_loss_statistics.dart diff --git a/assets/html/h264.html b/assets/html/h264.html index 63303e3c..0995b612 100644 --- a/assets/html/h264.html +++ b/assets/html/h264.html @@ -1,86 +1,87 @@ + - + play + - - - + + // Function to return to Flutter page + function returnToFlutter() { + notifyFlutter("Returning to Flutter page"); + } + + // 添加清理方法 + function cleanupJMuxer() { + if (jmuxer) { + try { + jmuxer.destroy(); + jmuxer = null; + console.log('JMuxer cleaned up successfully'); + window.Flutter.postMessage('cleanup_complete'); + } catch (e) { + console.error('Error cleaning up JMuxer:', e); + window.Flutter.postMessage('cleanup_error'); + } + } + } + - + + \ No newline at end of file diff --git a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index 03b69a5b..f3668a2c 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -7,6 +7,7 @@ import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:star_lock/apm/apm_helper.dart'; +import 'package:star_lock/appRouters.dart'; import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart'; diff --git a/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_logic.dart b/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_logic.dart index c748da0c..c63750d7 100755 --- a/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_logic.dart +++ b/lib/main/lockDetail/lockSet/normallyOpenMode/normallyOpenMode_logic.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; @@ -17,51 +16,59 @@ import '../../../../tools/eventBusEventManage.dart'; import '../../../../tools/storage.dart'; import 'normallyOpenMode_state.dart'; -class NormallyOpenModeLogic extends BaseGetXController{ +class NormallyOpenModeLogic extends BaseGetXController { NormallyOpenModeState state = NormallyOpenModeState(); // 配置锁的常开模式设置 - Future configPassageMode() async{ - if(state.weekDays.value.isEmpty){ + Future configPassageMode() async { + if (state.weekDays.value.isEmpty) { showToast('请选择常开日期'.tr); return; } - if(state.endTimeMinute.value < state.beginTimeMinute.value){ + if (state.endTimeMinute.value < state.beginTimeMinute.value) { showToast('结束时间不能小于开始时间哦'.tr); return; } final List passageModeConfig = []; final Map map = { - 'isAllDay':state.isAllDay.value, - 'weekDays':state.weekDays.value, - 'startDate':state.beginTimeMinute.value, - 'endDate':state.endTimeMinute.value, + 'isAllDay': state.isAllDay.value, + 'weekDays': state.weekDays.value, + 'startDate': state.beginTimeMinute.value, + 'endDate': state.endTimeMinute.value, }; passageModeConfig.add(map); final LoginEntity entity = await ApiRepository.to.setNormallyModeData( lockId: state.lockSetInfoData.value.lockId!, - passageMode:state.isOpenNormallyOpenMode.value == true ? 1:0, + passageMode: state.isOpenNormallyOpenMode.value == true ? 1 : 0, passageModeConfig: passageModeConfig, ); - if(entity.errorCode!.codeIsSuccessful){ - showToast('操作成功'.tr, something: (){ + if (entity.errorCode!.codeIsSuccessful) { + showToast('操作成功'.tr, something: () { eventBus.fire(RefreshLockListInfoDataEvent()); - state.lockSetInfoData.value.lockSettingInfo!.passageMode = state.isOpenNormallyOpenMode.value == true ? 1:0; - eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(2, state.lockSetInfoData.value.lockSettingInfo!.passageMode!.toString())); + state.lockSetInfoData.value.lockSettingInfo!.passageMode = + state.isOpenNormallyOpenMode.value == true ? 1 : 0; + eventBus + .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + eventBus.fire(LockSetChangeSetRefreshLockDetailWithType( + 2, + state.lockSetInfoData.value.lockSettingInfo!.passageMode! + .toString())); + Get.back(); }); } } // 获取解析后的数据 late StreamSubscription _replySubscription; + void _initReplySubscription() { - _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { - if(reply is SetSupportFunctionsWithParametersReply) { + _replySubscription = + EventBusManager().eventBus!.on().listen((Reply reply) { + if (reply is SetSupportFunctionsWithParametersReply) { _replySetSupportFunctionsWithParameters(reply); } @@ -93,7 +100,7 @@ class NormallyOpenModeLogic extends BaseGetXController{ // 设置自动落锁数据解析 Future _replySetSupportFunctionsWithParameters(Reply reply) async { final int status = reply.data[2]; - switch(status){ + switch (status) { case 0x00: //成功 state.sureBtnState.value = 0; @@ -111,38 +118,44 @@ class NormallyOpenModeLogic extends BaseGetXController{ // 设置支持功能(带参数) Future sendAutoLock() async { - if(state.sureBtnState.value == 1){ + if (state.sureBtnState.value == 1) { return; } state.sureBtnState.value = 1; showEasyLoading(); - showBlueConnetctToastTimer(action: (){ + showBlueConnetctToastTimer(action: () { dismissEasyLoading(); state.sureBtnState.value = 0; }); - BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { + BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { - final List? privateKey = await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = + await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = + changeStringListToIntList(privateKey!); final List? token = await Storage.getStringList(saveBlueToken); final List getTokenList = changeStringListToIntList(token!); - final List? publicKey = await Storage.getStringList(saveBluePublicKey); - final List getPublicKeyList = changeStringListToIntList(publicKey!); + final List? publicKey = + await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = + changeStringListToIntList(publicKey!); String weekStr = '00000000'; for (var day in state.weekDays.value) { - final int index = day % 7; // 将周日的索引转换为 0 - weekStr = '${weekStr.substring(0, index)}1${weekStr.substring(index + 1)}'; + final int index = day % 7; // 将周日的索引转换为 0 + weekStr = + '${weekStr.substring(0, index)}1${weekStr.substring(index + 1)}'; } // 倒序 weekStr weekStr = weekStr.split('').reversed.join(''); final int number = int.parse(weekStr, radix: 2); final List list = []; - list.add(state.isOpenNormallyOpenMode.value == true ? 1:0); + list.add(state.isOpenNormallyOpenMode.value == true ? 1 : 0); final int bieginTime = state.beginTimeMinute.value; final double bieginDouble = bieginTime / 256; @@ -159,7 +172,7 @@ class NormallyOpenModeLogic extends BaseGetXController{ list.add(end1); list.add(end2); - list.add(state.isAllDay.value == 1 ? 1:0); + list.add(state.isAllDay.value == 1 ? 1 : 0); list.add(number); list.add(0); @@ -177,7 +190,7 @@ class NormallyOpenModeLogic extends BaseGetXController{ dismissEasyLoading(); cancelBlueConnetctToastTimer(); state.sureBtnState.value = 0; - if(state.ifCurrentScreen.value == true){ + if (state.ifCurrentScreen.value == true) { showBlueConnetctToast(); } } diff --git a/lib/talk/starChart/constant/talk_constant.dart b/lib/talk/starChart/constant/talk_constant.dart index a3847d50..60d57a0d 100644 --- a/lib/talk/starChart/constant/talk_constant.dart +++ b/lib/talk/starChart/constant/talk_constant.dart @@ -1,7 +1,19 @@ +import 'package:star_lock/talk/starChart/proto/talk_expect.pb.dart'; + class TalkConstant { // TalkPing 未收到回复超时时间(s) static const int talkePingOverTime = 10; static const int talkeDataOverTime = 10; + // 收到TalkRequest 未处理超时时间(s) static const int talkeRequestOverTime = 30; + + static TalkExpectReq ImageExpect = TalkExpectReq( + videoType: [VideoTypeE.IMAGE], + audioType: [AudioTypeE.G711], + ); + static TalkExpectReq H264Expect = TalkExpectReq( + videoType: [VideoTypeE.H264], + audioType: [AudioTypeE.G711], + ); } diff --git a/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart index e2caed39..0a9e7ab3 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_data_handler.dart @@ -4,6 +4,7 @@ import 'package:star_lock/talk/call/g711.dart'; import 'package:star_lock/talk/starChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/starChart/entity/scp_message.dart'; import 'package:star_lock/talk/starChart/handle/other/h264_frame_handler.dart'; +import 'package:star_lock/talk/starChart/handle/other/packet_loss_statistics.dart'; import 'package:star_lock/talk/starChart/handle/scp_message_base_handle.dart'; import 'package:star_lock/talk/starChart/handle/scp_message_handle.dart'; import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart'; @@ -14,62 +15,6 @@ import 'package:star_lock/talk/starChart/proto/talk_data_h264_frame.pb.dart'; // implements ScpMessageHandler { class UdpTalkDataHandler extends ScpMessageBaseHandle implements ScpMessageHandler { - factory UdpTalkDataHandler() { - return _instance; - } - - UdpTalkDataHandler._internal(); - - static final UdpTalkDataHandler _instance = UdpTalkDataHandler._internal(); - - int _recentRecvDataRate = 0; - int _recentRecvPacketCount = 0; - int _recentSendDataRate = 0; - int _recentSendPacketCount = 0; - - int _lastRecvDataRate = 0; - int _lastRecvPacketCount = 0; - int _lastSendDataRate = 0; - int _lastSendPacketCount = 0; - - void updateRecvDataRate(int dataSize) { - _recentRecvDataRate += dataSize; - _recentRecvPacketCount++; - } - - void updateSendDataRate(int dataSize) { - _recentSendDataRate += dataSize; - _recentSendPacketCount++; - } - - void resetDataRates() { - _lastRecvDataRate = _recentRecvDataRate; - _lastRecvPacketCount = _recentRecvPacketCount; - _lastSendDataRate = _recentSendDataRate; - _lastSendPacketCount = _recentSendPacketCount; - - _recentRecvDataRate = 0; - _recentRecvPacketCount = 0; - _recentSendDataRate = 0; - _recentSendPacketCount = 0; - } - - int getLastRecvDataRate() { - return _lastRecvDataRate; - } - - int getLastRecvPacketCount() { - return _lastRecvPacketCount; - } - - int getLastSendDataRate() { - return _lastSendDataRate; - } - - int getLastSendPacketCount() { - return _lastSendPacketCount; - } - @override void handleReq(ScpMessage scpMessage) {} @@ -95,6 +40,17 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle return buffer.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(); } + // 在类顶部添加异步日志方法 + void _asyncLog(String message) { + Future.microtask(() { + try { + AppLog.log(message); + } catch (e) { + // 错误处理 + } + }); + } + @override deserializePayload( {required int payloadType, @@ -105,10 +61,12 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle int? spTotal, int? spIndex, int? messageId}) { - // AppLog.log( - // '没有组包之前的每一个包的数据:${byte.length} messageId:$messageId spTotal:$spTotal spIndex:$spIndex PayloadLength:$PayloadLength,byte:${bufferToHexString(byte)}'); + // 获取统计信息 + final stats = PacketLossStatistics().getStatistics(); + _asyncLog('丢包统计: $stats'); + // _asyncLog( + // '分包数据:messageId:$messageId [$spIndex/$spTotal] PayloadLength:$PayloadLength'); if (messageType == MessageTypeConstant.RealTimeData) { - // 回声测试 if (spTotal != null && spTotal > 1 && messageId != null && @@ -161,8 +119,6 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle final TalkDataH264Frame talkDataH264Frame = TalkDataH264Frame(); talkDataH264Frame.mergeFromBuffer(talkData.content); frameHandler.handleFrame(talkDataH264Frame); - // AppLog.log( - // "帧:${talkDataH264Frame.frameType},帧序号:${talkDataH264Frame.frameSeq},对应I帧序号:${talkDataH264Frame.frameSeqI}"); } /// 处理图片数据 diff --git a/lib/talk/starChart/handle/other/h264_frame_handler.dart b/lib/talk/starChart/handle/other/h264_frame_handler.dart index 2b4ea1ee..cd2f8bc2 100644 --- a/lib/talk/starChart/handle/other/h264_frame_handler.dart +++ b/lib/talk/starChart/handle/other/h264_frame_handler.dart @@ -1,105 +1,17 @@ import 'dart:collection'; import 'dart:typed_data'; +import 'package:flutter/services.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import '../../proto/talk_data_h264_frame.pb.dart'; class H264FrameHandler { - final LinkedHashMap _frameBuffer = LinkedHashMap(); - final void Function(List frameData) onCompleteFrame; - final LinkedHashMap _frameTypeIndex = LinkedHashMap(); + final void Function(List frameData) onCompleteFrame; H264FrameHandler({required this.onCompleteFrame}); void handleFrame(TalkDataH264Frame frame) { - // 存储帧 - _frameBuffer[frame.frameSeq] = frame; - _frameTypeIndex[frame.frameSeq] = frame.frameType; - - // 检查是否可以组装完整的 GOP (Group of Pictures) - _tryAssembleFrames(frame.frameSeq); - } - - void _tryAssembleFrames(int currentSeq) { - final List framesToProcess = []; - int? startFrameSeq; - - // 从当前帧开始向前找到最近的 I 帧或 P 帧 - for (int seq = currentSeq; seq >= 0; seq--) { - final frameType = _frameTypeIndex[seq]; - if (frameType == null) continue; - if (frameType == TalkDataH264Frame_FrameTypeE.I) { - startFrameSeq = seq; - break; - } else if (frameType == TalkDataH264Frame_FrameTypeE.P) { - if (_frameBuffer.containsKey(_frameBuffer[seq]!.frameSeqI)) { - startFrameSeq = seq; - break; - } else { - _frameBuffer.remove(seq); - _frameTypeIndex.remove(seq); - } - } - } - - if (startFrameSeq != null) { - for (int seq = startFrameSeq; _frameBuffer.containsKey(seq); seq++) { - framesToProcess.add(seq); - } - - if (framesToProcess.isNotEmpty) { - _processFrames(framesToProcess); - } - } else { - _clearOldFrames(currentSeq); - } - } - - void _processFrames(List frameSeqs) { - // 按顺序组装帧数据 - // final List assembledData = []; - // - // for (var seq in frameSeqs) { - // final frame = _frameBuffer[seq]!; - // assembledData.addAll(frame.frameData); - // - // // 处理完后从缓冲区移除 - // _frameBuffer.remove(seq); - // } - // - // // 回调完整的帧数据 - // onCompleteFrame(assembledData); - // Calculate the total length of the assembled data - int totalLength = frameSeqs.fold( - 0, (sum, seq) => sum + _frameBuffer[seq]!.frameData.length); - - // Allocate a buffer for the assembled data - final assembledData = Uint8List(totalLength); - int offset = 0; - - for (var seq in frameSeqs) { - final frame = _frameBuffer[seq]!; - assembledData.setRange( - offset, offset + frame.frameData.length, frame.frameData); - offset += frame.frameData.length; - - // Remove the frame from the buffer after processing - _frameBuffer.remove(seq); - _frameTypeIndex.remove(seq); - } - - // Callback with the complete frame data - onCompleteFrame(assembledData); - } - - void clear() { - _frameBuffer.clear(); - } - - void _clearOldFrames(int currentSeq) { - // 清理比当前帧序列旧的帧 - _frameBuffer.removeWhere((seq, frame) => seq < currentSeq - 200); // 调整阈值 - _frameTypeIndex.removeWhere((seq, frameType) => seq < currentSeq - 200); + onCompleteFrame(frame.frameData); } } diff --git a/lib/talk/starChart/handle/other/packet_loss_statistics.dart b/lib/talk/starChart/handle/other/packet_loss_statistics.dart new file mode 100644 index 00000000..34dd2282 --- /dev/null +++ b/lib/talk/starChart/handle/other/packet_loss_statistics.dart @@ -0,0 +1,94 @@ +import 'dart:collection'; + +class PacketLossStatistics { + static final PacketLossStatistics _instance = + PacketLossStatistics._internal(); + factory PacketLossStatistics() => _instance; + PacketLossStatistics._internal(); + + // 记录每个messageId的分包信息 + // key: messageId, value: {totalPackets, receivedPackets} + final Map _packetsMap = HashMap(); + + // 统计信息 + int _totalMessages = 0; // 总消息数 + int _lostMessages = 0; // 丢包的消息数 + int _totalPackets = 0; // 总分包数 + int _lostPackets = 0; // 丢失的分包数 + + // 记录分包数据 + void recordPacket(int messageId, int currentIndex, int totalPackets) { + if (!_packetsMap.containsKey(messageId)) { + _packetsMap[messageId] = PacketInfo(totalPackets); + _totalMessages++; + _totalPackets += totalPackets; + } + + _packetsMap[messageId]!.receivedPackets.add(currentIndex); + + // 如果收到了该messageId的最后一个包,进行统计 + if (currentIndex == totalPackets) { + _checkPacketLoss(messageId); + } + } + + // 检查丢包情况 + void _checkPacketLoss(int messageId) { + final info = _packetsMap[messageId]!; + + // 检查是否有丢失的包 + int received = info.receivedPackets.length; + if (received < info.totalPackets) { + _lostMessages++; + _lostPackets += (info.totalPackets - received); + } + + // 清理该messageId的记录,避免内存泄漏 + _packetsMap.remove(messageId); + } + + // 获取丢包率统计信息 + PacketLossInfo getStatistics() { + if (_totalMessages == 0 || _totalPackets == 0) { + return PacketLossInfo(0.0, 0.0); + } + + // 计算消息级别的丢包率 + double messageLossRate = (_lostMessages / _totalMessages) * 100; + + // 计算分包级别的丢包率 + double packetLossRate = (_lostPackets / _totalPackets) * 100; + + return PacketLossInfo(messageLossRate, packetLossRate); + } + + // 重置统计数据 + void reset() { + _packetsMap.clear(); + _totalMessages = 0; + _lostMessages = 0; + _totalPackets = 0; + _lostPackets = 0; + } +} + +// 分包信息类 +class PacketInfo { + final int totalPackets; + final Set receivedPackets = HashSet(); + + PacketInfo(this.totalPackets); +} + +// 丢包统计信息类 +class PacketLossInfo { + final double messageLossRate; // 消息丢失率 + final double packetLossRate; // 分包丢失率 + + PacketLossInfo(this.messageLossRate, this.packetLossRate); + + @override + String toString() { + return 'Message Loss Rate: ${messageLossRate.toStringAsFixed(2)}%, Packet Loss Rate: ${packetLossRate.toStringAsFixed(2)}%'; + } +} diff --git a/lib/talk/starChart/star_chart_manage.dart b/lib/talk/starChart/star_chart_manage.dart index 0e0e9eb8..85785514 100644 --- a/lib/talk/starChart/star_chart_manage.dart +++ b/lib/talk/starChart/star_chart_manage.dart @@ -22,6 +22,7 @@ import 'package:star_lock/talk/starChart/constant/ip_constant.dart'; import 'package:star_lock/talk/starChart/constant/listen_addr_type_constant.dart'; import 'package:star_lock/talk/starChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/starChart/constant/payload_type_constant.dart'; +import 'package:star_lock/talk/starChart/constant/talk_constant.dart'; import 'package:star_lock/talk/starChart/constant/talk_status.dart'; import 'package:star_lock/talk/starChart/entity/relay_info_entity.dart'; import 'package:star_lock/talk/starChart/entity/report_information_data.dart'; @@ -31,6 +32,7 @@ import 'package:star_lock/talk/starChart/exception/start_chart_message_exception import 'package:star_lock/talk/starChart/handle/impl/debug_Info_model.dart'; import 'package:star_lock/talk/starChart/handle/impl/udp_talk_data_handler.dart'; import 'package:star_lock/talk/starChart/handle/other/do_sign.dart'; +import 'package:star_lock/talk/starChart/handle/other/packet_loss_statistics.dart'; import 'package:star_lock/talk/starChart/handle/other/talke_data_over_time_timer_manager.dart'; import 'package:star_lock/talk/starChart/handle/other/talke_ping_over_time_timer_manager.dart'; import 'package:star_lock/talk/starChart/handle/other/talke_request_over_time_timer_manager.dart'; @@ -111,10 +113,7 @@ class StartChartManage { final int _maxPayloadSize = 8 * 1024; // 分包大小 // 默认通话的期望数据格式 - TalkExpectReq _defaultTalkExpect = TalkExpectReq( - videoType: [VideoTypeE.IMAGE], - audioType: [AudioTypeE.G711], - ); + TalkExpectReq _defaultTalkExpect = TalkConstant.H264Expect; String relayPeerId = ''; // 中继peerId @@ -342,7 +341,7 @@ class StartChartManage { } } - // 发送RbcuConfirm 打洞确认 + // 发送打洞确认包 void _sendRbcuConfirmMessage() async { RbcuConfirm( sessionId: _rbcuSessionId, @@ -596,10 +595,18 @@ class StartChartManage { // 发送拒绝接听消息 void startTalkRejectMessageTimer() async { try { + int count = 0; + final int maxCount = 10; // 最大执行次数为10秒 + talkRejectTimer ??= Timer.periodic( Duration(seconds: _defaultIntervalTime), (Timer timer) async { _sendTalkRejectMessage(); + count++; + if (count >= maxCount) { + timer.cancel(); + talkRejectTimer = null; + } }, ); } catch (e) { @@ -1035,6 +1042,14 @@ class StartChartManage { final int payloadType = scpMessage.PayloadType ?? 0; final int messageType = scpMessage.MessageType ?? 0; try { + // 记录分包数据用于统计丢包率 + if (scpMessage.SpIndex != null && + scpMessage.SpTotal != null && + scpMessage.MessageId != null) { + PacketLossStatistics().recordPacket( + scpMessage.MessageId!, scpMessage.SpIndex!, scpMessage.SpTotal!); + } + final ScpMessageHandler handler = ScpMessageHandlerFactory.createHandler(payloadType); if (messageType == MessageTypeConstant.Req) { @@ -1130,10 +1145,7 @@ class StartChartManage { } void reSetDefaultTalkExpect() { - _defaultTalkExpect = TalkExpectReq( - videoType: [VideoTypeE.IMAGE], - audioType: [AudioTypeE.G711], - ); + _defaultTalkExpect = TalkConstant.H264Expect; } TalkExpectReq getDefaultTalkExpect() { @@ -1152,10 +1164,7 @@ class StartChartManage { /// 修改预期接收到的数据 void sendImageVideoAndG711AudioTalkExpectData() { - final talkExpectReq = TalkExpectReq( - videoType: [VideoTypeE.IMAGE], - audioType: [AudioTypeE.G711], - ); + final talkExpectReq = TalkConstant.H264Expect; changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer( talkExpect: talkExpectReq); } @@ -1216,6 +1225,7 @@ class StartChartManage { await Storage.removerStarChartRegisterNodeInfo(); // 关闭udp服务 closeUdpSocket(); + PacketLossStatistics().reset(); } /// 重置数据 diff --git a/lib/talk/starChart/views/talkView/talk_view_page.dart b/lib/talk/starChart/views/talkView/talk_view_page.dart index 9492bc59..38b22343 100644 --- a/lib/talk/starChart/views/talkView/talk_view_page.dart +++ b/lib/talk/starChart/views/talkView/talk_view_page.dart @@ -615,7 +615,7 @@ class _TalkViewPageState extends State state.videoBuffer.clear(); state.listData.value = Uint8List(0); CallTalk().finishAVData(); - UdpTalkDataHandler().resetDataRates(); + // UdpTalkDataHandler().resetDataRates(); super.dispose(); } } diff --git a/lib/talk/starChart/webView/h264_web_logic.dart b/lib/talk/starChart/webView/h264_web_logic.dart index 4b7edc5e..fdbaad3f 100644 --- a/lib/talk/starChart/webView/h264_web_logic.dart +++ b/lib/talk/starChart/webView/h264_web_logic.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:collection'; import 'dart:io'; import 'dart:ui' as ui; import 'dart:math'; // Import the math package to use sqrt @@ -23,11 +24,13 @@ import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/talk/call/g711.dart'; import 'package:star_lock/talk/starChart/constant/talk_status.dart'; +import 'package:star_lock/talk/starChart/handle/other/packet_loss_statistics.dart'; import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart'; import 'package:star_lock/talk/starChart/proto/talk_expect.pb.dart'; import 'package:star_lock/talk/starChart/star_chart_manage.dart'; import 'package:star_lock/talk/starChart/views/talkView/talk_view_state.dart'; import 'package:star_lock/talk/starChart/webView/h264_web_view_state.dart'; +import 'package:star_lock/tools/G711Tool.dart'; import 'package:star_lock/tools/bugly/bugly_tool.dart'; import 'package:webview_flutter/webview_flutter.dart'; @@ -38,6 +41,14 @@ class H264WebViewLogic extends BaseGetXController { final LockDetailState lockDetailState = Get.put(LockDetailLogic()).state; + // 添加模拟数据相关变量 + static const int CHUNK_SIZE = 4096; + Timer? _mockDataTimer; + // 定义音频帧缓冲和发送函数 + final List _bufferedAudioFrames = []; + final Queue> _frameBuffer = Queue>(); + static const int FRAME_BUFFER_SIZE = 25; + @override void onInit() { super.onInit(); @@ -57,7 +68,7 @@ class H264WebViewLogic extends BaseGetXController { _loadLocalHtml(); // 创建流数据监听 _createFramesStreamListen(); - + // playLocalTestVideo(); _startListenTalkStatus(); state.talkStatus.value = state.startChartTalkStatus.status; // 初始化音频播放器 @@ -86,11 +97,43 @@ class H264WebViewLogic extends BaseGetXController { void _createFramesStreamListen() async { state.talkDataRepository.talkDataStream.listen((TalkData event) async { - // 发送数据给js处理 - _sendBufferedData(event.content); + // 添加新帧到缓冲区 + _frameBuffer.add(event.content); + + // 当缓冲区超过最大容量时,发送最早的帧并移除 + while (_frameBuffer.length > FRAME_BUFFER_SIZE) { + if (_frameBuffer.isNotEmpty) { + final frame = _frameBuffer.removeFirst(); + await _sendBufferedData(frame); + } + } }); } + /// 播放本地测试视频文件 + // Future playLocalTestVideo() async { + // try { + // ByteData data = await rootBundle.load('assets/html/demo.h264'); + // List bytes = data.buffer.asUint8List(); + // + // int offset = 0; + // _mockDataTimer = Timer.periodic(Duration(milliseconds: 40), (timer) { + // if (offset >= bytes.length) { + // timer.cancel(); + // return; + // } + // + // int end = min(offset + CHUNK_SIZE, bytes.length); + // List chunk = bytes.sublist(offset, end); + // _sendBufferedData(chunk); + // + // offset += CHUNK_SIZE; + // }); + // } catch (e) { + // AppLog.log('加载测试视频文件失败: $e'); + // } + // } + /// 加载html文件 Future _loadLocalHtml() async { // 加载 HTML 文件内容 @@ -226,15 +269,17 @@ class H264WebViewLogic extends BaseGetXController { //开始录音 Future startProcessingAudio() async { - // 增加录音帧监听器和错误监听器 - state.voiceProcessor?.addFrameListener(_onFrame); - state.voiceProcessor?.addErrorListener(_onError); try { if (await state.voiceProcessor?.hasRecordAudioPermission() ?? false) { await state.voiceProcessor?.start(state.frameLength, state.sampleRate); final bool? isRecording = await state.voiceProcessor?.isRecording(); state.isRecordingAudio.value = isRecording!; state.startRecordingAudioTime.value = DateTime.now(); + + // 增加录音帧监听器和错误监听器 + state.voiceProcessor + ?.addFrameListeners([_onFrame]); + state.voiceProcessor?.addErrorListener(_onError); } else { // state.errorMessage.value = 'Recording permission not granted'; } @@ -254,8 +299,8 @@ class H264WebViewLogic extends BaseGetXController { state.endRecordingAudioTime.value = DateTime.now(); // 计算录音的持续时间 - final duration = state.endRecordingAudioTime.value! - .difference(state.startRecordingAudioTime.value!); + final Duration duration = state.endRecordingAudioTime.value + .difference(state.startRecordingAudioTime.value); state.recordingAudioTime.value = duration.inSeconds; } on PlatformException catch (ex) { @@ -267,25 +312,71 @@ class H264WebViewLogic extends BaseGetXController { } } - // 音频帧处理 +// 音频帧处理 Future _onFrame(List frame) async { - // 预处理和转码操作放到异步计算线程 - // final processedFrame = await compute(preprocessAudio, frame); - // final list = listLinearToALaw(processedFrame); - final List processedFrame = preprocessAudio(frame); - final List list = listLinearToALaw(processedFrame); + // 添加最大缓冲限制 + if (_bufferedAudioFrames.length > state.frameLength * 3) { + _bufferedAudioFrames.clear(); // 清空过多积累的数据 + return; + } - final int ms = DateTime.now().millisecondsSinceEpoch - - state.startRecordingAudioTime.value.millisecondsSinceEpoch; + // 首先应用固定增益提升基础音量 + List amplifiedFrame = _applyGain(frame, 1.6); + // 编码为G711数据 + List encodedData = G711Tool.encode(amplifiedFrame, 0); // 0表示A-law + _bufferedAudioFrames.addAll(encodedData); + // 使用相对时间戳 + final int ms = DateTime.now().millisecondsSinceEpoch % 1000000; // 使用循环时间戳 + int getFrameLength = state.frameLength; + if (Platform.isIOS) { + getFrameLength = state.frameLength * 2; + } - // 发送音频数据到UDP - await StartChartManage().sendTalkDataMessage( - talkData: TalkData( - content: list, - contentType: TalkData_ContentTypeE.G711, - durationMs: ms, - ), - ); + // 添加发送间隔控制 + if (_bufferedAudioFrames.length >= state.frameLength) { + try { + await StartChartManage().sendTalkDataMessage( + talkData: TalkData( + content: _bufferedAudioFrames, + contentType: TalkData_ContentTypeE.G711, + durationMs: ms, + ), + ); + } finally { + _bufferedAudioFrames.clear(); // 确保清理缓冲区 + } + } else { + _bufferedAudioFrames.addAll(encodedData); + } + } + +// 错误监听 + void _onError(VoiceProcessorException error) { + AppLog.log(error.message!); + } + +// 添加音频增益处理方法 + List _applyGain(List pcmData, double gainFactor) { + List result = List.filled(pcmData.length, 0); + + for (int i = 0; i < pcmData.length; i++) { + // PCM数据通常是有符号的16位整数 + int sample = pcmData[i]; + + // 应用增益 + double amplified = sample * gainFactor; + + // 限制在有效范围内,防止溢出 + if (amplified > 32767) { + amplified = 32767; + } else if (amplified < -32768) { + amplified = -32768; + } + + result[i] = amplified.toInt(); + } + + return result; } /// 挂断 @@ -297,6 +388,9 @@ class H264WebViewLogic extends BaseGetXController { // 拒绝 StartChartManage().startTalkRejectMessageTimer(); } + // _mockDataTimer?.cancel(); + // _mockDataTimer = null; + PacketLossStatistics().reset(); Get.back(); } @@ -315,7 +409,7 @@ class H264WebViewLogic extends BaseGetXController { }); final LockSetInfoEntity lockSetInfoEntity = - await ApiRepository.to.getLockSettingInfoData( + await ApiRepository.to.getLockSettingInfoData( lockId: lockId.toString(), ); if (lockSetInfoEntity.errorCode!.codeIsSuccessful) { @@ -333,93 +427,11 @@ class H264WebViewLogic extends BaseGetXController { } } - List preprocessAudio(List pcmList) { - // 简单的降噪处理 - final List processedList = []; - for (int pcmVal in pcmList) { - // 简单的降噪示例:将小于阈值的信号置为0 - if (pcmVal.abs() < 200) { - pcmVal = 0; - } - processedList.add(pcmVal); - } - return processedList; - } - - List listLinearToALaw(List pcmList) { - final List aLawList = []; - for (int pcmVal in pcmList) { - final int aLawVal = linearToALaw(pcmVal); - aLawList.add(aLawVal); - } - return aLawList; - } - - int linearToALaw(int pcmVal) { - const int ALAW_MAX = 0x7FFF; // 32767 - const int ALAW_BIAS = 0x84; // 132 - - int mask; - int seg; - int aLawVal; - - // Handle sign - if (pcmVal < 0) { - pcmVal = -pcmVal; - mask = 0x7F; // 127 (sign bit is 1) - } else { - mask = 0xFF; // 255 (sign bit is 0) - } - - // Add bias and clamp to ALAW_MAX - pcmVal += ALAW_BIAS; - if (pcmVal > ALAW_MAX) { - pcmVal = ALAW_MAX; - } - - // Determine segment - seg = search(pcmVal); - - // Calculate A-law value - if (seg >= 8) { - aLawVal = 0x7F ^ mask; // Clamp to maximum value - } else { - int quantized = (pcmVal >> (seg + 3)) & 0xF; - aLawVal = (seg << 4) | quantized; - aLawVal ^= 0xD5; // XOR with 0xD5 to match standard A-law table - } - - return aLawVal; - } - - int search(int val) { - final List table = [ - 0xFF, // Segment 0 - 0x1FF, // Segment 1 - 0x3FF, // Segment 2 - 0x7FF, // Segment 3 - 0xFFF, // Segment 4 - 0x1FFF, // Segment 5 - 0x3FFF, // Segment 6 - 0x7FFF // Segment 7 - ]; - const int size = 8; - for (int i = 0; i < size; i++) { - if (val <= table[i]) { - return i; - } - } - return size; - } - -// 错误监听 - void _onError(VoiceProcessorException error) { - AppLog.log(error.message!); - } @override void dispose() { - // TODO: implement dispose + // _mockDataTimer?.cancel(); + // _mockDataTimer = null; super.dispose(); StartChartManage().startTalkHangupMessageTimer(); state.animationController.dispose(); @@ -429,5 +441,6 @@ class H264WebViewLogic extends BaseGetXController { state.oneMinuteTimeTimer = null; stopProcessingAudio(); StartChartManage().reSetDefaultTalkExpect(); + _frameBuffer.clear(); } } From a0d2bdaa7a8877f6d5a6974a8d7bc403bb0e5c7e Mon Sep 17 00:00:00 2001 From: liyi Date: Fri, 18 Apr 2025 10:34:42 +0800 Subject: [PATCH 126/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E4=BD=BF=E7=94=A8Image=E5=AF=B9=E8=AE=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/talk/starChart/star_chart_manage.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/talk/starChart/star_chart_manage.dart b/lib/talk/starChart/star_chart_manage.dart index 85785514..7ffed8e5 100644 --- a/lib/talk/starChart/star_chart_manage.dart +++ b/lib/talk/starChart/star_chart_manage.dart @@ -113,7 +113,7 @@ class StartChartManage { final int _maxPayloadSize = 8 * 1024; // 分包大小 // 默认通话的期望数据格式 - TalkExpectReq _defaultTalkExpect = TalkConstant.H264Expect; + TalkExpectReq _defaultTalkExpect = TalkConstant.ImageExpect; String relayPeerId = ''; // 中继peerId @@ -1145,7 +1145,7 @@ class StartChartManage { } void reSetDefaultTalkExpect() { - _defaultTalkExpect = TalkConstant.H264Expect; + _defaultTalkExpect = TalkConstant.ImageExpect; } TalkExpectReq getDefaultTalkExpect() { @@ -1164,7 +1164,7 @@ class StartChartManage { /// 修改预期接收到的数据 void sendImageVideoAndG711AudioTalkExpectData() { - final talkExpectReq = TalkConstant.H264Expect; + final talkExpectReq = TalkConstant.ImageExpect; changeTalkExpectDataTypeAndReStartTalkExpectMessageTimer( talkExpect: talkExpectReq); } From afcb031bd0ca3a11047995b986fa609b326c4757 Mon Sep 17 00:00:00 2001 From: liyi Date: Fri, 18 Apr 2025 10:46:57 +0800 Subject: [PATCH 127/135] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=90=8E=E5=88=97=E8=A1=A8=E5=87=BA=E7=8E=B0=E5=A4=9A?= =?UTF-8?q?=E6=9D=A1=E8=AE=B0=E5=BD=95=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main/lockDetail/card/cardList/cardList_logic.dart | 2 +- lib/main/lockDetail/face/faceList/faceList_logic.dart | 2 +- .../fingerprint/fingerprintList/fingerprintList_logic.dart | 1 - lib/main/lockDetail/palm/palmList/palmList_logic.dart | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/main/lockDetail/card/cardList/cardList_logic.dart b/lib/main/lockDetail/card/cardList/cardList_logic.dart index 022ff0fb..2fc2e376 100755 --- a/lib/main/lockDetail/card/cardList/cardList_logic.dart +++ b/lib/main/lockDetail/card/cardList/cardList_logic.dart @@ -248,7 +248,7 @@ class CardListLogic extends BaseGetXController { if (isDemoMode == false) { _initReplySubscription(); - _initRefreshAction(); + // _initRefreshAction(); } await getICCardListData(isRefresh: true); } diff --git a/lib/main/lockDetail/face/faceList/faceList_logic.dart b/lib/main/lockDetail/face/faceList/faceList_logic.dart index 9781a916..a1499556 100755 --- a/lib/main/lockDetail/face/faceList/faceList_logic.dart +++ b/lib/main/lockDetail/face/faceList/faceList_logic.dart @@ -430,7 +430,7 @@ class FaceListLogic extends BaseGetXController { if (isDemoMode == false) { _initReplySubscription(); - _initRefreshAction(); + // _initRefreshAction(); } } diff --git a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart index 3c886df8..d65269cd 100755 --- a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart +++ b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart @@ -461,7 +461,6 @@ class FingerprintListLogic extends BaseGetXController { _initReplySubscription(); // _initRefreshAction(); - getFingerprintsListData(isRefresh: true); } } diff --git a/lib/main/lockDetail/palm/palmList/palmList_logic.dart b/lib/main/lockDetail/palm/palmList/palmList_logic.dart index b18e3609..8d15fa33 100755 --- a/lib/main/lockDetail/palm/palmList/palmList_logic.dart +++ b/lib/main/lockDetail/palm/palmList/palmList_logic.dart @@ -233,7 +233,7 @@ class PalmListLogic extends BaseGetXController { if (isDemoMode == false) { _initReplySubscription(); - _initRefreshAction(); + // _initRefreshAction(); } } From 8fb7ea0fe8a09fec7e9ee9cbc83cc3fbbef8df99 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Fri, 18 Apr 2025 14:41:12 +0800 Subject: [PATCH 128/135] =?UTF-8?q?fix:=20jpush=E9=80=BB=E8=BE=91=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E9=80=82=E5=BA=94=E5=BA=94=E7=94=A8=E5=B8=82=E5=9C=BA?= =?UTF-8?q?=E5=90=88=E8=A7=84=E8=A6=81=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/kotlin/com/skychip/lock/App.kt | 2 ++ lib/tools/push/xs_jPhush.dart | 1 + 2 files changed, 3 insertions(+) diff --git a/android/app/src/main/kotlin/com/skychip/lock/App.kt b/android/app/src/main/kotlin/com/skychip/lock/App.kt index 06adbaf6..e28e27f9 100755 --- a/android/app/src/main/kotlin/com/skychip/lock/App.kt +++ b/android/app/src/main/kotlin/com/skychip/lock/App.kt @@ -2,11 +2,13 @@ package com.skychip.lock import io.flutter.app.FlutterApplication import android.util.Log +import cn.jiguang.api.utils.JCollectionAuth; class App : FlutterApplication() { override fun onCreate() { super.onCreate() Log.d("MyApplication", "Application has started") + JCollectionAuth.setAuth(getApplicationContext(), false); } } \ No newline at end of file diff --git a/lib/tools/push/xs_jPhush.dart b/lib/tools/push/xs_jPhush.dart index f2f431c6..7ab5edb3 100755 --- a/lib/tools/push/xs_jPhush.dart +++ b/lib/tools/push/xs_jPhush.dart @@ -66,6 +66,7 @@ class XSJPushProvider { production: F.isProductionEnv, debug: !F.isProductionEnv, ); + jpush.setAuth(enable: true); jpush.applyPushAuthority( const NotificationSettingsIOS(sound: true, alert: true, badge: false), ); From 4242ac0a80cdba1bca55b11a9522f0c6644d1160 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Mon, 21 Apr 2025 18:40:47 +0800 Subject: [PATCH 129/135] =?UTF-8?q?fix:=20=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=80=BB=E8=BE=91=E6=B2=A1=E6=9C=89=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E6=89=A7=E8=A1=8C=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=80=BB=E8=BE=91=E5=A4=B1=E8=B4=A5=E5=90=8E=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E4=BB=BB=E4=BD=95=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/login/starLock_login_logic.dart | 3 +++ lib/tools/jverify_one_click_login.dart | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/lib/login/login/starLock_login_logic.dart b/lib/login/login/starLock_login_logic.dart index f6130c6b..01453fba 100755 --- a/lib/login/login/starLock_login_logic.dart +++ b/lib/login/login/starLock_login_logic.dart @@ -136,6 +136,8 @@ class StarLockLoginLogic extends BaseGetXController { 'login_res': '${entity.errorCode}--${entity.errorMsg}', }); } + } else { + showToast('一键登录失败,请重试'.tr); } }); } @@ -215,6 +217,7 @@ class StarLockLoginLogic extends BaseGetXController { //刷新设备信息 Future flushedDeviceInfo() async { + eventBus.fire(AgreePrivacyAgreement()); XSConstantMacro().getDeviceInfoData().then((Map data) { state.deviceInfoMap.value = data; }).catchError((dynamic error) { diff --git a/lib/tools/jverify_one_click_login.dart b/lib/tools/jverify_one_click_login.dart index 94993d6d..d0a01f5b 100644 --- a/lib/tools/jverify_one_click_login.dart +++ b/lib/tools/jverify_one_click_login.dart @@ -95,6 +95,7 @@ class JverifyOneClickLoginManage { /// 判断当前网络环境是否可以发起认证 Future checkVerifyEnable() async { final Map map = await jverify.checkVerifyEnable(); + AppLog.log('一家登录 sdk 初始化结果:$map'); final bool result = map[f_result_key]; return result; // state.jverify.checkVerifyEnable().then((map) { @@ -267,6 +268,9 @@ class JverifyOneClickLoginManage { action(event); // AppLog.log('获取到 loginAuthSyncApi 接口返回数据,code=${event.code},message = ${event.message},operator = ${event.operator}'); }); + } else { + // -10000 表示登录失败 + action(JVListenerEvent.fromJson({'code': -10000, 'message': ''})); } } } From 07f66a547773c25f95a9d77eb31b6ac26a92f447 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Mon, 21 Apr 2025 19:15:41 +0800 Subject: [PATCH 130/135] =?UTF-8?q?fix:=20=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=80=BB=E8=BE=91=E6=B2=A1=E6=9C=89=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E6=89=A7=E8=A1=8C=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=80=BB=E8=BE=91=E5=A4=B1=E8=B4=A5=E5=90=8E=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E4=BB=BB=E4=BD=95=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/res/drawable/check.png | Bin 0 -> 5376 bytes android/app/src/main/res/drawable/uncheck.png | Bin 0 -> 4551 bytes .../check.imageset/Contents.json | 21 ++++++++++++++++++ .../Assets.xcassets/check.imageset/check.png | Bin 0 -> 5376 bytes .../uncheck.imageset/Contents.json | 21 ++++++++++++++++++ .../uncheck.imageset/uncheck.png | Bin 0 -> 4551 bytes lib/tools/jverify_one_click_login.dart | 14 ++++++------ 7 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 android/app/src/main/res/drawable/check.png create mode 100644 android/app/src/main/res/drawable/uncheck.png create mode 100644 ios/Runner/Assets.xcassets/check.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/check.imageset/check.png create mode 100644 ios/Runner/Assets.xcassets/uncheck.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/uncheck.imageset/uncheck.png diff --git a/android/app/src/main/res/drawable/check.png b/android/app/src/main/res/drawable/check.png new file mode 100644 index 0000000000000000000000000000000000000000..1b366bddba0111cd4adda558751c0c23b81c63d8 GIT binary patch literal 5376 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/uncheck.png b/android/app/src/main/res/drawable/uncheck.png new file mode 100644 index 0000000000000000000000000000000000000000..f1ff42177c5381dd577fbef8a4917b2eedb81225 GIT binary patch literal 4551 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 MTW6axD_Z>j0EElpYXATM literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/check.imageset/Contents.json b/ios/Runner/Assets.xcassets/check.imageset/Contents.json new file mode 100644 index 00000000..bd23e480 --- /dev/null +++ b/ios/Runner/Assets.xcassets/check.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "check.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Runner/Assets.xcassets/check.imageset/check.png b/ios/Runner/Assets.xcassets/check.imageset/check.png new file mode 100644 index 0000000000000000000000000000000000000000..1b366bddba0111cd4adda558751c0c23b81c63d8 GIT binary patch literal 5376 zcmWkyc{tSn6Mug`c3JD%m8(?NvAGtJB$CZ7WXY9tb9NB&El0FVIdg2zq?}2P+_{g{ zSGg*LB4065G3P zT>mfmnCfbP;xEVN0N|<9*ScipXTM;_mMm7wI8$ z5gJtfDo^ucIM|(ZHdyG^_1%?aZ{}p4>Xta36LG3O9i|a* z=N4Z)wKZ^GFV;p$aNaOunl}M3(Spz$vA1^5lP^2&&a?#k!STk_@4JWbm)mOGLd{WQ z72hc*W;or2128@fVemL=QSHwNF#cH)_(+|+ zsUBvzKEM-lsZ|mLQJ?+|Qg*2=XmoGg92XYhp+2DMF$js@wp)UQk;J6)(wKw!v%{18 z_YnfMGr#jc>{g?t)kny;y)H3XfU)4GB|R19n;1*hC`|*OE^b&# zE%d(C46ByLUpyds5-J*BBFNupaj%5j=mu;GUw-n2>3w+H#E1{&;^aN+ zI2&+9VQ#^p6uLT`i-HzXPx4b~Ke`CfCj8`kZkA*YZET1$s zIgnmQ6^VfKT$@z#LYv9fi3c<0k(#+7!0#o)h2`90<)9}dC#*-Qapnhdt0|;kdw$CI z+H9hT_o2TfnwMW$x`eCsISaw|ELW`4bMMV>92sf%T=(uA(}nFfc7OfstxZ|Y`&f>q zD?zy7uOg+|oUT0JAGwd$9js$>ec4|=nR7KBLXiFGeR&s71nQFKUVIV*224iwNjl`A z|2~O;F4$IOVUB?f#``Ef0t8k=~$->5?ZzOwm|Q)KoY$|N!}m6 z>slKlszndwvWLlPdv;3ow$|R7Nf^B$v>ysgtZywBnwIx`-@p*fpygoP^BbtuwRH!% z?b@6%6z(r{0+o#fCNr5qj;q*ULzLBd_$^Fx)_fyqd|;S=+2I0)SP7R(;SvCiadJ*4 z?I>37DiVjJt89noTYrq`6BqF!;*5By+~D?hcV7l$kOPu-!&QJpU}a266spH#w`>F< zY0ppQXF~ie@RM^6s*!VzCxhqyyM&^ef52Rv)ugLN(rpp1SKBT(&7qaf-M4*-dWJ2% z+uqM?g(MdQq-NzoA~Yt5Eza;?;uBz%^rVpzJC(z~hAnO4&n$)sF!|n(@=XSuq>088uNHB7yQSFffo2U?Wt})(X$JlKpoi8wf$O4#M`v|3V|(Hq*q!rX z0^``|BOO4PJ}A|YuZ<*%!+fjNc*Vfke@b@Cdz8rk{A)qe{r*QMhW}0s^{m_(R_b5J zd^n7A$V9{XxYKs?S=|w(IFV*$sUdC2} zr$vB8sqVL9^r)0OQPi_SW7oSZvaAcJi;dAVh1M*igw)}an!sq^aGIj|zPxSmmaEqP zLA9$m<DUS)i;UNJ)%|>RgW5f`$juVDrFc zMP|U&7f)deNq!)S$n1(Vo6~Vq5H3~S#`6{XP}9+LZp7w6>a1B8zrm=v?Cw}l9_a71 z31A~qrw$Ok_c(j5LRLI)+AiW8Za4}f^!Arp{z+q6$Mk!wgvKY^wBU%V8I!a3QR=MJ zTn70dPWXeYh2H)jJsZUMraU77ScPangQ0bsLDsA8xxr%t_5_v{Md-~wOry#Q`6qV7 z3Bh6qXR7$18np;DX{z{e_i$|U#BbjzZN!vZBF%Z4B^-2&#pQMp79(FJk4|>nKltWU zJg=`)b+*Q8eO#^1dZS?NPP4V_XjAl-mMQ*souXgRru-vTyW~|Z3{^UfSU^gsoJ3~I8?tOe= z3QM^qa#_*F?}vMTh7D0|M-N*QE6@?wt3qLL@D*!*N~k>piN~`w=%UC z_&Rgz4KNc8(VmrnFKjpJQz}b7o1^JQi6jr;24~@!atEUL!U`(YCJ!sNk9yoVk1U-G#b zm)|4-G9?!E9-r7^zs&#UsKIdwKqpzjCU3b1ZJ0qVlcqMwU;cYY6;qK)pyfsm@xJ2CRg- zoeL3q58e0#KV1dvabKO1WWD4#yVL%_>r=vK{?{( z2EF;gNn>1-JQ$FB3mzXdg8GB#t9T9b)pyKBK@F9G>biK4jP&KFN+p4gB~1&i!epyZ zHu^0G)^E)H+=@$iOsPSA6OF4u$$t6!cZkr{VW0WG63bHCgy1#q;OL8Q4eeV;3G(&F zJJpT;NP>u-p{9?Ke2{@iR!~c3eK_xeD1A8VaI$XjyC9ds zAKi!`Z|Me`EYKrRG={hHhLyfFs9viPhf2jh&(2Lj);ei?h9#S8kIx1er8CM>UHnDd zxIx!@WBsFS*NX>w9yb&sdTu{utkgP3{#1m>+5d@0;omeSfdGz=is_8{VgMKz=>NeZJd`GL8x8%t8*s~STP41rti1gz$49_gGte20`?~@ zZB|3zaV%ChEt#A%BC_2Z@q50uYFv$%TC?!`F=vX)QYQ`;qol8Y-8_h6q8GE-D_bF` zKGYTG=aO)o%jDnte&O7Z!R`oe+bEhog2fZ1$CNY?b@8q)JqZh+g;`cO+S4qPIB=P?BIqgB_*)^QTVWR{EURbL1Dt8&Q3#}CEf|`)zx8WSRekBe~C6N7MBSBhf5237oRY?BT7EHpU-7>cuWj~cYXV1<7h1$5Aq7AE?s;U0Ya~$-?z=)sxO<%R{Iz}W(}@5rIuxAG zD6;?|ZDvRx6v~J@SOW3dhea5CQv&9ZTF96`7>EbHYD^JZDf*ZA1tv*qtD0k;J=_sJ zyuFai{ErG=$?jE(P{-M_1HvzcRaiiQa`fjG4b5m+@(RTniL1gCe3Z((jP5g*fh|_M z>PnN3n(7> zH#ZC5Z+$`!m9wQmKLJ?Jup=T;xFI53^b%Qwsd)4!c^E5nkc+2nJ9H{ z*6<#Jl-KMV%DJb|W7k8X)<`>Ue9AfK!%8ImSw#DwSR8Tf{`7UmYo>Fk#KQZB#Y1vx zQ;&a&0@+J(w>}@dKWz$V#za(LFTTaCiEgZ{Q;k#ps){u0VhxGzrn(dlZH1P+!2LNdj&~ zGif6B*`?s1@3tX~Gj5=*KMOT)@G44GH=d%x;${hE{eg6FRARy8ndgkY%LmN<%n-4g zNdmryGVkb{ZdY$)_&wQ=2bP^)I{}gO^4io~_(r=Nn_`DKUvRFELK-MNA<>n9KcUO{ z=4#dJqe!slN19)WX~A#L)k!LDU!5UaK$)nT8Ksyp9B#~dZ+oX+)`XZVMyV1WKRWoP z#PX!a+L9nKcO&3F&EcAQcEV<+(Vsy!wGyf!WxwvEZ|4$9ZT>d()kUvzHY!yQE7ARS zU68o7i*I+xLM{hf@cX1^!8Er$HN|<9PI&-@*sPw-ZrFqv&;vISn?KV>c zuGmh!%0s<+*}vFfTy6KjaJ!2$RoWcr(i#J*6mru9)xIfxVw#d^GDi}tE@7?GirPo~ zGj?1G+d5$!>%>r7*)gK2SGvqhJICe#@^FhuAlBM%UmM!(cMy@Yz#QVDnHul^6qkds ztqviK@8)4)el}@M`EA_ZY{*;l98`Xa zx{N|YFS<0DMJH|Vf2D-a7Qh%g4iYNN?{=MXL7TcttzpMOEaMQ%gO^DJBdTHQm$YWw zY0>1aBt|_eJvw<@St1)VXztFuQk_3*Q37J;_=n`0@`419%bdATzP9sCLo}#x;zi1? zYtyF`|04Rl7~qiZwv2c%aYW?T4!$= zBSRdtpHJ^26^g*(hf7+x;XtCe+k;W<3H8>OaE~rK7T&HLty+?`Kg$MjHy`mw6U9m4 zT?N(5ld8o&ERpI0(r7x4%mb^DV|`Z_F5_!>0N#rSR`t?hyRZ-gIv02Vh>$ySTwtQK zp+akd$@?_`ErEsTzw02}L$uNA(+)S!o$BCZ39wJDQ0TdC`1OyMVBHh=G$Li&F{(xF zu~_5z4Ogmo_}BI&WhGMM0U6bW>O#l{|iRAC;V8dga} vbczrm2|*Q=D~S0+<-EXG7%TCFegNDQQ`N4xChHu&G=aYM6|G_oa>)MxfGM20 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/uncheck.imageset/Contents.json b/ios/Runner/Assets.xcassets/uncheck.imageset/Contents.json new file mode 100644 index 00000000..5b51e40e --- /dev/null +++ b/ios/Runner/Assets.xcassets/uncheck.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "uncheck.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Runner/Assets.xcassets/uncheck.imageset/uncheck.png b/ios/Runner/Assets.xcassets/uncheck.imageset/uncheck.png new file mode 100644 index 0000000000000000000000000000000000000000..f1ff42177c5381dd577fbef8a4917b2eedb81225 GIT binary patch literal 4551 zcmbtYX*iVa+rRGHV8+%xV`)eX%2HVhA>_6zVn~HbQ^G_<5wgrZ9_y2sHf5=%k~K@E z2Q5rVlr;*WC?p|USu$hZdH%=o|M-4+-|NeD{f_heoyYMzuMg*vN_DoE6jKlb07&j~ zuyF$b5vd#lJAKpYWDg&u^XeQEIjfuNuQ!f$Z`kVoWf)(#v3 zPX3q5JvCSxTb#8zF)`7TeYP^y9zZEoerxQXnf#ugpD*Yd|JC2U6tnYyNwjvl0O*K~ z%`cbF4OUfEE%NQR1Q7nvlfjZl@;BFk(_ujxr0DSzPkQQ_ok z=*f8M4?>;OZ=9VybtoB@xVe>5tN9#X;+L!6n}Yvs062uZ9L) zgpPIipUSvt1%73Ho(#?Fn$GzC&u~o;)!ur7_lbG>ef95y>58I+*VpEpU!jd5|AyV0 z8+Yc{Eel4isqJ#a`xk~GG8cPaz3?DA5T$g;a0oI~+E{vaTm}kIAPfSY$Rbq9siaHTTz&Ge-t4)&To8ag|)L!iXk(sW7Ux&RVeMQ zgNLbvw|%pY^t$Y>L2Ev5WpOHV$aO1<$F10b9XM32aqwky?&>V8nFqz7JXqO$ zVkyGrSuUOe);^v1_*)RI;KNTzA}duDxVTKqu8xh3S@<5RtMmx2qK^#cn^=V~v@+LX z`-f>g5yL&LLMIMS$hyV*3bPGI8fSBOt)oIIobu*}c_1u-o3NtusfIztzp$9hl*YOf z8PU-zEwQ{f`+4s167AzogiI2aDXgo)Z_H4(h~7?noo_uPcrvzgb3KdcA@UGCbTw^v z`S7NwXwMHjGZ9QKQDdZiVx+TWzYOyiOr78+a4$vQpI_d+{qlaGkg@DG8a`27{K+Zs zF7x|3``r-T>|6cv6jw8>{jn-lUEVOKmz4on;3CHdPIbH5O$cO`5P4j@`Xn^D*KTH|ne!>&@qv z;^>|@Iqfa=AGp$mL?+&7x3xHEn;vxCmZA3-K0y{!7}I^dI5$T+o1S$;qkbSD5WcC# zWVN|YaNSq*tFxv}Y}PVEV5+#{*y5CNmfhNq>h%P4)YGCTT0hDIt9fs8PwD)-+c>t! z!?Bpn*n0g}LO9hve=?MUU&OR$=~VdLq(K63|K^dvv%I0+UlEut`uu&N6&|~?7~N9( zP~LFCkTbmQE3k+4Rt~CtOCwlp-BO3$4wSi%q%RAji>l$tz#I5|+0i8Y3Z&rL( z9R9p>EaFV|7Y7TYZZ5he?&rk);*$vus(M|ShsCfFuCHy=%9{R->m^jFd)Hj|ZTA+& zIvA|bx$LdDygfntWrm!=2C5A2HF?XacN&y?u>Q&ZyTELKw|uU=_GsrY8CKd09e_DM zEnXv0&1UeW3mMMB19%MQw-EZq?DCh^k9Y^8gZ6Sba{@@LJDJ%Q6HH>cF)zAe;!t5P zuV&^i{d=kuS)9Ese68QtmjcYR1XEenss>ufKAaCZ@C&r0>|2Y>I z7dIL9VTmv`AonB5){>$skjtS%6mACnVp^0Y^Ww!hJ&0^lbi1UXnZkCW9aqqE0tsqT ze>2|N*+e`br0o_;!ee>#Twde${dVOp=$w4%u^~hdpvMR~*Wxntu9ZWF(OKQP=i97( zVYN=omB={^b+~QwT?i9pj^pwS(BaQ%H2_(4sZtX`u4CZ}g47hQif(sK3U=Y_kR+>s z5&pv2m+LN(BCm+h2W}e5Vnh?C&TxM(BvO#8j&};#MS#WkX+VsfIS-`-iEH9#^oy8p zK?R7WEnth2HTPC-qmIcVnhpxNt2r*F~~#X{E!*yy_k?kEk1kR2&k0Tn0)nmyAN zW!mQil)Gfv0JjehBPvWXFM6Wv49wO&NEPIQU)p*umP177{AKJ5%pm|fDdtXCE-_ph zsvy&qx800Km0-Dxk5hri$fl^wi&_6t8+LI*AU5c&S~3%c&VPOK1b9eXx+kc`t19eR z8Dn>_BnA8=m_E2l7Z|~OCSG(QRu1R_3eH5_#@i zXYC1719(W|Ma5CPq8dB4YyV+Tsk=$BzM%_gvIS7nw`>Ij|7}C$5)F8Y*7VT{eC|qZQx6~>$Qq=2q?5? zJ>^c#R=-oY`*Vyg8I%NmfX^*yvymHVSNS>OARLsdH&m+CJUcYCXf7C3>*Jvy#*7w>U^Ulk=G4ensB`SsCvq**beO;!A|j}p?DqxMkDsZe9d zl;D5Tj-2Nd&M-VAX+raw_rDmR%`x9Kb})$zbzij5sM|7qh_H>(;n$2SSmjFKN>hi7 zKvxQ!p1r2sUV}p5TvX;)H~3Wp{D(cYD&$Y`@_ZFot)BnI5X&~eG>2HcnGhO$H-fJP zQ@uCYLVZV_X*sm-;zaWE6&GnxL@tbKt6}lj5nvo2SR6VcXG zP71X!N;nF@qIi5_UFZBY!Lg8fcISudT9_&=oCdquUa&)qQTDM#<*(deH$fnF<(JbP zP|2{Xkw5_B_}d9}xG)uV5FY5&6B^$zbYd|=7CLEWUgR^TFi*w>lL|vtzqpo_;Mvs6 z6r%9ZVON4fPJh~tYo<`)E@40H?|`theo^RzPmXVwjxhV{X{1hZq`pkvR+uR^rmXbm zRQ*{kaMhJ#K$i`4md0}(IX>T~y@Aee>?y;3=y`n9j#%E(?6ChyN!XjYGDl|B>S##ge9PO84p8cmjE zs`w~6a?X6N(;!-b05|9d&)X|)F)^}fH?)Qx(W=flKKEB#0A^RNX9tYvn=W@Z##lf8LYCQY4 z5@(iOTiP`&%k&ysRJfWXgFO^^JXE8GwR;hpkPAt&z=reo{&-aqDl)dlQ|P;i{7^c2 zVOLjvCMq}Pq5^E-$9|5cl5ke8#RYIB_5DEYrl~>#z4}FV?C~?J?r?`H?7jJ6;FEo6 zo;`9m?%vC}eIBcFD%eg!amS2rCcFBDuZ9uPEUNYO{n=+coBm2RQL^?MbI}4h+C+l! zLNUd<`6stX7|TWx-7`B{`Xo1awJ|Q39+n(B7q7i(b$+Z}x4gXk$c?@Y^$I9EkEOgb zW{DTGlTjRbcu8j4b8yA>zAUpjKKaOdvHE*&B;n0{Z%8nPADSjH`&btJ>JQRDSPHn7 zw4r?0Oq5U4t)C-wE$BNDN*9xkT)v@Yki;F&wcu%S%)5e~ZDyVRGXLbU*`w~mb?$#2 z$)#L74;H??kfNA6{v&sPxqS1JN)VQhv%x|8Zin}@@1J~Hb-Y;|g}N@1D6pjsyKz=O zncLHx1SV6$5|Z&u9~GMUXoDpvBmXAv`M9-hZ2ri)#n;<$U8SECbn$Z!Fk(k!yeEW6JwmsOz+-`d?4)yz0 zk(h*pq%CbecHvX)FNbQ~bw)5nzc}Ew3hrQNF*o8~6Wcf@>rB1wtV5vH@r}eMG3mfP zzBnjf6W71F>yvh`=`*Xyx+4mTb=_1VX6JUHRWf17JWtz5O3e=c_cFKiDra`x)R{nM zTnC|S;end{e#7bB^Dig65`+8)UoHo6Ma3hHwz39$Jdy`QAeMYlCAHeV!yx^+-WAdF z#*?OWlcWLDh1v|kbmcN?=53NzXWG84VD4zQ@)+HVcJDPFBQ<3P>x^4Q<^6stqFp{7 z5KT&8Q_>AWll+bSM`=Krfky_Y-YeN MTW6axD_Z>j0EElpYXATM literal 0 HcmV?d00001 diff --git a/lib/tools/jverify_one_click_login.dart b/lib/tools/jverify_one_click_login.dart index d0a01f5b..6982e4d9 100644 --- a/lib/tools/jverify_one_click_login.dart +++ b/lib/tools/jverify_one_click_login.dart @@ -166,7 +166,7 @@ class JverifyOneClickLoginManage { uiConfig.authBackgroundImage = 'images/icon_left_grey.png'; // uiConfig.navHidden = !isiOS; - uiConfig.navColor = AppColors.mainColor.value; + uiConfig.navColor = Colors.white.value; uiConfig.navText = '一键登录'.tr; uiConfig.navTextColor = Colors.white.value; uiConfig.navReturnImgPath = 'return_bg'; //图片必须存在 @@ -184,7 +184,7 @@ class JverifyOneClickLoginManage { //uiConfig.numFieldOffsetX = isiOS ? 0 : null;//(screenWidth/2 - uiConfig.numberFieldWidth/2).toInt(); uiConfig.numFieldOffsetY = isiOS ? 120 : 220; uiConfig.numberVerticalLayoutItem = JVIOSLayoutItem.ItemLogo; - uiConfig.numberColor = AppColors.mainColor.value; + uiConfig.numberColor = Colors.white.value; uiConfig.numberSize = 18; uiConfig.sloganOffsetY = isiOS ? 120 : 260; @@ -201,7 +201,7 @@ class JverifyOneClickLoginManage { uiConfig.logBtnOffsetY = isiOS ? 120 : 330; uiConfig.logBtnVerticalLayoutItem = JVIOSLayoutItem.ItemNumber; uiConfig.logBtnText = '一键登录'.tr; - uiConfig.logBtnTextColor = Colors.white.value; + uiConfig.logBtnTextColor = AppColors.mainColor.value; uiConfig.logBtnTextSize = 16; uiConfig.logBtnBackgroundPath = ''; // uiConfig.logBtnTextBold = true; @@ -214,8 +214,8 @@ class JverifyOneClickLoginManage { uiConfig.privacyState = false; //设置默认勾选 uiConfig.privacyCheckboxSize = 20; - uiConfig.checkedImgPath = 'check_image'; //图片必须存在 - uiConfig.uncheckedImgPath = 'uncheck_image'; //图片必须存在 + uiConfig.checkedImgPath = 'check'; //图片必须存在 + uiConfig.uncheckedImgPath = 'uncheck'; //图片必须存在 uiConfig.privacyCheckboxInCenter = true; uiConfig.privacyCheckboxHidden = false; uiConfig.isAlertPrivacyVc = true; @@ -255,7 +255,7 @@ class JverifyOneClickLoginManage { uiConfig.enterAnim = 'activity_slide_enter_bottom'; uiConfig.exitAnim = 'activity_slide_exit_bottom'; - uiConfig.privacyNavColor = AppColors.mainColor.value; + uiConfig.privacyNavColor = Colors.white.value; uiConfig.privacyNavTitleTextColor = Colors.white.value; uiConfig.privacyNavTitleTextSize = 16; @@ -270,7 +270,7 @@ class JverifyOneClickLoginManage { }); } else { // -10000 表示登录失败 - action(JVListenerEvent.fromJson({'code': -10000, 'message': ''})); + action(JVListenerEvent.fromJson({'code': -10000, 'message': ''})); } } } From bb1607235dfe2e911b2d7fb86313a65cf4016000 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Mon, 21 Apr 2025 19:21:58 +0800 Subject: [PATCH 131/135] =?UTF-8?q?fix:=20=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=80=BB=E8=BE=91=E6=B2=A1=E6=9C=89=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E6=89=A7=E8=A1=8C=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=80=BB=E8=BE=91=E5=A4=B1=E8=B4=A5=E5=90=8E=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E4=BB=BB=E4=BD=95=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/login/starLock_login_logic.dart | 60 +++++++++++++---------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/lib/login/login/starLock_login_logic.dart b/lib/login/login/starLock_login_logic.dart index 01453fba..dc894170 100755 --- a/lib/login/login/starLock_login_logic.dart +++ b/lib/login/login/starLock_login_logic.dart @@ -109,35 +109,41 @@ class StarLockLoginLogic extends BaseGetXController { final String? content = e.message; // final String operator = map['operator']; AppLog.log('1111code:$code content:$content'); - if (code == 6000) { - final LoginEntity entity = await ApiRepository.to.oneClickLogin( - loginType: '3', - loginToken: content ?? '', - deviceInfo: state.deviceInfoMap); - if (entity.errorCode!.codeIsSuccessful) { - ApmHelper.instance.trackEvent('login_result', { - 'account': state.emailOrPhone.value, - 'date': DateTool().getNowDateWithType(1), - 'login_res': '成功', - }); + switch (code) { + case 6000: + final LoginEntity entity = await ApiRepository.to.oneClickLogin( + loginType: '3', + loginToken: content ?? '', + deviceInfo: state.deviceInfoMap); + if (entity.errorCode!.codeIsSuccessful) { + ApmHelper.instance.trackEvent('login_result', { + 'account': state.emailOrPhone.value, + 'date': DateTool().getNowDateWithType(1), + 'login_res': '成功', + }); - Storage.saveLoginData(entity.data); - Storage.setBool(saveIsVip, entity.data!.isVip == 1); - eventBus.fire(MineInfoChangeRefreshUI()); - if (Get.isRegistered()) { - Get.find().getStarLockInfo(isUnShowLoading: true); + Storage.saveLoginData(entity.data); + Storage.setBool(saveIsVip, entity.data!.isVip == 1); + eventBus.fire(MineInfoChangeRefreshUI()); + if (Get.isRegistered()) { + Get.find().getStarLockInfo(isUnShowLoading: true); + } + Get.offNamedUntil(Routers.starLockMain, (Route route) => false); + BlueManage().scanDevices.clear(); //清除设备缓存 + } else { + ApmHelper.instance.trackEvent('login_result', { + 'account': state.emailOrPhone.value, + 'date': DateTool().getNowDateWithType(1), + 'login_res': '${entity.errorCode}--${entity.errorMsg}', + }); } - Get.offNamedUntil(Routers.starLockMain, (Route route) => false); - BlueManage().scanDevices.clear(); //清除设备缓存 - } else { - ApmHelper.instance.trackEvent('login_result', { - 'account': state.emailOrPhone.value, - 'date': DateTool().getNowDateWithType(1), - 'login_res': '${entity.errorCode}--${entity.errorMsg}', - }); - } - } else { - showToast('一键登录失败,请重试'.tr); + break; + case 6002: + showToast('取消一键登录'.tr); + break; + default: + showToast('一键登录失败,请重试'.tr); + break; } }); } From 60a6666d224fe31d53b081736a7d7e0492e0a9cb Mon Sep 17 00:00:00 2001 From: Liuyf Date: Mon, 21 Apr 2025 19:24:04 +0800 Subject: [PATCH 132/135] =?UTF-8?q?fix:=20=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=80=BB=E8=BE=91=E6=B2=A1=E6=9C=89=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E6=89=A7=E8=A1=8C=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=80=BB=E8=BE=91=E5=A4=B1=E8=B4=A5=E5=90=8E=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E4=BB=BB=E4=BD=95=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/login/login/starLock_login_logic.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/login/login/starLock_login_logic.dart b/lib/login/login/starLock_login_logic.dart index dc894170..a2c154eb 100755 --- a/lib/login/login/starLock_login_logic.dart +++ b/lib/login/login/starLock_login_logic.dart @@ -139,7 +139,7 @@ class StarLockLoginLogic extends BaseGetXController { } break; case 6002: - showToast('取消一键登录'.tr); + // showToast('用户取消一键登录'.tr); break; default: showToast('一键登录失败,请重试'.tr); From 841ef69381351bf3670ac4b5850d39e1204fe424 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Tue, 22 Apr 2025 16:49:34 +0800 Subject: [PATCH 133/135] =?UTF-8?q?fix:=20-=20=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=80=BB=E8=BE=91=EF=BC=8CUI=E5=AE=8C=E5=96=84=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20-=20=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=A1=B5=E9=9D=A2=E4=BB=A5=E5=8F=8A=E4=BA=8C=E6=AC=A1?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E7=A1=AE=E8=AE=A4=E9=A1=B5=E9=9D=A2UI?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E5=AE=8C=E5=96=84=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20-=20=E4=B8=80=E9=94=AE=E7=99=BB=E5=BD=95=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=AE=8C=E5=96=84=EF=BC=8C=E8=BE=B9=E7=95=8C=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/drawable/icon_left_grey.png | Bin 0 -> 214 bytes ios/Podfile.lock | 49 ++++++++-- .../icon_left_grey.imageset/Contents.json | 21 +++++ .../icon_left_grey.png | Bin 0 -> 214 bytes lib/login/login/starLock_login_logic.dart | 6 +- lib/login/login/starLock_login_page.dart | 7 +- lib/login/login/starLock_login_xhj_page.dart | 2 +- lib/tools/jverify_one_click_login.dart | 86 ++++++++++++++++-- pubspec.lock | 48 ---------- 9 files changed, 149 insertions(+), 70 deletions(-) create mode 100644 android/app/src/main/res/drawable/icon_left_grey.png create mode 100644 ios/Runner/Assets.xcassets/icon_left_grey.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/icon_left_grey.imageset/icon_left_grey.png diff --git a/android/app/src/main/res/drawable/icon_left_grey.png b/android/app/src/main/res/drawable/icon_left_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..f95633172d283360b2e7e99f61aff75a87a74700 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^BBaTr|KZ#1%-dg@JWo0OY0pPxJvwu$Kh+1v51rC;pH+sC-IQk|`VxDt$&5|Y^!G 2.0.4) + - gallery_saver (0.0.1): + - Flutter - google_maps_flutter_ios (0.0.1): - Flutter - GoogleMaps (< 9.0) @@ -215,6 +215,24 @@ PODS: - JPush (= 5.3.0) - just_audio (0.0.1): - Flutter + - JVerification (3.2.4): + - JCore (>= 2.1.6) + - jverify (0.0.1): + - Flutter + - JCore (>= 4.6.2) + - JVerification (= 3.2.4) + - libwebp (1.3.2): + - libwebp/demux (= 1.3.2) + - libwebp/mux (= 1.3.2) + - libwebp/sharpyuv (= 1.3.2) + - libwebp/webp (= 1.3.2) + - libwebp/demux (1.3.2): + - libwebp/webp + - libwebp/mux (1.3.2): + - libwebp/demux + - libwebp/sharpyuv (1.3.2) + - libwebp/webp (1.3.2): + - libwebp/sharpyuv - nanopb (3.30910.0): - nanopb/decode (= 3.30910.0) - nanopb/encode (= 3.30910.0) @@ -257,6 +275,9 @@ PODS: - video_player_avfoundation (0.0.1): - Flutter - FlutterMacOS + - video_thumbnail (0.0.1): + - Flutter + - libwebp - webview_flutter_wkwebview (0.0.1): - Flutter - WechatOpenSDK-XCFramework (2.0.4) @@ -274,7 +295,6 @@ DEPENDENCIES: - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) - connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - - fast_rsa (from `.symlinks/plugins/fast_rsa/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`) - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) @@ -287,12 +307,14 @@ DEPENDENCIES: - flutter_voice_processor (from `.symlinks/plugins/flutter_voice_processor/ios`) - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) - fluwx (from `.symlinks/plugins/fluwx/ios`) + - gallery_saver (from `.symlinks/plugins/gallery_saver/ios`) - google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`) - image_gallery_saver (from `.symlinks/plugins/image_gallery_saver/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - JPush - jpush_flutter (from `.symlinks/plugins/jpush_flutter/ios`) - just_audio (from `.symlinks/plugins/just_audio/ios`) + - jverify (from `.symlinks/plugins/jverify/ios`) - network_info_plus (from `.symlinks/plugins/network_info_plus/ios`) - open_filex (from `.symlinks/plugins/open_filex/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) @@ -306,6 +328,7 @@ DEPENDENCIES: - umeng_common_sdk (from `.symlinks/plugins/umeng_common_sdk/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) + - video_thumbnail (from `.symlinks/plugins/video_thumbnail/ios`) - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) SPEC REPOS: @@ -334,6 +357,8 @@ SPEC REPOS: - ios-voice-processor - JCore - JPush + - JVerification + - libwebp - nanopb - PromisesObjC - SDWebImage @@ -366,8 +391,6 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/connectivity_plus/darwin" device_info_plus: :path: ".symlinks/plugins/device_info_plus/ios" - fast_rsa: - :path: ".symlinks/plugins/fast_rsa/ios" file_picker: :path: ".symlinks/plugins/file_picker/ios" firebase_analytics: @@ -392,6 +415,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/fluttertoast/ios" fluwx: :path: ".symlinks/plugins/fluwx/ios" + gallery_saver: + :path: ".symlinks/plugins/gallery_saver/ios" google_maps_flutter_ios: :path: ".symlinks/plugins/google_maps_flutter_ios/ios" image_gallery_saver: @@ -402,6 +427,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/jpush_flutter/ios" just_audio: :path: ".symlinks/plugins/just_audio/ios" + jverify: + :path: ".symlinks/plugins/jverify/ios" network_info_plus: :path: ".symlinks/plugins/network_info_plus/ios" open_filex: @@ -424,6 +451,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/url_launcher_ios/ios" video_player_avfoundation: :path: ".symlinks/plugins/video_player_avfoundation/darwin" + video_thumbnail: + :path: ".symlinks/plugins/video_thumbnail/ios" webview_flutter_wkwebview: :path: ".symlinks/plugins/webview_flutter_wkwebview/ios" @@ -451,7 +480,6 @@ SPEC CHECKSUMS: DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 EMASRest: 8df6f87836767a9415ad5cc4af739bc9d215b475 - fast_rsa: a1fed69b074093d2e2e3fefae6b821a071649d4c file_picker: ce3938a0df3cc1ef404671531facef740d03f920 Firebase: 9f574c08c2396885b5e7e100ed4293d956218af9 firebase_analytics: 1a66fe8d4375eccff44671ea37897683a78b2675 @@ -468,7 +496,8 @@ SPEC CHECKSUMS: flutter_pcm_sound: de0572ca4f99091cc2abfcc31601b8a4ddd33c0e flutter_voice_processor: 2b89b93d69b02227ae3fd58589ee0bcfa3ca2a82 fluttertoast: e9a18c7be5413da53898f660530c56f35edfba9c - fluwx: c18fd6c16b03a2187cd07d6e48e32a7801962849 + fluwx: daa284756ce53442b3d0417ceeda66e981906811 + gallery_saver: 9fc173c9f4fcc48af53b2a9ebea1b643255be542 google_maps_flutter_ios: f135b968a67c05679e0a53538e900b5c174b0d99 GoogleAppMeasurement: 6e49ffac7d3f2c3ded9cc663f912a13b67bbd0de GoogleMaps: 20d7b12be49a14287f797e88e0e31bc4156aaeb4 @@ -480,6 +509,9 @@ SPEC CHECKSUMS: JPush: b71f497a3c1b825c7843fd97f290b05d5cd75f2e jpush_flutter: c87be254790933c0363684169ef9d3d279a5adc5 just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa + JVerification: 0774807f44dd788c78d50303a14e133735807856 + jverify: 337ea43ac1e16f9484f4195abe787d1b6241163c + libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 network_info_plus: 6d0c3eb8367b8164fa3fb0c19875e3f59d49697f open_filex: 6e26e659846ec990262224a12ef1c528bb4edbe4 @@ -498,9 +530,10 @@ SPEC CHECKSUMS: umeng_common_sdk: a8abd7f86dfd013dbbeeae587ee143760c6582f2 url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3 + video_thumbnail: c4e2a3c539e247d4de13cd545344fd2d26ffafd1 webview_flutter_wkwebview: 2a23822e9039b7b1bc52e5add778e5d89ad488d1 WechatOpenSDK-XCFramework: 36fb2bea0754266c17184adf4963d7e6ff98b69f PODFILE CHECKSUM: 728f9c851a19709391c77c54ed3556e484b54db6 -COCOAPODS: 1.16.2 +COCOAPODS: 1.14.3 diff --git a/ios/Runner/Assets.xcassets/icon_left_grey.imageset/Contents.json b/ios/Runner/Assets.xcassets/icon_left_grey.imageset/Contents.json new file mode 100644 index 00000000..1aa8ae8d --- /dev/null +++ b/ios/Runner/Assets.xcassets/icon_left_grey.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "icon_left_grey.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Runner/Assets.xcassets/icon_left_grey.imageset/icon_left_grey.png b/ios/Runner/Assets.xcassets/icon_left_grey.imageset/icon_left_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..f95633172d283360b2e7e99f61aff75a87a74700 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^BBaTr|KZ#1%-dg@JWo0OY0pPxJvwu$Kh+1v51rC;pH+sC-IQk|`VxDt$&5|Y^!G oneClickLoginAction() async { - await JverifyOneClickLoginManage().loginAuth((e) async { + Future oneClickLoginAction(BuildContext context) async { + await JverifyOneClickLoginManage().loginAuth(context,(e) async { final int? code = e.code; final String? content = e.message; // final String operator = map['operator']; @@ -142,7 +142,7 @@ class StarLockLoginLogic extends BaseGetXController { // showToast('用户取消一键登录'.tr); break; default: - showToast('一键登录失败,请重试'.tr); + showToast('一键登录失败,请使用账号/密码登录'.tr); break; } }); diff --git a/lib/login/login/starLock_login_page.dart b/lib/login/login/starLock_login_page.dart index f9a46982..59997b27 100755 --- a/lib/login/login/starLock_login_page.dart +++ b/lib/login/login/starLock_login_page.dart @@ -283,7 +283,8 @@ class _StarLockLoginPageState extends State { width: 10.sp, )), Obx(() => Visibility( - visible: state.isCheckVerifyEnable.value && state.currentLanguage == 'zh_CN', + visible: state.isCheckVerifyEnable.value && + state.currentLanguage == 'zh_CN', child: GestureDetector( child: SizedBox( // width: 150.w, @@ -296,7 +297,9 @@ class _StarLockLoginPageState extends State { color: AppColors.mainColor)), ), ), - onTap: logic.oneClickLoginAction, + onTap: () { + logic.oneClickLoginAction(context); + }, ), )) ], diff --git a/lib/login/login/starLock_login_xhj_page.dart b/lib/login/login/starLock_login_xhj_page.dart index b0810366..9d32642d 100755 --- a/lib/login/login/starLock_login_xhj_page.dart +++ b/lib/login/login/starLock_login_xhj_page.dart @@ -243,7 +243,7 @@ class _StarLockLoginPageState extends State { ), ), onTap: () async { - logic.oneClickLoginAction(); + logic.oneClickLoginAction(context); }, ), )) diff --git a/lib/tools/jverify_one_click_login.dart b/lib/tools/jverify_one_click_login.dart index 6982e4d9..78454725 100644 --- a/lib/tools/jverify_one_click_login.dart +++ b/lib/tools/jverify_one_click_login.dart @@ -142,7 +142,7 @@ class JverifyOneClickLoginManage { } /// SDK 请求授权一键登录 - Future loginAuth( + Future loginAuth(BuildContext context, Function(JVListenerEvent jvListenerEvent) action) async { Map map = await jverify.checkVerifyEnable(); final bool result = map[f_result_key]; @@ -154,6 +154,9 @@ class JverifyOneClickLoginManage { // return null; if (result) { + final screenSize = MediaQuery.of(context).size; + final screenWidth = screenSize.width; + final screenHeight = screenSize.height; bool isiOS = Platform.isIOS; /// 自定义授权的 UI 界面,以下设置的图片必须添加到资源文件里, @@ -163,13 +166,13 @@ class JverifyOneClickLoginManage { // uiConfig.authBGGifPath = "main_gif"; // uiConfig.authBGVideoPath="main_vi"; // uiConfig.authBGVideoPath = 'http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4'; - uiConfig.authBackgroundImage = 'images/icon_left_grey.png'; + // uiConfig.authBackgroundImage = 'images/icon_left_grey.png'; // uiConfig.navHidden = !isiOS; - uiConfig.navColor = Colors.white.value; + uiConfig.navColor = AppColors.mainColor.value; uiConfig.navText = '一键登录'.tr; uiConfig.navTextColor = Colors.white.value; - uiConfig.navReturnImgPath = 'return_bg'; //图片必须存在 + uiConfig.navReturnImgPath = 'icon_left_grey'; //图片必须存在 uiConfig.logoWidth = 100; uiConfig.logoHeight = 100; @@ -194,11 +197,11 @@ class JverifyOneClickLoginManage { // uiConfig.slogan //uiConfig.sloganHidden = 0; - uiConfig.logBtnOffsetX = 20; + // uiConfig.logBtnOffsetX = 20; uiConfig.logBtnWidth = double.parse('${1.sw - 20 * 2}').toInt(); uiConfig.logBtnHeight = 50; //uiConfig.logBtnOffsetX = isiOS ? 0 : null;//(screenWidth/2 - uiConfig.logBtnWidth/2).toInt(); - uiConfig.logBtnOffsetY = isiOS ? 120 : 330; + uiConfig.logBtnOffsetY = isiOS ? 140 : 330; uiConfig.logBtnVerticalLayoutItem = JVIOSLayoutItem.ItemNumber; uiConfig.logBtnText = '一键登录'.tr; uiConfig.logBtnTextColor = AppColors.mainColor.value; @@ -221,6 +224,7 @@ class JverifyOneClickLoginManage { uiConfig.isAlertPrivacyVc = true; //uiConfig.privacyOffsetX = isiOS ? (20 + uiConfig.privacyCheckboxSize) : null; + uiConfig.privacyNavReturnBtnImage = 'icon_left_grey'; //图片必须存在; uiConfig.privacyOffsetY = 30; // 距离底部距离 uiConfig.privacyOffsetX = 15; // 距离底部距离 uiConfig.privacyVerticalLayoutItem = JVIOSLayoutItem.ItemSuper; @@ -259,8 +263,73 @@ class JverifyOneClickLoginManage { uiConfig.privacyNavTitleTextColor = Colors.white.value; uiConfig.privacyNavTitleTextSize = 16; + //协议二次弹窗内容设置 -Android + final JVPrivacyCheckDialogConfig privacyCheckDialogConfig = + JVPrivacyCheckDialogConfig(); + privacyCheckDialogConfig.width = 250; //协议⼆次弹窗本身的宽 + privacyCheckDialogConfig.height = 100; //协议⼆次弹窗本身的⾼ + privacyCheckDialogConfig.title = '请阅读并同意一下条款'; //弹窗标题 + privacyCheckDialogConfig.offsetX = 0; // 窗口相对屏幕中心的x轴偏移量 + privacyCheckDialogConfig.offsetY = 0; // 窗口相对屏幕中心的y轴偏移量 + + privacyCheckDialogConfig.logBtnText = '同意并登录'; //弹窗登录按钮 + privacyCheckDialogConfig.titleTextSize = 24; // 弹窗标题字体大小 + privacyCheckDialogConfig.gravity = 'center'; //弹窗对齐方式 + privacyCheckDialogConfig.titleTextColor = Colors.black.value; // 弹窗标题字体颜色 + privacyCheckDialogConfig.contentTextGravity = 'left'; //协议⼆次弹窗协议内容对⻬⽅式 + privacyCheckDialogConfig.contentTextSize = 16; //协议⼆次弹窗协议内容字体⼤⼩ + // privacyCheckDialogConfig.logBtnImgPath = "login_btn_normal";//协议⼆次弹窗登录按钮的背景图⽚ + privacyCheckDialogConfig.logBtnTextColor = + Colors.black.value; //协议⼆次弹窗登录按钮的字体颜⾊ + privacyCheckDialogConfig.logBtnMarginT = 20; //协议⼆次弹窗登录按钮上边距 + privacyCheckDialogConfig.logBtnMarginB = 20; //协议⼆次弹窗登录按钮下边距 + privacyCheckDialogConfig.logBtnMarginL = 40; //协议⼆次弹窗登录按钮左边距 + privacyCheckDialogConfig.logBtnWidth = 140; //协议⼆次弹窗登录按钮宽 + privacyCheckDialogConfig.logBtnHeight = 40; //协议⼆次弹窗登录按高 + /// 添加自定义的 控件 到dialog + final List dialogWidgetList = []; + const String btnDialogWidgetid = 'jv_add_custom_dialog_button'; // 标识控件 id + final JVCustomWidget buttonDialogWidget = + JVCustomWidget(btnDialogWidgetid, JVCustomWidgetType.button); + buttonDialogWidget.title = '取消'; + buttonDialogWidget.titleFont = 16; + buttonDialogWidget.left = 80; + buttonDialogWidget.top = 180; + buttonDialogWidget.width = 140; + buttonDialogWidget.height = 40; + buttonDialogWidget.textAlignment = JVTextAlignmentType.center; + buttonDialogWidget.titleColor = Colors.black.value; + // buttonDialogWidget.btnNormalImageName = "main_btn_other"; + // buttonDialogWidget.btnPressedImageName = "main_btn_other"; + // buttonDialogWidget.backgroundColor = Colors.yellow.value; + // buttonWidget.textAlignment = JVTextAlignmentType.left; + + // 添加点击事件监听 + jverify.addClikWidgetEventListener(btnDialogWidgetid, (eventId) { + print('receive listener - click dialog widget event :$eventId'); + if (btnDialogWidgetid == eventId) { + print('receive listener - 点击【新加 dialog button】'); + } + }); + dialogWidgetList.add(buttonDialogWidget); + privacyCheckDialogConfig.widgets = dialogWidgetList; + uiConfig.privacyCheckDialogConfig = privacyCheckDialogConfig; + // iOS 二次弹窗添加取消按钮 + uiConfig.isAlertPrivacyVc = true; + uiConfig.agreementAlertViewWidgets = dialogWidgetList; + uiConfig.agreementAlertViewLogBtnTextFontSize = 16; + uiConfig.agreementAlertViewTitleTexSize = 18; + uiConfig.agreementAlertViewContentTextFontSize = 14; + final alertLeft = (screenWidth / 2 - 300 / 2).toInt(); + uiConfig.agreementAlertViewUIFrames = { + 'superViewFrame': [alertLeft, 100, 300, 220], + 'titleFrame': [20, 10, 260, 40], + 'contentFrame': [25, 70, 250, 120], + 'buttonFrame': [80, 142, 140, 40] + }; + /// 调用接口设置 UI - jverify.setCustomAuthorizationView(true, uiConfig, + jverify.setCustomAuthorizationView(false, uiConfig, landscapeConfig: uiConfig); jverify.loginAuthSyncApi2( autoDismiss: true, @@ -270,7 +339,8 @@ class JverifyOneClickLoginManage { }); } else { // -10000 表示登录失败 - action(JVListenerEvent.fromJson({'code': -10000, 'message': ''})); + action(JVListenerEvent.fromJson( + {'code': -10000, 'message': ''})); } } } diff --git a/pubspec.lock b/pubspec.lock index 9b40c4b0..b1ead27d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -621,14 +621,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.3" - flutter_foreground_task: - dependency: transitive - description: - name: flutter_foreground_task - sha256: "6cf10a27f5e344cd2ecad0752d3a5f4ec32846d82fda8753b3fe2480ebb832a3" - url: "https://pub.dev" - source: hosted - version: "6.5.0" flutter_hooks: dependency: transitive description: @@ -714,30 +706,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.18" - flutter_screen_recording: - dependency: "direct main" - description: - name: flutter_screen_recording - sha256: "672a3f6c9e7b7438461a3a18ba36d8586189adcb716911d4c41d5d88592fbdda" - url: "https://pub.dev" - source: hosted - version: "2.0.16" - flutter_screen_recording_platform_interface: - dependency: transitive - description: - name: flutter_screen_recording_platform_interface - sha256: "9e07f78a2529bc5b6c77d045b392ed4062445543613fcad431c4cc1da57558d7" - url: "https://pub.dev" - source: hosted - version: "1.0.3" - flutter_screen_recording_web: - dependency: transitive - description: - name: flutter_screen_recording_web - sha256: f0a1b141beb1a64d8087c5871949a11ea6bf5d2a2fcd9d1341a7cf7b11e41aab - url: "https://pub.dev" - source: hosted - version: "1.0.7" flutter_screenutil: dependency: "direct main" description: @@ -1341,14 +1309,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.6" - platform_detect: - dependency: transitive - description: - name: platform_detect - sha256: a62f99417fc4fa2d099ce0ccdbb1bd3977920f2a64292c326271f049d4bc3a4f - url: "https://pub.dev" - source: hosted - version: "2.1.0" plugin_platform_interface: dependency: transitive description: @@ -1389,14 +1349,6 @@ packages: url: "https://pub.dev" source: hosted version: "6.1.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" - url: "https://pub.dev" - source: hosted - version: "2.1.4" qr: dependency: transitive description: From 1c3c61239bd5854c1359b5958bc7ff8764f81e26 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Tue, 22 Apr 2025 18:43:15 +0800 Subject: [PATCH 134/135] =?UTF-8?q?fix:=20-=20=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=80=BB=E8=BE=91=EF=BC=8CUI=E5=AE=8C=E5=96=84=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20-=20=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=A1=B5=E9=9D=A2=E4=BB=A5=E5=8F=8A=E4=BA=8C=E6=AC=A1?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E7=A1=AE=E8=AE=A4=E9=A1=B5=E9=9D=A2UI?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E5=AE=8C=E5=96=84=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20-=20=E4=B8=80=E9=94=AE=E7=99=BB=E5=BD=95=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=AE=8C=E5=96=84=EF=BC=8C=E8=BE=B9=E7=95=8C=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/drawable/log_btn_background.xml | 5 + android/app/src/main/res/drawable/uncheck.png | Bin 4551 -> 4839 bytes lib/tools/jverify_one_click_login.dart | 145 +++++++++--------- 3 files changed, 79 insertions(+), 71 deletions(-) create mode 100644 android/app/src/main/res/drawable/log_btn_background.xml diff --git a/android/app/src/main/res/drawable/log_btn_background.xml b/android/app/src/main/res/drawable/log_btn_background.xml new file mode 100644 index 00000000..58769a9b --- /dev/null +++ b/android/app/src/main/res/drawable/log_btn_background.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/uncheck.png b/android/app/src/main/res/drawable/uncheck.png index f1ff42177c5381dd577fbef8a4917b2eedb81225..4a1f3ddaaf386959d8d17bbb5e0d57f82c9ef68a 100644 GIT binary patch literal 4839 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 Ib_`4U9~e14)Bpeg literal 4551 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 MTW6axD_Z>j0EElpYXATM diff --git a/lib/tools/jverify_one_click_login.dart b/lib/tools/jverify_one_click_login.dart index 78454725..1e8007dc 100644 --- a/lib/tools/jverify_one_click_login.dart +++ b/lib/tools/jverify_one_click_login.dart @@ -187,10 +187,10 @@ class JverifyOneClickLoginManage { //uiConfig.numFieldOffsetX = isiOS ? 0 : null;//(screenWidth/2 - uiConfig.numberFieldWidth/2).toInt(); uiConfig.numFieldOffsetY = isiOS ? 120 : 220; uiConfig.numberVerticalLayoutItem = JVIOSLayoutItem.ItemLogo; - uiConfig.numberColor = Colors.white.value; + uiConfig.numberColor = AppColors.mainColor.value; uiConfig.numberSize = 18; - uiConfig.sloganOffsetY = isiOS ? 120 : 260; + uiConfig.sloganOffsetY = isiOS ? 40 : 300; uiConfig.sloganVerticalLayoutItem = JVIOSLayoutItem.ItemNumber; uiConfig.sloganTextColor = Colors.black.value; uiConfig.sloganTextSize = 15; @@ -201,12 +201,12 @@ class JverifyOneClickLoginManage { uiConfig.logBtnWidth = double.parse('${1.sw - 20 * 2}').toInt(); uiConfig.logBtnHeight = 50; //uiConfig.logBtnOffsetX = isiOS ? 0 : null;//(screenWidth/2 - uiConfig.logBtnWidth/2).toInt(); - uiConfig.logBtnOffsetY = isiOS ? 140 : 330; + uiConfig.logBtnOffsetY = isiOS ? 60 : 330; uiConfig.logBtnVerticalLayoutItem = JVIOSLayoutItem.ItemNumber; uiConfig.logBtnText = '一键登录'.tr; uiConfig.logBtnTextColor = AppColors.mainColor.value; uiConfig.logBtnTextSize = 16; - uiConfig.logBtnBackgroundPath = ''; + // uiConfig.logBtnBackgroundPath = 'log_btn_background'; // uiConfig.logBtnTextBold = true; // uiConfig.loginBtnNormalImage = 'login_btn_normal'; //图片必须存在 // uiConfig.loginBtnPressedImage = 'login_btn_press'; //图片必须存在 @@ -216,12 +216,15 @@ class JverifyOneClickLoginManage { true; //only android 设置隐私条款不选中时点击登录按钮默认显示toast。 uiConfig.privacyState = false; //设置默认勾选 - uiConfig.privacyCheckboxSize = 20; - uiConfig.checkedImgPath = 'check'; //图片必须存在 - uiConfig.uncheckedImgPath = 'uncheck'; //图片必须存在 + uiConfig.privacyCheckboxSize = 22; + if (isiOS) { + uiConfig.checkedImgPath = 'check'; //图片必须存在 + uiConfig.uncheckedImgPath = 'uncheck'; //图片必须存在 + } + uiConfig.privacyCheckboxInCenter = true; uiConfig.privacyCheckboxHidden = false; - uiConfig.isAlertPrivacyVc = true; + uiConfig.isAlertPrivacyVc = false; //uiConfig.privacyOffsetX = isiOS ? (20 + uiConfig.privacyCheckboxSize) : null; uiConfig.privacyNavReturnBtnImage = 'icon_left_grey'; //图片必须存在; @@ -264,69 +267,69 @@ class JverifyOneClickLoginManage { uiConfig.privacyNavTitleTextSize = 16; //协议二次弹窗内容设置 -Android - final JVPrivacyCheckDialogConfig privacyCheckDialogConfig = - JVPrivacyCheckDialogConfig(); - privacyCheckDialogConfig.width = 250; //协议⼆次弹窗本身的宽 - privacyCheckDialogConfig.height = 100; //协议⼆次弹窗本身的⾼ - privacyCheckDialogConfig.title = '请阅读并同意一下条款'; //弹窗标题 - privacyCheckDialogConfig.offsetX = 0; // 窗口相对屏幕中心的x轴偏移量 - privacyCheckDialogConfig.offsetY = 0; // 窗口相对屏幕中心的y轴偏移量 - - privacyCheckDialogConfig.logBtnText = '同意并登录'; //弹窗登录按钮 - privacyCheckDialogConfig.titleTextSize = 24; // 弹窗标题字体大小 - privacyCheckDialogConfig.gravity = 'center'; //弹窗对齐方式 - privacyCheckDialogConfig.titleTextColor = Colors.black.value; // 弹窗标题字体颜色 - privacyCheckDialogConfig.contentTextGravity = 'left'; //协议⼆次弹窗协议内容对⻬⽅式 - privacyCheckDialogConfig.contentTextSize = 16; //协议⼆次弹窗协议内容字体⼤⼩ - // privacyCheckDialogConfig.logBtnImgPath = "login_btn_normal";//协议⼆次弹窗登录按钮的背景图⽚ - privacyCheckDialogConfig.logBtnTextColor = - Colors.black.value; //协议⼆次弹窗登录按钮的字体颜⾊ - privacyCheckDialogConfig.logBtnMarginT = 20; //协议⼆次弹窗登录按钮上边距 - privacyCheckDialogConfig.logBtnMarginB = 20; //协议⼆次弹窗登录按钮下边距 - privacyCheckDialogConfig.logBtnMarginL = 40; //协议⼆次弹窗登录按钮左边距 - privacyCheckDialogConfig.logBtnWidth = 140; //协议⼆次弹窗登录按钮宽 - privacyCheckDialogConfig.logBtnHeight = 40; //协议⼆次弹窗登录按高 - /// 添加自定义的 控件 到dialog - final List dialogWidgetList = []; - const String btnDialogWidgetid = 'jv_add_custom_dialog_button'; // 标识控件 id - final JVCustomWidget buttonDialogWidget = - JVCustomWidget(btnDialogWidgetid, JVCustomWidgetType.button); - buttonDialogWidget.title = '取消'; - buttonDialogWidget.titleFont = 16; - buttonDialogWidget.left = 80; - buttonDialogWidget.top = 180; - buttonDialogWidget.width = 140; - buttonDialogWidget.height = 40; - buttonDialogWidget.textAlignment = JVTextAlignmentType.center; - buttonDialogWidget.titleColor = Colors.black.value; - // buttonDialogWidget.btnNormalImageName = "main_btn_other"; - // buttonDialogWidget.btnPressedImageName = "main_btn_other"; - // buttonDialogWidget.backgroundColor = Colors.yellow.value; - // buttonWidget.textAlignment = JVTextAlignmentType.left; - - // 添加点击事件监听 - jverify.addClikWidgetEventListener(btnDialogWidgetid, (eventId) { - print('receive listener - click dialog widget event :$eventId'); - if (btnDialogWidgetid == eventId) { - print('receive listener - 点击【新加 dialog button】'); - } - }); - dialogWidgetList.add(buttonDialogWidget); - privacyCheckDialogConfig.widgets = dialogWidgetList; - uiConfig.privacyCheckDialogConfig = privacyCheckDialogConfig; - // iOS 二次弹窗添加取消按钮 - uiConfig.isAlertPrivacyVc = true; - uiConfig.agreementAlertViewWidgets = dialogWidgetList; - uiConfig.agreementAlertViewLogBtnTextFontSize = 16; - uiConfig.agreementAlertViewTitleTexSize = 18; - uiConfig.agreementAlertViewContentTextFontSize = 14; - final alertLeft = (screenWidth / 2 - 300 / 2).toInt(); - uiConfig.agreementAlertViewUIFrames = { - 'superViewFrame': [alertLeft, 100, 300, 220], - 'titleFrame': [20, 10, 260, 40], - 'contentFrame': [25, 70, 250, 120], - 'buttonFrame': [80, 142, 140, 40] - }; + // final JVPrivacyCheckDialogConfig privacyCheckDialogConfig = + // JVPrivacyCheckDialogConfig(); + // privacyCheckDialogConfig.width = 300; //协议⼆次弹窗本身的宽 + // privacyCheckDialogConfig.height = 220; //协议⼆次弹窗本身的⾼ + // privacyCheckDialogConfig.privacyBackgroundColor = Colors.grey.value; + // privacyCheckDialogConfig.title = '请阅读并同意一下条款'; //弹窗标题 + // privacyCheckDialogConfig.offsetX = 0; // 窗口相对屏幕中心的x轴偏移量 + // privacyCheckDialogConfig.offsetY = 0; // 窗口相对屏幕中心的y轴偏移量 + // + // privacyCheckDialogConfig.logBtnText = '同意并登录'; //弹窗登录按钮 + // privacyCheckDialogConfig.titleTextSize = 16; // 弹窗标题字体大小 + // privacyCheckDialogConfig.gravity = 'center'; //弹窗对齐方式 + // privacyCheckDialogConfig.titleTextColor = Colors.black.value; // 弹窗标题字体颜色 + // privacyCheckDialogConfig.contentTextGravity = 'left'; //协议⼆次弹窗协议内容对⻬⽅式 + // privacyCheckDialogConfig.contentTextSize = 14; //协议⼆次弹窗协议内容字体⼤⼩ + // privacyCheckDialogConfig.logBtnImgPath = + // 'log_btn_background'; //协议⼆次弹窗登录按钮的背景图⽚ + // privacyCheckDialogConfig.logBtnTextColor = + // Colors.black.value; //协议⼆次弹窗登录按钮的字体颜⾊ + // privacyCheckDialogConfig.logBtnMarginT = 40; //协议⼆次弹窗登录按钮上边距 + // privacyCheckDialogConfig.logBtnMarginB = 20; //协议⼆次弹窗登录按钮下边距 + // privacyCheckDialogConfig.logBtnMarginL = 90; //协议⼆次弹窗登录按钮左边距 + // privacyCheckDialogConfig.logBtnWidth = 140; //协议⼆次弹窗登录按钮宽 + // privacyCheckDialogConfig.logBtnHeight = 40; //协议⼆次弹窗登录按高 + // /// 添加自定义的 控件 到dialog + // final List dialogWidgetList = []; + // const String btnDialogWidgetid = 'jv_add_custom_dialog_button'; // 标识控件 id + // final JVCustomWidget buttonDialogWidget = + // JVCustomWidget(btnDialogWidgetid, JVCustomWidgetType.button); + // buttonDialogWidget.title = '取消'; + // buttonDialogWidget.titleFont = 16; + // buttonDialogWidget.left = 80; + // buttonDialogWidget.top = 180; + // buttonDialogWidget.width = 140; + // buttonDialogWidget.height = 40; + // buttonDialogWidget.textAlignment = JVTextAlignmentType.center; + // buttonDialogWidget.titleColor = Colors.black.value; + // buttonDialogWidget.btnNormalImageName = "log_btn_background"; + // buttonDialogWidget.btnPressedImageName = "log_btn_background"; + // + // // 添加点击事件监听 + // jverify.addClikWidgetEventListener(btnDialogWidgetid, (eventId) { + // print('receive listener - click dialog widget event :$eventId'); + // if (btnDialogWidgetid == eventId) { + // print('receive listener - 点击【新加 dialog button】'); + // } + // }); + // dialogWidgetList.add(buttonDialogWidget); + // privacyCheckDialogConfig.widgets = dialogWidgetList; + // uiConfig.privacyCheckDialogConfig = privacyCheckDialogConfig; + // // iOS 二次弹窗添加取消按钮 + // uiConfig.isAlertPrivacyVc = true; + // uiConfig.agreementAlertViewWidgets = dialogWidgetList; + // uiConfig.agreementAlertViewLogBtnTextFontSize = 16; + // uiConfig.agreementAlertViewTitleTexSize = 18; + // uiConfig.agreementAlertViewContentTextFontSize = 14; + // final alertLeft = (screenWidth / 2 - 300 / 2).toInt(); + // uiConfig.agreementAlertViewUIFrames = { + // 'superViewFrame': [alertLeft, 100, 300, 220], + // 'titleFrame': [20, 10, 260, 40], + // 'contentFrame': [25, 70, 250, 120], + // 'buttonFrame': [80, 142, 140, 40] + // }; /// 调用接口设置 UI jverify.setCustomAuthorizationView(false, uiConfig, From f9c31f72392ba51c1e7eefcc9b69d2510ce19ac6 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Tue, 22 Apr 2025 19:00:51 +0800 Subject: [PATCH 135/135] =?UTF-8?q?fix:=20-=20=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=80=BB=E8=BE=91=EF=BC=8CUI=E5=AE=8C=E5=96=84=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20-=20=E4=B8=80=E9=94=AE=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=A1=B5=E9=9D=A2=E4=BB=A5=E5=8F=8A=E4=BA=8C=E6=AC=A1?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E7=A1=AE=E8=AE=A4=E9=A1=B5=E9=9D=A2UI?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E5=AE=8C=E5=96=84=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20-=20=E4=B8=80=E9=94=AE=E7=99=BB=E5=BD=95=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=AE=8C=E5=96=84=EF=BC=8C=E8=BE=B9=E7=95=8C=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../login_btn_normal.imageset/Contents.json | 21 ++++++++++++++++++ .../login_btn_normal.png | Bin 0 -> 2336 bytes .../login_btn_press.imageset/Contents.json | 21 ++++++++++++++++++ .../login_btn_press.png | Bin 0 -> 2337 bytes lib/tools/jverify_one_click_login.dart | 14 +++++++----- 5 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 ios/Runner/Assets.xcassets/login_btn_normal.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/login_btn_normal.imageset/login_btn_normal.png create mode 100644 ios/Runner/Assets.xcassets/login_btn_press.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/login_btn_press.imageset/login_btn_press.png diff --git a/ios/Runner/Assets.xcassets/login_btn_normal.imageset/Contents.json b/ios/Runner/Assets.xcassets/login_btn_normal.imageset/Contents.json new file mode 100644 index 00000000..a6c3fabf --- /dev/null +++ b/ios/Runner/Assets.xcassets/login_btn_normal.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "login_btn_normal.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Runner/Assets.xcassets/login_btn_normal.imageset/login_btn_normal.png b/ios/Runner/Assets.xcassets/login_btn_normal.imageset/login_btn_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..4467ae9af1d5de16418d80e6bbf7804eaea51948 GIT binary patch literal 2336 zcma)7ZBSEJ8a}LbtyM<5UNDE70CAqmmB*{&a3rWCY zC><&VETCY8I=a*P)v01)TNKc`+dzUsD;=k#6t+?oYK>_tU!xG&bNR6SvFwl^$$Rd3 zp67kv=e#+$EJ^mV|8r}e0|59-;zh{-ETY3W@7X`Y?@Uj$9saB);?jr|d^cfI7%(7E z;Yy4u(JHdBWK5y5ywQPehpbI%c^Z)>-N{FBEki+K7-p>=vH{p0W7aFsT#TS9v23+2 ziuOy(7c{C`6-7(sNLf<75X(`=7Z|XV0+}2w$VGW7T1+%`yO|FKv>2hFnzb68k#CNo zP3!VuOg?7PsM8Q4H;Oh>RGKu2D#Q&KmBWY#MUk*bDwoGVIJ`)9_*N>Lg+wq}JSGwz z%0l=o9-oC!XFoKU&7j)NPZo)1bHP;j^ckqmqgWC7wq_(O{)BEok*mWp&0`o1kG#vqH~A7%Z}- zIiOVf|Djs#Q?!vt#(uB&e+nDr7CpvH#*BEL0fh&*n@*SQO~#j|IZ`QKqB9Z-9g0arQ8cK+P^(pZk(e8XaAJ9J!UzF^ z#6?E(MB&1)NC8hE5DLP=L~~pbj^=4G9WlpM{mvE4%O%G_tB09Im_eP7sl*0cOPy|; zub#ga?!0=lT-E%wM9#})!eW@@;r`*U=N`ccBEzSn3l~p^AJf5!H^9*zumnB>z~U;2 zNFX=&dirBDhw}dF{Owdv>6y|>Zd9JNpnW~(U|K>N5P}I5^olrIo zuDmzQSq!W%$L{-2z58U{t}hOj+$nbt*E3%g7V`3!4;={dM2NpJUKXR2 z{=We5(~b7NfGy2s)#FNL^9BHJoVXd_&z89dGI)rE}RLZADpp<-R63G+P8*y%lwipf=l*DphUP3!80oXz5zkxjwt zn^%)_>_oG@qm;^t$;4kAjEk@Va@5}$oamZpb3Jf--QzlF3Gq`)UqDk!S+$BimaORv z^#j(36Gdj;xTsrO5!{0^9bdJ)1l6p=m)4(Sjx3>Qqi@N(Cn+_zb<5y?@V41odM5vg z{=28#yI@oA3V>Volf&b_?~O|`GCE5} zYeyuR*IrKvKenarABpCaPkMS_8S5T_M-dU};m6(`E&Th6KJvp>-w|p?=Tss=`Lf81ROX*vGE!xoEyyYqwO@6;&bKqTgBLEd%{IE4o1goo{qGK>63_Br{! zy}$GAeeNwwTb&#@`<2-MfIvx#FdYDY8jK5`n+3l&cvgG~f5HqRxnV7yWiToT3?!;> zB}S2G6xmohrcf2;U&NL})?&3xZjeh;c_^--D|{HbNuz^o0G211bP6;VGfVzn{G>sy_35>#~$3>&en0N|@OJ}mV@vPW4DJ%vv4qMFM zluG|URHJ!{)*I5XU-kZOV!fWzjT}!AcUuPH}}eTA;zShAFPOq*|#tD0U*{IpyIia~tM{Y|r{w%`Q$!l$DP7f**D)53`-;An@pMjiyx)bvD7A&}MzvjjVW$PBCR9`AtJ?p0*o~eEQ$fcw_WEX-cxIpMlSUU!wu@dG97Pv0mm zE~XBz9cwPWwrvh=8;PJ9O5{ARs2+fKTl%itdYpMNf?-Nfs^0RbJn0Ru!tJ6kCtt^U zoEXJqg^VtWd-?7?HUK3Bbu?pQ-?pC34(A81E#wK2cPey~(SAOL*w>SxH!4RrA=^q6ff0BK+LxWjikocF87_76av*s^AMc{OKANB;@{ zR#tlGuiQ*M!xZm26$rrhS;_Mp&S26z0IQzt7;{HHWD=D2Ub+u?WFX!ZN;}s0Jj`j$ z_?NPJN&DbJ_=hOH_)*&fyU7C2m$t7h(z{eV;)eWMd8WnM?<*+eg& z=5AjkA9UBLVIb?ZXSDWh4uHay-E0no4+JnFz4RrRyBscO5-6XU1kW^><9mttz%va> zLZMb4c*enZ&rO178c@VglMj5{fvOx~kZozH4*ht-n%1S_qZ1CwEY`?z2VE+Q_3pU8 zp3x9m@I=%VLc2}A{SD0Y`ks;7ozUZoCg^RNwJow$kDE=Md|%#!k|!VSw60MayP*X+ zC)y$+IS%Jx@`Z`MZ};_m&*}d0wzn9Q(em{z{t&n02|HQy4}9TH?`JUv_V2 z5;kW-Dr{IJKQ&*Sbt z!rO3!baia;iZx|Vdh13(aS+AF+wb^a4H>d83e&#>*)O5C@T>zr zfBV(kl$_?Yl8r|yRq;68vT+lQtHpY z_}?vg)wK!pJ)e*IgR_l#_T#fD1KZ}-)jtS6wIIB-zv9sDmXQPS!X98(+6Qk{F8lGp zriEYBRj=t=b+f%{Y(4qNe6C4(s2QI9-uD5{3{o%hekQl?9Xh)qs<_JT5I;04z3`bA zLu$xqQc6}dABD)3wuq)bw;d+fVWSPT_DrXVyfV7|WM8J=ETAm