Merge remote-tracking branch 'origin/develop_liyi' into develop_liyi

This commit is contained in:
liyi 2024-12-23 18:41:43 +08:00
commit d8680ac7df
107 changed files with 3021 additions and 1143 deletions

View File

@ -85,28 +85,28 @@ android {
dimension "flavor-type" dimension "flavor-type"
applicationId "com.starlock.lock.local" applicationId "com.starlock.lock.local"
signingConfig signingConfigs.debug signingConfig signingConfigs.debug
resValue "string", "app_name", "星锁-local" resValue "string", "app_name", "Star Lock"
manifestPlaceholders.JPUSH_PKGNAME = "com.starlock.lock.local" manifestPlaceholders.JPUSH_PKGNAME = "com.starlock.lock.local"
} }
dev { dev {
dimension "flavor-type" dimension "flavor-type"
applicationId "com.starlock.lock.dev" applicationId "com.starlock.lock.dev"
signingConfig signingConfigs.debug signingConfig signingConfigs.debug
resValue "string", "app_name", "星锁-dev" resValue "string", "app_name", "Star Lock"
manifestPlaceholders.JPUSH_PKGNAME = "com.starlock.lock.dev" manifestPlaceholders.JPUSH_PKGNAME = "com.starlock.lock.dev"
} }
pre { pre {
dimension "flavor-type" dimension "flavor-type"
applicationId "com.starlock.lock.pre" applicationId "com.starlock.lock.pre"
signingConfig signingConfigs.debug signingConfig signingConfigs.debug
resValue "string", "app_name", "星锁" resValue "string", "app_name", "Star Lock-P"
manifestPlaceholders.JPUSH_PKGNAME = "com.starlock.lock.pre" manifestPlaceholders.JPUSH_PKGNAME = "com.starlock.lock.pre"
} }
sky { sky {
dimension "flavor-type" dimension "flavor-type"
applicationId "com.skychip.lock" applicationId "com.skychip.lock"
signingConfig signingConfigs.sky signingConfig signingConfigs.sky
resValue "string", "app_name", "锁通通" resValue "string", "app_name", "TTLock Pro"
manifestPlaceholders.JPUSH_PKGNAME = "com.skychip.lock" manifestPlaceholders.JPUSH_PKGNAME = "com.skychip.lock"
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-sky.pro' proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-sky.pro'
} }
@ -114,21 +114,21 @@ android {
dimension "flavor-type" dimension "flavor-type"
applicationId "com.skychip.lock.pre" applicationId "com.skychip.lock.pre"
signingConfig signingConfigs.sky signingConfig signingConfigs.sky
resValue "string", "app_name", "锁通通-P" resValue "string", "app_name", "TTLock Pro-P"
manifestPlaceholders.JPUSH_PKGNAME = "com.skychip.lock.pre" manifestPlaceholders.JPUSH_PKGNAME = "com.skychip.lock.pre"
} }
sky_dev { sky_dev {
dimension "flavor-type" dimension "flavor-type"
applicationId "com.skychip.lock.dev" applicationId "com.skychip.lock.dev"
signingConfig signingConfigs.sky signingConfig signingConfigs.sky
resValue "string", "app_name", "锁通通-D" resValue "string", "app_name", "TTLock Pro"
manifestPlaceholders.JPUSH_PKGNAME = "com.skychip.lock.dev" manifestPlaceholders.JPUSH_PKGNAME = "com.skychip.lock.dev"
} }
xhj { xhj {
dimension "flavor-type" dimension "flavor-type"
applicationId "com.xhjcn.lock" applicationId "com.xhjcn.lock"
signingConfig signingConfigs.xhj signingConfig signingConfigs.xhj
resValue "string", "app_name", "星星锁" resValue "string", "app_name", "Star Lock"
manifestPlaceholders.JPUSH_PKGNAME = "com.xhjcn.lock" manifestPlaceholders.JPUSH_PKGNAME = "com.xhjcn.lock"
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-xhj.pro' proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-xhj.pro'
} }
@ -136,14 +136,14 @@ android {
dimension "flavor-type" dimension "flavor-type"
applicationId "com.xhjcn.lock.pre" applicationId "com.xhjcn.lock.pre"
signingConfig signingConfigs.xhj signingConfig signingConfigs.xhj
resValue "string", "app_name", "星星锁-P" resValue "string", "app_name", "Star Lock-P"
manifestPlaceholders.JPUSH_PKGNAME = "com.xhjcn.lock.pre" manifestPlaceholders.JPUSH_PKGNAME = "com.xhjcn.lock.pre"
} }
xhj_dev { xhj_dev {
dimension "flavor-type" dimension "flavor-type"
applicationId "com.xhjcn.lock.dev" applicationId "com.xhjcn.lock.dev"
signingConfig signingConfigs.xhj signingConfig signingConfigs.xhj
resValue "string", "app_name", "星星锁-D" resValue "string", "app_name", "Star Lock"
manifestPlaceholders.JPUSH_PKGNAME = "com.xhjcn.lock.dev" manifestPlaceholders.JPUSH_PKGNAME = "com.xhjcn.lock.dev"
} }
} }

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name">星锁</string> <string name="app_name">星锁-dev</string>
</resources> </resources>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">TTLock Pro-P</string>
</resources>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">锁通通-P</string>
</resources>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Star Lock-P</string>
</resources>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">星星锁-P</string>
</resources>

BIN
assets/test.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

BIN
images/icon_left_grey.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 B

View File

@ -10,12 +10,12 @@ PODS:
- EMASRest - EMASRest
- AlicloudUT (5.2.0.16): - AlicloudUT (5.2.0.16):
- AlicloudUTDID - AlicloudUTDID
- AlicloudUTDID (1.5.0.94) - AlicloudUTDID (1.6.0)
- AlicloudUtils (1.4.1): - AlicloudUtils (2.0.0):
- AlicloudUTDID - AlicloudUTDID
- aliyun_face_plugin (0.0.1): - aliyun_face_plugin (0.0.1):
- Flutter - Flutter
- AMap3DMap (10.0.600): - AMap3DMap (10.0.700):
- AMapFoundation (>= 1.8.0) - AMapFoundation (>= 1.8.0)
- amap_flutter_location (0.0.1): - amap_flutter_location (0.0.1):
- AMapLocation - AMapLocation
@ -42,35 +42,35 @@ PODS:
- FlutterMacOS - FlutterMacOS
- device_info_plus (0.0.1): - device_info_plus (0.0.1):
- Flutter - Flutter
- DKImagePickerController/Core (4.3.7): - DKImagePickerController/Core (4.3.9):
- DKImagePickerController/ImageDataManager - DKImagePickerController/ImageDataManager
- DKImagePickerController/Resource - DKImagePickerController/Resource
- DKImagePickerController/ImageDataManager (4.3.7) - DKImagePickerController/ImageDataManager (4.3.9)
- DKImagePickerController/PhotoGallery (4.3.7): - DKImagePickerController/PhotoGallery (4.3.9):
- DKImagePickerController/Core - DKImagePickerController/Core
- DKPhotoGallery - DKPhotoGallery
- DKImagePickerController/Resource (4.3.7) - DKImagePickerController/Resource (4.3.9)
- DKPhotoGallery (0.0.17): - DKPhotoGallery (0.0.19):
- DKPhotoGallery/Core (= 0.0.17) - DKPhotoGallery/Core (= 0.0.19)
- DKPhotoGallery/Model (= 0.0.17) - DKPhotoGallery/Model (= 0.0.19)
- DKPhotoGallery/Preview (= 0.0.17) - DKPhotoGallery/Preview (= 0.0.19)
- DKPhotoGallery/Resource (= 0.0.17) - DKPhotoGallery/Resource (= 0.0.19)
- SDWebImage - SDWebImage
- SwiftyGif - SwiftyGif
- DKPhotoGallery/Core (0.0.17): - DKPhotoGallery/Core (0.0.19):
- DKPhotoGallery/Model - DKPhotoGallery/Model
- DKPhotoGallery/Preview - DKPhotoGallery/Preview
- SDWebImage - SDWebImage
- SwiftyGif - SwiftyGif
- DKPhotoGallery/Model (0.0.17): - DKPhotoGallery/Model (0.0.19):
- SDWebImage - SDWebImage
- SwiftyGif - SwiftyGif
- DKPhotoGallery/Preview (0.0.17): - DKPhotoGallery/Preview (0.0.19):
- DKPhotoGallery/Model - DKPhotoGallery/Model
- DKPhotoGallery/Resource - DKPhotoGallery/Resource
- SDWebImage - SDWebImage
- SwiftyGif - SwiftyGif
- DKPhotoGallery/Resource (0.0.17): - DKPhotoGallery/Resource (0.0.19):
- SDWebImage - SDWebImage
- SwiftyGif - SwiftyGif
- EMASRest (11.1.1.2) - EMASRest (11.1.1.2)
@ -136,9 +136,9 @@ PODS:
- FlutterMacOS - FlutterMacOS
- permission_handler_apple (9.3.0): - permission_handler_apple (9.3.0):
- Flutter - Flutter
- SDWebImage (5.19.1): - SDWebImage (5.19.2):
- SDWebImage/Core (= 5.19.1) - SDWebImage/Core (= 5.19.2)
- SDWebImage/Core (5.19.1) - SDWebImage/Core (5.19.2)
- shared_preferences_foundation (0.0.1): - shared_preferences_foundation (0.0.1):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
@ -321,10 +321,10 @@ SPEC CHECKSUMS:
AlicloudPush: 88529c9b796e4ece0601de0867b30359f55b61f7 AlicloudPush: 88529c9b796e4ece0601de0867b30359f55b61f7
AlicloudSender: 1f468b6bd962a099ffc19d45e3608b0fe98f259d AlicloudSender: 1f468b6bd962a099ffc19d45e3608b0fe98f259d
AlicloudUT: 6d1cf30d57d096b7e9bb4b069dd0ba6ad59a3338 AlicloudUT: 6d1cf30d57d096b7e9bb4b069dd0ba6ad59a3338
AlicloudUTDID: 7323c443dcdf9a73e2224dc6ce51703671d7a765 AlicloudUTDID: 4e9d44c2fd704b3508069c38eaec9d6a759e702c
AlicloudUtils: 873a76615bebcee8b1996f20820d366e433c3eab AlicloudUtils: 2a78de434a8b2dc99e408c4d6220e654076d9ef0
aliyun_face_plugin: 7a90b6526c5acea616062e809699294c782c3eb8 aliyun_face_plugin: 7a90b6526c5acea616062e809699294c782c3eb8
AMap3DMap: d104a679c2bad573c908e0ddadf26bc399678b24 AMap3DMap: 6ee456d7ba946ebbad580a343b74ffa8e9936175
amap_flutter_location: 44ff5beb64f42e0bf5feb402fe299dac0013af6f amap_flutter_location: 44ff5beb64f42e0bf5feb402fe299dac0013af6f
amap_flutter_map: 979e54d227cedac6c7504a2151bfbf3bcf96760a amap_flutter_map: 979e54d227cedac6c7504a2151bfbf3bcf96760a
AMapFoundation: 9885c48fc3a78fdfb84a0299a2293e56ea3c9fec AMapFoundation: 9885c48fc3a78fdfb84a0299a2293e56ea3c9fec
@ -337,8 +337,8 @@ SPEC CHECKSUMS:
camera_avfoundation: dd002b0330f4981e1bbcb46ae9b62829237459a4 camera_avfoundation: dd002b0330f4981e1bbcb46ae9b62829237459a4
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed
DKImagePickerController: 0a24ebfe7b48beeb74c27531540aaa2cc1dac6cf DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
EMASRest: 8df6f87836767a9415ad5cc4af739bc9d215b475 EMASRest: 8df6f87836767a9415ad5cc4af739bc9d215b475
fast_rsa: a1fed69b074093d2e2e3fefae6b821a071649d4c fast_rsa: a1fed69b074093d2e2e3fefae6b821a071649d4c
file_picker: ce3938a0df3cc1ef404671531facef740d03f920 file_picker: ce3938a0df3cc1ef404671531facef740d03f920
@ -365,7 +365,7 @@ SPEC CHECKSUMS:
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
SDWebImage: 40b0b4053e36c660a764958bff99eed16610acbb SDWebImage: dfe95b2466a9823cf9f0c6d01217c06550d7b29a
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4

View File

@ -7,6 +7,7 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
04C1FC572D13F1A2000C959E /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 04C1FC562D13F1A2000C959E /* InfoPlist.xcstrings */; };
04D0CC262D06CE570042EF10 /* launchImage_xhj.png in Resources */ = {isa = PBXBuildFile; fileRef = 82B657662C919BDF0079121C /* launchImage_xhj.png */; }; 04D0CC262D06CE570042EF10 /* launchImage_xhj.png in Resources */ = {isa = PBXBuildFile; fileRef = 82B657662C919BDF0079121C /* launchImage_xhj.png */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
25B2A1422F9A2CCCBBCBBB97 /* skyRelease.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 35F02D170492750B437D6AB6 /* skyRelease.xcconfig */; }; 25B2A1422F9A2CCCBBCBBB97 /* skyRelease.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 35F02D170492750B437D6AB6 /* skyRelease.xcconfig */; };
@ -98,6 +99,7 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
0420903B2C0EEAA50073E654 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = "<group>"; }; 0420903B2C0EEAA50073E654 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = "<group>"; };
04BFC4482BCFE05100688FCA /* RunnerRelease-xhj.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerRelease-xhj.entitlements"; sourceTree = "<group>"; }; 04BFC4482BCFE05100688FCA /* RunnerRelease-xhj.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerRelease-xhj.entitlements"; sourceTree = "<group>"; };
04C1FC562D13F1A2000C959E /* InfoPlist.xcstrings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = "<group>"; };
0BEB3ADCCEC961E2916B9004 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; }; 0BEB3ADCCEC961E2916B9004 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
0D02C18E16914A687A4A1AC2 /* devDebug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = devDebug.xcconfig; path = Flutter/devDebug.xcconfig; sourceTree = "<group>"; }; 0D02C18E16914A687A4A1AC2 /* devDebug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = devDebug.xcconfig; path = Flutter/devDebug.xcconfig; sourceTree = "<group>"; };
126D1370182AB44291C67A10 /* Pods-Runner.dev-release-sky.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.dev-release-sky.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.dev-release-sky.xcconfig"; sourceTree = "<group>"; }; 126D1370182AB44291C67A10 /* Pods-Runner.dev-release-sky.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.dev-release-sky.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.dev-release-sky.xcconfig"; sourceTree = "<group>"; };
@ -341,6 +343,7 @@
97C146F01CF9000F007C117D /* Runner */ = { 97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
04C1FC562D13F1A2000C959E /* InfoPlist.xcstrings */,
E0B3E9EC2D04B36C00907A95 /* info_dev.plist */, E0B3E9EC2D04B36C00907A95 /* info_dev.plist */,
E0B3E9EB2D04B36C00907A95 /* info_pre.plist */, E0B3E9EB2D04B36C00907A95 /* info_pre.plist */,
E0B3E9EA2D04B36C00907A95 /* info_sky.plist */, E0B3E9EA2D04B36C00907A95 /* info_sky.plist */,
@ -507,6 +510,7 @@
9C453CBFAB0703DFA762337C /* preProfile.xcconfig in Resources */, 9C453CBFAB0703DFA762337C /* preProfile.xcconfig in Resources */,
44827AC367F1EAB110A97660 /* preRelease.xcconfig in Resources */, 44827AC367F1EAB110A97660 /* preRelease.xcconfig in Resources */,
D7EF77645AB1C3CEEA536468 /* skyDebug.xcconfig in Resources */, D7EF77645AB1C3CEEA536468 /* skyDebug.xcconfig in Resources */,
04C1FC572D13F1A2000C959E /* InfoPlist.xcstrings in Resources */,
7B54002BF45E5D8B295B6447 /* skyProfile.xcconfig in Resources */, 7B54002BF45E5D8B295B6447 /* skyProfile.xcconfig in Resources */,
25B2A1422F9A2CCCBBCBBB97 /* skyRelease.xcconfig in Resources */, 25B2A1422F9A2CCCBBCBBB97 /* skyRelease.xcconfig in Resources */,
ADF948FD9EE8BD1AE71F0984 /* xhjDebug.xcconfig in Resources */, ADF948FD9EE8BD1AE71F0984 /* xhjDebug.xcconfig in Resources */,
@ -698,10 +702,9 @@
baseConfigurationReference = 4A63B2C308CB401731950EC8 /* Pods-Runner.debug-sky.xcconfig */; baseConfigurationReference = 4A63B2C308CB401731950EC8 /* Pods-Runner.debug-sky.xcconfig */;
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements"; CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = SF86QP26TZ;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
INFOPLIST_FILE = Runner/info_sky.plist; INFOPLIST_FILE = Runner/info_sky.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -711,7 +714,6 @@
PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local; PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local;
PRODUCT_NAME = Runner; PRODUCT_NAME = Runner;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Debug_com.starlock.lock.local.mobileprovision;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO; SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
@ -795,10 +797,9 @@
baseConfigurationReference = 22D858E988707FF26E068457 /* Pods-Runner.debug-xhj.xcconfig */; baseConfigurationReference = 22D858E988707FF26E068457 /* Pods-Runner.debug-xhj.xcconfig */;
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements"; CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = SF86QP26TZ;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
INFOPLIST_FILE = Runner/info_xhj.plist; INFOPLIST_FILE = Runner/info_xhj.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -808,7 +809,6 @@
PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local; PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local;
PRODUCT_NAME = Runner; PRODUCT_NAME = Runner;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Debug_com.starlock.lock.local.mobileprovision;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO; SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
@ -821,9 +821,9 @@
baseConfigurationReference = 16A83D21DFB231D8453DC681 /* Pods-Runner.release-sky.xcconfig */; baseConfigurationReference = 16A83D21DFB231D8453DC681 /* Pods-Runner.release-sky.xcconfig */;
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements"; CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = NAQ5PL2DYC; DEVELOPMENT_TEAM = NAQ5PL2DYC;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
INFOPLIST_FILE = Runner/info_sky.plist; INFOPLIST_FILE = Runner/info_sky.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -831,7 +831,7 @@
"$(inherited)", "$(inherited)",
); );
PRODUCT_NAME = Runner; PRODUCT_NAME = Runner;
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Appstore_com.skychip.lock.mobileprovision; PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO; SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
@ -844,9 +844,9 @@
baseConfigurationReference = CDC2B8ED804B514A774F187D /* Pods-Runner.release-xhj.xcconfig */; baseConfigurationReference = CDC2B8ED804B514A774F187D /* Pods-Runner.release-xhj.xcconfig */;
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements"; CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = P8997RW3V8; DEVELOPMENT_TEAM = P8997RW3V8;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8;
INFOPLIST_FILE = Runner/info_xhj.plist; INFOPLIST_FILE = Runner/info_xhj.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -855,7 +855,7 @@
); );
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock; PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock;
PRODUCT_NAME = Runner; PRODUCT_NAME = Runner;
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Appstore_com.xhjcn.lock.mobileprovision; PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO; SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
@ -1088,10 +1088,8 @@
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerDebug-dev.entitlements"; CODE_SIGN_ENTITLEMENTS = "Runner/RunnerDebug-dev.entitlements";
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic;
CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = SF86QP26TZ;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -1101,7 +1099,6 @@
PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local; PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local;
PRODUCT_NAME = Runner; PRODUCT_NAME = Runner;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Debug_com.starlock.lock.local.mobileprovision;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO; SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
@ -1185,10 +1182,9 @@
baseConfigurationReference = D697F91E8405773AB9A5881E /* Pods-Runner.pre-release-sky.xcconfig */; baseConfigurationReference = D697F91E8405773AB9A5881E /* Pods-Runner.pre-release-sky.xcconfig */;
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements"; CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = NAQ5PL2DYC;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
INFOPLIST_FILE = Runner/info_sky.plist; INFOPLIST_FILE = Runner/info_sky.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -1198,7 +1194,6 @@
PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.pre; PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.pre;
PRODUCT_NAME = Runner; PRODUCT_NAME = Runner;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.skychip.lock.pre.mobileprovision;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO; SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
@ -1282,10 +1277,9 @@
baseConfigurationReference = 126D1370182AB44291C67A10 /* Pods-Runner.dev-release-sky.xcconfig */; baseConfigurationReference = 126D1370182AB44291C67A10 /* Pods-Runner.dev-release-sky.xcconfig */;
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements"; CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = NAQ5PL2DYC;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
INFOPLIST_FILE = Runner/info_sky.plist; INFOPLIST_FILE = Runner/info_sky.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -1295,7 +1289,6 @@
PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.dev; PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.dev;
PRODUCT_NAME = Runner; PRODUCT_NAME = Runner;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.skychip.lock.dev.mobileprovision;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO; SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
@ -1379,10 +1372,9 @@
baseConfigurationReference = 789004F1B475B44713E199BC /* Pods-Runner.pre-release-xhj.xcconfig */; baseConfigurationReference = 789004F1B475B44713E199BC /* Pods-Runner.pre-release-xhj.xcconfig */;
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements"; CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = P8997RW3V8;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8;
INFOPLIST_FILE = Runner/info_xhj.plist; INFOPLIST_FILE = Runner/info_xhj.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -1392,7 +1384,6 @@
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.pre; PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.pre;
PRODUCT_NAME = Runner; PRODUCT_NAME = Runner;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.xhjcn.lock.pre.mobileprovision;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO; SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
@ -1476,10 +1467,9 @@
baseConfigurationReference = ED3A443EA1439FD0FB4BCF80 /* Pods-Runner.dev-release-xhj.xcconfig */; baseConfigurationReference = ED3A443EA1439FD0FB4BCF80 /* Pods-Runner.dev-release-xhj.xcconfig */;
buildSettings = { buildSettings = {
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements"; CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = P8997RW3V8;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8;
INFOPLIST_FILE = Runner/info_xhj.plist; INFOPLIST_FILE = Runner/info_xhj.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -1489,7 +1479,6 @@
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.dev; PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.dev;
PRODUCT_NAME = Runner; PRODUCT_NAME = Runner;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.xhjcn.lock.dev.mobileprovision;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO; SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "ستتم إزالة جميع معلومات حسابك من المنصة بشكل دائم ولا يمكن استردادها. هل تريد حذفها ؟", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "ستتم إزالة جميع معلومات حسابك من المنصة بشكل دائم ولا يمكن استردادها. هل تريد حذفها ؟",
"监控": "شاشة", "监控": "شاشة",
"视频日志": "سجل الفيديو", "视频日志": "سجل الفيديو",
"网关设备": "بوابة",
"开门器": "فاتح باب", "开门器": "فاتح باب",
"面容开锁": "يفتح الوجه", "面容开锁": "يفتح الوجه",
"开门方向设置": "مجموعة فتح الاتجاه", "开门方向设置": "مجموعة فتح الاتجاه",
@ -778,7 +777,6 @@
"导出": "التصدير", "导出": "التصدير",
"批量导出": "تصدير الدفعة", "批量导出": "تصدير الدفعة",
"读取记录": "تحديث السجلات", "读取记录": "تحديث السجلات",
"手机需联网": "إبرة",
"设备": "جهاز", "设备": "جهاز",
"消息": "الرسائل", "消息": "الرسائل",
"智能分析": "تحليلات ذكية", "智能分析": "تحليلات ذكية",
@ -1110,5 +1108,15 @@
"常规使用": "استخدام منتظم", "常规使用": "استخدام منتظم",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "بعد تشغيل البوابة ، اضغط مع الاستمرار على زر إعادة الضبط لمدة 5 ثوانٍ ، وانقر بعد ذلك عندما يومض مصباح المؤشر بالتناوب", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "بعد تشغيل البوابة ، اضغط مع الاستمرار على زر إعادة الضبط لمدة 5 ثوانٍ ، وانقر بعد ذلك عندما يومض مصباح المؤشر بالتناوب",
"扫描设备": "جهاز المسح الضوئي", "扫描设备": "جهاز المسح الضوئي",
"删除失败,网关可能已经离线,是否强制删除该数据?": "فشل الحذف. ربما تكون البوابة قد اختفت دون اتصال. هل تريد فرض حذف البيانات ؟" "删除失败,网关可能已经离线,是否强制删除该数据?": "فشل الحذف. ربما تكون البوابة قد اختفت دون اتصال. هل تريد فرض حذف البيانات ؟",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -314,7 +314,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Цялата информация за профила ви ще бъде премахната от платформата за постоянно и не може да бъде възстановена. искате ли да изтриете?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Цялата информация за профила ви ще бъде премахната от платформата за постоянно и не може да бъде възстановена. искате ли да изтриете?",
"监控": "Монитор", "监控": "Монитор",
"视频日志": "Видео дневник", "视频日志": "Видео дневник",
"网关设备": "Шлюз",
"开门器": "Отварачка за врати", "开门器": "Отварачка за врати",
"面容开锁": "Face отключва", "面容开锁": "Face отключва",
"开门方向设置": "Задаване на посоката на отваряне", "开门方向设置": "Задаване на посоката на отваряне",
@ -779,7 +778,6 @@
"导出": "Експортиране", "导出": "Експортиране",
"批量导出": "Партиден износ", "批量导出": "Партиден износ",
"读取记录": "Опресняване на записи", "读取记录": "Опресняване на записи",
"手机需联网": "Neednet",
"设备": "Устройство", "设备": "Устройство",
"消息": "Съобщения", "消息": "Съобщения",
"智能分析": "Интелигентни анализи", "智能分析": "Интелигентни анализи",
@ -1110,5 +1108,15 @@
"常规使用": "Редовна употреба", "常规使用": "Редовна употреба",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "След като шлюзът е включен, натиснете и задръжте бутона reset за 5 секунди и щракнете върху следващия, когато индикаторната светлина мига алтернативно", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "След като шлюзът е включен, натиснете и задръжте бутона reset за 5 секунди и щракнете върху следващия, когато индикаторната светлина мига алтернативно",
"扫描设备": "Сканиране устройство", "扫描设备": "Сканиране устройство",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Изтриването не успя. Портата може да е отишла офлайн. Искате ли да принудите изтриване на данните?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Изтриването не успя. Портата може да е отишла офлайн. Искате ли да принудите изтриване на данните?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "অ্যালসসআরগানগান্টের মাইউইল্ডবেইভেড-এরফেইট্রোমফর্ম", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "অ্যালসসআরগানগান্টের মাইউইল্ডবেইভেড-এরফেইট্রোমফর্ম",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "নিঃশব্দ", "视频日志": "নিঃশব্দ",
"网关设备": "সমুদ্রে",
"开门器": "ডোরওএফ", "开门器": "ডোরওএফ",
"面容开锁": "ফেসসসুনcolocs", "面容开锁": "ফেসসসুনcolocs",
"开门方向设置": "ডিরেক্টরসেট", "开门方向设置": "ডিরেক্টরসেট",
@ -778,7 +777,6 @@
"导出": "পোর্ট", "导出": "পোর্ট",
"批量导出": "পোর্ট", "批量导出": "পোর্ট",
"读取记录": "রূপ", "读取记录": "রূপ",
"手机需联网": "উইমেনেট",
"设备": "ব্লিভাইস", "设备": "ব্লিভাইস",
"消息": "এন্টস", "消息": "এন্টস",
"智能分析": "Intel▁লিজেন্টা", "智能分析": "Intel▁লিজেন্টা",
@ -1110,5 +1108,15 @@
"常规使用": "গ্যারিউস", "常规使用": "গ্যারিউস",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "অ্যারাস্টার্টিউইসপোভেরেডন, প্রেস এবং টিপেস্টেট্রিসেট গানttonfor5sononds, এবং চক্লিক উইভেন্থে-উইন্টার", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "অ্যারাস্টার্টিউইসপোভেরেডন, প্রেস এবং টিপেস্টেট্রিসেট গানttonfor5sononds, এবং চক্লিক উইভেন্থে-উইন্টার",
"扫描设备": "সিস্কান্লিভাইস", "扫描设备": "সিস্কান্লিভাইস",
"删除失败,网关可能已经离线,是否强制删除该数据?": "ডাইজেজেশনিমেরিলেড। টিভওয়েমাইয়ানভিগনোনোআরলাইন। ডো ডাউনডেটা?" "删除失败,网关可能已经离线,是否强制删除该数据?": "ডাইজেজেশনিমেরিলেড। টিভওয়েমাইয়ানভিগনোনোআরলাইন। ডো ডাউনডেটা?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Všechny informace o vašem účtu budou z platformy odebrány natrvalo a nemohou být obnoveny.", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Všechny informace o vašem účtu budou z platformy odebrány natrvalo a nemohou být obnoveny.",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Protokol videa", "视频日志": "Protokol videa",
"网关设备": "Brána",
"开门器": "Otvírač dveří", "开门器": "Otvírač dveří",
"面容开锁": "Tvář odemkne", "面容开锁": "Tvář odemkne",
"开门方向设置": "Nastavit směr otevření", "开门方向设置": "Nastavit směr otevření",
@ -778,7 +777,6 @@
"导出": "Export", "导出": "Export",
"批量导出": "Export šarže", "批量导出": "Export šarže",
"读取记录": "Refresh records", "读取记录": "Refresh records",
"手机需联网": "Neednet",
"设备": "Zařízení", "设备": "Zařízení",
"消息": "Zprávy", "消息": "Zprávy",
"智能分析": "Inteligentní analýza", "智能分析": "Inteligentní analýza",
@ -1110,5 +1108,15 @@
"常规使用": "Pravidelné použití", "常规使用": "Pravidelné použití",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Po zapnutí brány stiskněte a podržte tlačítko reset po dobu 5 sekund a klepněte na tlačítko next", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Po zapnutí brány stiskněte a podržte tlačítko reset po dobu 5 sekund a klepněte na tlačítko next",
"扫描设备": "Skenovat zařízení", "扫描设备": "Skenovat zařízení",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Odstranění se nezdařilo. Brána možná byla offline. Chcete vynutit smazat data?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Odstranění se nezdařilo. Brána možná byla offline. Chcete vynutit smazat data?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Alle dine kontooplysninger vil blive fjernet fra platformen PERMANENTENTIGT og kan ikke gendannes. Ønsker du at slette?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Alle dine kontooplysninger vil blive fjernet fra platformen PERMANENTENTIGT og kan ikke gendannes. Ønsker du at slette?",
"监控": "Skærm", "监控": "Skærm",
"视频日志": "Videologg", "视频日志": "Videologg",
"网关设备": "GatewayName",
"开门器": "Døråbnere", "开门器": "Døråbnere",
"面容开锁": "Ansigt åbnes", "面容开锁": "Ansigt åbnes",
"开门方向设置": "Åbningsvejssæt", "开门方向设置": "Åbningsvejssæt",
@ -778,7 +777,6 @@
"导出": "Eksportører", "导出": "Eksportører",
"批量导出": "Batch-eksport", "批量导出": "Batch-eksport",
"读取记录": "Genopfrisk poster", "读取记录": "Genopfrisk poster",
"手机需联网": "NeedNet",
"设备": "Enhed", "设备": "Enhed",
"消息": "Meddelelser", "消息": "Meddelelser",
"智能分析": "Intelligent analyse", "智能分析": "Intelligent analyse",
@ -1110,5 +1108,15 @@
"常规使用": "Regelmæssig anvendelse", "常规使用": "Regelmæssig anvendelse",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Når gateway er tændt, tryk og hold nulstillingsknappen i 5 sekunder, og klik Next, når indikator lys blinker skiftevist", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Når gateway er tændt, tryk og hold nulstillingsknappen i 5 sekunder, og klik Next, når indikator lys blinker skiftevist",
"扫描设备": "Scan- enhed", "扫描设备": "Scan- enhed",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Sletning mislykkedes. Porten er måske offline. Vil du tvinge slette data?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Sletning mislykkedes. Porten er måske offline. Vil du tvinge slette data?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Alle Ihre Konto informationen werden DAUERHAFT von der Plattform entfernt und können nicht wieder hergestellt werden. Möchten Sie löschen?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Alle Ihre Konto informationen werden DAUERHAFT von der Plattform entfernt und können nicht wieder hergestellt werden. Möchten Sie löschen?",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Video protokoll", "视频日志": "Video protokoll",
"网关设备": "Gateway",
"开门器": "Türöffner", "开门器": "Türöffner",
"面容开锁": "Gesicht öffnet sich", "面容开锁": "Gesicht öffnet sich",
"开门方向设置": "Öffnungs richtung Set", "开门方向设置": "Öffnungs richtung Set",
@ -778,7 +777,6 @@
"导出": "Export", "导出": "Export",
"批量导出": "Batch-Export", "批量导出": "Batch-Export",
"读取记录": "Rekorde auffrischen", "读取记录": "Rekorde auffrischen",
"手机需联网": "NeedNet",
"设备": "Gerät", "设备": "Gerät",
"消息": "Nachrichten", "消息": "Nachrichten",
"智能分析": "Intelligente Analytik", "智能分析": "Intelligente Analytik",
@ -1110,5 +1108,15 @@
"常规使用": "Regelmäßige Verwendung", "常规使用": "Regelmäßige Verwendung",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Nachdem das Gateway eingesc haltet ist, drücken und halten Sie die Reset-Taste für 5 Sekunden, und klicken Sie auf Weiter, wenn die Kontroll leuchte blinkt abwechselnd", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Nachdem das Gateway eingesc haltet ist, drücken und halten Sie die Reset-Taste für 5 Sekunden, und klicken Sie auf Weiter, wenn die Kontroll leuchte blinkt abwechselnd",
"扫描设备": "Scan-Gerät", "扫描设备": "Scan-Gerät",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Löschung fehl geschlagen. Das Gateway ist möglicher weise offline gegangen. Möchten Sie das Löschen der Daten erzwingen?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Löschung fehl geschlagen. Das Gateway ist möglicher weise offline gegangen. Möchten Sie das Löschen der Daten erzwingen?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Όλες οι πληροφορίες λογαριασμού σας θα αφαιρεθούν από την πλατφόρμα ΜΟΝΑ και δεν μπορούν να ανακτηθούν. Θέλετε να διαγραφείτε;", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Όλες οι πληροφορίες λογαριασμού σας θα αφαιρεθούν από την πλατφόρμα ΜΟΝΑ και δεν μπορούν να ανακτηθούν. Θέλετε να διαγραφείτε;",
"监控": "Παρακολούθηση", "监控": "Παρακολούθηση",
"视频日志": "Καταγραφή βίντεο", "视频日志": "Καταγραφή βίντεο",
"网关设备": "Πύλη πύλης",
"开门器": "Ανοιχτή πόρτας", "开门器": "Ανοιχτή πόρτας",
"面容开锁": "Ξεκλείδωμα πρόσωπου", "面容开锁": "Ξεκλείδωμα πρόσωπου",
"开门方向设置": "Άνοιγμα σύνολο κατεύθυνσης", "开门方向设置": "Άνοιγμα σύνολο κατεύθυνσης",
@ -778,7 +777,6 @@
"导出": "Εξαγωγή", "导出": "Εξαγωγή",
"批量导出": "Παρτίδα εξαγωγή", "批量导出": "Παρτίδα εξαγωγή",
"读取记录": "Ανανέωση εγγραφής", "读取记录": "Ανανέωση εγγραφής",
"手机需联网": "NeedNet",
"设备": "Συσκευή", "设备": "Συσκευή",
"消息": "Μηνύματα", "消息": "Μηνύματα",
"智能分析": "Ευφυής αναλυτικός", "智能分析": "Ευφυής αναλυτικός",
@ -1110,5 +1108,15 @@
"常规使用": "Κανονική χρήση:", "常规使用": "Κανονική χρήση:",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Αφού ενεργοποιηθεί η πύλη, πατήστε και κρατήστε το κουμπί επαναφοράς για 5 δευτερόλεπτα, και κάντε κλικ Next όταν το φως δείκτη αναβοσβήνει εναλλάξα", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Αφού ενεργοποιηθεί η πύλη, πατήστε και κρατήστε το κουμπί επαναφοράς για 5 δευτερόλεπτα, και κάντε κλικ Next όταν το φως δείκτη αναβοσβήνει εναλλάξα",
"扫描设备": "Συσκευή σάρωσης", "扫描设备": "Συσκευή σάρωσης",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Η διαγραφή απέτυχε. Η πύλη μπορεί να έχει εκτός λειτουργίας. Θέλετε να αναγκάσετε τη διαγραφή των δεδομένων;" "删除失败,网关可能已经离线,是否强制删除该数据?": "Η διαγραφή απέτυχε. Η πύλη μπορεί να έχει εκτός λειτουργίας. Θέλετε να αναγκάσετε τη διαγραφή των δεδομένων;",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -315,7 +315,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "All your Account information will be Removed from the Platform PERMANENTLY and cannot be Recovered.Do you want to Delete?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "All your Account information will be Removed from the Platform PERMANENTLY and cannot be Recovered.Do you want to Delete?",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Video Log", "视频日志": "Video Log",
"网关设备": "Gateway",
"开门器": "Door Opener", "开门器": "Door Opener",
"面容开锁": "Face Unlocks", "面容开锁": "Face Unlocks",
"开门方向设置": "Opening Direction Set", "开门方向设置": "Opening Direction Set",
@ -787,7 +786,6 @@
"导出":"Export", "导出":"Export",
"批量导出":"Batch export", "批量导出":"Batch export",
"读取记录":"Refresh Records", "读取记录":"Refresh Records",
"手机需联网":"NeedNet",
"设备":"Device", "设备":"Device",
"消息":"Messages", "消息":"Messages",
"智能分析":"Intelligent analytics", "智能分析":"Intelligent analytics",
@ -1113,6 +1111,15 @@
"中功率": "Medium power", "中功率": "Medium power",
"常规使用": "Regular use", "常规使用": "Regular use",
"扫描设备": "Scan device", "扫描设备": "Scan device",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Deletion failed. The gateway may have gone offline. Do you want to force delete the data?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Deletion failed. The gateway may have gone offline. Do you want to force delete the data?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Toda la información de su cuenta se eliminará de la plataforma de forma permanente y no se podrá recuperar.", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Toda la información de su cuenta se eliminará de la plataforma de forma permanente y no se podrá recuperar.",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Registro de vídeo", "视频日志": "Registro de vídeo",
"网关设备": "Puerta de enlace",
"开门器": "Abrelatas de la puerta", "开门器": "Abrelatas de la puerta",
"面容开锁": "Desbloquea la cara", "面容开锁": "Desbloquea la cara",
"开门方向设置": "Conjunto de dirección de apertura", "开门方向设置": "Conjunto de dirección de apertura",
@ -778,7 +777,6 @@
"导出": "Exportación", "导出": "Exportación",
"批量导出": "Exportación de lotes", "批量导出": "Exportación de lotes",
"读取记录": "Actualizar registros", "读取记录": "Actualizar registros",
"手机需联网": "NeedNet",
"设备": "Dispositivo", "设备": "Dispositivo",
"消息": "Mensajes", "消息": "Mensajes",
"智能分析": "Analítica inteligente", "智能分析": "Analítica inteligente",
@ -1110,5 +1108,15 @@
"常规使用": "Uso regular", "常规使用": "Uso regular",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Después de encender la puerta de enlace, mantenga presionado el botón de reinicio durante 5 segundos y haga clic en Siguiente cuando la luz indicadora parpadee alternativamente", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Después de encender la puerta de enlace, mantenga presionado el botón de reinicio durante 5 segundos y haga clic en Siguiente cuando la luz indicadora parpadee alternativamente",
"扫描设备": "Dispositivo de exploración", "扫描设备": "Dispositivo de exploración",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Falló la eliminación. Es posible que la puerta de enlace se haya desconectado. ¿Desea forzar la eliminación de los datos?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Falló la eliminación. Es posible que la puerta de enlace se haya desconectado. ¿Desea forzar la eliminación de los datos?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Kogu Teie konto teave eemaldatakse platvormilt PERMANENTILT ja seda ei saa taastada.Kas soovite kustutada?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Kogu Teie konto teave eemaldatakse platvormilt PERMANENTILT ja seda ei saa taastada.Kas soovite kustutada?",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Video logi", "视频日志": "Video logi",
"网关设备": "Väravatee",
"开门器": "Ukseavaja", "开门器": "Ukseavaja",
"面容开锁": "Nägu lahti lukustus", "面容开锁": "Nägu lahti lukustus",
"开门方向设置": "Avava suuna komplektComment", "开门方向设置": "Avava suuna komplektComment",
@ -778,7 +777,6 @@
"导出": "Eksport", "导出": "Eksport",
"批量导出": "Partii eksportimine", "批量导出": "Partii eksportimine",
"读取记录": "Värskenda salvestus", "读取记录": "Värskenda salvestus",
"手机需联网": "NeedNet",
"设备": "Seade", "设备": "Seade",
"消息": "Teated", "消息": "Teated",
"智能分析": "Intelligentne analüüs", "智能分析": "Intelligentne analüüs",
@ -1110,5 +1108,15 @@
"常规使用": "Regulaarne kasutamine", "常规使用": "Regulaarne kasutamine",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Kui värav on sisse lülitatud, vajutage ja hoidke nuppu 5 sekundit, ja klõpsa Järgmine, kui indikaator valgus vilgub vaheldumisel", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Kui värav on sisse lülitatud, vajutage ja hoidke nuppu 5 sekundit, ja klõpsa Järgmine, kui indikaator valgus vilgub vaheldumisel",
"扫描设备": "Skaneerimisseade", "扫描设备": "Skaneerimisseade",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Kustutamine nurjus. Värav võis välja lülitada. Kas soovid kustutada andmed?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Kustutamine nurjus. Värav võis välja lülitada. Kas soovid kustutada andmed?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Kaikki tilitiedot poistetaan alustalta PERMANENTTI eikä niitä voi palauttaa.Haluatko poistaa?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Kaikki tilitiedot poistetaan alustalta PERMANENTTI eikä niitä voi palauttaa.Haluatko poistaa?",
"监控": "Monitori", "监控": "Monitori",
"视频日志": "Videoloki", "视频日志": "Videoloki",
"网关设备": "GatewayComment",
"开门器": "Oviaukko", "开门器": "Oviaukko",
"面容开锁": "Kasvo avaa", "面容开锁": "Kasvo avaa",
"开门方向设置": "Avaava suunta", "开门方向设置": "Avaava suunta",
@ -778,7 +777,6 @@
"导出": "Vienti", "导出": "Vienti",
"批量导出": "Erän vienti", "批量导出": "Erän vienti",
"读取记录": "Päivitä tiedostot", "读取记录": "Päivitä tiedostot",
"手机需联网": "NeedNet",
"设备": "Laite", "设备": "Laite",
"消息": "Viestit", "消息": "Viestit",
"智能分析": "Älykäs analytiikka", "智能分析": "Älykäs analytiikka",
@ -1110,5 +1108,15 @@
"常规使用": "Säännöllinen käyttö", "常规使用": "Säännöllinen käyttö",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Kun portti on käytössä, paina ja pidä painiketta nollauspainiketta 5 sekunnin ajan, ja klikkaa Seuraava kun ilmaisin valo vilkkuu vuorotellensa", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Kun portti on käytössä, paina ja pidä painiketta nollauspainiketta 5 sekunnin ajan, ja klikkaa Seuraava kun ilmaisin valo vilkkuu vuorotellensa",
"扫描设备": "Skannauslaite", "扫描设备": "Skannauslaite",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Poisto epäonnistui. Portti on ehkä pois päältä. Haluatko pakottaa poistamaan tiedot?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Poisto epäonnistui. Portti on ehkä pois päältä. Haluatko pakottaa poistamaan tiedot?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Toutes les informations de votre compte seront supprimées de la plate-forme de manière PERMANENTE et ne pourront pas être récupérées. Voulez-vous supprimer?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Toutes les informations de votre compte seront supprimées de la plate-forme de manière PERMANENTE et ne pourront pas être récupérées. Voulez-vous supprimer?",
"监控": "Moniteur", "监控": "Moniteur",
"视频日志": "Journal vidéo", "视频日志": "Journal vidéo",
"网关设备": "Passerelle",
"开门器": "Ouvre-porte", "开门器": "Ouvre-porte",
"面容开锁": "Le visage se déverrouille", "面容开锁": "Le visage se déverrouille",
"开门方向设置": "Ensemble de direction d'ouverture", "开门方向设置": "Ensemble de direction d'ouverture",
@ -778,7 +777,6 @@
"导出": "Exportation", "导出": "Exportation",
"批量导出": "Exportation par lots", "批量导出": "Exportation par lots",
"读取记录": "Rafraîchir les enregistrements", "读取记录": "Rafraîchir les enregistrements",
"手机需联网": "NeedNet",
"设备": "Appareil", "设备": "Appareil",
"消息": "Messages", "消息": "Messages",
"智能分析": "Analyse intelligente", "智能分析": "Analyse intelligente",
@ -1110,5 +1108,15 @@
"常规使用": "Utilisation régulière", "常规使用": "Utilisation régulière",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Une fois la passerelle allumée, appuyez et maintenez enfoncé le bouton de réinitialisation pendant 5 secondes, puis cliquez sur Suivant lorsque le voyant clignote alternativement", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Une fois la passerelle allumée, appuyez et maintenez enfoncé le bouton de réinitialisation pendant 5 secondes, puis cliquez sur Suivant lorsque le voyant clignote alternativement",
"扫描设备": "Appareil de numérisation", "扫描设备": "Appareil de numérisation",
"删除失败,网关可能已经离线,是否强制删除该数据?": "La suppression a échoué. La passerelle est peut-être hors ligne. Voulez-vous forcer la suppression des données?" "删除失败,网关可能已经离线,是否强制删除该数据?": "La suppression a échoué. La passerelle est peut-être hors ligne. Voulez-vous forcer la suppression des données?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "כל פרטי החשבון שלך יוסר מהפלטפורמה לצמיתות ולא ניתן לשחזר. האם ברצונך למחוק?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "כל פרטי החשבון שלך יוסר מהפלטפורמה לצמיתות ולא ניתן לשחזר. האם ברצונך למחוק?",
"监控": "מוניטור", "监控": "מוניטור",
"视频日志": "יומן וידאו", "视频日志": "יומן וידאו",
"网关设备": "שער",
"开门器": "פותחן דלת", "开门器": "פותחן דלת",
"面容开锁": "פותח פנים", "面容开锁": "פותח פנים",
"开门方向设置": "פתיחת כיוון", "开门方向设置": "פתיחת כיוון",
@ -778,7 +777,6 @@
"导出": "יצוא", "导出": "יצוא",
"批量导出": "יצוא אצווה", "批量导出": "יצוא אצווה",
"读取记录": "ריענון רשומות", "读取记录": "ריענון רשומות",
"手机需联网": "נברשת",
"设备": "מכשיר", "设备": "מכשיר",
"消息": "הודעות", "消息": "הודעות",
"智能分析": "ניתוח חכם", "智能分析": "ניתוח חכם",
@ -1110,5 +1108,15 @@
"常规使用": "שימוש קבוע", "常规使用": "שימוש קבוע",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "לאחר השער מופעל, לחץ והחזק את כפתור איפוס עבור 5 שניות, ולחץ על הבא כאשר מחוון אור מהבהב לסירוגין", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "לאחר השער מופעל, לחץ והחזק את כפתור איפוס עבור 5 שניות, ולחץ על הבא כאשר מחוון אור מהבהב לסירוגין",
"扫描设备": "התקן סריקה", "扫描设备": "התקן סריקה",
"删除失败,网关可能已经离线,是否强制删除该数据?": "מחיקה נכשלה. ייתכן שהשער נעלם מהרשת. האם ברצונך לאלץ למחוק את הנתונים?" "删除失败,网关可能已经离线,是否强制删除该数据?": "מחיקה נכשלה. ייתכן שהשער נעלם מהרשת. האם ברצונך לאלץ למחוק את הנתונים?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -314,7 +314,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "您的所有账户信息将从平台上永久删除,且无法恢复。要删除吗?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "您的所有账户信息将从平台上永久删除,且无法恢复。要删除吗?",
"监控": "监控", "监控": "监控",
"视频日志": "视频日志", "视频日志": "视频日志",
"网关设备": "网关",
"开门器": "开门器", "开门器": "开门器",
"面容开锁": "脸解锁", "面容开锁": "脸解锁",
"开门方向设置": "开启方向集", "开门方向设置": "开启方向集",
@ -786,7 +785,6 @@
"导出": "出口", "导出": "出口",
"批量导出": "批量出口", "批量导出": "批量出口",
"读取记录": "刷新记录", "读取记录": "刷新记录",
"手机需联网": "NeedNet",
"设备": "设备", "设备": "设备",
"消息": "消息", "消息": "消息",
"智能分析": "智能分析", "智能分析": "智能分析",
@ -1110,5 +1108,15 @@
"常规使用": "经常使用", "常规使用": "经常使用",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "待设备上电后长按复位键5秒指示灯交替闪烁后单击“下一步”", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "待设备上电后长按复位键5秒指示灯交替闪烁后单击“下一步”",
"扫描设备": "扫描设备", "扫描设备": "扫描设备",
"删除失败,网关可能已经离线,是否强制删除该数据?": "删除失败。网关可能已经脱机。是否要强制删除数据?" "删除失败,网关可能已经离线,是否强制删除该数据?": "删除失败。网关可能已经脱机。是否要强制删除数据?",
"超级管理员英文": "超级管理员",
"授权管理员英文": "使管理",
"普通管理员英文": "普通用户",
"网关设备英文": "网关设备",
"手机需联网英文": "手机需联网",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Sve informacije vašeg računa će biti uklonjene s platforme i neće se moći vratiti.Želite li izbrisati?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Sve informacije vašeg računa će biti uklonjene s platforme i neće se moći vratiti.Želite li izbrisati?",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Video dnevnik", "视频日志": "Video dnevnik",
"网关设备": "Prolaz",
"开门器": "Otvarač vrata", "开门器": "Otvarač vrata",
"面容开锁": "Otključa lice", "面容开锁": "Otključa lice",
"开门方向设置": "Smjer otvaranja", "开门方向设置": "Smjer otvaranja",
@ -778,7 +777,6 @@
"导出": "Izvozi", "导出": "Izvozi",
"批量导出": "Izvoz serije", "批量导出": "Izvoz serije",
"读取记录": "Osvježi zapise", "读取记录": "Osvježi zapise",
"手机需联网": "NeedNet",
"设备": "Uređaj", "设备": "Uređaj",
"消息": "Poruka servera:", "消息": "Poruka servera:",
"智能分析": "Inteligentna analiza", "智能分析": "Inteligentna analiza",
@ -1110,5 +1108,15 @@
"常规使用": "Redovna upotreba", "常规使用": "Redovna upotreba",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Nakon što se prolaz ukljuèi, pritisnite i zadržite dugme za reset 5 sekundi, i kliknite Sljedeća kada svjetlost indikatora izmijeniti", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Nakon što se prolaz ukljuèi, pritisnite i zadržite dugme za reset 5 sekundi, i kliknite Sljedeća kada svjetlost indikatora izmijeniti",
"扫描设备": "Skeniraj uređaj", "扫描设备": "Skeniraj uređaj",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Brisanje nije uspjelo. Prolaz je možda nestao. Želite li prisiliti brisati podatke?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Brisanje nije uspjelo. Prolaz je možda nestao. Želite li prisiliti brisati podatke?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Az összes számlaadatot végleg eltávolítjuk a platformról, és nem lehet visszanyerni. szeretné törölni?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Az összes számlaadatot végleg eltávolítjuk a platformról, és nem lehet visszanyerni. szeretné törölni?",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Videó napló", "视频日志": "Videó napló",
"网关设备": "Gateway",
"开门器": "Ajtónyitó", "开门器": "Ajtónyitó",
"面容开锁": "Face kinyit", "面容开锁": "Face kinyit",
"开门方向设置": "Nyitási irány beállítás", "开门方向设置": "Nyitási irány beállítás",
@ -778,7 +777,6 @@
"导出": "Export", "导出": "Export",
"批量导出": "Batch export", "批量导出": "Batch export",
"读取记录": "Refresh records", "读取记录": "Refresh records",
"手机需联网": "Neednet",
"设备": "Eszköz", "设备": "Eszköz",
"消息": "Üzenetek", "消息": "Üzenetek",
"智能分析": "Intelligens analitika", "智能分析": "Intelligens analitika",
@ -1110,5 +1108,15 @@
"常规使用": "Rendszeres használat", "常规使用": "Rendszeres használat",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Miután az átjáró be van kapcsolva, nyomja meg és tartsa a reset gombot 5 másodpercig, és kattintson a következő gombra, amikor a jelző fény felváltva villog", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Miután az átjáró be van kapcsolva, nyomja meg és tartsa a reset gombot 5 másodpercig, és kattintson a következő gombra, amikor a jelző fény felváltva villog",
"扫描设备": "Beolvasási eszköz", "扫描设备": "Beolvasási eszköz",
"删除失败,网关可能已经离线,是否强制删除该数据?": "A törlés nem sikerült. Az átjáró lehet, hogy offline lett. Szeretné kényszeríteni az adatok törlését?" "删除失败,网关可能已经离线,是否强制删除该数据?": "A törlés nem sikerült. Az átjáró lehet, hogy offline lett. Szeretné kényszeríteni az adatok törlését?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Semua informasi akun Anda akan dihapus dari Platform permanen dan tidak dapat dipulihkan. Apakah Anda ingin menghapus?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Semua informasi akun Anda akan dihapus dari Platform permanen dan tidak dapat dipulihkan. Apakah Anda ingin menghapus?",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Log Video", "视频日志": "Log Video",
"网关设备": "Gateway",
"开门器": "Pembuka pintu", "开门器": "Pembuka pintu",
"面容开锁": "Buka kunci wajah", "面容开锁": "Buka kunci wajah",
"开门方向设置": "Set penunjuk arah", "开门方向设置": "Set penunjuk arah",
@ -778,7 +777,6 @@
"导出": "Ekspor", "导出": "Ekspor",
"批量导出": "Batch ekspor", "批量导出": "Batch ekspor",
"读取记录": "Refresh rekaman", "读取记录": "Refresh rekaman",
"手机需联网": "NeedNet",
"设备": "Perangkat", "设备": "Perangkat",
"消息": "Pesan", "消息": "Pesan",
"智能分析": "Intelligent analytics", "智能分析": "Intelligent analytics",
@ -1110,5 +1108,15 @@
"常规使用": "Penggunaan biasa", "常规使用": "Penggunaan biasa",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Setelah gateway menyala, tekan dan tahan tombol reset selama 5 detik, dan klik berikutnya ketika lampu indikator berkedip secara bersamaan", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Setelah gateway menyala, tekan dan tahan tombol reset selama 5 detik, dan klik berikutnya ketika lampu indikator berkedip secara bersamaan",
"扫描设备": "Perangkat Pindai", "扫描设备": "Perangkat Pindai",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Penghapusan gagal. Gateway mungkin telah offline. Ingin menghapus data?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Penghapusan gagal. Gateway mungkin telah offline. Ingin menghapus data?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Tutte le informazioni del tuo account verranno rimosse dalla piattaforma PERMANENTAMENTE e non potranno essere recuperate. Vuoi eliminare?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Tutte le informazioni del tuo account verranno rimosse dalla piattaforma PERMANENTAMENTE e non potranno essere recuperate. Vuoi eliminare?",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Registro video", "视频日志": "Registro video",
"网关设备": "Gateway",
"开门器": "Apriporta", "开门器": "Apriporta",
"面容开锁": "Il viso si sblocca", "面容开锁": "Il viso si sblocca",
"开门方向设置": "Set di direzione di apertura", "开门方向设置": "Set di direzione di apertura",
@ -778,7 +777,6 @@
"导出": "Esportazione", "导出": "Esportazione",
"批量导出": "Esportazione in batch", "批量导出": "Esportazione in batch",
"读取记录": "Aggiorna i record", "读取记录": "Aggiorna i record",
"手机需联网": "NeedNet",
"设备": "Dispositivo", "设备": "Dispositivo",
"消息": "Messaggi", "消息": "Messaggi",
"智能分析": "Analisi intelligente", "智能分析": "Analisi intelligente",
@ -1110,5 +1108,15 @@
"常规使用": "Uso regolare", "常规使用": "Uso regolare",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Dopo aver acceso il gateway, tenere premuto il pulsante di ripristino per 5 secondi e fare clic su Avanti quando l'indicatore luminoso lampeggia alternativamente", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Dopo aver acceso il gateway, tenere premuto il pulsante di ripristino per 5 secondi e fare clic su Avanti quando l'indicatore luminoso lampeggia alternativamente",
"扫描设备": "Dispositivo di scansione", "扫描设备": "Dispositivo di scansione",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Eliminazione non riuscita. Il gateway potrebbe essere andato offline. Vuoi forzare l'eliminazione dei dati?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Eliminazione non riuscita. Il gateway potrebbe essere andato offline. Vuoi forzare l'eliminazione dei dati?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "すべてのアカウント情報は完全にプラットフォームから削除され、回復できません。削除しますか?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "すべてのアカウント情報は完全にプラットフォームから削除され、回復できません。削除しますか?",
"监控": "モニター", "监控": "モニター",
"视频日志": "ビデオログ", "视频日志": "ビデオログ",
"网关设备": "ゲートウェイ",
"开门器": "ドアオープナー", "开门器": "ドアオープナー",
"面容开锁": "顔のロック解除", "面容开锁": "顔のロック解除",
"开门方向设置": "オープニング方向セット", "开门方向设置": "オープニング方向セット",
@ -778,7 +777,6 @@
"导出": "エクスポート", "导出": "エクスポート",
"批量导出": "一括エクスポート", "批量导出": "一括エクスポート",
"读取记录": "レコードの更新", "读取记录": "レコードの更新",
"手机需联网": "ニードネット",
"设备": "デバイス", "设备": "デバイス",
"消息": "メッセージ", "消息": "メッセージ",
"智能分析": "インテリジェント分析", "智能分析": "インテリジェント分析",
@ -1110,5 +1108,15 @@
"常规使用": "通常の使用", "常规使用": "通常の使用",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "ゲートウェイの電源がオンになった後、リセットボタンを5秒間押し続け、インジケーターライトが交互に点滅したら [次へ] をクリックします。", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "ゲートウェイの電源がオンになった後、リセットボタンを5秒間押し続け、インジケーターライトが交互に点滅したら [次へ] をクリックします。",
"扫描设备": "スキャン装置", "扫描设备": "スキャン装置",
"删除失败,网关可能已经离线,是否强制删除该数据?": "削除に失敗しました。ゲートウェイがオフラインになった可能性があります。強制的にデータを削除しますか?" "删除失败,网关可能已经离线,是否强制删除该数据?": "削除に失敗しました。ゲートウェイがオフラインになった可能性があります。強制的にデータを削除しますか?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -317,7 +317,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?",
"监控": "监控", "监控": "监控",
"视频日志": "视频日志", "视频日志": "视频日志",
"网关设备": "网关设备",
"开门器": "开门器", "开门器": "开门器",
"面容开锁": "面容开锁", "面容开锁": "面容开锁",
"开门方向设置": "开门方向设置", "开门方向设置": "开门方向设置",
@ -1112,5 +1111,15 @@
"中功率": "中功率", "中功率": "中功率",
"常规使用": "常规使用", "常规使用": "常规使用",
"扫描设备": "扫描设备", "扫描设备": "扫描设备",
"删除失败,网关可能已经离线,是否强制删除该数据?": "删除失败,网关可能已经离线,是否强制删除该数据?" "删除失败,网关可能已经离线,是否强制删除该数据?": "删除失败,网关可能已经离线,是否强制删除该数据?",
"超级管理员英文": "超级管理员英文",
"授权管理员英文": "授权管理员英文",
"普通管理员英文": "普通管理员英文",
"网关设备英文": "网关设备英文",
"手机需联网英文": "手机需联网英文",
"年简称": "年简称",
"月简称": "月简称",
"日简称": "日简称",
"时简称": "时简称",
"分简称": "分简称"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Тіркелгіңіздің барлық мәліметі Платформадан өшірілген және қайта жоғалтылмайды. Өшіруге қалайсыз ба?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Тіркелгіңіздің барлық мәліметі Платформадан өшірілген және қайта жоғалтылмайды. Өшіруге қалайсыз ба?",
"监控": "Монитор", "监控": "Монитор",
"视频日志": "Видео журналы", "视频日志": "Видео журналы",
"网关设备": "Шлюз",
"开门器": "Қашықтығы ашу", "开门器": "Қашықтығы ашу",
"面容开锁": "Өшірілгендер", "面容开锁": "Өшірілгендер",
"开门方向设置": "Ашату жолы жинағы", "开门方向设置": "Ашату жолы жинағы",
@ -778,7 +777,6 @@
"导出": "Экспорттау", "导出": "Экспорттау",
"批量导出": "Бағдарлама экспорттау", "批量导出": "Бағдарлама экспорттау",
"读取记录": "Жаңарту", "读取记录": "Жаңарту",
"手机需联网": "NeedNet",
"设备": "Құрылғысы", "设备": "Құрылғысы",
"消息": "Хаттар", "消息": "Хаттар",
"智能分析": "Интелгент аналітикасы", "智能分析": "Интелгент аналітикасы",
@ -1110,5 +1108,15 @@
"常规使用": "Қалыпты қолданылсын", "常规使用": "Қалыпты қолданылсын",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Келесі періңізнен соң, ысырып тасымалдау батырмасын басып 5 секунд басыңыз, Индикаторның жарықты ауыстырғанда, келесі басыңыз", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Келесі періңізнен соң, ысырып тасымалдау батырмасын басып 5 секунд басыңыз, Индикаторның жарықты ауыстырғанда, келесі басыңыз",
"扫描设备": "Сканер құрылғысы", "扫描设备": "Сканер құрылғысы",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Өшіру жаңылысы. Келесі жіберді. Деректерді өшіргіңіз келе ме?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Өшіру жаңылысы. Келесі жіберді. Деректерді өшіргіңіз келе ме?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "모든 계정 정보는 플랫폼에서 자동으로 삭제되며 복구 할 수 없습니다. 삭제 하시겠습니까?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "모든 계정 정보는 플랫폼에서 자동으로 삭제되며 복구 할 수 없습니다. 삭제 하시겠습니까?",
"监控": "모니터", "监控": "모니터",
"视频日志": "비디오 로그", "视频日志": "비디오 로그",
"网关设备": "게이트웨이",
"开门器": "도어 오프너", "开门器": "도어 오프너",
"面容开锁": "얼굴 잠금 해제", "面容开锁": "얼굴 잠금 해제",
"开门方向设置": "오프닝 방향 세트", "开门方向设置": "오프닝 방향 세트",
@ -778,7 +777,6 @@
"导出": "수출", "导出": "수출",
"批量导出": "배치 수출", "批量导出": "배치 수출",
"读取记录": "레코드 새로 고침", "读取记录": "레코드 새로 고침",
"手机需联网": "니드넷",
"设备": "장치", "设备": "장치",
"消息": "메시지", "消息": "메시지",
"智能分析": "지능형 분석", "智能分析": "지능형 분석",
@ -1110,5 +1108,15 @@
"常规使用": "정사이즈 사용", "常规使用": "정사이즈 사용",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "게이트웨이의 전원이 켜진 후 5 초 동안 리셋 버튼을 누르고 누르고 표시등이 번갈아 깜박이면 다음 을 클릭하십시오.", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "게이트웨이의 전원이 켜진 후 5 초 동안 리셋 버튼을 누르고 누르고 표시등이 번갈아 깜박이면 다음 을 클릭하십시오.",
"扫描设备": "스캔 장치", "扫描设备": "스캔 장치",
"删除失败,网关可能已经离线,是否强制删除该数据?": "삭제가 실패했습니다. 게이트웨이가 오프라인 상태일 수 있다. 강제로 데이터 삭제를 하시겠습니까?" "删除失败,网关可能已经离线,是否强制删除该数据?": "삭제가 실패했습니다. 게이트웨이가 오프라인 상태일 수 있다. 강제로 데이터 삭제를 하시겠습니까?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Visa jūsų paskyros informacija bus pašalinta iš platformos visam laikui ir jų negalima atkurti. ar norite ištrinti?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Visa jūsų paskyros informacija bus pašalinta iš platformos visam laikui ir jų negalima atkurti. ar norite ištrinti?",
"监控": "Monitorius", "监控": "Monitorius",
"视频日志": "Vaizdo žurnalas", "视频日志": "Vaizdo žurnalas",
"网关设备": "Vartai",
"开门器": "Durų atidarytuvas", "开门器": "Durų atidarytuvas",
"面容开锁": "Veidas atrakinamas", "面容开锁": "Veidas atrakinamas",
"开门方向设置": "Atidarymo kryptis nustatytas", "开门方向设置": "Atidarymo kryptis nustatytas",
@ -778,7 +777,6 @@
"导出": "Eksporto", "导出": "Eksporto",
"批量导出": "Paketo eksportas", "批量导出": "Paketo eksportas",
"读取记录": "Atnaujinti įrašus", "读取记录": "Atnaujinti įrašus",
"手机需联网": "Neednet",
"设备": "Įtaisas", "设备": "Įtaisas",
"消息": "Pranešimai", "消息": "Pranešimai",
"智能分析": "Intelektuali analizė", "智能分析": "Intelektuali analizė",
@ -1110,5 +1108,15 @@
"常规使用": "Reguliarus naudojimas", "常规使用": "Reguliarus naudojimas",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Įjungus vartus, 5 sekundes paspauskite ir palaikykite reset mygtuką ir spustelėkite toliau, kai indikatoriaus lemputė mirksi pakaitomis.", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Įjungus vartus, 5 sekundes paspauskite ir palaikykite reset mygtuką ir spustelėkite toliau, kai indikatoriaus lemputė mirksi pakaitomis.",
"扫描设备": "Nuskaitymo įrenginys", "扫描设备": "Nuskaitymo įrenginys",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Ištrynimas nepavyko. Vartai gali būti neprisijungę. Ar norite priversti ištrinti duomenis?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Ištrynimas nepavyko. Vartai gali būti neprisijungę. Ar norite priversti ištrinti duomenis?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Semua maklumat akaun anda akan dikeluarkan dari Platform secara kekal dan tidak dapat dipulihkan. Adakah anda ingin memadam?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Semua maklumat akaun anda akan dikeluarkan dari Platform secara kekal dan tidak dapat dipulihkan. Adakah anda ingin memadam?",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Log Video", "视频日志": "Log Video",
"网关设备": "Pintu masuk",
"开门器": "Pembuka pintu", "开门器": "Pembuka pintu",
"面容开锁": "Membuka muka", "面容开锁": "Membuka muka",
"开门方向设置": "Set arah pembukaan", "开门方向设置": "Set arah pembukaan",
@ -778,7 +777,6 @@
"导出": "Eksport", "导出": "Eksport",
"批量导出": "Eksport Batch", "批量导出": "Eksport Batch",
"读取记录": "Rekod-rekod segar semula", "读取记录": "Rekod-rekod segar semula",
"手机需联网": "NeedNet",
"设备": "Peranti", "设备": "Peranti",
"消息": "Mesej", "消息": "Mesej",
"智能分析": "Analisis pintar", "智能分析": "Analisis pintar",
@ -1110,5 +1108,15 @@
"常规使用": "Penggunaan biasa", "常规使用": "Penggunaan biasa",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Selepas pintu masuk dihidupkan, tekan dan tahan butang reset selama 5 saat, dan klik seterusnya apabila lampu penunjuk berkelip bergantian", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Selepas pintu masuk dihidupkan, tekan dan tahan butang reset selama 5 saat, dan klik seterusnya apabila lampu penunjuk berkelip bergantian",
"扫描设备": "Imbas peranti", "扫描设备": "Imbas peranti",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Penghapusan gagal. Pintu masuk mungkin telah pergi di luar talian. Adakah anda mahu memaksa memadam data?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Penghapusan gagal. Pintu masuk mungkin telah pergi di luar talian. Adakah anda mahu memaksa memadam data?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Alle accountgegevens worden PERMANENT van het Platform verwijderd en kunnen niet worden teruggevonden. Wilt u Verwijderen?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Alle accountgegevens worden PERMANENT van het Platform verwijderd en kunnen niet worden teruggevonden. Wilt u Verwijderen?",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Videologboek", "视频日志": "Videologboek",
"网关设备": "Gateway",
"开门器": "Deuropener", "开门器": "Deuropener",
"面容开锁": "Gezicht ontgrendelt", "面容开锁": "Gezicht ontgrendelt",
"开门方向设置": "Openingsrichtingsset", "开门方向设置": "Openingsrichtingsset",
@ -778,7 +777,6 @@
"导出": "Uitvoer", "导出": "Uitvoer",
"批量导出": "Batch export", "批量导出": "Batch export",
"读取记录": "Records vernieuwen", "读取记录": "Records vernieuwen",
"手机需联网": "Neednet",
"设备": "Apparaat", "设备": "Apparaat",
"消息": "Berichten", "消息": "Berichten",
"智能分析": "Intelligente analyses", "智能分析": "Intelligente analyses",
@ -1110,5 +1108,15 @@
"常规使用": "Regelmatig gebruik", "常规使用": "Regelmatig gebruik",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Nadat de gateway is ingeschakeld, houdt u de resetknop 5 seconden ingedrukt en klikt u op Volgende wanneer het indicatielampje afwisselend knippert", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Nadat de gateway is ingeschakeld, houdt u de resetknop 5 seconden ingedrukt en klikt u op Volgende wanneer het indicatielampje afwisselend knippert",
"扫描设备": "Scan apparaat", "扫描设备": "Scan apparaat",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Verwijdering is mislukt. De gateway is mogelijk offline gegaan. Wilt u de gegevens forceren verwijderen?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Verwijdering is mislukt. De gateway is mogelijk offline gegaan. Wilt u de gegevens forceren verwijderen?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Wszystkie informacje o koncie zostaną usunięte z platformy i nie będzie można ich odzyskać. Czy chcesz usunąć?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Wszystkie informacje o koncie zostaną usunięte z platformy i nie będzie można ich odzyskać. Czy chcesz usunąć?",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Dziennik wideo", "视频日志": "Dziennik wideo",
"网关设备": "Brama",
"开门器": "Otwieracz do drzwi", "开门器": "Otwieracz do drzwi",
"面容开锁": "Odblokowywanie twarzy", "面容开锁": "Odblokowywanie twarzy",
"开门方向设置": "Zestaw kierunku otwierania", "开门方向设置": "Zestaw kierunku otwierania",
@ -778,7 +777,6 @@
"导出": "Eksport", "导出": "Eksport",
"批量导出": "Eksport partii", "批量导出": "Eksport partii",
"读取记录": "Odśwież rekordy", "读取记录": "Odśwież rekordy",
"手机需联网": "NeedNet",
"设备": "Urządzenie", "设备": "Urządzenie",
"消息": "Wiadomości", "消息": "Wiadomości",
"智能分析": "Inteligentna analityka", "智能分析": "Inteligentna analityka",
@ -1110,5 +1108,15 @@
"常规使用": "Regularne stosowanie", "常规使用": "Regularne stosowanie",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Po włączeniu bramy naciśnij i przytrzymaj przycisk resetowania przez 5 sekund i kliknij przycisk Dalej, gdy wskaźnik miga na przemian", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Po włączeniu bramy naciśnij i przytrzymaj przycisk resetowania przez 5 sekund i kliknij przycisk Dalej, gdy wskaźnik miga na przemian",
"扫描设备": "Urządzenie skanujące", "扫描设备": "Urządzenie skanujące",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Usunięcie nie powiodło się. Brama mogła zostać wyłączona. Czy chcesz wymusić usunięcie danych?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Usunięcie nie powiodło się. Brama mogła zostać wyłączona. Czy chcesz wymusić usunięcie danych?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Todas as informações da sua conta serão removidas da plataforma PERMANENTEMENTE e não poderão ser recuperadas. Deseja excluir?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Todas as informações da sua conta serão removidas da plataforma PERMANENTEMENTE e não poderão ser recuperadas. Deseja excluir?",
"监控": "Monitore", "监控": "Monitore",
"视频日志": "Log Vídeo", "视频日志": "Log Vídeo",
"网关设备": "Gateway",
"开门器": "Abridor porta", "开门器": "Abridor porta",
"面容开锁": "Rosto desbloqueia", "面容开锁": "Rosto desbloqueia",
"开门方向设置": "Conjunto Direção Abertura", "开门方向设置": "Conjunto Direção Abertura",
@ -778,7 +777,6 @@
"导出": "Exportação", "导出": "Exportação",
"批量导出": "Exportação lote", "批量导出": "Exportação lote",
"读取记录": "Atualizar Registros", "读取记录": "Atualizar Registros",
"手机需联网": "NeedNet",
"设备": "Dispositivo", "设备": "Dispositivo",
"消息": "Mensagens", "消息": "Mensagens",
"智能分析": "Análise inteligente", "智能分析": "Análise inteligente",
@ -1110,5 +1108,15 @@
"常规使用": "Uso regular", "常规使用": "Uso regular",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Depois que o gateway estiver ligado, pressione e segure o botão de reset por 5 segundos e clique em Next quando a luz indicadora pisca alternadamente", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Depois que o gateway estiver ligado, pressione e segure o botão de reset por 5 segundos e clique em Next quando a luz indicadora pisca alternadamente",
"扫描设备": "Digitalizar dispositivo", "扫描设备": "Digitalizar dispositivo",
"删除失败,网关可能已经离线,是否强制删除该数据?": "A eliminação falhou. O gateway pode ter ficado offline. Você quer forçar a exclusão dos dados?" "删除失败,网关可能已经离线,是否强制删除该数据?": "A eliminação falhou. O gateway pode ter ficado offline. Você quer forçar a exclusão dos dados?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Toate informațiile contului dumneavoastră vor fi înlăturate de pe platformă și nu pot fi recuperate. Doriți să ștergeți?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Toate informațiile contului dumneavoastră vor fi înlăturate de pe platformă și nu pot fi recuperate. Doriți să ștergeți?",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Jurnal video", "视频日志": "Jurnal video",
"网关设备": "GatewayComment",
"开门器": "Deschizător de uși", "开门器": "Deschizător de uși",
"面容开锁": "Fața deblochează", "面容开锁": "Fața deblochează",
"开门方向设置": "Set de direcție de deschidere", "开门方向设置": "Set de direcție de deschidere",
@ -778,7 +777,6 @@
"导出": "Exportă", "导出": "Exportă",
"批量导出": "Export pe lot", "批量导出": "Export pe lot",
"读取记录": "Reîmprospătește înregistrările", "读取记录": "Reîmprospătește înregistrările",
"手机需联网": "NeedNet",
"设备": "Dispozitive", "设备": "Dispozitive",
"消息": "Mesaje", "消息": "Mesaje",
"智能分析": "Analitică inteligentă", "智能分析": "Analitică inteligentă",
@ -1110,5 +1108,15 @@
"常规使用": "Utilizare regulată", "常规使用": "Utilizare regulată",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "După ce poarta este pornită, apăsați și țineți butonul de resetare timp de 5 secunde, și faceți clic pe Următor atunci când lumina indicatorului se aprinde alternativ.", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "După ce poarta este pornită, apăsați și țineți butonul de resetare timp de 5 secunde, și faceți clic pe Următor atunci când lumina indicatorului se aprinde alternativ.",
"扫描设备": "Dispozitiv de scanare", "扫描设备": "Dispozitiv de scanare",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Ștergerea a eșuat. Poarta poate s-a oprit. Doriți să forțați ștergerea datelor?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Ștergerea a eșuat. Poarta poate s-a oprit. Doriți să forțați ștergerea datelor?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -180,7 +180,7 @@
"隐藏无效开锁权限": "Скрыть недопустимый доступ", "隐藏无效开锁权限": "Скрыть недопустимый доступ",
"APP开锁时需手机连网的锁": "Замки требующие телефона онлайн", "APP开锁时需手机连网的锁": "Замки требующие телефона онлайн",
"增值服务": "Услуги", "增值服务": "Услуги",
"关于": "Касательно", "关于": "О нас",
"退出": "Выход", "退出": "Выход",
"删除账号": "Удалить аккаунт", "删除账号": "Удалить аккаунт",
"个人信息": "Информация счета", "个人信息": "Информация счета",
@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Вся информация о вашей учетной записи будет удалена с платформы ПОСТОЯННО и не может быть восстановлена. Вы хотите удалить?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Вся информация о вашей учетной записи будет удалена с платформы ПОСТОЯННО и не может быть восстановлена. Вы хотите удалить?",
"监控": "Монитор", "监控": "Монитор",
"视频日志": "Видео журнал", "视频日志": "Видео журнал",
"网关设备": "Шлюз",
"开门器": "Дверь открывалка", "开门器": "Дверь открывалка",
"面容开锁": "Лицо разблокирует", "面容开锁": "Лицо разблокирует",
"开门方向设置": "Набор направления открытия", "开门方向设置": "Набор направления открытия",
@ -778,7 +777,6 @@
"导出": "Экспорт", "导出": "Экспорт",
"批量导出": "Пакетный экспорт", "批量导出": "Пакетный экспорт",
"读取记录": "Обновить записи", "读取记录": "Обновить записи",
"手机需联网": "Ниднет",
"设备": "Устройство", "设备": "Устройство",
"消息": "Сообщения", "消息": "Сообщения",
"智能分析": "Интеллектуальная аналитика", "智能分析": "Интеллектуальная аналитика",
@ -1110,5 +1108,15 @@
"常规使用": "Регулярное использование", "常规使用": "Регулярное использование",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "После включения шлюза нажмите и удерживайте кнопку сброса в течение 5 секунд и нажмите «Далее», когда индикатор попеременно начнет мигать.", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "После включения шлюза нажмите и удерживайте кнопку сброса в течение 5 секунд и нажмите «Далее», когда индикатор попеременно начнет мигать.",
"扫描设备": "Устройство сканирования", "扫描设备": "Устройство сканирования",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Ошибка удаления. Возможно, шлюз ушел в автономный режим. Хотите ли вы принудительно удалить данные?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Ошибка удаления. Возможно, шлюз ушел в автономный режим. Хотите ли вы принудительно удалить данные?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Všetky informácie o vašom účte budú natrvalo odstránené z platformy a nemôžu byť obnovené. chcete odstrániť?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Všetky informácie o vašom účte budú natrvalo odstránené z platformy a nemôžu byť obnovené. chcete odstrániť?",
"监控": "Monitor", "监控": "Monitor",
"视频日志": "Video log", "视频日志": "Video log",
"网关设备": "Brána",
"开门器": "Otvárač dverí", "开门器": "Otvárač dverí",
"面容开锁": "Tvár odomkne", "面容开锁": "Tvár odomkne",
"开门方向设置": "Nastaviť smer otvorenia", "开门方向设置": "Nastaviť smer otvorenia",
@ -778,7 +777,6 @@
"导出": "Export", "导出": "Export",
"批量导出": "Export šarže", "批量导出": "Export šarže",
"读取记录": "Refresh records", "读取记录": "Refresh records",
"手机需联网": "Neednet",
"设备": "Zariadenie", "设备": "Zariadenie",
"消息": "Správy", "消息": "Správy",
"智能分析": "Inteligentná analýza", "智能分析": "Inteligentná analýza",
@ -1110,5 +1108,15 @@
"常规使用": "Pravidelné použitie", "常规使用": "Pravidelné použitie",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Po zapnutí brány stlačte a podržte tlačidlo reset po dobu 5 sekúnd a kliknite na ďalšie, keď indikátorové svetlo záblesky striedavo", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Po zapnutí brány stlačte a podržte tlačidlo reset po dobu 5 sekúnd a kliknite na ďalšie, keď indikátorové svetlo záblesky striedavo",
"扫描设备": "Skenovanie zariadenia", "扫描设备": "Skenovanie zariadenia",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Vymazanie sa nepodarilo. Brána môže ísť offline. Chcete vynútiť odstránenie údajov?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Vymazanie sa nepodarilo. Brána môže ísť offline. Chcete vynútiť odstránenie údajov?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -181,7 +181,7 @@
"隐藏无效开锁权限": "Сакриј неважећи приступ", "隐藏无效开锁权限": "Сакриј неважећи приступ",
"APP开锁时需手机连网的锁": "Браве које захтевају телефон на мрежи", "APP开锁时需手机连网的锁": "Браве које захтевају телефон на мрежи",
"增值服务": "Услуге", "增值服务": "Услуге",
"关于": "Povodom", "关于": "O nama",
"退出": "Одјавити се", "退出": "Одјавити се",
"删除账号": "Избриши налог", "删除账号": "Избриши налог",
"个人信息": "Информације о налогу", "个人信息": "Информације о налогу",
@ -314,7 +314,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Сви подаци о вашем налогу ће бити трајно уклоњени са платформе и не могу се Рецоверед.До желите да избришете?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Сви подаци о вашем налогу ће бити трајно уклоњени са платформе и не могу се Рецоверед.До желите да избришете?",
"监控": "Монитор", "监控": "Монитор",
"视频日志": "Видео Дневник", "视频日志": "Видео Дневник",
"网关设备": "Пролаз",
"开门器": "Отварач врата", "开门器": "Отварач врата",
"面容开锁": "Откључавање лица", "面容开锁": "Откључавање лица",
"开门方向设置": "Отварање Правац Сет", "开门方向设置": "Отварање Правац Сет",
@ -786,7 +785,6 @@
"导出": "Извоз", "导出": "Извоз",
"批量导出": "Серијски извоз", "批量导出": "Серијски извоз",
"读取记录": "Освежите записе", "读取记录": "Освежите записе",
"手机需联网": "Претраживање",
"设备": "Уређај", "设备": "Уређај",
"消息": "Поруке", "消息": "Поруке",
"智能分析": "Интелигентна аналитика", "智能分析": "Интелигентна аналитика",
@ -1110,5 +1108,15 @@
"常规使用": "Редовна употреба", "常规使用": "Редовна употреба",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Након што је гатеваи укључен, притисните и држите дугме за ресетовање за 5 секунди, и кликните Следећи када индикатор трепери наизменично", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Након што је гатеваи укључен, притисните и држите дугме за ресетовање за 5 секунди, и кликните Следећи када индикатор трепери наизменично",
"扫描设备": "Уређај за скенирање", "扫描设备": "Уређај за скенирање",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Брисање није успело. Гатеваи је можда отишао ван мреже. Да ли желите да присилите брисање података?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Брисање није успело. Гатеваи је можда отишао ван мреже. Да ли желите да присилите брисање података?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "All information från dina konto kommer att tas bort från plattformen PERMANENTLYT och kan inte återställas. Vill du ta bort?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "All information från dina konto kommer att tas bort från plattformen PERMANENTLYT och kan inte återställas. Vill du ta bort?",
"监控": "Övervakare", "监控": "Övervakare",
"视频日志": "Videologg", "视频日志": "Videologg",
"网关设备": "Gateway",
"开门器": "Dörröppnare", "开门器": "Dörröppnare",
"面容开锁": "Ansiktet upplåsas", "面容开锁": "Ansiktet upplåsas",
"开门方向设置": "Öppningsriktning", "开门方向设置": "Öppningsriktning",
@ -778,7 +777,6 @@
"导出": "Exportering", "导出": "Exportering",
"批量导出": "Export från sats", "批量导出": "Export från sats",
"读取记录": "Uppdatera poster", "读取记录": "Uppdatera poster",
"手机需联网": "NeedNet",
"设备": "Enheten", "设备": "Enheten",
"消息": "Meddelanden", "消息": "Meddelanden",
"智能分析": "Intelligent analys", "智能分析": "Intelligent analys",
@ -1110,5 +1108,15 @@
"常规使用": "Regelbunden användning", "常规使用": "Regelbunden användning",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "När gateway är på, tryck och håll omställningsknappen i 5 sekunder, och klicka Nästa när indikatorljuset blinkar växelvist", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "När gateway är på, tryck och håll omställningsknappen i 5 sekunder, och klicka Nästa när indikatorljuset blinkar växelvist",
"扫描设备": "Söka enheter", "扫描设备": "Söka enheter",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Borttagning misslyckades. Porten kan ha gått offline. Vill du tvinga bort data?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Borttagning misslyckades. Porten kan ha gått offline. Vill du tvinga bort data?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "ข้อมูลบัญชีทั้งหมดของคุณจะถูกลบออกจากแพลตฟอร์มอย่างถาวรและไม่สามารถกู้คืนได้คุณต้องการลบหรือไม่?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "ข้อมูลบัญชีทั้งหมดของคุณจะถูกลบออกจากแพลตฟอร์มอย่างถาวรและไม่สามารถกู้คืนได้คุณต้องการลบหรือไม่?",
"监控": "จอภาพสำหรับตรวจสอบ", "监控": "จอภาพสำหรับตรวจสอบ",
"视频日志": "บันทึกวิดีโอบันทึก", "视频日志": "บันทึกวิดีโอบันทึก",
"网关设备": "เกตเวย์เกตเวย์",
"开门器": "ที่เปิดประตู", "开门器": "ที่เปิดประตู",
"面容开锁": "ปลดล็อคใบหน้า", "面容开锁": "ปลดล็อคใบหน้า",
"开门方向设置": "ชุดเปิดทิศทาง", "开门方向设置": "ชุดเปิดทิศทาง",
@ -778,7 +777,6 @@
"导出": "ส่งออกจากต่างประเทศ", "导出": "ส่งออกจากต่างประเทศ",
"批量导出": "ชุดส่งออก", "批量导出": "ชุดส่งออก",
"读取记录": "รีเฟรชระเบียน", "读取记录": "รีเฟรชระเบียน",
"手机需联网": "ตาข่ายปักลาย",
"设备": "อุปกรณ์สำหรับเชื่อมต่อ", "设备": "อุปกรณ์สำหรับเชื่อมต่อ",
"消息": "ข้อความต่างๆ", "消息": "ข้อความต่างๆ",
"智能分析": "การวิเคราะห์อัจฉริยะ", "智能分析": "การวิเคราะห์อัจฉริยะ",
@ -1110,5 +1108,15 @@
"常规使用": "ใช้เป็นประจำ", "常规使用": "ใช้เป็นประจำ",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "หลังจากเปิดเกตเวย์แล้วให้กดปุ่มรีเซ็ตค้างไว้5วินาทีและคลิกถัดไปเมื่อไฟแสดงสถานะกะพริบสลับกัน", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "หลังจากเปิดเกตเวย์แล้วให้กดปุ่มรีเซ็ตค้างไว้5วินาทีและคลิกถัดไปเมื่อไฟแสดงสถานะกะพริบสลับกัน",
"扫描设备": "อุปกรณ์สแกน", "扫描设备": "อุปกรณ์สแกน",
"删除失败,网关可能已经离线,是否强制删除该数据?": "การลบล้มเหลวเกตเวย์อาจออฟไลน์ไปแล้วคุณต้องการบังคับให้ลบข้อมูลหรือไม่?" "删除失败,网关可能已经离线,是否强制删除该数据?": "การลบล้มเหลวเกตเวย์อาจออฟไลน์ไปแล้วคุณต้องการบังคับให้ลบข้อมูลหรือไม่?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Tüm hesap bilgileriniz platformdan kalıcı olarak kaldırılacak ve kurtarılamayacaktır. silmek ister misiniz?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Tüm hesap bilgileriniz platformdan kalıcı olarak kaldırılacak ve kurtarılamayacaktır. silmek ister misiniz?",
"监控": "Monitör", "监控": "Monitör",
"视频日志": "Video günlüğü", "视频日志": "Video günlüğü",
"网关设备": "Ağ geçidi",
"开门器": "Kapı açacağı", "开门器": "Kapı açacağı",
"面容开锁": "Yüz kilidini açar", "面容开锁": "Yüz kilidini açar",
"开门方向设置": "Açılış yönü seti", "开门方向设置": "Açılış yönü seti",
@ -778,7 +777,6 @@
"导出": "Ihracat", "导出": "Ihracat",
"批量导出": "Toplu ihracat", "批量导出": "Toplu ihracat",
"读取记录": "Kayıtları yenileyin", "读取记录": "Kayıtları yenileyin",
"手机需联网": "Neednet",
"设备": "Cihaz", "设备": "Cihaz",
"消息": "Mesajlar", "消息": "Mesajlar",
"智能分析": "Akıllı analiz", "智能分析": "Akıllı analiz",
@ -1110,5 +1108,15 @@
"常规使用": "Düzenli kullanım", "常规使用": "Düzenli kullanım",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Ağ geçidi açıldıktan sonra, sıfırlama düğmesine 5 saniye basılı tutun ve gösterge ışığı dönüşümlü olarak yanıp söndüğünde İleri'ye tıklayın.", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Ağ geçidi açıldıktan sonra, sıfırlama düğmesine 5 saniye basılı tutun ve gösterge ışığı dönüşümlü olarak yanıp söndüğünde İleri'ye tıklayın.",
"扫描设备": "Tarama cihazı", "扫描设备": "Tarama cihazı",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Silme başarısız oldu. Ağ geçidi çevrimdışı geçmiş olabilir. Verileri silmeye zorlamak ister misiniz?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Silme başarısız oldu. Ağ geçidi çevrimdışı geçmiş olabilir. Verileri silmeye zorlamak ister misiniz?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "您的所有帳戶信息都將從平台中永久刪除,並且無法恢復。 是否要刪除?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "您的所有帳戶信息都將從平台中永久刪除,並且無法恢復。 是否要刪除?",
"监控": "顯示器", "监控": "顯示器",
"视频日志": "視頻日誌", "视频日志": "視頻日誌",
"网关设备": "網關",
"开门器": "開門器", "开门器": "開門器",
"面容开锁": "面部解鎖", "面容开锁": "面部解鎖",
"开门方向设置": "打開方向設置", "开门方向设置": "打開方向設置",
@ -778,7 +777,6 @@
"导出": "出口", "导出": "出口",
"批量导出": "批量導出", "批量导出": "批量導出",
"读取记录": "刷新記錄", "读取记录": "刷新記錄",
"手机需联网": "NeedNet",
"设备": "設備", "设备": "設備",
"消息": "消息", "消息": "消息",
"智能分析": "智能分析", "智能分析": "智能分析",
@ -1110,5 +1108,16 @@
"常规使用": "經常使用", "常规使用": "經常使用",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "網關通電後,按住reset按鈕5秒鐘,當指示燈交替閃爍時單擊Next", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "網關通電後,按住reset按鈕5秒鐘,當指示燈交替閃爍時單擊Next",
"扫描设备": "掃描設備", "扫描设备": "掃描設備",
"删除失败,网关可能已经离线,是否强制删除该数据?": "刪除失敗。 網關可能已脫機。 是否要強制刪除數據?" "删除失败,网关可能已经离线,是否强制删除该数据?": "刪除失敗。 網關可能已脫機。 是否要強制刪除數據?",
"超级管理员英文": "超級管理員",
"授权管理员英文": "授權管理員",
"普通管理员英文": "普通用戶",
"网关设备英文": "網關設備",
"手机需联网英文": "手機需要聯網",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -314,7 +314,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Вся інформація вашого Облікового запису буде видалена з Платформи НАЗАВЖДИ і не може бути Recovered.Do ви хочете Видалити?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Вся інформація вашого Облікового запису буде видалена з Платформи НАЗАВЖДИ і не може бути Recovered.Do ви хочете Видалити?",
"监控": "Монітор", "监控": "Монітор",
"视频日志": "Відео журнал", "视频日志": "Відео журнал",
"网关设备": "Шлюз",
"开门器": "Відкривач дверей", "开门器": "Відкривач дверей",
"面容开锁": "Розблокування по обличчю", "面容开锁": "Розблокування по обличчю",
"开门方向设置": "Встановлено напрямок відкривання", "开门方向设置": "Встановлено напрямок відкривання",
@ -786,7 +785,6 @@
"导出": "Експорт", "导出": "Експорт",
"批量导出": "Пакетний експорт", "批量导出": "Пакетний експорт",
"读取记录": "Оновити записи", "读取记录": "Оновити записи",
"手机需联网": "Мережа NeedNet",
"设备": "Пристрій", "设备": "Пристрій",
"消息": "Повідомлення", "消息": "Повідомлення",
"智能分析": "Інтелектуальна аналітика", "智能分析": "Інтелектуальна аналітика",
@ -1110,5 +1108,15 @@
"常规使用": "Регулярне використання", "常规使用": "Регулярне використання",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Після ввімкнення шлюзу натисніть і утримуйте кнопку скидання протягом 5 секунд, а потім натисніть «Далі», коли індикатор почне блимати по черзі", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Після ввімкнення шлюзу натисніть і утримуйте кнопку скидання протягом 5 секунд, а потім натисніть «Далі», коли індикатор почне блимати по черзі",
"扫描设备": "Сканування пристрою", "扫描设备": "Сканування пристрою",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Видалення не вдалося. Можливо, шлюз перейшов в автономний режим. Ви хочете примусово видалити дані?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Видалення не вдалося. Можливо, шлюз перейшов в автономний режим. Ви хочете примусово видалити дані?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -313,7 +313,6 @@
"删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Tất cả thông tin tài khoản của bạn sẽ bị xóa vĩnh viễn khỏi nền tảng và không thể phục hồi. Bạn có muốn xóa?", "删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?": "Tất cả thông tin tài khoản của bạn sẽ bị xóa vĩnh viễn khỏi nền tảng và không thể phục hồi. Bạn có muốn xóa?",
"监控": "Màn hình", "监控": "Màn hình",
"视频日志": "Nhật ký video", "视频日志": "Nhật ký video",
"网关设备": "Cổng",
"开门器": "Dụng cụ mở cửa", "开门器": "Dụng cụ mở cửa",
"面容开锁": "Mở khóa mặt", "面容开锁": "Mở khóa mặt",
"开门方向设置": "Bộ hướng mở", "开门方向设置": "Bộ hướng mở",
@ -778,7 +777,6 @@
"导出": "Xuất khẩu", "导出": "Xuất khẩu",
"批量导出": "Hàng loạt xuất khẩu", "批量导出": "Hàng loạt xuất khẩu",
"读取记录": "Làm mới hồ sơ", "读取记录": "Làm mới hồ sơ",
"手机需联网": "Neednet",
"设备": "Thiết bị", "设备": "Thiết bị",
"消息": "Tin nhắn", "消息": "Tin nhắn",
"智能分析": "Phân Tích thông minh", "智能分析": "Phân Tích thông minh",
@ -1110,5 +1108,15 @@
"常规使用": "Sử dụng thường xuyên", "常规使用": "Sử dụng thường xuyên",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Sau khi cổng được bật, Nhấn và giữ nút đặt lại trong 5 giây và Nhấp vào tiếp theo khi đèn báo nhấp nháy luân phiên", "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Sau khi cổng được bật, Nhấn và giữ nút đặt lại trong 5 giây và Nhấp vào tiếp theo khi đèn báo nhấp nháy luân phiên",
"扫描设备": "Thiết bị quét", "扫描设备": "Thiết bị quét",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Xóa thất bại. Cổng có thể đã tắt. Bạn có muốn buộc xóa dữ liệu không?" "删除失败,网关可能已经离线,是否强制删除该数据?": "Xóa thất bại. Cổng có thể đã tắt. Bạn có muốn buộc xóa dữ liệu không?",
"超级管理员英文": "Super Admin",
"授权管理员英文": "Make admin",
"普通管理员英文": "Ordinary user",
"网关设备英文": "Gateway",
"手机需联网英文": "NeedNet",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -1112,5 +1112,15 @@
"中功率": "中功率", "中功率": "中功率",
"常规使用": "常规使用", "常规使用": "常规使用",
"扫描设备": "扫描设备", "扫描设备": "扫描设备",
"删除失败,网关可能已经离线,是否强制删除该数据?": "删除失败,网关可能已经离线,是否强制删除该数据?" "删除失败,网关可能已经离线,是否强制删除该数据?": "删除失败,网关可能已经离线,是否强制删除该数据?",
"超级管理员英文": "超级管理员",
"授权管理员英文": "授权管理员",
"普通管理员英文": "普通管理员",
"网关设备英文": "网关设备",
"手机需联网英文": "手机需联网",
"年简称": "Y",
"月简称": "M",
"日简称": "D",
"时简称": "H",
"分简称": "M"
} }

View File

@ -10,7 +10,6 @@ import 'package:star_lock/main/lockMian/lockMain/lockMain_logic.dart';
import 'package:star_lock/tools/appFirstEnterHandle.dart'; import 'package:star_lock/tools/appFirstEnterHandle.dart';
import 'package:star_lock/tools/app_manager.dart'; import 'package:star_lock/tools/app_manager.dart';
import 'package:star_lock/tools/bindings/app_binding.dart'; import 'package:star_lock/tools/bindings/app_binding.dart';
import 'package:star_lock/tools/change_language_format.dart';
import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/translations/app_dept.dart'; import 'package:star_lock/translations/app_dept.dart';
@ -21,6 +20,7 @@ import 'baseWidget.dart';
import 'tools/appRouteObserver.dart'; import 'tools/appRouteObserver.dart';
import 'tools/store_service.dart'; import 'tools/store_service.dart';
import 'translations/current_locale_tool.dart';
class MyApp extends StatefulWidget { class MyApp extends StatefulWidget {
MyApp({required this.isLogin, GlobalKey? key}) : super(key: key); MyApp({required this.isLogin, GlobalKey? key}) : super(key: key);
@ -62,36 +62,26 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
// localeResolutionCallback用于在启动时动态确定应该使用哪种语言和地区 // localeResolutionCallback用于在启动时动态确定应该使用哪种语言和地区
localeResolutionCallback: localeResolutionCallback:
(Locale? locale, Iterable<Locale> supportedLocales) { (Locale? locale, Iterable<Locale> supportedLocales) {
if (widget.isLogin) { AppLog.log(
// 'System device locale: ${Get.deviceLocale} locale$locale');
if (StoreService.to.getLanguageCode()!.isNotEmpty) { // if (widget.isLogin) {
locale = appDept.deptSupportedLocales //
.where((Locale element) => locale = CurrentLocaleTool.getCurrentLocale();
element.toString() == StoreService.to.getLanguageCode()) // } else {
.first; // //
} else { // locale = Get.deviceLocale;
// // }
locale = Get.deviceLocale; locale = CurrentLocaleTool.convertLocale(locale);
} AppLog.log('localeResolutionCallback locale: $locale');
} else { AppManager()
// .setLanCode(code: '${locale.languageCode}_${locale.countryCode}');
locale = Get.deviceLocale; return Locale(locale.languageCode, locale.countryCode);
}
locale = ChangeLanguageFormat.convertLocale(locale!);
return supportedLocales.contains(locale)
? locale
: supportedLocales.first;
}, },
// 使 // 使
locale: StoreService.to.getLanguageCode()!.isNotEmpty locale: CurrentLocaleTool.getCurrentLocale(),
? appDept.deptSupportedLocales
.where((Locale element) =>
element.toString() == StoreService.to.getLanguageCode())
.first
: Get.deviceLocale,
// locale: Get.deviceLocale, // locale: Get.deviceLocale,
// fallbackLocale用于指定在无法找到匹配的语言时使 // fallbackLocale用于指定在无法找到匹配的语言时使
fallbackLocale: Get.deviceLocale, fallbackLocale: const Locale('en', 'US'),
theme: ThemeData( theme: ThemeData(
scaffoldBackgroundColor: const Color(0xFFF6F6F6), scaffoldBackgroundColor: const Color(0xFFF6F6F6),
backgroundColor: const Color(0xFFF6F6F6), backgroundColor: const Color(0xFFF6F6F6),

View File

@ -21,6 +21,7 @@ import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_main_page.dart';
import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart'; import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart';
import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_page.dart'; import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_page.dart';
import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_page.dart'; import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_page.dart';
import 'package:star_lock/main/lockDetail/lockSet/double_lock_link/double_lock_link_page.dart';
import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_page.dart'; import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_page.dart';
import 'package:star_lock/main/lockDetail/lockSet/liveVideo/liveVideo_page.dart'; import 'package:star_lock/main/lockDetail/lockSet/liveVideo/liveVideo_page.dart';
import 'package:star_lock/main/lockDetail/lockSet/motorPower/motorPower_page.dart'; import 'package:star_lock/main/lockDetail/lockSet/motorPower/motorPower_page.dart';
@ -35,6 +36,7 @@ import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotific
import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/nDaysUnopened/nDaysUnopened_page.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/nDaysUnopened/nDaysUnopened_page.dart';
import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_page.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/openDoorNotify/openDoorNotify_page.dart';
import 'package:star_lock/main/lockDetail/messageWarn/notificationMode/notificationMode_page.dart'; import 'package:star_lock/main/lockDetail/messageWarn/notificationMode/notificationMode_page.dart';
import 'package:star_lock/main/lockDetail/monitoring/star_chart_h264/star_chart_page.dart';
import 'package:star_lock/main/lockDetail/palm/addPalm/addPalm_page.dart'; import 'package:star_lock/main/lockDetail/palm/addPalm/addPalm_page.dart';
import 'package:star_lock/main/lockDetail/palm/palmList/palmList_page.dart'; import 'package:star_lock/main/lockDetail/palm/palmList/palmList_page.dart';
import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_page.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_page.dart';
@ -42,6 +44,7 @@ import 'package:star_lock/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart';
import 'package:star_lock/mine/about/webviewShow_page.dart'; import 'package:star_lock/mine/about/webviewShow_page.dart';
import 'package:star_lock/mine/mine/safeVerify/safeVerify_page.dart'; import 'package:star_lock/mine/mine/safeVerify/safeVerify_page.dart';
import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart';
import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart';
import 'package:star_lock/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_page.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_page.dart';
import 'package:star_lock/mine/mineSet/amazon_alexa/amazon_alexa_page.dart'; import 'package:star_lock/mine/mineSet/amazon_alexa/amazon_alexa_page.dart';
import 'package:star_lock/mine/mineSet/authorizedAdministrator/administratorAssociationLock/administratorAssociationLock_page.dart'; import 'package:star_lock/mine/mineSet/authorizedAdministrator/administratorAssociationLock/administratorAssociationLock_page.dart';
@ -509,6 +512,8 @@ abstract class Routers {
static const String login = '/login'; // static const String login = '/login'; //
static const String amazonAlexaPage = '/amazonAlexaPage'; //AmazonAlexa static const String amazonAlexaPage = '/amazonAlexaPage'; //AmazonAlexa
static const String googleHomePage = '/googleHomePage'; //GoogleHome static const String googleHomePage = '/googleHomePage'; //GoogleHome
static const String doubleLockLinkPage = '/doubleLockLinkPage'; //
static const String starChartPage = '/starChartPage'; //
} }
abstract class AppRouters { abstract class AppRouters {
@ -1183,5 +1188,10 @@ abstract class AppRouters {
GetPage<dynamic>( GetPage<dynamic>(
name: Routers.gatewayGetWifiListPage, name: Routers.gatewayGetWifiListPage,
page: () => const GatewayGetWifiListPage()), page: () => const GatewayGetWifiListPage()),
GetPage<dynamic>(
name: Routers.doubleLockLinkPage,
page: () => const DoubleLockLinkPage()),
GetPage<dynamic>(
name: Routers.starChartPage, page: () => const StarChartPage()),
]; ];
} }

View File

@ -17,6 +17,7 @@ class SenderConfiguringWifiCommand extends SenderProtocol {
this.userID, this.userID,
this.ssid, this.ssid,
this.password, this.password,
this.peerId,
this.numberOfServers, this.numberOfServers,
this.listOfServers, this.listOfServers,
this.numberOfPhone, this.numberOfPhone,
@ -31,6 +32,7 @@ class SenderConfiguringWifiCommand extends SenderProtocol {
String? userID; String? userID;
String? ssid; String? ssid;
String? password; String? password;
String? peerId;
int? numberOfServers; int? numberOfServers;
List<int>? listOfServers; List<int>? listOfServers;
int? numberOfPhone; int? numberOfPhone;
@ -44,7 +46,7 @@ class SenderConfiguringWifiCommand extends SenderProtocol {
@override @override
String toString() { String toString() {
return 'SenderConfiguringWifiCommand{keyID: $keyID, userID: $userID, ' return 'SenderConfiguringWifiCommand{keyID: $keyID, userID: $userID, '
'ssid: $ssid, password: $password, numberOfServers: $numberOfServers, ' 'ssid: $ssid, password: $password,peerId: $peerId, numberOfServers: $numberOfServers, '
'listOfServers: $listOfServers, numberOfPhone: $numberOfPhone, ' 'listOfServers: $listOfServers, numberOfPhone: $numberOfPhone, '
'listOfPhone: $listOfPhone, token: $token, needAuthor: $needAuthor, ' 'listOfPhone: $listOfPhone, token: $token, needAuthor: $needAuthor, '
'publicKey: $publicKey, privateKey: $privateKey}'; 'publicKey: $publicKey, privateKey: $privateKey}';
@ -87,6 +89,11 @@ class SenderConfiguringWifiCommand extends SenderProtocol {
subData.addAll(utf8.encode(password!)); subData.addAll(utf8.encode(password!));
subData = getFixedLengthList(subData, 20 - passwordLength); subData = getFixedLengthList(subData, 20 - passwordLength);
//peerId 44
final int peerIdLength = utf8.encode(peerId!).length;
subData.addAll(utf8.encode(peerId!));
subData = getFixedLengthList(subData, 44 - peerIdLength);
// NumberOfServers // NumberOfServers
subData.add(numberOfServers!); subData.add(numberOfServers!);

View File

@ -854,6 +854,7 @@ class IoSenderManage {
required String? userID, required String? userID,
required String? ssid, required String? ssid,
required String? password, required String? password,
required String? peerId,
required int? numberOfServers, required int? numberOfServers,
required List<int>? listOfServers, required List<int>? listOfServers,
required int? numberOfPhone, required int? numberOfPhone,
@ -869,6 +870,7 @@ class IoSenderManage {
userID: userID, userID: userID,
ssid: ssid, ssid: ssid,
password: password, password: password,
peerId: peerId,
numberOfServers: numberOfServers, numberOfServers: numberOfServers,
listOfServers: listOfServers, listOfServers: listOfServers,
numberOfPhone: numberOfPhone, numberOfPhone: numberOfPhone,

View File

@ -61,12 +61,14 @@ class StarLockLoginLogic extends BaseGetXController {
Storage.saveLoginData(entity.data); Storage.saveLoginData(entity.data);
Storage.setBool(saveIsVip, entity.data!.isVip == 1); Storage.setBool(saveIsVip, entity.data!.isVip == 1);
// //
final Starchart starChart = entity.data!.starchart!; if (entity.data!.starchart != null) {
await Storage.saveStarChartRegisterNodeInfo(StarChartRegisterNodeEntity( final Starchart starChart = entity.data!.starchart!;
peer: PeerData( Storage.saveStarChartRegisterNodeInfo(StarChartRegisterNodeEntity(
id: starChart.starchartId, peer: PeerData(
publicKey: starChart.starchartPeerPublicKey, id: starChart.starchartId,
privateKey: starChart.starchartPeerPrivateKey))); publicKey: starChart.starchartPeerPublicKey,
privateKey: starChart.starchartPeerPrivateKey)));
}
eventBus.fire(MineInfoChangeRefreshUI()); eventBus.fire(MineInfoChangeRefreshUI());
if (Get.isRegistered<LockMainLogic>()) { if (Get.isRegistered<LockMainLogic>()) {
Get.find<LockMainLogic>().getStarLockInfo(isUnShowLoading: true); Get.find<LockMainLogic>().getStarLockInfo(isUnShowLoading: true);

View File

@ -7,8 +7,8 @@ import 'package:star_lock/login/login/starLock_login_state.dart';
import 'package:star_lock/talk/startChart/handle/impl/udp_talk_ping_handler.dart'; import 'package:star_lock/talk/startChart/handle/impl/udp_talk_ping_handler.dart';
import 'package:star_lock/talk/startChart/start_chart_manage.dart'; import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/tools/appFirstEnterHandle.dart'; import 'package:star_lock/tools/appFirstEnterHandle.dart';
import 'package:star_lock/tools/wechat/customer_tool.dart';
import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/tools/wechat/customer_tool.dart';
import '../../appRouters.dart'; import '../../appRouters.dart';
import '../../app_settings/app_colors.dart'; import '../../app_settings/app_colors.dart';
@ -50,14 +50,16 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
haveBack: false, haveBack: false,
backgroundColor: AppColors.mainColor, backgroundColor: AppColors.mainColor,
actionsList: <Widget>[ actionsList: <Widget>[
IconButton( if (state.isChina == true)
onPressed: () { IconButton(
WechatManageTool.getAppInfo(CustomerTool.openCustomerService); onPressed: () {
}, WechatManageTool.getAppInfo(
icon: const Icon( CustomerTool.openCustomerService);
Icons.support_agent, },
color: Colors.white, icon: const Icon(
)), Icons.support_agent,
color: Colors.white,
)),
TextButton( TextButton(
child: Text( child: Text(
'注册'.tr, '注册'.tr,

View File

@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../translations/current_locale_tool.dart';
class StarLockLoginState { class StarLockLoginState {
StarLockLoginState() { StarLockLoginState() {
// emailOrPhone.value = StoreService.to.getLastUserAccount() as String; // emailOrPhone.value = StoreService.to.getLastUserAccount() as String;
@ -15,6 +17,16 @@ class StarLockLoginState {
/// ///
String get countryName => countryKey.value.tr; String get countryName => countryKey.value.tr;
///
bool get isChina {
if (CurrentLocaleTool.convertLocale(Get.deviceLocale!) ==
const Locale('zh', 'CN')) {
return true;
} else {
return false;
}
}
RxString emailOrPhone = ''.obs; RxString emailOrPhone = ''.obs;
RxString pwd = ''.obs; RxString pwd = ''.obs;
RxBool canNext = false.obs; RxBool canNext = false.obs;

View File

@ -5,8 +5,8 @@ import 'package:get/get.dart';
import 'package:star_lock/flavors.dart'; import 'package:star_lock/flavors.dart';
import 'package:star_lock/login/login/starLock_login_state.dart'; import 'package:star_lock/login/login/starLock_login_state.dart';
import 'package:star_lock/tools/appFirstEnterHandle.dart'; import 'package:star_lock/tools/appFirstEnterHandle.dart';
import 'package:star_lock/tools/wechat/customer_tool.dart';
import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/tools/wechat/customer_tool.dart';
import '../../appRouters.dart'; import '../../appRouters.dart';
import '../../app_settings/app_colors.dart'; import '../../app_settings/app_colors.dart';
@ -63,15 +63,16 @@ class _StarLockLoginPageState extends State<StarLockLoginXHJPage> {
), ),
), ),
), ),
IconButton( if (state.isChina == true)
onPressed: () { IconButton(
WechatManageTool.getAppInfo( onPressed: () {
CustomerTool.openCustomerService); WechatManageTool.getAppInfo(
}, CustomerTool.openCustomerService);
icon: Icon( },
Icons.support_agent, icon: Icon(
color: AppColors.mainColor, Icons.support_agent,
)), color: AppColors.mainColor,
)),
], ],
), ),
SizedBox(height: 30.h), SizedBox(height: 30.h),

View File

@ -10,6 +10,7 @@ import 'package:star_lock/tools/baseGetXController.dart';
import '../../app_settings/app_colors.dart'; import '../../app_settings/app_colors.dart';
import '../../tools/keySearchWidget.dart'; import '../../tools/keySearchWidget.dart';
import '../../tools/titleAppBar.dart'; import '../../tools/titleAppBar.dart';
import '../../translations/current_locale_tool.dart';
import 'common/index.dart'; import 'common/index.dart';
class SelectCountryRegionPage extends StatefulWidget { class SelectCountryRegionPage extends StatefulWidget {
@ -24,11 +25,14 @@ class _SelectCountryRegionPageState extends State<SelectCountryRegionPage> {
List<CountryRegionModel> countriesList = <CountryRegionModel>[]; List<CountryRegionModel> countriesList = <CountryRegionModel>[];
List<CountryRegionModel> topCountriesList = <CountryRegionModel>[]; List<CountryRegionModel> topCountriesList = <CountryRegionModel>[];
TextEditingController searchController = TextEditingController(); TextEditingController searchController = TextEditingController();
String currentLanguage = '';
@override @override
void initState() { void initState() {
super.initState(); super.initState();
currentLanguage = CurrentLocaleTool.getCurrentLocaleString();
SuspensionUtil.setShowSuspensionStatus( SuspensionUtil.setShowSuspensionStatus(
countriesList.cast<ISuspensionBean>()); countriesList.cast<ISuspensionBean>());
Future.delayed(const Duration(milliseconds: 20), getCountriesListRequest); Future.delayed(const Duration(milliseconds: 20), getCountriesListRequest);
@ -154,7 +158,9 @@ class _SelectCountryRegionPageState extends State<SelectCountryRegionPage> {
final String tag = model.getSuspensionTag(); final String tag = model.getSuspensionTag();
return Utils.getSusItem(context, tag); return Utils.getSusItem(context, tag);
}, },
indexBarData: const <String>['', ...kIndexBarData], indexBarData: currentLanguage == 'zh_CN'
? const <String>['', ...kIndexBarData]
: [],
), ),
), ),
], ],

View File

@ -12,6 +12,7 @@ import 'package:star_lock/mine/about/debug/debug_tool.dart';
import 'package:star_lock/network/api_provider.dart'; import 'package:star_lock/network/api_provider.dart';
import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/network/start_chart_api.dart'; import 'package:star_lock/network/start_chart_api.dart';
import 'package:star_lock/talk/startChart/appLifecycle_observer.dart';
import 'package:star_lock/tools/bugly/bugly_tool.dart'; import 'package:star_lock/tools/bugly/bugly_tool.dart';
import 'package:star_lock/tools/device_info_service.dart'; import 'package:star_lock/tools/device_info_service.dart';
import 'package:star_lock/tools/platform_info_services.dart'; import 'package:star_lock/tools/platform_info_services.dart';
@ -29,6 +30,10 @@ FutureOr<void> main() async {
FlutterBugly.postCatchedException(() async { FlutterBugly.postCatchedException(() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
// AppLifecycleObserver()
AppLifecycleObserver appLifecycleObserver = AppLifecycleObserver();
WidgetsBinding.instance.addObserver(appLifecycleObserver);
await _setCommonServices(); await _setCommonServices();
// //
@ -76,7 +81,8 @@ Future<void> _setCommonServices() async {
// //
Future<void> privacySDKInitialization() async { Future<void> privacySDKInitialization() async {
UmengCommonSdk.initCommon('671244cf80464b33f6df9648', '671244ae80464b33f6df9646', 'Product'); UmengCommonSdk.initCommon(
'671244cf80464b33f6df9648', '671244ae80464b33f6df9646', 'Product');
UmengCommonSdk.setPageCollectionModeManual(); UmengCommonSdk.setPageCollectionModeManual();
await Get.putAsync(() => PlatformInfoService().init()); await Get.putAsync(() => PlatformInfoService().init());
@ -85,27 +91,3 @@ Future<void> privacySDKInitialization() async {
final XSJPushProvider jpushProvider = XSJPushProvider(); final XSJPushProvider jpushProvider = XSJPushProvider();
await jpushProvider.initJPushService(); await jpushProvider.initJPushService();
} }
void checkChinese() {
//
final String scriptDir = path.dirname(Platform.script.path);
// .dart
findChineseCharacters(Directory(scriptDir));
}
void findChineseCharacters(Directory directory) {
final List<FileSystemEntity> files = directory.listSync(recursive: true);
for (FileSystemEntity file in files) {
if (file is File && file.path.endsWith('.dart')) {
final String content = file.readAsStringSync(encoding: utf8);
if (hasChineseCharacters(content)) {
print('Found Chinese characters in ${file.path}');
}
}
}
}
bool hasChineseCharacters(String input) {
return RegExp(r'[\u4e00-\u9fa5]').hasMatch(input);
}

View File

@ -1,8 +1,6 @@
import 'package:expandable/expandable.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart'; import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -109,12 +107,13 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
Widget keyInfoWidget() { Widget keyInfoWidget() {
return Column( return Column(
children: <Widget>[ children: <Widget>[
CommonItem( // CommonItem(
leftTitel: '接收者'.tr, // leftTitel: '接收者'.tr,
rightTitle: '', // rightTitle: '',
isHaveLine: true, // isHaveLine: true,
isHaveRightWidget: true, // isHaveRightWidget: true,
rightWidget: getTFWidget(true, '请输入手机号或者邮箱'.tr, 1)), // rightWidget: getTFWidget(true, '请输入手机号或者邮箱'.tr, 1)),
perpetualKeyWidget('接收者'.tr, '请输入手机号或者邮箱'.tr),
CommonItem( CommonItem(
leftTitel: '国家/地区'.tr, leftTitel: '国家/地区'.tr,
rightTitle: '', rightTitle: '',
@ -192,6 +191,88 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
); );
} }
Widget perpetualKeyWidget(String titleStr, String rightTitle) {
return Column(
children: <Widget>[
Container(
height: 65.h,
padding: EdgeInsets.only(left: 20.w, right: 20.w),
color: Colors.white,
child: Row(
children: <Widget>[
Text(titleStr, style: TextStyle(fontSize: 22.sp)),
SizedBox(width: 6.w),
Expanded(
child: TextField(
controller: logic.getCurrentController(1),
//
maxLines: 1,
inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.deny('\n'),
LengthLimitingTextInputFormatter(30),
],
// controller: _controller,
autofocus: false,
textAlign: TextAlign.end,
decoration: InputDecoration(
//
hintText: rightTitle,
hintStyle: TextStyle(fontSize: 22.sp),
focusedBorder: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
disabledBorder: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
enabledBorder: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
border: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
contentPadding: const EdgeInsets.symmetric(vertical: 0),
),
style: TextStyle(
fontSize: 22.sp, textBaseline: TextBaseline.alphabetic),
),
),
SizedBox(
width: 10.w,
),
Container(
width: 32.w,
height: 32.w,
decoration: const BoxDecoration(
color: Colors.white,
image: DecorationImage(
image: AssetImage('images/icon_addressBook.png'),
fit: BoxFit.fill),
),
alignment: Alignment.center,
child: InkWell(
onTap: () async {
final Contact? currentContact =
await logic.state.contactPicker.selectContact();
logic.state.contact = currentContact!;
if (currentContact.phoneNumbers!.isNotEmpty) {
logic.state.emailOrPhoneController.text = currentContact
.phoneNumbers![0]
.replaceAll(RegExp(r'\s+\b|\b\s'), '');
}
if (currentContact.fullName!.isNotEmpty) {
logic.state.keyNameController.text =
currentContact.fullName!;
}
},
),
)
],
),
)
],
);
}
// //
Widget keyOnlyManageWidget() { Widget keyOnlyManageWidget() {
return Column( return Column(

View File

@ -244,8 +244,6 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
children: <Widget>[ children: <Widget>[
Flexible( Flexible(
child: Text(showTime, child: Text(showTime,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
fontSize: 18.sp, fontSize: 18.sp,
color: AppColors.placeholderTextColor)), color: AppColors.placeholderTextColor)),

View File

@ -1,4 +1,3 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@ -22,7 +21,6 @@ import 'package:star_lock/tools/showTipView.dart';
import 'package:star_lock/tools/submitBtn.dart'; import 'package:star_lock/tools/submitBtn.dart';
class SendElectronicKeyView extends StatefulWidget { class SendElectronicKeyView extends StatefulWidget {
SendElectronicKeyView({required this.type, Key? key}) : super(key: key); SendElectronicKeyView({required this.type, Key? key}) : super(key: key);
String type; String type;
@ -105,16 +103,17 @@ class _SendElectronicKeyViewState extends State<SendElectronicKeyView>
return Column( return Column(
children: <Widget>[ children: <Widget>[
// Container(height: 10.h), // Container(height: 10.h),
CommonItem( // CommonItem(
leftTitel: '接收者'.tr, // leftTitel: '接收者'.tr,
rightTitle: '', // rightTitle: '',
isHaveLine: true, // isHaveLine: true,
isHaveRightWidget: true, // isHaveRightWidget: true,
rightWidget: getTFWidget( // rightWidget: getTFWidget(
true, // true,
'请输入手机号或者邮箱'.tr, // '请输入手机号或者邮箱'.tr,
1, // 1,
logic)), // logic)),
perpetualKeyWidget(logic, '接收者'.tr, '请输入手机号或者邮箱'.tr),
CommonItem( CommonItem(
leftTitel: '国家/地区'.tr, leftTitel: '国家/地区'.tr,
rightTitle: '', rightTitle: '',
@ -142,14 +141,95 @@ class _SendElectronicKeyViewState extends State<SendElectronicKeyView>
leftTitel: '姓名'.tr, leftTitel: '姓名'.tr,
rightTitle: '', rightTitle: '',
isHaveRightWidget: true, isHaveRightWidget: true,
rightWidget: getTFWidget( rightWidget: getTFWidget(false, '请输入'.tr, 2, logic, maxSize: 50)),
false, '请输入'.tr, 2, logic,
maxSize: 50)),
Container(height: 10.h), Container(height: 10.h),
], ],
); );
} }
Widget perpetualKeyWidget(
SendElectronicKeyViewLogic logic, String titleStr, String rightTitle) {
return Column(
children: <Widget>[
Container(
height: 65.h,
padding: EdgeInsets.only(left: 20.w, right: 20.w),
color: Colors.white,
child: Row(
children: <Widget>[
Text(titleStr, style: TextStyle(fontSize: 22.sp)),
SizedBox(width: 6.w),
Expanded(
child: TextField(
controller: logic.getCurrentController(1),
//
maxLines: 1,
inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.deny('\n'),
LengthLimitingTextInputFormatter(30),
],
// controller: _controller,
autofocus: false,
textAlign: TextAlign.end,
decoration: InputDecoration(
//
hintText: rightTitle,
hintStyle: TextStyle(fontSize: 22.sp),
focusedBorder: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
disabledBorder: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
enabledBorder: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
border: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
contentPadding: const EdgeInsets.symmetric(vertical: 0),
),
style: TextStyle(
fontSize: 22.sp, textBaseline: TextBaseline.alphabetic),
),
),
SizedBox(
width: 10.w,
),
Container(
width: 32.w,
height: 32.w,
decoration: const BoxDecoration(
color: Colors.white,
image: DecorationImage(
image: AssetImage('images/icon_addressBook.png'),
fit: BoxFit.fill),
),
alignment: Alignment.center,
child: InkWell(
onTap: () async {
final Contact? currentContact =
await logic.state.contactPicker.selectContact();
logic.state.contact = currentContact!;
if (currentContact.phoneNumbers!.isNotEmpty) {
logic.state.emailOrPhoneController.text = currentContact
.phoneNumbers![0]
.replaceAll(RegExp(r'\s+\b|\b\s'), '');
}
if (currentContact.fullName!.isNotEmpty) {
logic.state.keyNameController.text =
currentContact.fullName!;
}
},
),
)
],
),
)
],
);
}
// //
Widget keyTimeWidget(SendElectronicKeyViewLogic logic) { Widget keyTimeWidget(SendElectronicKeyViewLogic logic) {
return Column( return Column(
@ -163,7 +243,8 @@ class _SendElectronicKeyViewState extends State<SendElectronicKeyView>
final PDuration selectDate = PDuration.parse( final PDuration selectDate = PDuration.parse(
DateTime.parse(logic.state.timeLimitBeginTime)); DateTime.parse(logic.state.timeLimitBeginTime));
Pickers.showDatePicker(context, Pickers.showDatePicker(context,
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { selectDate: selectDate,
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
logic.state.timeLimitBeginTime = logic.state.timeLimitBeginTime =
DateTool().getYMDHNDateString(p, 1); DateTool().getYMDHNDateString(p, 1);
logic.update(); logic.update();
@ -177,7 +258,8 @@ class _SendElectronicKeyViewState extends State<SendElectronicKeyView>
final PDuration selectDate = PDuration.parse( final PDuration selectDate = PDuration.parse(
DateTime.tryParse(logic.state.timeLimitEndTime)); DateTime.tryParse(logic.state.timeLimitEndTime));
Pickers.showDatePicker(context, Pickers.showDatePicker(context,
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { selectDate: selectDate,
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
logic.state.timeLimitEndTime = logic.state.timeLimitEndTime =
DateTool().getYMDHNDateString(p, 1); DateTool().getYMDHNDateString(p, 1);
logic.update(); logic.update();
@ -237,14 +319,14 @@ class _SendElectronicKeyViewState extends State<SendElectronicKeyView>
isHaveDirection: true, isHaveDirection: true,
isHaveLine: true, isHaveLine: true,
action: () async { action: () async {
final result = final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{ arguments: <String, Object>{
'validityValue': logic.state.weekdaysList, 'validityValue': logic.state.weekdaysList,
'starDate': logic.state.cycleBeginTime, 'starDate': logic.state.cycleBeginTime,
'endDate': logic.state.cycleEndTime, 'endDate': logic.state.cycleEndTime,
'starTime': logic.state.effectiveDateTime, 'starTime': logic.state.effectiveDateTime,
'endTime': logic.state.failureDateTime 'endTime': logic.state.failureDateTime
}); });
if (result != null && result.isNotEmpty) { if (result != null && result.isNotEmpty) {
logic.state.weekdaysList = result['validityValue']; logic.state.weekdaysList = result['validityValue'];
logic.state.cycleBeginTime = result['starDate']; logic.state.cycleBeginTime = result['starDate'];
@ -418,7 +500,8 @@ class _SendElectronicKeyViewState extends State<SendElectronicKeyView>
), ),
if (logic.emailOrPhone != null) if (logic.emailOrPhone != null)
OutLineBtn( OutLineBtn(
btnName: logic.state.userNameType.value == 1 ? '短信通知'.tr : '邮件通知'.tr, btnName:
logic.state.userNameType.value == 1 ? '短信通知'.tr : '邮件通知'.tr,
onClick: () { onClick: () {
Get.toNamed(Routers.sendEmailNotificationPage, Get.toNamed(Routers.sendEmailNotificationPage,
arguments: <String, Object?>{ arguments: <String, Object?>{

View File

@ -251,8 +251,6 @@ class _FingerprintListPageState extends State<FingerprintListPage>
children: <Widget>[ children: <Widget>[
Flexible( Flexible(
child: Text(showTime, child: Text(showTime,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
fontSize: 18.sp, fontSize: 18.sp,
color: AppColors.placeholderTextColor)), color: AppColors.placeholderTextColor)),

View File

@ -109,9 +109,23 @@ class _LockDetailPageState extends State<LockDetailPage>
SingleChildScrollView( SingleChildScrollView(
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
SizedBox( Visibility(
height: isShowTip ? 70.h : 10.h, visible: isShowTip,
child: Container(
// height: 30.h,
width: 1.sw,
color: const Color(0xFFFBEFD4),
padding: EdgeInsets.only(top: 8.h, bottom: 8.h),
child: Text(
"${"钥匙将在".tr}${DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!)}${"天后失效".tr}",
maxLines: 2,
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center,
style: TextStyle(
color: const Color(0xffCBA74B), fontSize: 24.sp)),
),
), ),
SizedBox(height: 10.h),
Padding( Padding(
padding: EdgeInsets.symmetric(horizontal: 24.w), padding: EdgeInsets.symmetric(horizontal: 24.w),
child: Text( child: Text(
@ -152,23 +166,6 @@ class _LockDetailPageState extends State<LockDetailPage>
], ],
), ),
), ),
Visibility(
visible: isShowTip,
child: Container(
// height: 30.h,
color: const Color(0xFFFBEFD4),
padding: EdgeInsets.only(top: 8.h, bottom: 8.h),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
"${"钥匙将在".tr}${DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!)}${"天后失效".tr}",
style: TextStyle(
color: const Color(0xffCBA74B), fontSize: 24.sp))
],
),
),
),
Visibility( Visibility(
visible: state.iSClosedUnlockSuccessfulPopup.value, visible: state.iSClosedUnlockSuccessfulPopup.value,
// visible: true, // visible: true,
@ -508,17 +505,17 @@ class _LockDetailPageState extends State<LockDetailPage>
, ,
child: Container( child: Container(
// height: 30.h, // height: 30.h,
width: 1.sw,
color: const Color(0xFFFBEFD4), color: const Color(0xFFFBEFD4),
padding: EdgeInsets.only(top: 8.h, bottom: 8.h), padding:
child: Row( EdgeInsets.only(top: 8.h, bottom: 8.h, right: 10.w, left: 10.h),
mainAxisAlignment: MainAxisAlignment.center, child: Text(
children: <Widget>[ "${"钥匙将在".tr}${DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!)}${"天后失效".tr}",
Text( maxLines: 2,
"${"钥匙将在".tr}${DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!)}${"天后失效".tr}", overflow: TextOverflow.ellipsis,
style: TextStyle( textAlign: TextAlign.center,
color: const Color(0xffCBA74B), fontSize: 24.sp)) style:
], TextStyle(color: const Color(0xffCBA74B), fontSize: 24.sp)),
),
), ),
), ),
Stack(children: <Widget>[ Stack(children: <Widget>[
@ -808,10 +805,10 @@ class _LockDetailPageState extends State<LockDetailPage>
SizedBox(width: 6.w), SizedBox(width: 6.w),
Text( Text(
state.keyInfos.value.isLockOwner == 1 state.keyInfos.value.isLockOwner == 1
? '超级管理员'.tr ? '超级管理员英文'.tr
: (state.keyInfos.value.keyRight == 1 : (state.keyInfos.value.keyRight == 1
? '授权管理员'.tr ? '授权管理员英文'.tr
: '普通用户'.tr), : '普通用户英文'.tr),
style: TextStyle( style: TextStyle(
fontSize: 20.sp, color: AppColors.darkGrayTextColor), fontSize: 20.sp, color: AppColors.darkGrayTextColor),
), ),
@ -832,7 +829,7 @@ class _LockDetailPageState extends State<LockDetailPage>
), ),
SizedBox(width: 6.w), SizedBox(width: 6.w),
Text( Text(
'网关设备'.tr, '网关设备英文'.tr,
style: TextStyle( style: TextStyle(
fontSize: 20.sp, fontSize: 20.sp,
color: state.keyInfos.value.hasGateway == 1 color: state.keyInfos.value.hasGateway == 1
@ -855,7 +852,7 @@ class _LockDetailPageState extends State<LockDetailPage>
), ),
SizedBox(width: 6.w), SizedBox(width: 6.w),
Text( Text(
'手机需联网'.tr, '手机需联网英文'.tr,
style: TextStyle( style: TextStyle(
fontSize: 20.sp, fontSize: 20.sp,
color: state.isOpenLockNeedOnline.value == 1 color: state.isOpenLockNeedOnline.value == 1

View File

@ -1,4 +1,3 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
@ -8,6 +7,7 @@ import 'package:network_info_plus/network_info_plus.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifiEntity.dart'; import 'package:star_lock/main/lockDetail/lockSet/configuringWifi/configuringWifi/configuringWifiEntity.dart';
import 'package:star_lock/talk/startChart/entity/star_chart_register_node_entity.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import '../../../../../blue/blue_manage.dart'; import '../../../../../blue/blue_manage.dart';
@ -21,24 +21,26 @@ import '../../../../../tools/eventBusEventManage.dart';
import '../../../../../tools/storage.dart'; import '../../../../../tools/storage.dart';
import 'configuringWifi_state.dart'; import 'configuringWifi_state.dart';
class ConfiguringWifiLogic extends BaseGetXController{ class ConfiguringWifiLogic extends BaseGetXController {
final ConfiguringWifiState state = ConfiguringWifiState(); final ConfiguringWifiState state = ConfiguringWifiState();
Future<void> getWifiLockServiceIpAndPort() async { Future<void> getWifiLockServiceIpAndPort() async {
final ConfiguringWifiEntity entity = await ApiRepository.to.getWifiLockServiceIpAndPort(); final ConfiguringWifiEntity entity =
if(entity.errorCode! == 0){ await ApiRepository.to.getWifiLockServiceIpAndPort();
if (entity.errorCode! == 0) {
state.configuringWifiEntity.value = entity; state.configuringWifiEntity.value = entity;
} }
} }
Future<void> updateNetworkInfo() async{ Future<void> updateNetworkInfo() async {
final LoginEntity entity = await ApiRepository.to.updateNetworkInfo( final LoginEntity entity = await ApiRepository.to.updateNetworkInfo(
lockId: state.lockSetInfoData.value.lockId!, lockId: state.lockSetInfoData.value.lockId!,
network:state.wifiNameController.text, network: state.wifiNameController.text,
); );
if(entity.errorCode!.codeIsSuccessful){ if (entity.errorCode!.codeIsSuccessful) {
showToast('配网成功'.tr, something:(){ showToast('配网成功'.tr, something: () {
eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); eventBus
.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
Get.close(2); Get.close(2);
}); });
} }
@ -46,10 +48,12 @@ class ConfiguringWifiLogic extends BaseGetXController{
// //
late StreamSubscription<Reply> _replySubscription; late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() { void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async { _replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
// WIFI配网结果 // WIFI配网结果
if(reply is SenderConfiguringWifiReply) { if (reply is SenderConfiguringWifiReply) {
_replySenderConfiguringWifi(reply); _replySenderConfiguringWifi(reply);
} }
}); });
@ -59,7 +63,7 @@ class ConfiguringWifiLogic extends BaseGetXController{
Future<void> _replySenderConfiguringWifi(Reply reply) async { Future<void> _replySenderConfiguringWifi(Reply reply) async {
final int status = reply.data[5]; final int status = reply.data[5];
switch(status){ switch (status) {
case 0x00: case 0x00:
// //
state.sureBtnState.value = 0; state.sureBtnState.value = 0;
@ -69,19 +73,26 @@ class ConfiguringWifiLogic extends BaseGetXController{
break; break;
case 0x06: case 0x06:
// //
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey); final List<String>? privateKey =
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!); await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? publicKey = await Storage.getStringList(saveBluePublicKey); final List<String>? publicKey =
final List<int> publicKeyDataList = changeStringListToIntList(publicKey!); await Storage.getStringList(saveBluePublicKey);
final List<int> publicKeyDataList =
changeStringListToIntList(publicKey!);
final List<int> tokenData = reply.data.sublist(7, 10); final List<int> tokenData = reply.data.sublist(7, 10);
final List<String> saveStrList = changeIntListToStringList(tokenData); final List<String> saveStrList = changeIntListToStringList(tokenData);
Storage.setStringList(saveBlueToken, saveStrList); Storage.setStringList(saveBlueToken, saveStrList);
final List<int> serversList = <int>[]; final List<int> serversList = <int>[];
for(int i = 0; i<state.configuringWifiEntity.value.data!.serviceList!.length; i++){ for (int i = 0;
final ServiceList item = state.configuringWifiEntity.value.data!.serviceList![i]; i < state.configuringWifiEntity.value.data!.serviceList!.length;
i++) {
final ServiceList item =
state.configuringWifiEntity.value.data!.serviceList![i];
final List<String> itemList = item.serviceIp!.split('.'); final List<String> itemList = item.serviceIp!.split('.');
for (String element in itemList) { for (String element in itemList) {
serversList.add(int.parse(element)); serversList.add(int.parse(element));
@ -94,6 +105,11 @@ class ConfiguringWifiLogic extends BaseGetXController{
serversList.add(type2); serversList.add(type2);
} }
final StarChartRegisterNodeEntity? registerNodeEntity =
await Storage.getStarChartRegisterNodeInfo();
// app用户的peerId
String appPeerId = registerNodeEntity?.peer?.id ?? '';
final List<String> uidList = <String>[Storage.getUid().toString()]; final List<String> uidList = <String>[Storage.getUid().toString()];
IoSenderManage.senderConfiguringWifiCommand( IoSenderManage.senderConfiguringWifiCommand(
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
@ -108,6 +124,7 @@ class ConfiguringWifiLogic extends BaseGetXController{
needAuthor: 1, needAuthor: 1,
publicKey: publicKeyDataList, publicKey: publicKeyDataList,
privateKey: getPrivateKeyList, privateKey: getPrivateKeyList,
peerId: appPeerId,
); );
break; break;
@ -123,42 +140,51 @@ class ConfiguringWifiLogic extends BaseGetXController{
// wifi // wifi
Future<void> senderConfiguringWifiAction() async { Future<void> senderConfiguringWifiAction() async {
if(state.wifiNameController.text.isEmpty){ if (state.wifiNameController.text.isEmpty) {
showToast('请输入wifi名称'.tr); showToast('请输入wifi名称'.tr);
return; return;
} }
if(state.sureBtnState.value == 1){ if (state.sureBtnState.value == 1) {
return; return;
} }
state.sureBtnState.value = 1; state.sureBtnState.value = 1;
showEasyLoading(); showEasyLoading();
showBlueConnetctToastTimer(action: (){ showBlueConnetctToastTimer(action: () {
dismissEasyLoading(); dismissEasyLoading();
state.sureBtnState.value = 0; state.sureBtnState.value = 0;
}); });
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { BlueManage().blueSendData(BlueManage().connectDeviceName,
if (connectionState == BluetoothConnectionState.connected){ (BluetoothConnectionState connectionState) async {
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey); if (connectionState == BluetoothConnectionState.connected) {
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!); final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? publicKey = await Storage.getStringList(saveBluePublicKey); final List<String>? publicKey =
final List<int> publicKeyDataList = changeStringListToIntList(publicKey!); await Storage.getStringList(saveBluePublicKey);
final List<int> publicKeyDataList =
changeStringListToIntList(publicKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken); final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!); final List<int> getTokenList = changeStringListToIntList(token!);
final List<int> serversList = <int>[]; final List<int> serversList = <int>[];
for(int i = 0; i<state.configuringWifiEntity.value.data!.serviceList!.length; i++){ for (int i = 0;
final ServiceList item = state.configuringWifiEntity.value.data!.serviceList![i]; i < state.configuringWifiEntity.value.data!.serviceList!.length;
if(item.serviceIp!.contains('192')){ i++) {
final ServiceList item =
state.configuringWifiEntity.value.data!.serviceList![i];
if (item.serviceIp!.contains('192')) {
final List<String> itemList = item.serviceIp!.split('.'); final List<String> itemList = item.serviceIp!.split('.');
for (String element in itemList) { for (String element in itemList) {
serversList.add(int.parse(element)); serversList.add(int.parse(element));
} }
}else{ } else {
final List<InternetAddress> addresses = await InternetAddress.lookup(item.serviceIp!); final List<InternetAddress> addresses =
await InternetAddress.lookup(item.serviceIp!);
final List<String> itemList = addresses.first.address.split('.'); final List<String> itemList = addresses.first.address.split('.');
for (String element in itemList) { for (String element in itemList) {
serversList.add(int.parse(element)); serversList.add(int.parse(element));
@ -174,11 +200,17 @@ class ConfiguringWifiLogic extends BaseGetXController{
final String? uidStr = await Storage.getUid(); final String? uidStr = await Storage.getUid();
final List<String> uidList = <String>[uidStr.toString()]; final List<String> uidList = <String>[uidStr.toString()];
final StarChartRegisterNodeEntity? registerNodeEntity =
await Storage.getStarChartRegisterNodeInfo();
// app用户的peerId
String appPeerId = registerNodeEntity?.peer?.id ?? '';
IoSenderManage.senderConfiguringWifiCommand( IoSenderManage.senderConfiguringWifiCommand(
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
userID: await Storage.getUid(), userID: await Storage.getUid(),
ssid: state.wifiNameController.text, ssid: state.wifiNameController.text,
password: state.wifiPWDController.text, password: state.wifiPWDController.text,
peerId: appPeerId,
numberOfServers: state.configuringWifiEntity.value.data!.serviceNum, numberOfServers: state.configuringWifiEntity.value.data!.serviceNum,
listOfServers: serversList, listOfServers: serversList,
numberOfPhone: uidList.length, numberOfPhone: uidList.length,
@ -192,7 +224,7 @@ class ConfiguringWifiLogic extends BaseGetXController{
dismissEasyLoading(); dismissEasyLoading();
cancelBlueConnetctToastTimer(); cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0; state.sureBtnState.value = 0;
if(state.ifCurrentScreen.value == true){ if (state.ifCurrentScreen.value == true) {
showBlueConnetctToast(); showBlueConnetctToast();
} }
} }
@ -200,6 +232,7 @@ class ConfiguringWifiLogic extends BaseGetXController{
} }
final NetworkInfo _networkInfo = NetworkInfo(); final NetworkInfo _networkInfo = NetworkInfo();
Future<String> getWifiName() async { Future<String> getWifiName() async {
String ssid = ''; String ssid = '';
ssid = (await _networkInfo.getWifiName())!; ssid = (await _networkInfo.getWifiName())!;
@ -211,17 +244,19 @@ class ConfiguringWifiLogic extends BaseGetXController{
/// ///
Future<bool> checkLocationPermission() async { Future<bool> checkLocationPermission() async {
final PermissionStatus value = await locationPermission(); final PermissionStatus value = await locationPermission();
final bool allow = value != PermissionStatus.permanentlyDenied && value != PermissionStatus.denied; final bool allow = value != PermissionStatus.permanentlyDenied &&
value != PermissionStatus.denied;
return allow; return allow;
} }
Future<PermissionStatus> locationPermission() async => Permission.location.request(); Future<PermissionStatus> locationPermission() async =>
Permission.location.request();
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
if(state.wifiName.value.isEmpty){ if (state.wifiName.value.isEmpty) {
getWifiName().then((String value) { getWifiName().then((String value) {
state.wifiNameController.text = value; state.wifiNameController.text = value;
}); });

View File

@ -0,0 +1,54 @@
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/lockSet/double_lock_link/double_lock_link_state.dart';
import 'package:star_lock/main/lockMian/lockMain/lockMain_logic.dart';
import 'package:star_lock/mine/mineSet/appUnlockNeedMobileNetworkingLock/selectLockListEntity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
class DoubleLockLinkLogic extends BaseGetXController {
final DoubleLockLinkState state = DoubleLockLinkState();
//
Future<SelectLockListEntity> mockNetworkDataRequest() async {
final SelectLockListEntity entity = await ApiRepository.to
.selectLockList(searchStr: state.searchController.text);
List<LockItemData> dataList = <LockItemData>[];
if (entity.errorCode!.codeIsSuccessful) {
dataList = entity.data!.list!;
state.lockItemList.value = dataList;
for (int i = 0; i < dataList.length; i++) {
final LockItemData itemData = dataList[i];
if (itemData.appUnlockOnline == 1) {
state.selectLockIdList.add(itemData.lockId);
}
}
}
return entity;
}
//APP开锁时需手机联网的锁
Future<void> setAppUnlockMustOnlineRequest() async {
final SelectLockListEntity entity =
await ApiRepository.to.setAppUnlockMustOnline(state.selectLockIdList);
if (entity.errorCode!.codeIsSuccessful) {
showToast('操作成功'.tr);
//--
if (Get.isRegistered<LockMainLogic>()) {
Get.find<LockMainLogic>().getStarLockInfo(isUnShowLoading: true);
}
}
}
@override
void onReady() {
super.onReady();
// mockNetworkDataRequest();
}
@override
void onInit() {
super.onInit();
}
}

View File

@ -0,0 +1,149 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/main/lockDetail/lockSet/double_lock_link/double_lock_link_logic.dart';
import 'package:star_lock/main/lockDetail/lockSet/double_lock_link/double_lock_link_state.dart';
import 'package:star_lock/mine/mineSet/appUnlockNeedMobileNetworkingLock/selectLockListEntity.dart';
import 'package:star_lock/tools/keySearchWidget.dart';
import 'package:star_lock/tools/noData.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/tools/submitBtn.dart';
import 'package:star_lock/tools/titleAppBar.dart';
class DoubleLockLinkPage extends StatefulWidget {
const DoubleLockLinkPage({Key? key}) : super(key: key);
@override
State<DoubleLockLinkPage> createState() => _DoubleLockLinkPageState();
}
class _DoubleLockLinkPageState extends State<DoubleLockLinkPage> {
final DoubleLockLinkLogic logic = Get.put(DoubleLockLinkLogic());
final DoubleLockLinkState state = Get.find<DoubleLockLinkLogic>().state;
// ID
int? _selectedLockId;
Future<void> getHttpData() async {
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
logic.mockNetworkDataRequest().then((SelectLockListEntity value) {
setState(() {});
});
}
}
@override
void initState() {
super.initState();
getHttpData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.mainBackgroundColor,
resizeToAvoidBottomInset: false,
appBar: TitleAppBar(
barTitle: '双锁联动'.tr,
haveBack: true,
backgroundColor: AppColors.mainColor,
),
body: Obx(
() => state.lockItemList.value.isEmpty
? NoData()
: Column(
children: <Widget>[
KeySearchWidget(
editingController: state.searchController,
onSubmittedAction: () {
state.lockItemList.value = [];
logic.mockNetworkDataRequest();
},
),
Container(
padding: EdgeInsets.all(15.w),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Expanded(
child: Text(
'对于当前拥有的锁和选中的锁,其中任意一把开启/关闭,另外一把则自动开启/关闭'.tr,
style: TextStyle(fontSize: 22.sp),
),
),
],
),
),
SizedBox(height: 15.h),
Expanded(
child: ListView.builder(
itemCount: state.lockItemList.value.length,
itemBuilder: (BuildContext c, int index) {
final LockItemData itemData =
state.lockItemList.value[index];
return _gatewatListItem(itemData);
},
),
),
SubmitBtn(
btnName: '确定'.tr,
onClick: () {
logic.showToast('关联成功'.tr);
Get.back();
},
),
SizedBox(
height: 40.h,
),
],
),
),
);
}
Widget _gatewatListItem(LockItemData itemData) {
return GestureDetector(
onTap: () {
setState(() {
// ID
_selectedLockId = itemData.lockId;
});
},
child: Container(
height: 80.h,
margin: const EdgeInsets.only(bottom: 2),
padding:
EdgeInsets.only(left: 10.w, right: 20.w, top: 20.h, bottom: 20.h),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10.w),
),
child: Row(
children: <Widget>[
SizedBox(
width: 15.w,
),
Image.asset(
_selectedLockId == itemData.lockId
? 'images/icon_round_select.png'
: 'images/icon_round_unSelect.png',
width: 30.w,
height: 30.w,
),
SizedBox(
width: 10.w,
),
Expanded(
child: Text(
itemData.lockAlias ?? '',
style: TextStyle(fontSize: 22.sp, fontWeight: FontWeight.w600),
),
),
],
),
),
);
}
}

View File

@ -0,0 +1,11 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:star_lock/mine/mineSet/appUnlockNeedMobileNetworkingLock/selectLockListEntity.dart';
class DoubleLockLinkState {
RxList<LockItemData> lockItemList = <LockItemData>[].obs;
List selectLockIdList = [];
RxBool isCheckAll = false.obs;
final TextEditingController searchController = TextEditingController();
}

View File

@ -3,9 +3,12 @@ import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:qr_flutter/qr_flutter.dart';
import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockSet/checkingInInfoData_entity.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/checkingInInfoData_entity.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSet_state.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSet_state.dart';
import 'package:star_lock/main/lockMian/lockMain/lockMain_logic.dart'; import 'package:star_lock/main/lockMian/lockMain/lockMain_logic.dart';
import 'package:star_lock/tools/showCupertinoAlertView.dart';
import '../../../../appRouters.dart'; import '../../../../appRouters.dart';
import '../../../../app_settings/app_colors.dart'; import '../../../../app_settings/app_colors.dart';
@ -317,6 +320,21 @@ class _LockSetPageState extends State<LockSetPage>
'lockSetInfoData': state.lockSetInfoData.value 'lockSetInfoData': state.lockSetInfoData.value
}); });
}))), }))),
//todo
//
Obx(() => CommonItem(
leftTitel: '电子反锁'.tr,
rightTitle: '',
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: _elecAntiLockSwitch())),
//
Obx(() => CommonItem(
leftTitel: '可视门铃码'.tr,
rightTitle: '',
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: _visualDoorbellCodeSwitch())),
SizedBox(height: 10.h), SizedBox(height: 10.h),
// //
Obx(() => Visibility( Obx(() => Visibility(
@ -335,6 +353,25 @@ class _LockSetPageState extends State<LockSetPage>
'lockSetInfoData': state.lockSetInfoData.value 'lockSetInfoData': state.lockSetInfoData.value
}); });
}))), }))),
//todo: API接口
//
Obx(() => Visibility(
visible: true,
child: CommonItem(
leftTitel: '双重认证'.tr,
rightTitle: '',
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: _dualAuthSwitch()))),
//
CommonItem(
leftTitel: '双锁联动'.tr,
rightTitle: '未关联'.tr,
isHaveLine: true,
isHaveDirection: true,
action: () {
Get.toNamed(Routers.doubleLockLinkPage);
}),
// //
Obx(() => Visibility( Obx(() => Visibility(
visible: state.lockFeature.value.remoteUnlock == 1, visible: state.lockFeature.value.remoteUnlock == 1,
@ -529,11 +566,9 @@ class _LockSetPageState extends State<LockSetPage>
() => Visibility( () => Visibility(
visible: state.lockBasicInfo.value.isLockOwner == 1 && visible: state.lockBasicInfo.value.isLockOwner == 1 &&
state.lockFeature.value.appUnlockOnline == 1, state.lockFeature.value.appUnlockOnline == 1,
child: CommonItem( child: otherItem(
leftTitel: '开锁时是否需联网'.tr, leftTitle: '开锁时是否需联网'.tr,
rightTitle: '',
isHaveLine: false, isHaveLine: false,
isHaveRightWidget: true,
rightWidget: _openLockNeedOnlineSwitch()), rightWidget: _openLockNeedOnlineSwitch()),
), ),
), ),
@ -653,6 +688,33 @@ class _LockSetPageState extends State<LockSetPage>
style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor)); style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor));
} }
Widget otherItem({String? leftTitle, bool? isHaveLine, Widget? rightWidget}) {
return Container(
width: 1.sw,
padding:
EdgeInsets.only(left: 20.w, top: 7.5.h, bottom: 7.5.h, right: 10.w),
decoration: BoxDecoration(
color: Colors.white,
border: isHaveLine!
? Border(
bottom: BorderSide(
color: AppColors.greyLineColor, //
width: 2.0.h, //
),
)
: null,
),
child: Row(
children: <Widget>[
Expanded(child: Text(leftTitle!, style: TextStyle(fontSize: 22.sp))),
SizedBox(width: 10.w),
rightWidget ?? Container(),
SizedBox(width: 5.w),
],
),
);
}
// //
// CupertinoSwitch _openCheckInSwitch() { // CupertinoSwitch _openCheckInSwitch() {
// return CupertinoSwitch( // return CupertinoSwitch(
@ -710,6 +772,64 @@ class _LockSetPageState extends State<LockSetPage>
); );
} }
//
CupertinoSwitch _elecAntiLockSwitch() {
return CupertinoSwitch(
activeColor: CupertinoColors.activeBlue,
trackColor: CupertinoColors.systemGrey5,
thumbColor: CupertinoColors.white,
value: state.isElecAntiLock.value == 1,
onChanged: state.sureBtnState.value == 1
? null
: (bool value) {
setState(() {
state.isElecAntiLock.value = value ? 1 : 0;
});
},
);
}
//
CupertinoSwitch _visualDoorbellCodeSwitch() {
return CupertinoSwitch(
activeColor: CupertinoColors.activeBlue,
trackColor: CupertinoColors.systemGrey5,
thumbColor: CupertinoColors.white,
value: state.isVisualDoorbellCode.value == 1,
onChanged: state.sureBtnState.value == 1
? null
: (bool value) {
setState(() {
state.isVisualDoorbellCode.value = value ? 1 : 0;
if (state.isVisualDoorbellCode.value == 1) {
ShowCupertinoAlertView().showVisualDoorbellCodeAlert(
widgetContext: context,
qrCodeUrl: BlueManage().connectDeviceName,
qrCodeText: '请扫描可视门铃码二维码'.tr,
);
} else {}
});
},
);
}
//
CupertinoSwitch _dualAuthSwitch() {
return CupertinoSwitch(
activeColor: CupertinoColors.activeBlue,
trackColor: CupertinoColors.systemGrey5,
thumbColor: CupertinoColors.white,
value: state.isDualAuth.value == 1,
onChanged: state.sureBtnState.value == 1
? null
: (bool value) {
setState(() {
state.isDualAuth.value = value ? 1 : 0;
});
},
);
}
// //
// CupertinoSwitch _lockExceptionWarningsSwitch() { // CupertinoSwitch _lockExceptionWarningsSwitch() {
// return CupertinoSwitch( // return CupertinoSwitch(

View File

@ -22,13 +22,16 @@ class LockSetState {
RxInt isOpenBlueBroadcast = 0.obs; // 广 RxInt isOpenBlueBroadcast = 0.obs; // 广
RxInt isOpenExceptionWarnings = 0.obs; // RxInt isOpenExceptionWarnings = 0.obs; //
RxInt isOpenStayWarn = 0.obs; // RxInt isOpenStayWarn = 0.obs; //
RxInt isElecAntiLock = 0.obs; //
RxInt isVisualDoorbellCode = 0.obs; //
RxInt isDualAuth = 0.obs; //
TextEditingController passwordTF = TextEditingController(); TextEditingController passwordTF = TextEditingController();
int settingUpSupportFeatures = 0; int settingUpSupportFeatures = 0;
RxBool ifCurrentScreen = true.obs; // , RxBool ifCurrentScreen = true.obs; // ,
RxBool deleteAdministratorIsHaveAllData = false.obs; // RxBool deleteAdministratorIsHaveAllData = false.obs; //
RxInt sureBtnState = 0.obs;// 0() 1() RxInt sureBtnState = 0.obs; // 0() 1()
final ShowTipView showTipView = ShowTipView(); final ShowTipView showTipView = ShowTipView();
LockSetState() { LockSetState() {

View File

@ -5,7 +5,6 @@ import 'package:flutter_voice_processor/flutter_voice_processor.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/talk/call/callTalk.dart'; import 'package:star_lock/talk/call/callTalk.dart';
import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/talk/udp/udp_talkClass.dart'; import 'package:star_lock/talk/udp/udp_talkClass.dart';
import '../../../../app_settings/app_settings.dart'; import '../../../../app_settings/app_settings.dart';
@ -23,11 +22,8 @@ class LockMonitoringLogic extends BaseGetXController {
state.voiceProcessor = VoiceProcessor.instance; state.voiceProcessor = VoiceProcessor.instance;
} }
/*
/// UDP发送的状态 /// UDP发送的状态
StreamSubscription? _getUDPStatusRefreshUIEvent; StreamSubscription? _getUDPStatusRefreshUIEvent;
void _getUDPStatusRefreshUIAction() { void _getUDPStatusRefreshUIAction() {
_getUDPStatusRefreshUIEvent = _getUDPStatusRefreshUIEvent =
eventBus.on<GetUDPStatusRefreshUI>().listen((event) async { eventBus.on<GetUDPStatusRefreshUI>().listen((event) async {
@ -57,7 +53,6 @@ class LockMonitoringLogic extends BaseGetXController {
} }
}); });
} }
*/
// //
void initiateUdpAnswerAction() { void initiateUdpAnswerAction() {
@ -79,9 +74,6 @@ class LockMonitoringLogic extends BaseGetXController {
UDPTalkClass().callNoAnswer(1); UDPTalkClass().callNoAnswer(1);
} }
}); });
//
StartChartManage().sendTalkAcceptMessage();
} }
/// ///
@ -112,9 +104,6 @@ class LockMonitoringLogic extends BaseGetXController {
UDPTalkClass().callNoAnswer(2); UDPTalkClass().callNoAnswer(2);
} }
}); });
//
StartChartManage().sendTalkRejectMessage();
} }
/// ///
@ -416,7 +405,7 @@ class LockMonitoringLogic extends BaseGetXController {
void onReady() { void onReady() {
super.onReady(); super.onReady();
// _getUDPStatusRefreshUIAction(); _getUDPStatusRefreshUIAction();
initRecorder(); initRecorder();
} }
@ -430,7 +419,7 @@ class LockMonitoringLogic extends BaseGetXController {
void onClose() { void onClose() {
CallTalk().finishAVData(); CallTalk().finishAVData();
stopProcessing(); stopProcessing();
// _getUDPStatusRefreshUIEvent!.cancel(); _getUDPStatusRefreshUIEvent!.cancel();
state.getTVDataRefreshUIEvent!.cancel(); state.getTVDataRefreshUIEvent!.cancel();
if (state.oneMinuteTimeTimer != null) { if (state.oneMinuteTimeTimer != null) {

View File

@ -1,5 +1,4 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:ui' as ui; import 'dart:ui' as ui;
@ -11,18 +10,16 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/main/lockDetail/monitoring/monitoring/star_chart_logic.dart';
import 'package:star_lock/talk/call/callTalk.dart'; import 'package:star_lock/talk/call/callTalk.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
import 'package:star_lock/talk/startChart/webView/h264_web_view.dart';
import 'package:star_lock/talk/udp/udp_manage.dart'; import 'package:star_lock/talk/udp/udp_manage.dart';
import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/showTFView.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../app_settings/app_settings.dart';
import '../../../../login/selectCountryRegion/common/index.dart';
import '../../../../tools/showTFView.dart';
import 'lockMonitoring_logic.dart'; import 'lockMonitoring_logic.dart';
import 'lockMonitoring_state.dart';
class LockMonitoringPage extends StatefulWidget { class LockMonitoringPage extends StatefulWidget {
const LockMonitoringPage({Key? key}) : super(key: key); const LockMonitoringPage({Key? key}) : super(key: key);
@ -32,13 +29,12 @@ class LockMonitoringPage extends StatefulWidget {
} }
class _LockMonitoringPageState extends State<LockMonitoringPage> { class _LockMonitoringPageState extends State<LockMonitoringPage> {
final StarChartLogic logic = Get.put(StarChartLogic()); final LockMonitoringLogic logic = Get.put(LockMonitoringLogic());
final LockMonitoringState state = Get.find<StarChartLogic>().state; final LockMonitoringState state = Get.find<LockMonitoringLogic>().state;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
initAsync(); initAsync();
_getTVDataRefreshUIAction(); _getTVDataRefreshUIAction();
} }
@ -50,156 +46,242 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return PopScope( return PopScope(
canPop: false, canPop: false,
child: RepaintBoundary( child: RepaintBoundary(
key: state.globalKey, key: state.globalKey,
child: Container(
width: 1.sw,
height: 1.sh,
color: Colors.transparent,
child: Stack(
children: <Widget>[
Image.memory(
state.listPhotoData.value,
gaplessPlayback: true,
width: 1.sw,
height: 1.sh,
fit: BoxFit.cover, //contain- none-
filterQuality: FilterQuality.high,
errorBuilder: (BuildContext context, Object error,
StackTrace? stackTrace) {
return Container(color: Colors.transparent);
},
),
Positioned(
top: ScreenUtil().statusBarHeight + 30.h,
width: 1.sw,
child: Obx(() {
final String sec = (state.oneMinuteTime.value % 60)
.toString()
.padLeft(2, '0');
final String min = (state.oneMinuteTime.value ~/ 60)
.toString()
.padLeft(2, '0');
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('$min:$sec',
style: TextStyle(
fontSize: 26.sp, color: Colors.white)),
]);
}),
),
Positioned(
bottom: 10.w,
child: Container(
width: 1.sw - 30.w * 2,
// height: 300.h,
margin: EdgeInsets.all(30.w),
decoration: BoxDecoration(
color: const Color(0xC83C3F41),
borderRadius: BorderRadius.circular(20.h)),
child: Column(
children: <Widget>[
SizedBox(height: 20.h),
bottomTopBtnWidget(),
SizedBox(height: 20.h),
bottomBottomBtnWidget(),
SizedBox(height: 20.h),
],
),
))
],
),
),
));
}
Widget bottomTopBtnWidget() {
return Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
//
GestureDetector(
onTap: () {
state.isOpenVoice.value = !state.isOpenVoice.value;
},
child: Container( child: Container(
width: 1.sw, width: 50.w,
height: 1.sh, height: 50.w,
color: Colors.transparent, padding: EdgeInsets.all(5.w),
child: _buildTalkView(isMpeg4: false), child: Obx(() => Image(
width: 40.w,
height: 40.w,
image: state.isOpenVoice.value
? const AssetImage(
'images/main/icon_lockDetail_monitoringCloseVoice.png')
: const AssetImage(
'images/main/icon_lockDetail_monitoringOpenVoice.png'))),
), ),
), ),
); SizedBox(width: 60.w),
//
GestureDetector(
onTap: captureAndSavePng,
child: Container(
width: 50.w,
height: 50.w,
padding: EdgeInsets.all(5.w),
child: Image(
width: 40.w,
height: 40.w,
image: const AssetImage(
'images/main/icon_lockDetail_monitoringScreenshot.png')),
),
),
SizedBox(width: 60.w),
//
GestureDetector(
onTap: () {
// Get.toNamed(Routers.monitoringRealTimeScreenPage);
},
child: Container(
width: 50.w,
height: 50.w,
padding: EdgeInsets.all(5.w),
child: Image(
width: 40.w,
height: 40.w,
image: const AssetImage(
'images/main/icon_lockDetail_monitoringScreenRecording.png')),
),
),
]);
} }
Widget buildTopButtons() { Widget bottomBottomBtnWidget() {
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[ children: <Widget>[
buildIconButton( //
icon: state.isOpenVoice.value Obx(() => bottomBtnItemWidget(
? 'images/main/icon_lockDetail_monitoringCloseVoice.png' state.isClickAnswer.value == true
: 'images/main/icon_lockDetail_monitoringOpenVoice.png', ? 'images/main/icon_lockDetail_monitoringUnTalkback.png'
onTap: () { : getAnswerBtnImg(),
state.isOpenVoice.value = !state.isOpenVoice.value; state.isClickAnswer.value == true
}, ? '长按说话'.tr
), : getAnswerBtnName(),
SizedBox(width: 60.w), Colors.white, () async {
buildIconButton( if (state.isClickAnswer.value == false) {
icon: 'images/main/icon_lockDetail_monitoringScreenshot.png', logic.initiateUdpAnswerAction();
onTap: captureAndSavePng, state.isClickAnswer.value = true;
), }
SizedBox(width: 60.w), }, longPress: () {
buildIconButton( //
icon: 'images/main/icon_lockDetail_monitoringScreenRecording.png', AppLog.log('onLongPress');
onTap: () { state.listAudioData.value = <int>[];
// Get.toNamed(Routers.monitoringRealTimeScreenPage); if (state.udpStatus.value == 8) {
}, state.udpStatus.value = 9;
), }
], // logic.readG711Data();
); logic.startProcessing();
} }, longPressUp: () async {
//
Widget buildBottomButtons() { AppLog.log('onLongPressUp');
return Row( if (state.udpStatus.value == 9) {
mainAxisAlignment: MainAxisAlignment.spaceEvenly, state.udpStatus.value = 8;
children: <Widget>[ }
buildAnswerButton(), logic.stopProcessing();
buildIconButton( })),
icon: 'images/main/icon_lockDetail_hangUp.png', bottomBtnItemWidget(
label: '挂断'.tr, 'images/main/icon_lockDetail_hangUp.png', '挂断'.tr, Colors.red,
color: Colors.red, () async {
onTap: () async { logic.stopProcessing();
// logic.stopProcessing(); CallTalk().finishAVData();
// CallTalk().finishAVData(); //
if (state.isClickHangUp.value == false) {
if (!state.isClickHangUp.value) { logic.initiateUdpHangUpAction(3);
// logic.initiateUdpHangUpAction(3);
logic.initiateHangUpCommand();
state.isClickHangUp.value = true; state.isClickHangUp.value = true;
} }
}, // else {
), // AppLog.log('点了这里?');
buildIconButton( // state.isClickHangUp.value = true;
icon: 'images/main/icon_lockDetail_monitoringUnlock.png', // UDPTalkClass().stopLocalAudio();
label: '开锁'.tr, // logic.initiateUdpHangUpAction(4);
color: AppColors.mainColor, // }
onTap: () { }),
bottomBtnItemWidget(
'images/main/icon_lockDetail_monitoringUnlock.png',
'开锁'.tr,
AppColors.mainColor, () {
if (UDPManage().remoteUnlock == 1) { if (UDPManage().remoteUnlock == 1) {
showDeletPasswordAlertDialog(context); showDeletPasswordAlertDialog(context);
} else { } else {
logic.showToast('请在锁设置中开启远程开锁'.tr); logic.showToast('请在锁设置中开启远程开锁'.tr);
} }
}, })
), ]);
],
);
} }
Widget buildAnswerButton() { String getAnswerBtnImg() {
return Obx(() { switch (state.udpStatus.value) {
final bool isDuringCall = case 8:
state.talkStatus.value == TalkStatus.duringCall.index; return 'images/main/icon_lockDetail_monitoringUnTalkback.png';
return buildIconButton( case 9:
icon: isDuringCall return 'images/main/icon_lockDetail_monitoringTalkback.png';
? 'images/main/icon_lockDetail_monitoringUnTalkback.png' default:
: 'images/main/icon_lockDetail_monitoringAnswerCalls.png', return 'images/main/icon_lockDetail_monitoringAnswerCalls.png';
label: isDuringCall ? '长按说话'.tr : '接听'.tr, }
onTap: () async {
if (!state.isClickAnswer.value) {
logic.initiateAnswerCommand();
state.isClickAnswer.value = true;
}
},
onLongPress: () {
state.listAudioData.value = <int>[];
// if (state.udpStatus.value == 8) {
// state.udpStatus.value = 9;
// }
logic.startProcessing();
},
onLongPressUp: () {
// if (state.udpStatus.value == 9) {
// state.udpStatus.value = 8;
// }
logic.stopProcessing();
},
);
});
} }
Widget buildIconButton({ String getAnswerBtnName() {
required String icon, switch (state.udpStatus.value) {
String? label, case 8:
Color color = Colors.white, return '长按说话'.tr;
required Function() onTap, case 9:
Function()? onLongPress, return '松开发送'.tr;
Function()? onLongPressUp, default:
}) { return '接听'.tr;
}
}
Widget bottomBtnItemWidget(
String iconUrl, String name, Color backgroundColor, Function() onClick,
{Function()? longPress, Function()? longPressUp}) {
final double wh = 80.w; final double wh = 80.w;
return GestureDetector( return GestureDetector(
onTap: onTap, onTap: onClick,
onLongPress: onLongPress, onLongPress: longPress,
onLongPressUp: onLongPressUp, onLongPressUp: longPressUp,
child: SizedBox( child: SizedBox(
height: 140.h, height: 140.h,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Container( Container(
width: wh, width: wh,
height: wh, height: wh,
decoration: BoxDecoration( decoration: BoxDecoration(
color: color, color: backgroundColor,
borderRadius: BorderRadius.circular((wh + 10.w * 2) / 2), borderRadius: BorderRadius.circular((wh + 10.w * 2) / 2)),
padding: EdgeInsets.all(20.w),
child: Image.asset(iconUrl, fit: BoxFit.fitWidth),
), ),
padding: EdgeInsets.all(20.w),
child: Image.asset(icon, fit: BoxFit.fitWidth),
),
if (label != null) ...[
SizedBox(height: 20.w), SizedBox(height: 20.w),
Expanded( Expanded(
child: Text( child: Text(name,
label, style: TextStyle(fontSize: 20.sp, color: Colors.white),
style: TextStyle(fontSize: 20.sp, color: Colors.white), textAlign: TextAlign.center))
textAlign: TextAlign.center,
),
),
], ],
], )),
),
),
); );
} }
@ -217,18 +299,23 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
FilteringTextInputFormatter.allow(RegExp('[0-9]')), FilteringTextInputFormatter.allow(RegExp('[0-9]')),
], ],
sureClick: () async { sureClick: () async {
//
if (state.passwordTF.text.isEmpty) { if (state.passwordTF.text.isEmpty) {
logic.showToast('请输入开锁密码'.tr); logic.showToast('请输入开锁密码'.tr);
return; return;
} }
// List<int> numbers = state.passwordTF.text.split('').map((char) => int.parse(char)).toList();
//
// lockID
final List<int> numbers = <int>[]; final List<int> numbers = <int>[];
final List<int> lockIDData = utf8.encode(state.passwordTF.text); final List<int> lockIDData = utf8.encode(state.passwordTF.text);
numbers.addAll(lockIDData); numbers.addAll(lockIDData);
// topBytes = getFixedLengthList(lockIDData, 20 - lockIDData.length);
for (int i = 0; i < 6 - lockIDData.length; i++) { for (int i = 0; i < 6 - lockIDData.length; i++) {
numbers.add(0); numbers.add(0);
} }
//todo: logic.udpOpenDoorAction(numbers);
// logic.udpOpenDoorAction(numbers);
}, },
cancelClick: () { cancelClick: () {
Get.back(); Get.back();
@ -238,11 +325,16 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
); );
} }
Future<void> requestMicrophonePermission() async { //
Future requestMicrophonePermission() async {
await logic.getPermissionStatus().then((bool value) async { await logic.getPermissionStatus().then((bool value) async {
if (!value) { if (!value) {
return; return;
} }
// state.isSenderAudioData.value = false;
// AppLog.log("发送接听了");
//
}); });
} }
@ -263,12 +355,15 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
} }
final Uint8List pngBytes = byteData.buffer.asUint8List(); final Uint8List pngBytes = byteData.buffer.asUint8List();
//
final Directory directory = await getApplicationDocumentsDirectory(); final Directory directory = await getApplicationDocumentsDirectory();
final String imagePath = '${directory.path}/screenshot.png'; final String imagePath = '${directory.path}/screenshot.png';
//
final File imgFile = File(imagePath); final File imgFile = File(imagePath);
await imgFile.writeAsBytes(pngBytes); await imgFile.writeAsBytes(pngBytes);
//
await ImageGallerySaver.saveFile(imagePath); await ImageGallerySaver.saveFile(imagePath);
AppLog.log('截图保存路径: $imagePath'); AppLog.log('截图保存路径: $imagePath');
@ -278,19 +373,31 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
} }
} }
///
void _getTVDataRefreshUIAction() { void _getTVDataRefreshUIAction() {
// eventBus
state.getTVDataRefreshUIEvent = eventBus state.getTVDataRefreshUIEvent = eventBus
.on<GetTVDataRefreshUI>() .on<GetTVDataRefreshUI>()
.listen((GetTVDataRefreshUI event) async { .listen((GetTVDataRefreshUI event) async {
if (event.tvList.isNotEmpty && event.tvList.length > 100) { if (event.tvList.isNotEmpty && event.tvList.length > 100) {
//
final Uint8List imageData = Uint8List.fromList(event.tvList); final Uint8List imageData = Uint8List.fromList(event.tvList);
if (!listEquals(state.listPhotoData.value, imageData)) { if (!listEquals(state.listPhotoData.value, imageData)) {
//
state.listPhotoData.value = imageData; state.listPhotoData.value = imageData;
// trueUI
state.shouldUpdateUI.value = true; state.shouldUpdateUI.value = true;
// WidgetsBinding.instance.addPostFrameCallback((_) {
// setState方法之前检查标志true时才更新UI
if (state.shouldUpdateUI.value) { if (state.shouldUpdateUI.value) {
setState(() {}); setState(() {
// UI
});
// UI后将标志重新设置为false
state.shouldUpdateUI.value = false; state.shouldUpdateUI.value = false;
} }
// });
} }
} }
}); });
@ -302,109 +409,4 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
logic.stopProcessing(); logic.stopProcessing();
state.getTVDataRefreshUIEvent!.cancel(); state.getTVDataRefreshUIEvent!.cancel();
} }
Widget _buildTalkView({required bool isMpeg4}) {
return isMpeg4 ? _buildMpeg4TalkView() : _buildH264TalkView();
}
Widget _buildMpeg4TalkView() {
return Stack(
children: <Widget>[
Image.memory(
state.listPhotoData.value,
gaplessPlayback: true,
width: 1.sw,
height: 1.sh,
fit: BoxFit.cover,
filterQuality: FilterQuality.high,
errorBuilder:
(BuildContext context, Object error, StackTrace? stackTrace) {
return Container(color: Colors.transparent);
},
),
Positioned(
top: ScreenUtil().statusBarHeight + 30.h,
width: 1.sw,
child: Obx(() {
final String sec =
(state.oneMinuteTime.value % 60).toString().padLeft(2, '0');
final String min =
(state.oneMinuteTime.value ~/ 60).toString().padLeft(2, '0');
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('$min:$sec',
style: TextStyle(fontSize: 26.sp, color: Colors.white)),
],
);
}),
),
Positioned(
bottom: 10.w,
child: Container(
width: 1.sw - 30.w * 2,
margin: EdgeInsets.all(30.w),
decoration: BoxDecoration(
color: const Color(0xC83C3F41),
borderRadius: BorderRadius.circular(20.h),
),
child: Column(
children: <Widget>[
SizedBox(height: 20.h),
buildTopButtons(),
SizedBox(height: 20.h),
buildBottomButtons(),
SizedBox(height: 20.h),
],
),
),
),
],
);
}
Widget _buildH264TalkView() {
return Stack(
children: <Widget>[
H264WebView(),
Positioned(
top: ScreenUtil().statusBarHeight + 30.h,
width: 1.sw,
child: Obx(() {
final String sec =
(state.oneMinuteTime.value % 60).toString().padLeft(2, '0');
final String min =
(state.oneMinuteTime.value ~/ 60).toString().padLeft(2, '0');
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('$min:$sec',
style: TextStyle(fontSize: 26.sp, color: Colors.white)),
],
);
}),
),
Positioned(
bottom: 10.w,
child: Container(
width: 1.sw - 30.w * 2,
margin: EdgeInsets.all(30.w),
decoration: BoxDecoration(
color: const Color(0xC83C3F41),
borderRadius: BorderRadius.circular(20.h),
),
child: Column(
children: <Widget>[
SizedBox(height: 20.h),
buildTopButtons(),
SizedBox(height: 20.h),
buildBottomButtons(),
SizedBox(height: 20.h),
],
),
),
),
],
);
}
} }

View File

@ -5,7 +5,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_voice_processor/flutter_voice_processor.dart'; import 'package:flutter_voice_processor/flutter_voice_processor.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:network_info_plus/network_info_plus.dart'; import 'package:network_info_plus/network_info_plus.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
import '../../../../tools/storage.dart'; import '../../../../tools/storage.dart';
@ -19,8 +18,8 @@ class LockMonitoringState {
Future<String?> userMobileIP = NetworkInfo().getWifiIP(); Future<String?> userMobileIP = NetworkInfo().getWifiIP();
Future<String?> userUid = Storage.getUid(); Future<String?> userUid = Storage.getUid();
// RxInt udpStatus = RxInt udpStatus =
// 0.obs; //0 1 2 3 4 5 6 8 9 0.obs; //0 1 2 3 4 5 6 8 9
TextEditingController passwordTF = TextEditingController(); TextEditingController passwordTF = TextEditingController();
Rx<Uint8List> listPhotoData = Uint8List(0).obs; // Rx<Uint8List> listPhotoData = Uint8List(0).obs; //
@ -32,6 +31,10 @@ class LockMonitoringState {
RxBool isButtonDisabled = false.obs; // RxBool isButtonDisabled = false.obs; //
final int frameLength = 320; //320 final int frameLength = 320; //320
final int sampleRate = 8000; //8000 final int sampleRate = 8000; //8000
// final int volumeHistoryCapacity = 5; //
// final double dbOffset = 50.0; //
// var volumeHistory = <double>[].obs; //
// var smoothedVolumeValue = 0.0.obs; //
RxString errorMessage = ''.obs; RxString errorMessage = ''.obs;
List<List<int>> allFrames = <List<int>>[]; List<List<int>> allFrames = <List<int>>[];
@ -52,6 +55,4 @@ class LockMonitoringState {
late Timer openDoorTimer = Timer(const Duration(seconds: 1), () {}); // late Timer openDoorTimer = Timer(const Duration(seconds: 1), () {}); //
RxInt openDoorSeconds = 0.obs; RxInt openDoorSeconds = 0.obs;
RxInt talkStatus = 0.obs; //
} }

View File

@ -4,15 +4,16 @@ import 'package:flutter_voice_processor/flutter_voice_processor.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/blue/io_tool/manager_event_bus.dart';
import 'package:star_lock/main/lockDetail/monitoring/star_chart_h264/star_chart_state.dart';
import 'package:star_lock/talk/startChart/events/talk_status_change_event.dart'; import 'package:star_lock/talk/startChart/events/talk_status_change_event.dart';
import 'package:star_lock/talk/startChart/start_chart_manage.dart'; import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart'; import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/eventBusEventManage.dart';
import 'lockMonitoring_state.dart';
class StarChartLogic extends BaseGetXController { class StarChartLogic extends BaseGetXController {
final LockMonitoringState state = LockMonitoringState(); final StarChartState state = StarChartState();
/// Talk发送的状态 /// Talk发送的状态
StreamSubscription? _getTalkStatusRefreshUIEvent; StreamSubscription? _getTalkStatusRefreshUIEvent;
@ -24,15 +25,19 @@ class StarChartLogic extends BaseGetXController {
} }
void _getTalkStatusRefreshUIAction() { void _getTalkStatusRefreshUIAction() {
_getTalkStatusRefreshUIEvent = eventBus _getTalkStatusRefreshUIEvent = EventBusManager()
.eventBus!
.on<TalkStatusChangeEvent>() .on<TalkStatusChangeEvent>()
.listen((TalkStatusChangeEvent event) async { .listen((TalkStatusChangeEvent event) async {
state.talkStatus.value = event.newStatus.index; state.talkStatus.value = event.newStatus.index;
state.oneMinuteTime.value = 0; state.oneMinuteTime.value = 0;
if (state.talkStatus.value == TalkStatus.rejected.index || if (state.talkStatus.value == TalkStatus.rejected.index ||
state.talkStatus.value == TalkStatus.notTalkData.index ||
state.talkStatus.value == TalkStatus.notTalkPing.index ||
state.talkStatus.value == TalkStatus.end.index) { state.talkStatus.value == TalkStatus.end.index) {
_cancelTimers(); _cancelTimers();
//
Get.back();
return; return;
} }
@ -58,26 +63,10 @@ class StarChartLogic extends BaseGetXController {
void _cancelTimers() { void _cancelTimers() {
state.oneMinuteTimeTimer.cancel(); state.oneMinuteTimeTimer.cancel();
state.answerTimer.cancel();
} }
// //
void initiateAnswerCommand() { void initiateAnswerCommand() {
// state.answerTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
// StartChartManage().sendTalkAcceptMessage();
// state.answerSeconds++;
// if (state.talkStatus.value == TalkStatus.duringCall.index) {
// state.answerTimer.cancel();
// return;
// }
// if (state.answerSeconds >= 6) {
// state.answerTimer.cancel();
// showToast('接听失败'.tr);
// initiateHangUpCommand();
// }
// });
StartChartManage().sendTalkAcceptMessage(); StartChartManage().sendTalkAcceptMessage();
} }
@ -113,23 +102,23 @@ class StarChartLogic extends BaseGetXController {
} }
Future<void> startProcessing() async { Future<void> startProcessing() async {
state.isButtonDisabled.value = true; // state.isButtonDisabled.value = true;
//
state.voiceProcessor?.addFrameListener(_onFrame); // state.voiceProcessor?.addFrameListener(_onFrame);
state.voiceProcessor?.addErrorListener(_onError); // state.voiceProcessor?.addErrorListener(_onError);
try { // try {
if (await state.voiceProcessor?.hasRecordAudioPermission() ?? false) { // if (await state.voiceProcessor?.hasRecordAudioPermission() ?? false) {
await state.voiceProcessor?.start(state.frameLength, state.sampleRate); // await state.voiceProcessor?.start(state.frameLength, state.sampleRate);
state.isProcessing.value = // state.isProcessing.value =
await state.voiceProcessor?.isRecording() ?? false; // await state.voiceProcessor?.isRecording() ?? false;
} else { // } else {
state.errorMessage.value = 'Recording permission not granted'; // state.errorMessage.value = 'Recording permission not granted';
} // }
} on PlatformException catch (ex) { // } on PlatformException catch (ex) {
state.errorMessage.value = 'Failed to start recorder: $ex'; // state.errorMessage.value = 'Failed to start recorder: $ex';
} finally { // } finally {
state.isButtonDisabled.value = false; // state.isButtonDisabled.value = false;
} // }
} }
void _onError(VoiceProcessorException error) { void _onError(VoiceProcessorException error) {
@ -137,18 +126,24 @@ class StarChartLogic extends BaseGetXController {
} }
Future<void> stopProcessing() async { Future<void> stopProcessing() async {
state.isButtonDisabled.value = true; // voiceProcessor
try { // if (state.voiceProcessor == null) {
await state.voiceProcessor?.stop(); // state.errorMessage.value = 'Voice processor is not initialized.';
state.voiceProcessor?.removeFrameListener(_onFrame); // return;
state.udpSendDataFrameNumber = 0; // }
} on PlatformException catch (ex) { //
state.errorMessage.value = 'Failed to stop recorder: $ex'; // state.isButtonDisabled.value = true;
} finally { // try {
state.isProcessing.value = // await state.voiceProcessor?.stop();
await state.voiceProcessor?.isRecording() ?? false; // state.voiceProcessor?.removeFrameListener(_onFrame);
state.isButtonDisabled.value = false; // state.udpSendDataFrameNumber = 0;
} // } on PlatformException catch (ex) {
// state.errorMessage.value = 'Failed to stop recorder: $ex';
// } finally {
// state.isProcessing.value =
// await state.voiceProcessor?.isRecording() ?? false;
// state.isButtonDisabled.value = false;
// }
} }
int linearToULaw(int pcmVal) { int linearToULaw(int pcmVal) {

View File

@ -0,0 +1,396 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:ui' as ui;
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:path_provider/path_provider.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/main/lockDetail/monitoring/star_chart_h264/star_chart_logic.dart';
import 'package:star_lock/main/lockDetail/monitoring/star_chart_h264/star_chart_state.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
import 'package:star_lock/talk/startChart/webView/h264_web_view.dart';
import 'package:star_lock/talk/udp/udp_manage.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/showTFView.dart';
class StarChartPage extends StatefulWidget {
const StarChartPage({Key? key}) : super(key: key);
@override
State<StarChartPage> createState() => _StarChartPageState();
}
class _StarChartPageState extends State<StarChartPage> {
final StarChartLogic logic = Get.put(StarChartLogic());
final StarChartState state = Get.find<StarChartLogic>().state;
@override
void initState() {
super.initState();
initAsync();
_getTVDataRefreshUIAction();
}
Future<void> initAsync() async {
await requestMicrophonePermission();
}
@override
Widget build(BuildContext context) {
return PopScope(
canPop: false,
child: RepaintBoundary(
key: state.globalKey,
child: Container(
width: 1.sw,
height: 1.sh,
color: Colors.transparent,
child: _buildTalkView(isMpeg4: true),
),
),
);
}
Widget buildTopButtons() {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
buildIconButton(
icon: state.isOpenVoice.value
? 'images/main/icon_lockDetail_monitoringCloseVoice.png'
: 'images/main/icon_lockDetail_monitoringOpenVoice.png',
onTap: () {
state.isOpenVoice.value = !state.isOpenVoice.value;
},
),
SizedBox(width: 60.w),
buildIconButton(
icon: 'images/main/icon_lockDetail_monitoringScreenshot.png',
onTap: captureAndSavePng,
),
SizedBox(width: 60.w),
buildIconButton(
icon: 'images/main/icon_lockDetail_monitoringScreenRecording.png',
onTap: () {
// Get.toNamed(Routers.monitoringRealTimeScreenPage);
},
),
],
);
}
Widget buildBottomButtons() {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
buildAnswerButton(),
buildIconButton(
icon: 'images/main/icon_lockDetail_hangUp.png',
label: '挂断'.tr,
color: Colors.red,
onTap: () async {
logic.initiateHangUpCommand();
},
),
buildIconButton(
icon: 'images/main/icon_lockDetail_monitoringUnlock.png',
label: '开锁'.tr,
color: AppColors.mainColor,
onTap: () {
if (UDPManage().remoteUnlock == 1) {
showDeletPasswordAlertDialog(context);
} else {
logic.showToast('请在锁设置中开启远程开锁'.tr);
}
},
),
],
);
}
Widget buildAnswerButton() {
return Obx(() {
// final bool isDuringCall =
// state.talkStatus.value == TalkStatus.duringCall.index;
return buildIconButton(
icon: state.talkStatus.value == TalkStatus.duringCall.index
? 'images/main/icon_lockDetail_monitoringUnTalkback.png'
: 'images/main/icon_lockDetail_monitoringAnswerCalls.png',
label: state.talkStatus.value == TalkStatus.duringCall.index
? '长按说话'.tr
: '接听'.tr,
onTap: () async {
if (state.talkStatus.value == TalkStatus.waitingAnswer.index) {
logic.initiateAnswerCommand();
setState(() {});
}
},
onLongPress: () {
state.listAudioData.value = <int>[];
logic.startProcessing();
},
onLongPressUp: () {
logic.stopProcessing();
},
);
});
}
Widget buildIconButton({
required String icon,
String? label,
Color color = Colors.white,
required Function() onTap,
Function()? onLongPress,
Function()? onLongPressUp,
}) {
final double wh = 80.w;
return GestureDetector(
onTap: onTap,
onLongPress: onLongPress,
onLongPressUp: onLongPressUp,
child: SizedBox(
height: 140.h,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
width: wh,
height: wh,
decoration: BoxDecoration(
color: color,
borderRadius: BorderRadius.circular((wh + 10.w * 2) / 2),
),
padding: EdgeInsets.all(20.w),
child: Image.asset(icon, fit: BoxFit.fitWidth),
),
if (label != null) ...[
SizedBox(height: 20.w),
Expanded(
child: Text(
label,
style: TextStyle(fontSize: 20.sp, color: Colors.white),
textAlign: TextAlign.center,
),
),
],
],
),
),
);
}
void showDeletPasswordAlertDialog(BuildContext context) {
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return ShowTFView(
title: '请输入6位数字开锁密码'.tr,
tipTitle: '',
controller: state.passwordTF,
inputFormatters: <TextInputFormatter>[
LengthLimitingTextInputFormatter(6), //
FilteringTextInputFormatter.allow(RegExp('[0-9]')),
],
sureClick: () async {
if (state.passwordTF.text.isEmpty) {
logic.showToast('请输入开锁密码'.tr);
return;
}
final List<int> numbers = <int>[];
final List<int> lockIDData = utf8.encode(state.passwordTF.text);
numbers.addAll(lockIDData);
for (int i = 0; i < 6 - lockIDData.length; i++) {
numbers.add(0);
}
//todo:
// logic.udpOpenDoorAction(numbers);
},
cancelClick: () {
Get.back();
},
);
},
);
}
Future<void> requestMicrophonePermission() async {
await logic.getPermissionStatus().then((bool value) async {
if (!value) {
return;
}
});
}
Future<void> captureAndSavePng() async {
try {
if (state.globalKey.currentContext == null) {
AppLog.log('截图失败: 未找到当前上下文');
return;
}
final RenderRepaintBoundary boundary = state.globalKey.currentContext!
.findRenderObject()! as RenderRepaintBoundary;
final ui.Image image = await boundary.toImage();
final ByteData? byteData =
await image.toByteData(format: ui.ImageByteFormat.png);
if (byteData == null) {
AppLog.log('截图失败: 图像数据为空');
return;
}
final Uint8List pngBytes = byteData.buffer.asUint8List();
final Directory directory = await getApplicationDocumentsDirectory();
final String imagePath = '${directory.path}/screenshot.png';
final File imgFile = File(imagePath);
await imgFile.writeAsBytes(pngBytes);
await ImageGallerySaver.saveFile(imagePath);
AppLog.log('截图保存路径: $imagePath');
logic.showToast('截图已保存到相册'.tr);
} catch (e) {
AppLog.log('截图失败: $e');
}
}
void _getTVDataRefreshUIAction() {
state.getTVDataRefreshUIEvent = eventBus
.on<GetTVDataRefreshUI>()
.listen((GetTVDataRefreshUI event) async {
if (event.tvList.isNotEmpty && event.tvList.length > 100) {
final Uint8List imageData = Uint8List.fromList(event.tvList);
if (!listEquals(state.listPhotoData.value, imageData)) {
state.listPhotoData.value = imageData;
state.shouldUpdateUI.value = true;
if (state.shouldUpdateUI.value) {
setState(() {});
state.shouldUpdateUI.value = false;
}
}
}
});
}
@override
void dispose() {
super.dispose();
logic.stopProcessing();
state.getTVDataRefreshUIEvent!.cancel();
}
Widget _buildTalkView({required bool isMpeg4}) {
return isMpeg4 ? _buildMpeg4TalkView() : _buildH264TalkView();
}
Widget _buildMpeg4TalkView() {
return Stack(
children: <Widget>[
Image.memory(
state.listPhotoData.value,
gaplessPlayback: true,
width: 1.sw,
height: 1.sh,
fit: BoxFit.cover,
filterQuality: FilterQuality.high,
errorBuilder:
(BuildContext context, Object error, StackTrace? stackTrace) {
return Container(color: Colors.transparent);
},
),
Positioned(
top: ScreenUtil().statusBarHeight + 30.h,
width: 1.sw,
child: Obx(() {
final String sec =
(state.oneMinuteTime.value % 60).toString().padLeft(2, '0');
final String min =
(state.oneMinuteTime.value ~/ 60).toString().padLeft(2, '0');
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('$min:$sec',
style: TextStyle(fontSize: 26.sp, color: Colors.white)),
],
);
}),
),
Positioned(
bottom: 10.w,
child: Container(
width: 1.sw - 30.w * 2,
margin: EdgeInsets.all(30.w),
decoration: BoxDecoration(
color: const Color(0xC83C3F41),
borderRadius: BorderRadius.circular(20.h),
),
child: Column(
children: <Widget>[
SizedBox(height: 20.h),
buildTopButtons(),
SizedBox(height: 20.h),
buildBottomButtons(),
SizedBox(height: 20.h),
],
),
),
),
],
);
}
Widget _buildH264TalkView() {
return Stack(
children: <Widget>[
H264WebView(),
Positioned(
top: ScreenUtil().statusBarHeight + 30.h,
width: 1.sw,
child: Obx(() {
final String sec =
(state.oneMinuteTime.value % 60).toString().padLeft(2, '0');
final String min =
(state.oneMinuteTime.value ~/ 60).toString().padLeft(2, '0');
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('$min:$sec',
style: TextStyle(fontSize: 26.sp, color: Colors.white)),
],
);
}),
),
Positioned(
bottom: 10.w,
child: Container(
width: 1.sw - 30.w * 2,
margin: EdgeInsets.all(30.w),
decoration: BoxDecoration(
color: const Color(0xC83C3F41),
borderRadius: BorderRadius.circular(20.h),
),
child: Column(
children: <Widget>[
SizedBox(height: 20.h),
buildTopButtons(),
SizedBox(height: 20.h),
buildBottomButtons(),
SizedBox(height: 20.h),
],
),
),
),
],
);
}
}

View File

@ -0,0 +1,57 @@
import 'dart:async';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_voice_processor/flutter_voice_processor.dart';
import 'package:get/get.dart';
import 'package:network_info_plus/network_info_plus.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
import '../../../../tools/storage.dart';
class StarChartState {
RxBool isOpenVoice = false.obs;
int udpSendDataFrameNumber = 0; //
// var isSenderAudioData = false.obs;//
StreamSubscription? getTVDataRefreshUIEvent; //
RxBool shouldUpdateUI = false.obs; //UI
Future<String?> userMobileIP = NetworkInfo().getWifiIP();
Future<String?> userUid = Storage.getUid();
// RxInt udpStatus =
// 0.obs; //0 1 2 3 4 5 6 8 9
TextEditingController passwordTF = TextEditingController();
Rx<Uint8List> listPhotoData = Uint8List(0).obs; //
RxList<int> listAudioData = <int>[].obs; //
//
late VoiceProcessor? voiceProcessor;
RxBool isProcessing = false.obs; //
RxBool isButtonDisabled = false.obs; //
final int frameLength = 320; //320
final int sampleRate = 8000; //8000
RxString errorMessage = ''.obs;
List<List<int>> allFrames = <List<int>>[];
GlobalKey globalKey = GlobalKey();
late Timer oneMinuteTimeTimer =
Timer(const Duration(seconds: 1), () {}); // 60
RxInt oneMinuteTime = 0.obs; //
// 10
late Timer answerTimer = Timer(const Duration(seconds: 1), () {}); //
RxInt answerSeconds = 0.obs;
RxBool isClickAnswer = false.obs; //
late Timer hangUpTimer = Timer(const Duration(seconds: 1), () {}); //
RxInt hangUpSeconds = 0.obs;
RxBool isClickHangUp = false.obs; //
late Timer openDoorTimer = Timer(const Duration(seconds: 1), () {}); //
RxInt openDoorSeconds = 0.obs;
RxInt talkStatus = 0.obs; //
}

View File

@ -187,7 +187,7 @@ class _DemoModeLockDetailPageState extends State<DemoModeLockDetailPage> {
width: 6.w, width: 6.w,
), ),
Text( Text(
'网关设备'.tr, '网关设备英文'.tr,
style: style:
TextStyle(fontSize: 20.sp, color: AppColors.btnDisableColor), TextStyle(fontSize: 20.sp, color: AppColors.btnDisableColor),
), ),
@ -227,8 +227,8 @@ class _DemoModeLockDetailPageState extends State<DemoModeLockDetailPage> {
// //
// if (state.keyInfos.value.isAttendance == 1) { // if (state.keyInfos.value.isAttendance == 1) {
showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png', showWidgetArr
'考勤'.tr, () { .add(bottomItem('images/main/icon_main_clockingIn.png', '考勤'.tr, () {
// gotoLogin(); // gotoLogin();
Get.toNamed(Routers.checkingInListPage, Get.toNamed(Routers.checkingInListPage,
arguments: LockListInfoItemEntity()); arguments: LockListInfoItemEntity());
@ -237,34 +237,35 @@ class _DemoModeLockDetailPageState extends State<DemoModeLockDetailPage> {
final List<Widget> defaultWidgetArr = <Widget>[ final List<Widget> defaultWidgetArr = <Widget>[
// //
bottomItem('images/main/icon_main_electronicKey.png', bottomItem('images/main/icon_main_electronicKey.png', '电子钥匙'.tr, () {
'电子钥匙'.tr, () {
// gotoLogin(); // gotoLogin();
Get.toNamed(Routers.electronicKeyListPage, Get.toNamed(Routers.electronicKeyListPage,
arguments: <String, LockListInfoItemEntity>{'keyInfo': LockListInfoItemEntity()}); arguments: <String, LockListInfoItemEntity>{
'keyInfo': LockListInfoItemEntity()
});
}), }),
// //
bottomItem('images/main/icon_main_password.png', bottomItem('images/main/icon_main_password.png', '密码'.tr, () {
'密码'.tr, () {
// gotoLogin(); // gotoLogin();
Get.toNamed(Routers.passwordKeyListPage, Get.toNamed(Routers.passwordKeyListPage,
arguments: <String, LockListInfoItemEntity>{'keyInfo': LockListInfoItemEntity()}); arguments: <String, LockListInfoItemEntity>{
'keyInfo': LockListInfoItemEntity()
});
}), }),
// ic卡 // ic卡
bottomItem('images/main/icon_main_icCard.png', bottomItem('images/main/icon_main_icCard.png', ''.tr, () {
''.tr, () {
// gotoLogin(); // gotoLogin();
Get.toNamed(Routers.cardListPage, arguments: <String, int>{'lockId': 0}); Get.toNamed(Routers.cardListPage,
arguments: <String, int>{'lockId': 0});
}), }),
// //
bottomItem('images/main/icon_main_fingerprint.png', bottomItem('images/main/icon_main_fingerprint.png', '指纹'.tr, () {
'指纹'.tr, () {
// gotoLogin(); // gotoLogin();
Get.toNamed(Routers.fingerprintListPage, Get.toNamed(Routers.fingerprintListPage,
@ -272,8 +273,7 @@ class _DemoModeLockDetailPageState extends State<DemoModeLockDetailPage> {
}), }),
// //
bottomItem('images/main/icon_main_remoteControl.png', bottomItem('images/main/icon_main_remoteControl.png', '遥控'.tr, gotoLogin),
'遥控'.tr, gotoLogin),
]; ];
showWidgetArr.addAll(defaultWidgetArr); showWidgetArr.addAll(defaultWidgetArr);
@ -295,18 +295,21 @@ class _DemoModeLockDetailPageState extends State<DemoModeLockDetailPage> {
final List<Widget> endWiddget = <Widget>[ final List<Widget> endWiddget = <Widget>[
// //
bottomItem('images/main/icon_main_authorizedAdmin.png', bottomItem('images/main/icon_main_authorizedAdmin.png', '授权管理员'.tr, () {
'授权管理员'.tr, () {
// gotoLogin(); // gotoLogin();
Get.toNamed(Routers.authorizedAdminListPage, Get.toNamed(Routers.authorizedAdminListPage,
arguments: <String, LockListInfoItemEntity>{'keyInfo': LockListInfoItemEntity()}); arguments: <String, LockListInfoItemEntity>{
'keyInfo': LockListInfoItemEntity()
});
}), }),
// //
bottomItem('images/main/icon_main_operatingRecord.png', '操作记录'.tr, () { bottomItem('images/main/icon_main_operatingRecord.png', '操作记录'.tr, () {
// gotoLogin(); // gotoLogin();
Get.toNamed(Routers.lockOperatingRecordPage, Get.toNamed(Routers.lockOperatingRecordPage,
arguments: <String, LockListInfoItemEntity>{'keyInfo': LockListInfoItemEntity()}); arguments: <String, LockListInfoItemEntity>{
'keyInfo': LockListInfoItemEntity()
});
}), }),
// //
bottomItem('images/main/icon_lockDetail_videoLog.png', '视频日志'.tr, () { bottomItem('images/main/icon_lockDetail_videoLog.png', '视频日志'.tr, () {
@ -319,9 +322,7 @@ class _DemoModeLockDetailPageState extends State<DemoModeLockDetailPage> {
Get.toNamed(Routers.msgNotificationPage); Get.toNamed(Routers.msgNotificationPage);
}), }),
// //
bottomItem( bottomItem('images/main/icon_main_set.png', '设置'.tr, () {
'images/main/icon_main_set.png', '设置'.tr,
() {
Get.toNamed(Routers.demoModeLockSetPage); Get.toNamed(Routers.demoModeLockSetPage);
}), }),
]; ];

View File

@ -290,21 +290,25 @@ class _LockListXHJPageState extends State<LockListXHJPage> with RouteAware {
const Spacer(), const Spacer(),
Column( Column(
children: <Widget>[ children: <Widget>[
Row( SizedBox(
children: <Widget>[ width: (1.sw - 10.w * 3) / 2 - 48.w - 50.w,
Image.asset( child: Row(
logic.showElectricIcon(keyInfo.electricQuantity!), children: <Widget>[
width: 30.w, Spacer(),
height: 24.w, Image.asset(
), logic.showElectricIcon(keyInfo.electricQuantity!),
SizedBox(width: 2.w), width: 30.w,
Text( height: 24.w,
'${keyInfo.electricQuantity!}%', ),
style: TextStyle( SizedBox(width: 2.w),
fontSize: 16.sp, Text(
color: AppColors.darkGrayTextColor), '${keyInfo.electricQuantity!}%',
), style: TextStyle(
], fontSize: 16.sp,
color: AppColors.darkGrayTextColor),
),
],
),
), ),
SizedBox( SizedBox(
width: (1.sw - 10.w * 3) / 2 - 48.w - 50.w, width: (1.sw - 10.w * 3) / 2 - 48.w - 50.w,
@ -316,6 +320,7 @@ class _LockListXHJPageState extends State<LockListXHJPage> with RouteAware {
: '普通用户'.tr), : '普通用户'.tr),
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
textAlign: TextAlign.right,
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: AppColors.darkGrayTextColor), color: AppColors.darkGrayTextColor),

File diff suppressed because one or more lines are too long

View File

@ -3,6 +3,7 @@ import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/main/lockMian/lockMain/lockMain_page.dart'; import 'package:star_lock/main/lockMian/lockMain/lockMain_page.dart';
import 'package:star_lock/main/lockMian/lockMain/xhj/lockMain_xhj_state.dart'; import 'package:star_lock/main/lockMian/lockMain/xhj/lockMain_xhj_state.dart';
import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart';
@ -12,6 +13,8 @@ import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/push/xs_jPhush.dart'; import 'package:star_lock/tools/push/xs_jPhush.dart';
import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/storage.dart';
import '../../../../tools/store_service.dart';
class LockMainXHJLogic extends BaseGetXController { class LockMainXHJLogic extends BaseGetXController {
final LockMainXHJState state = LockMainXHJState(); final LockMainXHJState state = LockMainXHJState();
@ -26,15 +29,20 @@ class LockMainXHJLogic extends BaseGetXController {
Future<void> getUserInfoRequest() async { Future<void> getUserInfoRequest() async {
final MinePersonInfoEntity entity = await ApiRepository.to.getUserInfo(); final MinePersonInfoEntity entity = await ApiRepository.to.getUserInfo();
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
final String languageCodeAndCountryCode = entity.data!.lang ?? 'zh-CN'; final String languageCodeAndCountryCode = entity.data!.lang!;
if (languageCodeAndCountryCode.contains('-')) { if (languageCodeAndCountryCode.isEmpty) {
await StoreService.to.saveLanguageCode('');
} else if (languageCodeAndCountryCode.contains('-')) {
final List<String> parts = languageCodeAndCountryCode.split('-'); final List<String> parts = languageCodeAndCountryCode.split('-');
final Locale locale = Locale(parts[0], parts[1]); final Locale locale = Locale(parts[0], parts[1]);
Get.updateLocale(locale); await Get.updateLocale(locale);
await StoreService.to.saveLanguageCode(locale.toString());
} else if (languageCodeAndCountryCode.contains('_')) { } else if (languageCodeAndCountryCode.contains('_')) {
final List<String> parts = languageCodeAndCountryCode.split('_'); final List<String> parts = languageCodeAndCountryCode.split('_');
final Locale locale = Locale(parts[0], parts[1]); final Locale locale = Locale(parts[0], parts[1]);
Get.updateLocale(locale); await Get.updateLocale(locale);
AppLog.log('用户信息请求成功 更新locale: $locale');
await StoreService.to.saveLanguageCode(locale.toString());
} }
Storage.setBool(saveIsVip, entity.data!.isVip == 1); Storage.setBool(saveIsVip, entity.data!.isVip == 1);

View File

@ -5,6 +5,9 @@ import 'package:star_lock/tools/baseGetXController.dart';
import '../../main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; import '../../main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart';
import '../../network/api_repository.dart'; import '../../network/api_repository.dart';
import '../../tools/eventBusEventManage.dart'; import '../../tools/eventBusEventManage.dart';
import '../../tools/store_service.dart';
import '../../translations/app_dept.dart';
import '../../translations/current_locale_tool.dart';
import 'mineMultiLanguage_state.dart'; import 'mineMultiLanguage_state.dart';
class MineMultiLanguageLogic extends GetxController { class MineMultiLanguageLogic extends GetxController {
@ -13,20 +16,21 @@ class MineMultiLanguageLogic extends GetxController {
// //
Future<void> updateUserLangInfo(Locale l) async { Future<void> updateUserLangInfo(Locale l) async {
// AppLog.log('lanTypeTitle: $lanTypeTitle'); // AppLog.log('lanTypeTitle: $lanTypeTitle');
String lang = l.toString();
final String lang = l.toLanguageTag(); if (state.currentLanguageType.value == LanguageType.system) {
lang = '';
}
final PasswordKeyListEntity entity = final PasswordKeyListEntity entity =
await ApiRepository.to.updateUserLangInfo(lang: lang); await ApiRepository.to.updateUserLangInfo(lang: lang);
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
await changeLanguage(l); await changeLanguage(l);
eventBus.fire(ChangeLanguageBlockLastLanguageEvent()); eventBus.fire(ChangeLanguageBlockLastLanguageEvent());
print('发送语言变化事件');
} }
} }
Future<void> changeLanguage(Locale l) async { Future<void> changeLanguage(Locale l) async {
if (l == Get.locale) return;
await Get.updateLocale(l); await Get.updateLocale(l);
state.resetLan(); await StoreService.to.saveLanguageCode(
CurrentLocaleTool.convertLocale(Get.locale!).toString());
} }
} }

View File

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/mine/mineMultiLanguage/mineMultiLanguage_state.dart'; import 'package:star_lock/mine/mineMultiLanguage/mineMultiLanguage_state.dart';
import 'package:star_lock/translations/current_locale_tool.dart';
import '../../app_settings/app_colors.dart'; import '../../app_settings/app_colors.dart';
import '../../tools/commonItem.dart'; import '../../tools/commonItem.dart';
@ -26,35 +26,66 @@ class _MineMultiLanguagePageState extends State<MineMultiLanguagePage> {
return Scaffold( return Scaffold(
backgroundColor: AppColors.mainBackgroundColor, backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar( appBar: TitleAppBar(
barTitle: '多语言'.tr, barTitle: '多语言'.tr,
haveBack: true, haveBack: true,
backgroundColor: AppColors.mainColor), backgroundColor: AppColors.mainColor,
body: ListView( actionsList: [
// mainAxisAlignment: MainAxisAlignment.start, TextButton(
// mainAxisSize: MainAxisSize.min, onPressed: () async {
children: _children(), await logic.updateUserLangInfo(state.seletLocale);
) final String lanTypeTitle =
); ExtensionLanguageType.fromLocale(state.seletLocale)
.lanTitle;
Get.back(result: {'currentLanguage': lanTypeTitle});
},
child: Text(
'保存'.tr,
style: TextStyle(
color: Colors.white,
fontSize: 22.sp,
),
),
),
],
),
body: Obx(() => ListView(
// mainAxisAlignment: MainAxisAlignment.start,
// mainAxisSize: MainAxisSize.min,
children: _children(),
)));
} }
List<Widget> _children() { List<Widget> _children() {
final List<Widget> l = <Widget>[]; final List<Widget> l = <Widget>[];
// l.add( l.add(
// CommonItem( CommonItem(
// leftTitel: '跟随系统', leftTitel: '跟随系统',
// rightTitle: "", rightTitle: '',
// isHaveLine: true, isHaveLine: true,
// isHaveDirection: false, isHaveDirection: false,
// isHaveRightWidget: true, isHaveRightWidget: true,
// rightWidget: Container(), rightWidget: state.currentLanguageType.value == LanguageType.system
// action: () { ? Image(
// // logic.changeLanguage(e); image: const AssetImage('images/icon_item_checked.png'),
// }), width: 30.w,
// ); height: 30.w,
fit: BoxFit.contain,
)
: Container(),
action: () {
state.seletLocale =
CurrentLocaleTool.convertLocale(Get.deviceLocale!);
state.currentLanguageType.value = LanguageType.system;
}),
);
for (int i = 0; i < state.languages.length; i++) { for (int i = 0; i < state.languages.length; i++) {
final Locale e = state.languages[i]; final Locale e = state.languages[i];
final LanguageType lanType = ExtensionLanguageType.fromLocale(e); final LanguageType lanType = ExtensionLanguageType.fromLocale(e);
// AppLog.log('e:$e lanType:$lanType state.currentLanguageType.value:${state.currentLanguageType.value} Get.locale!.languageCode:${Get.locale!.languageCode} Get.locale!.countryCode:${Get.locale!.countryCode}'); // AppLog.log('e:$e lanType:$lanType state.currentLanguageType.value:${state.currentLanguageType.value} Get.locale!.languageCode:${Get.locale!.languageCode} Get.locale!.countryCode:${Get.locale!.countryCode}');
if (state.currentLanguageType.value == lanType) {
state.seletLocale = e;
}
l.add( l.add(
CommonItem( CommonItem(
leftTitel: lanType.lanTitle, leftTitel: lanType.lanTitle,
@ -62,17 +93,19 @@ class _MineMultiLanguagePageState extends State<MineMultiLanguagePage> {
isHaveLine: true, isHaveLine: true,
isHaveDirection: false, isHaveDirection: false,
isHaveRightWidget: true, isHaveRightWidget: true,
rightWidget: Obx(() => state.currentLanguageType.value == lanType rightWidget: state.currentLanguageType.value == lanType
? Image( ? Image(
image: const AssetImage('images/icon_item_checked.png'), image: const AssetImage('images/icon_item_checked.png'),
width: 30.w, width: 30.w,
height: 30.w, height: 30.w,
fit: BoxFit.contain, fit: BoxFit.contain,
) )
: Container()), : Container(),
action: () { action: () {
logic.updateUserLangInfo(e); // logic.updateUserLangInfo(e);
// eventBus.fire(ChangeLanguageBlockLastLanguageEvent(lanType.lanTitle)); state.seletLocale = e;
state.currentLanguageType.value =
ExtensionLanguageType.fromLocale(state.seletLocale);
}), }),
); );
} }

View File

@ -6,19 +6,16 @@ import '../../tools/store_service.dart';
import '../../translations/app_dept.dart'; import '../../translations/app_dept.dart';
class MineMultiLanguageState { class MineMultiLanguageState {
MineMultiLanguageState() { // MineMultiLanguageState() {
resetLan(); // resetLan();
} // }
List<Locale> get languages { List<Locale> get languages {
return appDept.deptSupportedLocales; return appDept.deptSupportedLocales;
} }
var currentLanguageType = ExtensionLanguageType.fromLocale(Get.locale!).obs; Rx<LanguageType> currentLanguageType =
ExtensionLanguageType.fromLocale(Get.locale!).obs;
Future<void> resetLan() async { late Locale seletLocale;
currentLanguageType.value = ExtensionLanguageType.fromLocale(Get.locale!);
// AppLog.log('currentLanguageType.value:${currentLanguageType.value} Get.locale!.languageCode:${Get.locale!.languageCode} languages:$languages');
await StoreService.to.saveLanguageCode(Get.locale!.toString());
}
} }

View File

@ -1,4 +1,4 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:flutter_slidable/flutter_slidable.dart';
@ -25,7 +25,8 @@ class LockUserManageListPage extends StatefulWidget {
class _LockUserManageListPageState extends State<LockUserManageListPage> { class _LockUserManageListPageState extends State<LockUserManageListPage> {
final LockUserManageListLogic logic = Get.put(LockUserManageListLogic()); final LockUserManageListLogic logic = Get.put(LockUserManageListLogic());
final LockUserManageListState state = Get.find<LockUserManageListLogic>().state; final LockUserManageListState state =
Get.find<LockUserManageListLogic>().state;
Future<void> getHttpData() async { Future<void> getHttpData() async {
logic.lockUserListRequest().then((LockUserListEntity value) { logic.lockUserListRequest().then((LockUserListEntity value) {
@ -167,8 +168,9 @@ class _LockUserManageListPageState extends State<LockUserManageListPage> {
arguments: <String, int?>{'uid': itemData.uid}); arguments: <String, int?>{'uid': itemData.uid});
}, },
child: Container( child: Container(
height: 90.h, // height: 90.h,
color: Colors.white, color: Colors.white,
padding: EdgeInsets.only(top: 15.h, bottom: 15.h),
// decoration: BoxDecoration( // decoration: BoxDecoration(
// color: Colors.white, // color: Colors.white,
// borderRadius: BorderRadius.circular(10.w), // borderRadius: BorderRadius.circular(10.w),
@ -192,17 +194,20 @@ class _LockUserManageListPageState extends State<LockUserManageListPage> {
SizedBox( SizedBox(
width: 20.w, width: 20.w,
), ),
Expanded( SizedBox(
width: 1.sw - 30.w - 60.w - 20.w - 20.w - 20.w - 12.w,
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Row( Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[ children: <Widget>[
Text( Expanded(
itemData.nickname ?? '', child: Text(
style: TextStyle( itemData.nickname ?? '',
fontSize: 24.sp, color: AppColors.blackColor), style: TextStyle(
fontSize: 24.sp, color: AppColors.blackColor),
),
), ),
], ],
), ),
@ -234,7 +239,8 @@ class _LockUserManageListPageState extends State<LockUserManageListPage> {
); );
} }
void showIosTipViewDialog(BuildContext context, LockUserItemData lockUserData) { void showIosTipViewDialog(
BuildContext context, LockUserItemData lockUserData) {
showDialog( showDialog(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {

View File

@ -18,14 +18,10 @@ import 'package:umeng_common_sdk/umeng_common_sdk.dart';
import '../../../../network/api_repository.dart'; import '../../../../network/api_repository.dart';
import '../../../../tools/baseGetXController.dart'; import '../../../../tools/baseGetXController.dart';
import '../../../app_settings/app_settings.dart';
import '../../../blue/blue_manage.dart'; import '../../../blue/blue_manage.dart';
import '../../../talk/udp/udp_help.dart'; import '../../../talk/udp/udp_help.dart';
import '../../../tools/change_language_format.dart';
import '../../../tools/dateTool.dart'; import '../../../tools/dateTool.dart';
import '../../../tools/eventBusEventManage.dart';
import '../../../tools/store_service.dart'; import '../../../tools/store_service.dart';
import '../../../translations/app_dept.dart';
class MineSetLogic extends BaseGetXController { class MineSetLogic extends BaseGetXController {
final MineSetState state = MineSetState(); final MineSetState state = MineSetState();
@ -180,46 +176,14 @@ class MineSetLogic extends BaseGetXController {
} }
} }
// // //
StreamSubscription? _getNumberEvent; // StreamSubscription? _getNumberEvent;
void _initLoadDataAction() { // void _initLoadDataAction() {
// eventBus // // eventBus
_getNumberEvent = eventBus // _getNumberEvent = eventBus
.on<ChangeLanguageBlockLastLanguageEvent>() // .on<ChangeLanguageBlockLastLanguageEvent>()
.listen((ChangeLanguageBlockLastLanguageEvent event) { // .listen((ChangeLanguageBlockLastLanguageEvent event) {
state.currentLanguage.value = _getCurrentLanguage(); // state.currentLanguage.value = CurrentLocaleTool.getCurrentLocaleString();
}); // });
} // }
String _getCurrentLanguage() {
String? language = StoreService.to.getLanguageCode();
AppLog.log('language: $language Get.locale!: ${Get.locale!}');
if (language!.isEmpty) {
language = ChangeLanguageFormat.convertLocale(Get.locale!).toString();
}
AppLog.log('language: $language');
final String currentLanguage = ExtensionLanguageType.fromLocale(appDept
.deptSupportedLocales
.where((Locale element) => element.toString() == language)
.first)
.lanTitle;
return currentLanguage;
}
@override
void onReady() {
super.onReady();
state.currentLanguage.value = _getCurrentLanguage();
_initLoadDataAction();
getUserInfoRequest();
}
@override
void onClose() {
super.onClose();
_getNumberEvent!.cancel();
}
} }

View File

@ -6,7 +6,9 @@ import 'package:flutter/widgets.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get/get_state_manager/get_state_manager.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/flavors.dart'; import 'package:star_lock/flavors.dart';
import 'package:star_lock/mine/mineSet/mineSet/mineSet_logic.dart'; import 'package:star_lock/mine/mineSet/mineSet/mineSet_logic.dart';
import 'package:star_lock/mine/mineSet/mineSet/mineSet_state.dart'; import 'package:star_lock/mine/mineSet/mineSet/mineSet_state.dart';
@ -170,7 +172,6 @@ class _MineSetPageState extends State<MineSetPage>
Widget getListDataView() { Widget getListDataView() {
// //
bool isChinese = LanguageTool.instance.isChinese;
return Column( return Column(
children: <Widget>[ children: <Widget>[
/* 2024-01-12 by DaisyWu /* 2024-01-12 by DaisyWu
@ -214,8 +215,9 @@ class _MineSetPageState extends State<MineSetPage>
height: 50.h, height: 50.h,
child: Obx(_isPushNotificationSwitch))), child: Obx(_isPushNotificationSwitch))),
// if (F.appFlavor == Flavor.sky) // if (F.appFlavor == Flavor.sky)
if (isChinese) Visibility(
CommonItem( visible: state.currentLanguageName == '简体中文'.tr,
child: CommonItem(
leftTitel: '微信公众号推送'.tr, leftTitel: '微信公众号推送'.tr,
rightTitle: '', rightTitle: '',
isHaveLine: true, isHaveLine: true,
@ -225,9 +227,8 @@ class _MineSetPageState extends State<MineSetPage>
height: 50.h, height: 50.h,
child: Obx(_isWechatPublicAccountPushSwitch), child: Obx(_isWechatPublicAccountPushSwitch),
), ),
) ),
else ),
Container(),
SizedBox(height: 10.h), SizedBox(height: 10.h),
CommonItem( CommonItem(
leftTitel: '锁用户管理'.tr, leftTitel: '锁用户管理'.tr,
@ -292,19 +293,22 @@ class _MineSetPageState extends State<MineSetPage>
SizedBox( SizedBox(
height: 10.h, height: 10.h,
), ),
Obx(() => CommonItem( Obx(() {
leftTitel: '多语言'.tr, AppLog.log(
rightTitle: state.currentLanguage.value, 'state.currentLanguageName: ${state.currentLanguageName} state.currentLanguage.value: ${state.currentLanguage.value}');
isHaveLine: true, return CommonItem(
isHaveDirection: true, leftTitel: '多语言'.tr,
action: () async { rightTitle: state.currentLanguageName,
// Get.toNamed(Routers.mineMultiLanguagePage); isHaveLine: true,
var result = await Get.toNamed(Routers.mineMultiLanguagePage); isHaveDirection: true,
if (result != null) { action: () async {
result as Map<String, dynamic>; // Get.toNamed(Routers.mineMultiLanguagePage);
state.currentLanguage.value = result['currentLanguage']; await Get.toNamed(Routers.mineMultiLanguagePage)!.then(
} (value) => {
})), state.currentLanguage.value = value['currentLanguage']
});
});
}),
/* 2024-01-12 by DaisyWu /* 2024-01-12 by DaisyWu
Obx(() => CommonItem( Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.lockScreen!.tr, leftTitel: TranslationLoader.lanKeys!.lockScreen!.tr,

View File

@ -3,6 +3,9 @@ import 'package:get/get.dart';
import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart';
import 'package:star_lock/mine/mineSet/mineSet/userSettingInfoEntity.dart'; import 'package:star_lock/mine/mineSet/mineSet/userSettingInfoEntity.dart';
import '../../../translations/app_dept.dart';
import '../../../translations/current_locale_tool.dart';
class MineSetState { class MineSetState {
final Rx<UserSettingInfoData> userInfoData = UserSettingInfoData().obs; final Rx<UserSettingInfoData> userInfoData = UserSettingInfoData().obs;
final Rx<UserSettings> userSetting = UserSettings().obs; final Rx<UserSettings> userSetting = UserSettings().obs;
@ -16,7 +19,17 @@ class MineSetState {
RxInt lockScreen = 2.obs; // RxInt lockScreen = 2.obs; //
RxInt hideExpiredAccessFlag = 2.obs; // RxInt hideExpiredAccessFlag = 2.obs; //
RxString currentLanguage = ''.obs; // RxString currentLanguage =
CurrentLocaleTool.getCurrentLocaleString().obs; //
///
String get currentLanguageName {
return ExtensionLanguageType.fromLocale(
CurrentLocaleTool.getCurrentLocaleWithLanguageCode(
currentLanguage.value))
.lanTitle;
}
RxBool isAmazonAlexa = false.obs; //Alexa RxBool isAmazonAlexa = false.obs; //Alexa
RxBool isGoogleHome = false.obs; //Home RxBool isGoogleHome = false.obs; //Home
Rx<AmazonAlexa> amazonAlexaData = AmazonAlexa().obs; Rx<AmazonAlexa> amazonAlexaData = AmazonAlexa().obs;

View File

@ -2707,7 +2707,8 @@ class ApiProvider extends BaseProvider {
'starchartPeerPublicKey': starchartPeerPublicKey, 'starchartPeerPublicKey': starchartPeerPublicKey,
'starchartPeerPrivateKey': starchartPeerPrivateKey, 'starchartPeerPrivateKey': starchartPeerPrivateKey,
}), }),
isUnShowLoading: true); isUnShowLoading: true,
isShowNetworkErrorMsg: false);
} }
extension ExtensionString on String { extension ExtensionString on String {

View File

@ -2021,7 +2021,7 @@ class ApiRepository {
// //
Future<MinePersonInfoEntity> getUserInfo() async { Future<MinePersonInfoEntity> getUserInfo() async {
final res = await apiProvider.getUserInfo(""); final res = await apiProvider.getUserInfo('');
return MinePersonInfoEntity.fromJson(res.body); return MinePersonInfoEntity.fromJson(res.body);
} }

View File

@ -1,16 +1,12 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:ui';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get/get_connect/http/src/request/request.dart'; import 'package:get/get_connect/http/src/request/request.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/login/login/entity/LoginData.dart'; import 'package:star_lock/login/login/entity/LoginData.dart';
import '../tools/change_language_format.dart';
import '../tools/platform_info_services.dart'; import '../tools/platform_info_services.dart';
import '../tools/storage.dart'; import '../tools/storage.dart';
import '../tools/store_service.dart'; import '../translations/current_locale_tool.dart';
import '../translations/app_dept.dart';
//UA //UA
String getUserAgent() { String getUserAgent() {
@ -22,8 +18,8 @@ String getUserAgent() {
FutureOr<Request> requestInterceptor(Request request) async { FutureOr<Request> requestInterceptor(Request request) async {
request.headers['User-Agent'] = getUserAgent(); request.headers['User-Agent'] = getUserAgent();
request.headers['Accept-Language'] = request.headers['Accept-Language'] = CurrentLocaleTool
getLanguageCode(); // StoreService.to.getLanguageCode() .getCurrentLocaleString(); // StoreService.to.getLanguageCode()
// request.headers['Content-Type'] = 'application/json'; // request.headers['Content-Type'] = 'application/json';
// request.headers['token'] = StoreService.to.userToken!; // request.headers['token'] = StoreService.to.userToken!;
String? xToken = ''; String? xToken = '';
@ -34,17 +30,3 @@ FutureOr<Request> requestInterceptor(Request request) async {
request.headers['Authorization'] = "Bearer ${xToken ?? ''}"; request.headers['Authorization'] = "Bearer ${xToken ?? ''}";
return request; return request;
} }
String getLanguageCode() {
final Locale locale = StoreService.to.getLanguageCode()!.isNotEmpty
? appDept.deptSupportedLocales
.where((Locale element) =>
element.toString() == StoreService.to.getLanguageCode())
.first
: Get.locale!; // Get.deviceLocale;
String languageCode =
ChangeLanguageFormat.convertLocale(locale).toLanguageTag();
AppLog.log(
'languageCode: ${locale.toLanguageTag()} locale: $locale languageCode:$languageCode');
return languageCode;
}

View File

@ -0,0 +1,42 @@
import 'package:flutter/widgets.dart';
import 'package:star_lock/talk/startChart/start_chart_manage.dart';
class AppLifecycleObserver extends WidgetsBindingObserver {
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
//
print('AppLifecycleState: $state');
//
if (state == AppLifecycleState.paused) {
//
onAppPaused();
} else if (state == AppLifecycleState.resumed) {
//
onAppResumed();
} else if (state == AppLifecycleState.detached) {
//
onAppDetached();
}
}
void onAppPaused() {
//
print('App has entered the background.');
StartChartManage().destruction();
}
void onAppResumed() {
//
StartChartManage().init();
print('App has resumed to the foreground.');
}
void onAppDetached() {
//
StartChartManage().destruction();
print('App has been detached.');
}
}

View File

@ -16,22 +16,44 @@ import 'package:star_lock/talk/startChart/proto/talk_reject.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_request.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_request.pb.dart';
class MessageCommand { class MessageCommand {
// ToPeerId messageId
static Map<String, int> _messageIdMap = {};
static int _maxIntValue = 9223372036854775807; // Dart int
// ID
static int getNextMessageId(String toPeerId, {bool increment = true}) {
if (_messageIdMap.containsKey(toPeerId)) {
if (increment) {
_messageIdMap[toPeerId] = _messageIdMap[toPeerId]! + 1;
// messageId int 1
if (_messageIdMap[toPeerId]! > _maxIntValue) {
_messageIdMap[toPeerId] = 1;
}
}
} else {
_messageIdMap[toPeerId] = 1;
}
return _messageIdMap[toPeerId]!;
}
/// 线 /// 线
static List<int> goOnlineRelay({ static List<int> goOnlineRelay({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
String serializedBytesString = ScpMessage( String serializedBytesString = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: 'hello', Payload: [0],
PayloadCRC: 55230, PayloadCRC: 0,
PayloadLength: 5, PayloadLength: 0,
PayloadType: PayloadTypeConstant.goOnline, PayloadType: PayloadTypeConstant.goOnline,
).serialize(); ).serialize();
return _hexToBytes(serializedBytesString); return _hexToBytes(serializedBytesString);
@ -41,19 +63,22 @@ class MessageCommand {
static List<int> echoMessage({ static List<int> echoMessage({
required String ToPeerId, required String ToPeerId,
required String FromPeerId, required String FromPeerId,
List<int>? payload,
int? SpTotal,
int? SpIndex,
int? MessageId,
}) { }) {
String payload = 'hello';
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: SpTotal,
SpIndex: 0, SpIndex: SpIndex,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
PayloadCRC: calculationCrc(_stringToUint8List(payload)), PayloadCRC: calculationCrcFromIntList(payload ?? []),
PayloadLength: payload.length, PayloadLength: payload?.length ?? 0,
PayloadType: PayloadTypeConstant.echoTest, PayloadType: PayloadTypeConstant.echoTest,
); );
String serializedBytesString = message.serialize(); String serializedBytesString = message.serialize();
@ -64,14 +89,15 @@ class MessageCommand {
static List<int> heartbeatMessage({ static List<int> heartbeatMessage({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
String payload = 'hello'; String payload = 'hello';
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -89,6 +115,7 @@ class MessageCommand {
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
required int time, required int time,
int? MessageId,
}) { }) {
// //
final gatewayResetReq = GatewayResetReq( final gatewayResetReq = GatewayResetReq(
@ -100,9 +127,9 @@ class MessageCommand {
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -118,15 +145,16 @@ class MessageCommand {
static List<int> talkAcceptMessage({ static List<int> talkAcceptMessage({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
final talkAcceptReq = TalkAcceptReq(); final talkAcceptReq = TalkAcceptReq();
final payload = talkAcceptReq.writeToBuffer(); final payload = talkAcceptReq.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -142,15 +170,16 @@ class MessageCommand {
static List<int> talkRequestMessage({ static List<int> talkRequestMessage({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
final talkReq = TalkReq(); final talkReq = TalkReq();
final payload = talkReq.writeToBuffer(); final payload = talkReq.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -166,15 +195,16 @@ class MessageCommand {
static List<int> talkRejectMessage({ static List<int> talkRejectMessage({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
final talkReject = TalkReject(); final talkReject = TalkReject();
final payload = talkReject.writeToBuffer(); final payload = talkReject.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -190,15 +220,16 @@ class MessageCommand {
static List<int> talkPingMessage({ static List<int> talkPingMessage({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
final talkPing = TalkPing(); final talkPing = TalkPing();
final payload = talkPing.writeToBuffer(); final payload = talkPing.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -214,15 +245,16 @@ class MessageCommand {
static List<int> talkHangupMessage({ static List<int> talkHangupMessage({
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
int? MessageId,
}) { }) {
final talkHangup = TalkHangup(); final talkHangup = TalkHangup();
final payload = talkHangup.writeToBuffer(); final payload = talkHangup.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -239,14 +271,15 @@ class MessageCommand {
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
required TalkData talkData, required TalkData talkData,
int? MessageId,
}) { }) {
final payload = talkData.writeToBuffer(); final payload = talkData.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.RealTimeData, MessageType: MessageTypeConstant.RealTimeData,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -263,14 +296,15 @@ class MessageCommand {
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
required TalkExpect talkExpect, required TalkExpect talkExpect,
int? MessageId,
}) { }) {
final payload = talkExpect.writeToBuffer(); final payload = talkExpect.writeToBuffer();
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req, MessageType: MessageTypeConstant.Req,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -287,6 +321,7 @@ class MessageCommand {
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
required int PayloadType, required int PayloadType,
int? MessageId,
}) { }) {
final genericResp = GenericResp(); final genericResp = GenericResp();
genericResp.message = 'ok'; genericResp.message = 'ok';
@ -295,9 +330,9 @@ class MessageCommand {
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Resp, MessageType: MessageTypeConstant.Resp,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -314,6 +349,7 @@ class MessageCommand {
required String FromPeerId, required String FromPeerId,
required String ToPeerId, required String ToPeerId,
required int PayloadType, required int PayloadType,
int? MessageId,
}) { }) {
final genericResp = GenericResp(); final genericResp = GenericResp();
genericResp.message = 'error'; genericResp.message = 'error';
@ -322,9 +358,9 @@ class MessageCommand {
ScpMessage message = ScpMessage( ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01, ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Resp, MessageType: MessageTypeConstant.Resp,
MessageId: 1, MessageId: MessageId,
SpTotal: 0, SpTotal: 1,
SpIndex: 0, SpIndex: 1,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
Payload: payload, Payload: payload,
@ -351,6 +387,15 @@ class MessageCommand {
return crc32Value; return crc32Value;
} }
// List<int>
static int calculationCrcFromIntList(List<int> intList) {
// List<int> Uint8List
final Uint8List uint8Payload = Uint8List.fromList(intList);
// calculationCrc
return calculationCrc(uint8Payload);
}
// Uint8List // Uint8List
static Uint8List _stringToUint8List(String input) { static Uint8List _stringToUint8List(String input) {
return Uint8List.fromList(utf8.encode(input)); return Uint8List.fromList(utf8.encode(input));

View File

@ -1,9 +1,12 @@
import 'dart:convert'; import 'dart:convert';
import 'package:get/get.dart';
import 'package:protobuf/protobuf.dart';
import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/talk/startChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/message_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/entity/heartbeat_response.dart'; import 'package:star_lock/talk/startChart/entity/heartbeat_response.dart';
import 'package:star_lock/talk/startChart/entity/login_response.dart'; import 'package:star_lock/talk/startChart/entity/login_response.dart';
import 'package:star_lock/talk/startChart/handle/other/talk_data_repository.dart';
import 'package:star_lock/talk/startChart/proto/ble_message.pb.dart'; import 'package:star_lock/talk/startChart/proto/ble_message.pb.dart';
import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart'; import 'package:star_lock/talk/startChart/proto/gateway_reset.pb.dart';
import 'package:star_lock/talk/startChart/proto/gateway_transfer.pb.dart'; import 'package:star_lock/talk/startChart/proto/gateway_transfer.pb.dart';
@ -20,6 +23,10 @@ import 'package:star_lock/talk/startChart/proto/talk_reject.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_request.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_request.pb.dart';
class ScpMessage { class ScpMessage {
///
// messageId
static Map<int, List<List<int>>> _packetBuffer = {};
ScpMessage({ ScpMessage({
this.ProtocolFlag, this.ProtocolFlag,
this.MessageType, this.MessageType,
@ -149,7 +156,7 @@ class ScpMessage {
// Payload () // Payload ()
if (Payload != null && Payload is String) { if (Payload != null && Payload is String) {
bytes.addAll(utf8.encode(Payload!)); bytes.addAll(utf8.encode(Payload!));
} else { } else if (Payload != null) {
// //
bytes.addAll(Payload); bytes.addAll(Payload);
} }
@ -163,7 +170,12 @@ class ScpMessage {
static ScpMessage deserialize(List<int> bytes) { static ScpMessage deserialize(List<int> bytes) {
final message = ScpMessage(); final message = ScpMessage();
int offset = 0; int offset = 0;
// Convert byte array to hex string with zero padding and without spaces
String hexString =
bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
// Log the hex string
_log(text: '原始字节数组: $hexString');
// ProtocolFlag (4 bytes) // ProtocolFlag (4 bytes)
if (bytes.length - offset >= 4) { if (bytes.length - offset >= 4) {
message.ProtocolFlag = utf8.decode(bytes.sublist(offset, offset + 4)); message.ProtocolFlag = utf8.decode(bytes.sublist(offset, offset + 4));
@ -253,7 +265,6 @@ class ScpMessage {
if (message.PayloadLength != null && if (message.PayloadLength != null &&
bytes.length - offset >= message.PayloadLength!) { bytes.length - offset >= message.PayloadLength!) {
final sublist = bytes.sublist(offset, offset + message.PayloadLength!); final sublist = bytes.sublist(offset, offset + message.PayloadLength!);
// print('sublist:$sublist');
offset += message.PayloadLength!; offset += message.PayloadLength!;
message.Payload = _handlePayLoad( message.Payload = _handlePayLoad(
payloadType: message.PayloadType ?? 0, payloadType: message.PayloadType ?? 0,
@ -261,7 +272,13 @@ class ScpMessage {
byte: sublist, byte: sublist,
offset: offset, offset: offset,
PayloadLength: message.PayloadLength, PayloadLength: message.PayloadLength,
spIndex: message.SpIndex,
spTotal: message.SpTotal,
messageId: message.MessageId,
); );
// if (message.Payload != null && message.Payload is List<int>) {
// message.PayloadLength = message.Payload.length;
// }
} else { } else {
throw FormatException("Invalid Payload or PayloadLength"); throw FormatException("Invalid Payload or PayloadLength");
} }
@ -269,20 +286,6 @@ class ScpMessage {
return message; return message;
} }
static String bytesToHex(List<int> bytes) {
return bytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join('');
}
// 16
static List<int> hexToBytes(String hexString) {
final bytes = <int>[];
for (int i = 0; i < hexString.length; i += 2) {
final hexByte = hexString.substring(i, i + 2);
bytes.add(int.parse(hexByte, radix: 16));
}
return bytes;
}
// payloadType序列化对应的payload结构体 // payloadType序列化对应的payload结构体
static dynamic _handlePayLoad({ static dynamic _handlePayLoad({
required int payloadType, required int payloadType,
@ -290,6 +293,9 @@ class ScpMessage {
required List<int> byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId,
}) { }) {
try { try {
switch (payloadType) { switch (payloadType) {
@ -304,8 +310,23 @@ class ScpMessage {
return heartbeatResponse; return heartbeatResponse;
case PayloadTypeConstant.echoTest: case PayloadTypeConstant.echoTest:
// //
String payload = utf8.decode(byte); if (spTotal != null &&
return payload; spTotal > 1 &&
messageId != null &&
spIndex != null) {
//
return _handleFragmentedPayload(
messageId: messageId,
spTotal: spTotal,
spIndex: spIndex,
byte: byte,
payloadType: payloadType,
);
} else {
// spTotal 1 byte
String payload = utf8.decode(byte);
return payload;
}
case PayloadTypeConstant.gatewayReset: case PayloadTypeConstant.gatewayReset:
// //
if (messageType == MessageTypeConstant.Resp) { if (messageType == MessageTypeConstant.Resp) {
@ -430,8 +451,24 @@ class ScpMessage {
final GenericResp genericResp = GenericResp.fromBuffer(byte); final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp; return genericResp;
} else if (messageType == MessageTypeConstant.RealTimeData) { } else if (messageType == MessageTypeConstant.RealTimeData) {
final TalkData talkData = TalkData.fromBuffer(byte); //
return talkData; if (spTotal != null &&
spTotal > 1 &&
messageId != null &&
spIndex != null) {
//
return _handleFragmentedPayload(
messageId: messageId,
spTotal: spTotal,
spIndex: spIndex,
byte: byte,
payloadType: payloadType,
);
} else {
//
final TalkData talkData = TalkData.fromBuffer(byte);
return talkData;
}
} else { } else {
String payload = utf8.decode(byte); String payload = utf8.decode(byte);
return payload; return payload;
@ -452,14 +489,75 @@ class ScpMessage {
String payload = utf8.decode(byte); String payload = utf8.decode(byte);
return payload; return payload;
} }
} catch (e) { } catch (e, stackTrace) {
//
_log(text: '❌反序列化udp数据时遇到错误----》$e'); _log(text: '❌反序列化udp数据时遇到错误----》$e');
String payload = utf8.decode(byte); //
return payload; _log(text: '堆栈跟踪:\n$stackTrace');
return '';
} }
} }
static String bytesToHex(List<int> bytes) {
return bytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join('');
}
// 16
static List<int> hexToBytes(String hexString) {
final bytes = <int>[];
for (int i = 0; i < hexString.length; i += 2) {
final hexByte = hexString.substring(i, i + 2);
bytes.add(int.parse(hexByte, radix: 16));
}
return bytes;
}
static void _log({required String text}) { static void _log({required String text}) {
AppLog.log('=====${text}'); AppLog.log('=====${text}');
} }
///
/// null
static dynamic _handleFragmentedPayload({
required int messageId,
required int spTotal,
required int spIndex,
required List<int> byte,
required int payloadType,
}) {
//
if (!_packetBuffer.containsKey(messageId)) {
_packetBuffer[messageId] = List.filled(spTotal, []);
}
//
if (spIndex < 1 || spIndex > spTotal) {
print('Invalid spIndex: $spIndex for messageId: $messageId');
return null;
}
//
_packetBuffer[messageId]![spIndex - 1] = byte;
//
if (_packetBuffer[messageId]!.every((packet) => packet.isNotEmpty)) {
//
List<int> completePayload = _packetBuffer[messageId]!.expand((packet) => packet).toList();
//
_packetBuffer.remove(messageId);
// payload
if (payloadType == PayloadTypeConstant.talkData) {
final TalkData talkData = TalkData.fromBuffer(completePayload);
return talkData;
} else {
String payload = utf8.decode(completePayload);
return payload;
}
} else {
// null
return null;
}
}
} }

View File

@ -3,6 +3,7 @@ import 'package:get/get.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart'; import 'package:star_lock/talk/startChart/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart';
import '../../start_chart_manage.dart'; import '../../start_chart_manage.dart';
@ -16,7 +17,14 @@ class UdpEchoTestHandler extends ScpMessageBaseHandle
@override @override
void handleResp(ScpMessage scpMessage) { void handleResp(ScpMessage scpMessage) {
// TODO: // TODO:
EasyLoading.showToast(scpMessage.Payload, duration: 2000.milliseconds); final List<int> payload = scpMessage.Payload;
if (payload is String) {
EasyLoading.showToast(scpMessage.Payload, duration: 2000.milliseconds);
} else {
talkDataRepository.addTalkData(
TalkData(content: payload, contentType: TalkData_ContentTypeE.Image));
}
} }
@override @override

View File

@ -26,10 +26,10 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
// //
final GenericResp genericResp = scpMessage.Payload; final GenericResp genericResp = scpMessage.Payload;
if (checkGenericRespSuccess(genericResp)) { if (checkGenericRespSuccess(genericResp)) {
//
_handleStartTalkPing();
// 2 // 2
Future.delayed(Duration(seconds: 2), () { Future.delayed(Duration(seconds: 4), () {
//
_handleStartTalkPing();
// //
_handleStartSendTalkExpectDataRequest(); _handleStartSendTalkExpectDataRequest();
// //

View File

@ -27,6 +27,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
final TalkData talkData = scpMessage.Payload; final TalkData talkData = scpMessage.Payload;
// //
_handleTalkData(talkData: talkData); _handleTalkData(talkData: talkData);
print('talkData$talkData');
// //
talkDataOverTimeTimerManager.receiveMessage(); talkDataOverTimeTimerManager.receiveMessage();
} }
@ -53,7 +54,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
/// h264协议的数据 /// h264协议的数据
void _handleVideoH264(TalkData talkData) { void _handleVideoH264(TalkData talkData) {
talkDataRepository.addTalkData(talkData); // talkDataRepository.addTalkData(talkData);
} }
/// ///

View File

@ -29,7 +29,6 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
startChartManage.ToPeerId = scpMessage.FromPeerId!; startChartManage.ToPeerId = scpMessage.FromPeerId!;
// //
_talkRequestEvent(talkObjectName: talkReq.callerName); _talkRequestEvent(talkObjectName: talkReq.callerName);
} }
@override @override
@ -53,7 +52,7 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
_showTalkRequestNotification(talkObjectName: talkObjectName); _showTalkRequestNotification(talkObjectName: talkObjectName);
// //
Get.toNamed( Get.toNamed(
Routers.lockMonitoringPage, Routers.starChartPage,
arguments: <String, String>{'lockId': '111'}, arguments: <String, String>{'lockId': '111'},
); );
} }

View File

@ -31,7 +31,6 @@ class OverTimeTimerManager {
// //
void receiveMessage() { void receiveMessage() {
print("Received a message, resetting the timer.");
startTimer(); startTimer();
} }

View File

@ -0,0 +1,10 @@
//
// int都是00
syntax = "proto3";
package main;
option go_package = "./spb";
message TestStruct {
uint32 StatusA = 1;
uint32 StatusB = 2;
}

View File

@ -50,12 +50,16 @@ class StartChartManage {
final String _productName = F.navTitle; final String _productName = F.navTitle;
RawDatagramSocket? _udpSocket; RawDatagramSocket? _udpSocket;
final Map<String, Completer<void>> _completers = {}; //
final Uuid _uuid = Uuid(); // id
int _messageMaxTimeout = 5; // s
late String remoteHost = ''; // () late String remoteHost = ''; // ()
late int remotePort = 0; // () late int remotePort = 0; // ()
final int localPort = 62289; // final int localPort = 62289; //
String localPublicHost = ''; // ip地址 String localPublicHost = ''; // ip地址
int heartbeatIntervalTime = 1; // s int heartbeatIntervalTime = 1; // s
Timer? _heartBeatTimer; // Timer? _heartBeatTimer; //
bool _heartBeatTimerRunning = false; // bool _heartBeatTimerRunning = false; //
@ -75,9 +79,11 @@ class StartChartManage {
int talkDataIntervalTime = 10; // (ms) int talkDataIntervalTime = 10; // (ms)
Timer? talkDataTimer; // Timer? talkDataTimer; //
final int _maxPayloadSize = 8 * 1024; //
// //
TalkExpect defaultTalkExpect = TalkExpect( TalkExpect defaultTalkExpect = TalkExpect(
videoType: [TalkExpect_VideoTypeE.H264], videoType: [TalkExpect_VideoTypeE.IMAGE],
audioType: [TalkExpect_AudioTypeE.G711], audioType: [TalkExpect_AudioTypeE.G711],
); );
@ -109,7 +115,7 @@ class StartChartManage {
Future<void> _clientRegister() async { Future<void> _clientRegister() async {
final StarChartRegisterNodeEntity? registerNodeEntity = final StarChartRegisterNodeEntity? registerNodeEntity =
await Storage.getStarChartRegisterNodeInfo(); await Storage.getStarChartRegisterNodeInfo();
if (registerNodeEntity != null) { if (registerNodeEntity != null && registerNodeEntity.peer?.id != null) {
_log(text: '获取到星图注册节点信息:$registerNodeEntity'); _log(text: '获取到星图注册节点信息:$registerNodeEntity');
FromPeerId = registerNodeEntity.peer!.id ?? ''; FromPeerId = registerNodeEntity.peer!.id ?? '';
} else { } else {
@ -120,6 +126,7 @@ class StartChartManage {
FromPeerId = requestStarChartRegisterNode.peer!.id ?? ''; FromPeerId = requestStarChartRegisterNode.peer!.id ?? '';
bindUserStarchart(); bindUserStarchart();
} }
} }
// //
@ -153,14 +160,19 @@ class StartChartManage {
} }
if (relayInfoEntity.relay_list != null && if (relayInfoEntity.relay_list != null &&
relayInfoEntity.relay_list!.length != 0) { relayInfoEntity.relay_list!.length > 0) {
final data = relayInfoEntity.relay_list?[0]; for (int i = 0; i <= relayInfoEntity.relay_list!.length; i++) {
final parseUdpUrl = _parseUdpUrl(data?.listenAddr ?? ''); final data = relayInfoEntity.relay_list?[i];
remoteHost = parseUdpUrl['host'] ?? ''; if (data?.peerID != FromPeerId) {
remotePort = parseUdpUrl['port'] ?? ''; final parseUdpUrl = _parseUdpUrl(data?.listenAddr ?? '');
relayPeerId = data?.peerID ?? ''; remoteHost = parseUdpUrl['host'] ?? '';
ToPeerId = relayPeerId; remotePort = parseUdpUrl['port'] ?? '';
_log(text: '中继信息----》${relayInfoEntity}'); relayPeerId = data?.peerID ?? '';
ToPeerId = relayPeerId;
_log(text: '中继信息----》${relayInfoEntity}');
break;
}
}
} else { } else {
_log(text: '未查询到中继信息----》'); _log(text: '未查询到中继信息----》');
} }
@ -208,7 +220,7 @@ class StartChartManage {
// 线 // 线
Future<void> _sendOnlineMessage() async { Future<void> _sendOnlineMessage() async {
_log(text: '发送上线消息'); _log(text: '发送上线消息,是否已经上线:$isOnlineStartChartServer');
if (isOnlineStartChartServer) { if (isOnlineStartChartServer) {
_log(text: '星图已上线,请勿重复发送上线消息'); _log(text: '星图已上线,请勿重复发送上线消息');
return; return;
@ -217,6 +229,7 @@ class StartChartManage {
final message = MessageCommand.goOnlineRelay( final message = MessageCommand.goOnlineRelay(
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -231,6 +244,7 @@ class StartChartManage {
final message = MessageCommand.talkRequestMessage( final message = MessageCommand.talkRequestMessage(
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -242,6 +256,7 @@ class StartChartManage {
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
talkData: talkData, talkData: talkData,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -260,6 +275,8 @@ class StartChartManage {
final List<int> message = MessageCommand.heartbeatMessage( final List<int> message = MessageCommand.heartbeatMessage(
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
ToPeerId: relayPeerId, ToPeerId: relayPeerId,
MessageId:
MessageCommand.getNextMessageId(relayPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
}, },
@ -268,13 +285,37 @@ class StartChartManage {
} }
// //
void sendEchoMessage() async { void sendEchoMessage({required List<int> payload}) async {
final message = MessageCommand.echoMessage( String toPeerId = '7SDLN3XMNAQvVAJ2yrbLFfJkKQdgfBrpa8wV7s7TXYcu';
ToPeerId: echoPeerId,
FromPeerId: FromPeerId, //
); final int totalPackets = (payload.length / _maxPayloadSize).ceil();
await _sendMessage(message: message); //
_log(text: '发送回声测试消息'); for (int i = 0; i < totalPackets; i++) {
int start = i * _maxPayloadSize;
int end = (i + 1) * _maxPayloadSize;
if (end > payload.length) {
end = payload.length;
}
//
List<int> packet = payload.sublist(start, end);
final messageId =
MessageCommand.getNextMessageId(toPeerId, increment: false);
//
final message = MessageCommand.echoMessage(
ToPeerId: toPeerId,
FromPeerId: FromPeerId,
payload: packet,
SpTotal: totalPackets,
SpIndex: i + 1,
MessageId: messageId,
);
//
await _sendMessage(message: message);
}
// id
MessageCommand.getNextMessageId(toPeerId);
} }
// //
@ -285,6 +326,7 @@ class StartChartManage {
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
gatewayId: gatewayId, gatewayId: gatewayId,
time: DateTime.now().millisecondsSinceEpoch ~/ 1000, time: DateTime.now().millisecondsSinceEpoch ~/ 1000,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -294,6 +336,7 @@ class StartChartManage {
final message = MessageCommand.talkAcceptMessage( final message = MessageCommand.talkAcceptMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
talkStatus.setWaitingAnswer(); talkStatus.setWaitingAnswer();
@ -304,6 +347,7 @@ class StartChartManage {
final message = MessageCommand.talkRejectMessage( final message = MessageCommand.talkRejectMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -314,6 +358,7 @@ class StartChartManage {
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
talkExpect: talkExpect, talkExpect: talkExpect,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -327,6 +372,7 @@ class StartChartManage {
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
PayloadType: PayloadType, PayloadType: PayloadType,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: false),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -340,6 +386,7 @@ class StartChartManage {
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
PayloadType: PayloadType, PayloadType: PayloadType,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: false),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -350,6 +397,7 @@ class StartChartManage {
final message = MessageCommand.talkPingMessage( final message = MessageCommand.talkPingMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -359,6 +407,7 @@ class StartChartManage {
final message = MessageCommand.talkHangupMessage( final message = MessageCommand.talkHangupMessage(
ToPeerId: ToPeerId, ToPeerId: ToPeerId,
FromPeerId: FromPeerId, FromPeerId: FromPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
} }
@ -405,7 +454,7 @@ class StartChartManage {
message, InternetAddress(remoteHost), remotePort); message, InternetAddress(remoteHost), remotePort);
if (result != message.length) { if (result != message.length) {
AppLog.log('❌Udp send data error----> $result ${message.length}'); AppLog.log('❌Udp send data error----> $result ${message.length}');
_udpSocket = null; // _udpSocket = null;
} }
} }
@ -716,10 +765,12 @@ class StartChartManage {
} }
if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) { if (deserialize.PayloadType != PayloadTypeConstant.heartbeat) {
_log(text: 'Udp收到结构体数据---》$deserialize'); _log(text: 'Udp收到结构体数据---》$deserialize');
// _log(text: 'text---》${utf8.decode(deserialize.Payload)}');
} }
} }
} catch (e) { } catch (e, stackTrace) {
_log(text: '❌ Udp result data error ----> $e'); _log(text: '❌ Udp result data error ----> $e');
_log(text: '堆栈跟踪:\n$stackTrace');
} }
} }
}); });
@ -742,7 +793,7 @@ class StartChartManage {
handler.handleInvalidReq(scpMessage); handler.handleInvalidReq(scpMessage);
} }
} catch (e) { } catch (e) {
_log(text: '❌ 处理udp返回数据时遇到错误---> $e'); // _log(text: '❌ 处理udp返回数据时遇到错误---> $e');
} }
} }
@ -897,12 +948,13 @@ class StartChartManage {
/// ///
void destruction() async { void destruction() async {
isOnlineStartChartServer = false;
stopTalkExpectMessageTimer(); stopTalkExpectMessageTimer();
stopTalkPingMessageTimer(); stopTalkPingMessageTimer();
stopHeartbeat(); stopHeartbeat();
stopReStartOnlineStartChartServer(); stopReStartOnlineStartChartServer();
stopTalkDataTimer(); stopTalkDataTimer();
await Storage.removerRelayInfo(); // await Storage.removerRelayInfo();
await Storage.removerStarChartRegisterNodeInfo(); // await Storage.removerStarChartRegisterNodeInfo();
} }
} }

View File

@ -1,21 +0,0 @@
import 'dart:ui';
class ChangeLanguageFormat {
static Locale convertLocale(Locale locale) {
if (locale.languageCode == 'zh') {
if (locale.scriptCode == 'Hans') {
//
return const Locale('zh', 'CN');
} else if (locale.scriptCode == 'Hant') {
//
if (locale.countryCode == 'CN') {
return const Locale('zh', 'TW');
} else if (locale.countryCode == 'HK') {
return const Locale('zh', 'HK');
}
}
}
// Locale
return locale;
}
}

Some files were not shown because too many files have changed in this diff Show More