Merge branch 'develop_sky' into 'release_sky'
Develop sky See merge request StarlockTeam/app-starlock!172
This commit is contained in:
commit
91c597b9a5
BIN
images/guide/1.png
Normal file
BIN
images/guide/1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
BIN
images/guide/2.png
Normal file
BIN
images/guide/2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
BIN
images/guide/3.png
Normal file
BIN
images/guide/3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
BIN
images/guide/4.png
Normal file
BIN
images/guide/4.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.2 KiB |
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "بعد إعادة الضبط ، سيتم حذف الأوردة المشطية للقفل. هل أنت متأكد أنك تريد إعادة الضبط ؟",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "След нулиране, метакарпалните вени на ключалката ще бъдат изтрити. Сигурен ли сте, че искате да се възстанови?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "ব্যান্ডোটারআইসেট, হাসিপাল রিরিইনস্ফথেলকবইল্ডজেডড।?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetování budou metakarpální žíly zámku odstraněny. Jste si jistý, že chcete resetovat?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter nulstilling, de metacarpal vener i låsen vil blive slettet. Er du sikker på at du vil nulstille?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nach dem Zurücksetzen werden die Mittelhand adern des Schlosses gelöscht. Sind Sie sicher, dass Sie zurücksetzen wollen?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, οι μετακάρπιες φλέβες της κλειδαριάς θα διαγραφούν. Είστε σίγουροι ότι θέλετε να επαναφέρετε;",
|
||||
|
||||
@ -1082,6 +1082,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "After reset, the metacarpal veins of the lock will be deleted. Are you sure you want to reset?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Después del reinicio, se eliminarán las venas metacarpiales de la cerradura. ¿Está seguro de que desea restablecer?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku metakarpaalveenid. Kas tõesti soovid lähtestada?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Kun lukko on nollattu, metakarppinen suoneet poistetaan. Haluatko varmasti palauttaa?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Après réinitialisation, les veines métacarpiennes de la serrure seront supprimées. Êtes-vous sûr de vouloir réinitialiser?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "לאחר איפוס, הורידים של המנעול יימחקו. אתה בטוח שברצונך לאפס?",
|
||||
|
||||
@ -1082,6 +1082,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "रीसेट के बाद, लॉक के मेटाकार्पल नसों को हटा दिया जाएगा। क्या आप निश्चित रूप से रीसेट करना चाहते हैं?",
|
||||
|
||||
@ -1081,6 +1081,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 你確定要重置啊?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nakon resetiranja, metakarpalne vene brave će biti izbrisane. Jeste li sigurni da želite resetiranje?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "A reset után a zár metakarpális erei törlődnek. Biztos vagy benne, hogy vissza akarsz állítani?",
|
||||
|
||||
1163
lan/lan_hy.json
Normal file
1163
lan/lan_hy.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Setelah mengulang, pembuluh darah metakarpal dari kunci akan dihapus. Yakin ingin mengatur ulang?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Dopo il reset, le vene metacarpali della serratura verranno cancellate. Sei sicuro di voler reimpostare?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "リセット後、ロックの中手骨静脈が削除されます。リセットしてもよろしいですか。",
|
||||
|
||||
1163
lan/lan_ka.json
Normal file
1163
lan/lan_ka.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -1083,6 +1083,8 @@
|
||||
"丹麦语": "丹麦语",
|
||||
"印地语": "印地语",
|
||||
"乌尔都语": "乌尔都语",
|
||||
"亚美尼亚语": "亚美尼亚语",
|
||||
"格鲁吉亚语": "格鲁吉亚语",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Қайта ысырып тастағаннан соң бұғаттағы метакарпалар өшіріледі. Шынымен ысырып тастауды қалайсыз ба?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "재설정 후 잠금 장치의 중수골 정맥이 삭제됩니다. 당신은 당신이 재설정 하시겠습니까?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po reset užrakto metakarpinės venos bus ištrintos. Ar tikrai norite atstatyti?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, urat metacarpal kunci akan dipadamkan. Adakah anda pasti anda mahu menetapkan semula?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Na reset worden de middenhandsbeenaders van het slot verwijderd. Weet je zeker dat je wilt resetten?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po zresetowaniu żyły śródręcza zamka zostaną usunięte. Czy na pewno chcesz zresetować?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Após a reinicialização, as veias do metacarpo do bloqueio serão excluídas. Tens a certeza que queres reiniciar?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "După resetare, venele metacarpale ale încuietorii vor fi şterse. Sigur doriți să resetați?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "После сброса пястные вены замка будут удалены. Вы уверены, что хотите сбросить?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetovaní budú metakarpálne žily zámku vymazané. Ste si istí, že chcete obnoviť?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Након ресетовања, метакарпалне вене браве ће бити избрисане. Да ли сте сигурни да желите да ресетујете?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter återställd, de metakarpal venerna i låset tas bort. Är du säker på att du vill återställa?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "หลังจากรีเซ็ตแล้วหลอดเลือดดำ metacarpal ของล็อคจะถูกลบออกคุณแน่ใจว่าอยากจะรีเซ็ต?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sıfırlamadan sonra, kilidin metacarpal damarları silinecektir. Sıfırlamak istediğine emin misin?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 是否確實要重置?",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Після скидання п'ясткові вени замку будуть видалені. Ви впевнені, що хочете скинути налаштування?",
|
||||
|
||||
@ -1082,6 +1082,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "ری سیٹ کرنے کے بعد ، لاک کی میٹاکارپل رگیں حذف کردی جائیں گی۔ کیا آپ واقعی دوبارہ ترتیب دینا چاہتے ہیں؟",
|
||||
|
||||
@ -1080,6 +1080,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
|
||||
"繁体中文(中国香港)": "繁體中文(中國香港)",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sau khi đặt lại, các tĩnh mạch metacarpal của khóa sẽ bị xóa. Bạn có chắc muốn thiết lập lại không?",
|
||||
|
||||
@ -1085,6 +1085,8 @@
|
||||
"丹麦语": "Dansk",
|
||||
"印地语": "हिंदीName",
|
||||
"乌尔都语": "اوردو",
|
||||
"亚美尼亚语": "Հայերեն",
|
||||
"格鲁吉亚语": "ქართული",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?",
|
||||
"在线": "在线",
|
||||
"离线": "离线",
|
||||
|
||||
560
langAi.py
Normal file
560
langAi.py
Normal file
@ -0,0 +1,560 @@
|
||||
#!/usr/bin/python3
|
||||
import base64
|
||||
import datetime
|
||||
import hashlib
|
||||
import hmac
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import urllib.parse
|
||||
from typing import Dict
|
||||
|
||||
import requests
|
||||
|
||||
# 运行格式方式:python langAi.py youdao 备注:aliyun 阿里云 youdao 有道翻译
|
||||
|
||||
# 语言文件路径 /Users/mac/www/app-starlock/lan
|
||||
path = "./lan2/"
|
||||
# 原语言
|
||||
SOURCE_LANG = 'lan_en'
|
||||
|
||||
# 过滤不翻译的语言
|
||||
FILTER_LANG = ['lan_zh', 'lan_en', 'lan_keys']
|
||||
|
||||
# 阿里云语言映射
|
||||
ALIYUN_LANG_MAP = {
|
||||
'lan_zh': {
|
||||
'name': '中文',
|
||||
'code': 'zh'
|
||||
},
|
||||
'lan_tw': {
|
||||
'name': '繁体中文',
|
||||
'code': 'zh-tw',
|
||||
},
|
||||
'lan_en': {
|
||||
'name': '英文',
|
||||
'code': 'en',
|
||||
},
|
||||
'lan_fr': {
|
||||
'name': '法文',
|
||||
'code': 'fr',
|
||||
},
|
||||
'lan_ru': {
|
||||
'name': '俄文',
|
||||
'code': 'ru',
|
||||
},
|
||||
'lan_de': {
|
||||
'name': '德文',
|
||||
'code': 'de',
|
||||
},
|
||||
'lan_ja': {
|
||||
'name': '日文',
|
||||
'code': 'ja',
|
||||
},
|
||||
'lan_ko': {
|
||||
'name': '韩文',
|
||||
'code': 'ko',
|
||||
},
|
||||
'lan_it': {
|
||||
'name': '意大利文',
|
||||
'code': 'it',
|
||||
},
|
||||
'lan_pt': {
|
||||
'name': '葡萄牙文',
|
||||
'code': 'pt',
|
||||
},
|
||||
'lan_es': {
|
||||
'name': '西班牙文',
|
||||
'code': 'es',
|
||||
},
|
||||
'lan_ar': {
|
||||
'name': '阿拉伯文',
|
||||
'code': 'ar',
|
||||
},
|
||||
'lan_vi': {
|
||||
'name': '越南文',
|
||||
'code': 'vi',
|
||||
},
|
||||
'lan_ms': {
|
||||
'name': '马来文',
|
||||
'code': 'ms',
|
||||
},
|
||||
'lan_nl': {
|
||||
'name': '荷兰文',
|
||||
'code': 'nl',
|
||||
},
|
||||
'lan_ro': {
|
||||
'name': '罗马尼亚文',
|
||||
'code': 'ro',
|
||||
},
|
||||
'lan_lt': {
|
||||
'name': '立陶宛文',
|
||||
'code': 'lt',
|
||||
},
|
||||
'lan_sv': {
|
||||
'name': '瑞典文',
|
||||
'code': 'sv',
|
||||
},
|
||||
'lan_et': {
|
||||
'name': '爱沙尼亚文',
|
||||
'code': 'et',
|
||||
},
|
||||
'lan_pl': {
|
||||
'name': '波兰文',
|
||||
'code': 'pl',
|
||||
},
|
||||
'lan_sk': {
|
||||
'name': '斯洛伐克文',
|
||||
'code': 'sk',
|
||||
},
|
||||
'lan_cs': {
|
||||
'name': '捷克文',
|
||||
'code': 'cs',
|
||||
},
|
||||
'lan_el': {
|
||||
'name': '希腊文',
|
||||
'code': 'el',
|
||||
},
|
||||
'lan_he': {
|
||||
'name': '希伯来文',
|
||||
'code': 'he',
|
||||
},
|
||||
'lan_tr': {
|
||||
'name': '土耳其文',
|
||||
'code': 'tr',
|
||||
},
|
||||
'lan_hu': {
|
||||
'name': '匈牙利文',
|
||||
'code': 'hu',
|
||||
},
|
||||
'lan_bg': {
|
||||
'name': '保加利亚文',
|
||||
'code': 'bg',
|
||||
},
|
||||
'lan_kk': {
|
||||
'name': '哈萨克文',
|
||||
'code': 'kk',
|
||||
},
|
||||
'lan_bn': {
|
||||
'name': '孟加拉文',
|
||||
'code': 'bn',
|
||||
},
|
||||
'lan_hr': {
|
||||
'name': '克罗地亚文',
|
||||
'code': 'hbs',
|
||||
},
|
||||
'lan_th': {
|
||||
'name': '泰文',
|
||||
'code': 'th',
|
||||
},
|
||||
'lan_id': {
|
||||
'name': '印尼文',
|
||||
'code': 'id',
|
||||
},
|
||||
'lan_fi': {
|
||||
'name': '芬兰文',
|
||||
'code': 'fi',
|
||||
},
|
||||
'lan_da': {
|
||||
'name': '丹麦文',
|
||||
'code': 'da',
|
||||
},
|
||||
}
|
||||
|
||||
# 有道语言映射
|
||||
YOUDAO_LANG_MAP = {
|
||||
'lan_zh': {
|
||||
'name': '中文',
|
||||
'code': 'zh-CHS',
|
||||
},
|
||||
'lan_tw': {
|
||||
'name': '繁体中文(中国台湾)',
|
||||
'code': 'zh-CHT',
|
||||
},
|
||||
'lan_hk': {
|
||||
'name': '繁体中文(中国香港)',
|
||||
'code': 'yue',
|
||||
},
|
||||
'lan_en': {
|
||||
'name': '英文',
|
||||
'code': 'en'
|
||||
},
|
||||
'lan_fr': {
|
||||
'name': '法文',
|
||||
'code': 'fr'
|
||||
},
|
||||
'lan_ru': {
|
||||
'name': '俄文',
|
||||
'code': 'ru'
|
||||
},
|
||||
'lan_de': {
|
||||
'name': '德文',
|
||||
'code': 'de'
|
||||
},
|
||||
'lan_ja': {
|
||||
'name': '日文',
|
||||
'code': 'ja'
|
||||
},
|
||||
'lan_ko': {
|
||||
'name': '韩文',
|
||||
'code': 'ko'
|
||||
},
|
||||
'lan_it': {
|
||||
'name': '意大利文',
|
||||
'code': 'it'
|
||||
},
|
||||
'lan_pt': {
|
||||
'name': '葡萄牙文',
|
||||
'code': 'pt'
|
||||
},
|
||||
'lan_es': {
|
||||
'name': '西班牙文',
|
||||
'code': 'es'
|
||||
},
|
||||
'lan_ar': {
|
||||
'name': '阿拉伯文',
|
||||
'code': 'ar'
|
||||
},
|
||||
'lan_vi': {
|
||||
'name': '越南文',
|
||||
'code': 'vi'
|
||||
},
|
||||
'lan_ms': {
|
||||
'name': '马来文',
|
||||
'code': 'ms'
|
||||
},
|
||||
'lan_nl': {
|
||||
'name': '荷兰文',
|
||||
'code': 'nl'
|
||||
},
|
||||
'lan_ro': {
|
||||
'name': '罗马尼亚文',
|
||||
'code': 'ro'
|
||||
},
|
||||
'lan_lt': {
|
||||
'name': '立陶宛文',
|
||||
'code': 'lt'
|
||||
},
|
||||
'lan_sv': {
|
||||
'name': '瑞典文',
|
||||
'code': 'sv'
|
||||
},
|
||||
'lan_et': {
|
||||
'name': '爱沙尼亚文',
|
||||
'code': 'et'
|
||||
},
|
||||
'lan_pl': {
|
||||
'name': '波兰文',
|
||||
'code': 'pl'
|
||||
},
|
||||
'lan_sk': {
|
||||
'name': '斯洛伐克文',
|
||||
'code': 'sk'
|
||||
},
|
||||
'lan_cs': {
|
||||
'name': '捷克文',
|
||||
'code': 'cs'
|
||||
},
|
||||
'lan_el': {
|
||||
'name': '希腊文',
|
||||
'code': 'el'
|
||||
},
|
||||
'lan_he': {
|
||||
'name': '希伯来文',
|
||||
'code': 'he'
|
||||
},
|
||||
'lan_tr': {
|
||||
'name': '土耳其文',
|
||||
'code': 'tr'
|
||||
},
|
||||
'lan_hu': {
|
||||
'name': '匈牙利文',
|
||||
'code': 'hu'
|
||||
},
|
||||
'lan_bg': {
|
||||
'name': '保加利亚文',
|
||||
'code': 'bg'
|
||||
},
|
||||
'lan_kk': {
|
||||
'name': '哈萨克文',
|
||||
'code': 'kk'
|
||||
},
|
||||
'lan_bn': {
|
||||
'name': '孟加拉文',
|
||||
'code': 'bn'
|
||||
},
|
||||
'lan_hr': {
|
||||
'name': '克罗地亚文',
|
||||
'code': 'hr'
|
||||
},
|
||||
'lan_th': {
|
||||
'name': '泰文',
|
||||
'code': 'th'
|
||||
},
|
||||
'lan_id': {
|
||||
'name': '印尼文',
|
||||
'code': 'id'
|
||||
},
|
||||
'lan_fi': {
|
||||
'name': '芬兰文',
|
||||
'code': 'fi'
|
||||
},
|
||||
'lan_da': {
|
||||
'name': '丹麦文',
|
||||
'code': 'da'
|
||||
},
|
||||
'lan_uk': {
|
||||
'name': '乌克兰文',
|
||||
'code': 'uk'
|
||||
},
|
||||
'lan_sr_cyrl': {
|
||||
'name': '塞尔维亚语(西里尔文)',
|
||||
'code': 'sr-Cyrl'
|
||||
},
|
||||
'lan_hy': {
|
||||
'name': '亚美尼亚语',
|
||||
'code': 'hy'
|
||||
},
|
||||
'lan_ka': {
|
||||
'name': '格鲁吉亚语',
|
||||
'code': 'ka'
|
||||
},
|
||||
}
|
||||
|
||||
# =============================== 以下为固定代码,非必要请勿修改 ===============================
|
||||
|
||||
# 阿里云配置
|
||||
ALIYUN_CONFIG = {
|
||||
'domain': 'mt.cn-hangzhou.aliyuncs.com/api/translate/web/ecommerce',
|
||||
'accessKeyId': 'LTAI5tFke4yGaY94ondXkmHn',
|
||||
'accessKeySecret': '08zPw8BoRqfqlKDTMX65k7gfeER33x',
|
||||
}
|
||||
|
||||
# 有道翻译配置
|
||||
YOUDAO_CONFIG = {
|
||||
'domain': 'https://openapi.youdao.com/api',
|
||||
'appKey': '3e4923bad470f8d2',
|
||||
'appSecret': '5thWwZ7D0RIzT0aquCF6NKmaiakAyhqr'
|
||||
}
|
||||
|
||||
CHANNELS = ['aliyun', 'youdao']
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print('Usage: python langAi.py aliLang')
|
||||
sys.exit(1)
|
||||
|
||||
# 检测传入参数是否合法
|
||||
if sys.argv[1] not in CHANNELS:
|
||||
print('channel must be one of {}'.format(CHANNELS))
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
# 主函数
|
||||
def main(channel):
|
||||
en_path = path + SOURCE_LANG + ".json"
|
||||
# 判断文件是否存在
|
||||
if not os.path.exists(en_path):
|
||||
print('文件不存在:', en_path)
|
||||
sys.exit(1)
|
||||
|
||||
# 读取文件内容
|
||||
en_us_content = read_file(en_path)
|
||||
|
||||
# 把json转数组
|
||||
en_us_data = json.loads(en_us_content)
|
||||
|
||||
# 语言列表 如果channel为aliyun赋值ALIYUN_LANG_MAP,否则赋值YOUDAO_LANG_MAP
|
||||
lang_map = ALIYUN_LANG_MAP if channel == 'aliyun' else YOUDAO_LANG_MAP
|
||||
|
||||
# 遍历ALIYUN_LANG_MAP
|
||||
for key in lang_map:
|
||||
# 过滤掉不翻译的语言
|
||||
if key in FILTER_LANG:
|
||||
continue
|
||||
|
||||
lang_path = path + key + ".json"
|
||||
# 验证文件是否存在,如果不存在即创建
|
||||
if not os.path.exists(lang_path):
|
||||
create_file(lang_path)
|
||||
|
||||
data_content = read_file(lang_path)
|
||||
if data_content.strip(): # Check if the file is not empty
|
||||
datas = json.loads(data_content)
|
||||
else:
|
||||
datas = {}
|
||||
|
||||
total = len(en_us_data) # 总数
|
||||
current = 0 # 当前数
|
||||
|
||||
for en_us_key in en_us_data:
|
||||
current += 1
|
||||
print('语言:%s-%s 正在翻译处理第%d/%d批数据' % (key,lang_map[key]['code'], current, total))
|
||||
# 过滤已存在的key
|
||||
if en_us_key in datas:
|
||||
continue
|
||||
|
||||
# 异常处理
|
||||
try:
|
||||
datas[en_us_key] = translation(channel, lang_map[SOURCE_LANG]['code'], lang_map[key]['code'],
|
||||
en_us_data[en_us_key])
|
||||
except Exception as e:
|
||||
print('翻译异常:', e.args, 'key:', en_us_key, 'content:', en_us_data[en_us_key])
|
||||
continue
|
||||
|
||||
# 写入文件
|
||||
with open(lang_path, 'w', encoding='utf-8') as file:
|
||||
json.dump(datas, file, ensure_ascii=False, indent=4)
|
||||
|
||||
|
||||
# 翻译
|
||||
def translation(channel, source_language, target_language, text):
|
||||
translation_text = ''
|
||||
if channel == 'aliyun':
|
||||
translation_text = aliyun_translation(source_language, target_language, text)
|
||||
elif channel == 'youdao':
|
||||
translation_text = youdao_translation(source_language, target_language, text)
|
||||
# 延迟2秒
|
||||
time.sleep(2)
|
||||
|
||||
return translation_text
|
||||
|
||||
|
||||
# 有道翻译
|
||||
def youdao_translation(source_language, target_language, text):
|
||||
post_body = {
|
||||
'q': text,
|
||||
'from': source_language,
|
||||
'to': target_language,
|
||||
'appKey': YOUDAO_CONFIG['appKey'],
|
||||
'salt': hashlib.md5(os.urandom(32)).hexdigest(), # 随机字符串,可使用UUID进行生产
|
||||
'signType': 'v3',
|
||||
'curtime': str(int(datetime.datetime.now().timestamp())),
|
||||
}
|
||||
|
||||
# 签名生成方法如下:
|
||||
# signType=v3;
|
||||
# sign=sha256(应用ID+input+salt+curtime+应用密钥);
|
||||
# 其中,input的计算方式为:input=q前10个字符 + q长度 + q后10个字符(当q长度大于20)或 input=q字符串(当q长度小于等于20);
|
||||
|
||||
input_text = post_body['q']
|
||||
if len(input_text) > 20:
|
||||
input_text = input_text[:10] + str(len(input_text)) + input_text[-10:]
|
||||
post_body['input'] = input_text
|
||||
|
||||
sign = hashlib.sha256((YOUDAO_CONFIG['appKey'] + input_text + post_body['salt'] + post_body['curtime'] +
|
||||
YOUDAO_CONFIG['appSecret']).encode('utf-8')).hexdigest()
|
||||
|
||||
post_body['sign'] = sign
|
||||
|
||||
req = fetch_content(YOUDAO_CONFIG['domain'], 'POST', post_body)
|
||||
req_json = json.loads(req)
|
||||
try:
|
||||
return req_json['translation'][0]
|
||||
except KeyError as e:
|
||||
print(f"[翻译异常][KeyError] 目标语言: {target_language}, key: {text}, API返回: {req_json}, 请求参数: {post_body}")
|
||||
raise
|
||||
except Exception as e:
|
||||
print(f"[翻译异常][OtherError] 目标语言: {target_language}, key: {text}, API返回: {req_json}, 请求参数: {post_body}, 异常: {e}")
|
||||
raise
|
||||
|
||||
|
||||
# 阿里云翻译
|
||||
def aliyun_translation(source_language, target_language, text):
|
||||
headers = {
|
||||
'Version': '2018-10-12',
|
||||
}
|
||||
post_body = {
|
||||
"FormatType": "text",
|
||||
"SourceLanguage": source_language,
|
||||
"TargetLanguage": target_language,
|
||||
"SourceText": text,
|
||||
"Ccene": "general",
|
||||
'Action': 'TranslateGeneral',
|
||||
}
|
||||
req = aliyun_request(ALIYUN_CONFIG['domain'], {**post_body, **headers})
|
||||
if req['Code'] == '200':
|
||||
return req['Data']['Translated']
|
||||
else:
|
||||
raise Exception(req)
|
||||
|
||||
|
||||
def aliyun_request(domain: str, params: Dict, security: bool = True,
|
||||
method: str = 'POST') -> Dict:
|
||||
# Add common parameters
|
||||
api_params = {
|
||||
"SignatureMethod": "HMAC-SHA1",
|
||||
"SignatureNonce": hashlib.md5(os.urandom(32)).hexdigest(),
|
||||
"SignatureVersion": "1.0",
|
||||
"AccessKeyId": ALIYUN_CONFIG['accessKeyId'],
|
||||
"Timestamp": datetime.datetime.utcnow().isoformat("T"),
|
||||
"Format": "JSON",
|
||||
}
|
||||
api_params.update(params)
|
||||
|
||||
# Sort parameters by key
|
||||
sorted_params = sorted(api_params.items(), key=lambda x: x[0])
|
||||
|
||||
sorted_query_string_tmp = ""
|
||||
for key, value in sorted(sorted_params):
|
||||
sorted_query_string_tmp += "&" + aliyun_encode(key) + "=" + aliyun_encode(value)
|
||||
|
||||
string_to_sign = "{}&%2F&{}".format(method, aliyun_encode(sorted_query_string_tmp[1:]))
|
||||
|
||||
# Calculate the signature
|
||||
signature = base64.b64encode(
|
||||
hmac.new((ALIYUN_CONFIG['accessKeySecret'] + "&").encode('utf-8'), string_to_sign.encode('utf-8'),
|
||||
hashlib.sha1).digest()).decode(
|
||||
'utf-8')
|
||||
|
||||
# Add the signature to the parameters
|
||||
api_params['Signature'] = signature
|
||||
|
||||
# Send the request
|
||||
url = ("https" if security else "http") + "://" + domain + "/"
|
||||
if method == 'POST':
|
||||
response = requests.post(url, data=api_params)
|
||||
else:
|
||||
response = requests.get(url, params=api_params)
|
||||
return response.json()
|
||||
|
||||
|
||||
# 阿里云编码
|
||||
def aliyun_encode(value):
|
||||
res = urllib.parse.quote_plus(value)
|
||||
res = res.replace("+", "%20")
|
||||
res = res.replace("*", "%2A")
|
||||
res = res.replace("%7E", "~")
|
||||
return res
|
||||
|
||||
|
||||
def fetch_content(url, method, body):
|
||||
headers = {"x-sdk-client": "python/2.0.0"}
|
||||
|
||||
if method == 'POST':
|
||||
response = requests.post(url, data=body, headers=headers)
|
||||
else:
|
||||
response = requests.get(url, params=body, headers=headers)
|
||||
|
||||
if response.status_code != 200:
|
||||
raise Exception(f"Request failed with status {response.status_code}")
|
||||
|
||||
return response.text
|
||||
|
||||
|
||||
# 创建文件
|
||||
def create_file(file_path):
|
||||
with open(file_path, 'w') as file:
|
||||
pass
|
||||
|
||||
|
||||
# 读取文件内容
|
||||
def read_file(file_path):
|
||||
with open(file_path, 'r', encoding='utf-8') as file:
|
||||
content = file.read()
|
||||
return content
|
||||
|
||||
|
||||
# translation_text = youdao_translation('en', 'de', 'Your application <:name> has been approved.')
|
||||
# print(translation_text)
|
||||
main(sys.argv[1])
|
||||
@ -60,6 +60,7 @@ import 'package:star_lock/mine/mineSet/transferSmartLock/transferSmartLockList/t
|
||||
import 'package:star_lock/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_page.dart';
|
||||
import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_page.dart';
|
||||
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_page.dart';
|
||||
import 'package:star_lock/talk/starChart/views/guide/permission_guidance_page.dart';
|
||||
import 'package:star_lock/talk/starChart/views/native/talk_view_native_decode_page.dart';
|
||||
import 'package:star_lock/talk/starChart/views/talkView/talk_view_page.dart';
|
||||
import 'package:star_lock/talk/starChart/webView/h264_web_view.dart';
|
||||
@ -515,9 +516,11 @@ abstract class Routers {
|
||||
static const String doubleLockLinkPage = '/doubleLockLinkPage'; //双锁联动
|
||||
static const String starChartPage = '/starChartPage'; //星图
|
||||
static const String starChartTalkView = '/starChartTalkView'; //星图对讲页面
|
||||
static const String h264WebView = '/h264WebView'; //星图对讲页面
|
||||
static const String h264View = '/h264View'; //星图对讲页面
|
||||
static const String imageTransmissionView =
|
||||
'/imageTransmissionView'; //星图对讲页面(图传)
|
||||
static const String permissionGuidancePage =
|
||||
'/permissionGuidancePage'; // 锁屏权限通知引导页面
|
||||
}
|
||||
|
||||
abstract class AppRouters {
|
||||
@ -1189,12 +1192,16 @@ abstract class AppRouters {
|
||||
GetPage<dynamic>(
|
||||
name: Routers.starChartTalkView, page: () => const TalkViewPage()),
|
||||
GetPage<dynamic>(
|
||||
name: Routers.h264WebView, page: () => TalkViewNativeDecodePage()),
|
||||
name: Routers.h264View, page: () => TalkViewNativeDecodePage()),
|
||||
// 插件播放页面
|
||||
GetPage<dynamic>(
|
||||
name: Routers.imageTransmissionView,
|
||||
page: () => ImageTransmissionPage()),
|
||||
|
||||
GetPage<dynamic>(
|
||||
name: Routers.permissionGuidancePage,
|
||||
page: () => PermissionGuidancePage()),
|
||||
// 插件播放页面
|
||||
// GetPage<dynamic>(name: Routers.h264WebView, page: () => H264WebView()), // webview播放页面
|
||||
// GetPage<dynamic>(name: Routers.h264View, page: () => H264WebView()), // webview播放页面
|
||||
];
|
||||
}
|
||||
|
||||
@ -69,8 +69,7 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
|
||||
onPressed: () async {
|
||||
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
@ -148,8 +147,7 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
|
||||
SlidableAction(
|
||||
onPressed: (BuildContext context) async {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ??
|
||||
false;
|
||||
await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
@ -180,7 +178,8 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
|
||||
arguments: <String, FingerprintItemData>{
|
||||
'fingerprintItemData': fingerprintItemData,
|
||||
})!
|
||||
.then((value) => logic.getICCardListData(isRefresh: true));
|
||||
.then((value) =>
|
||||
logic.getICCardListData(isRefresh: true));
|
||||
// if (data != null) {
|
||||
// logic.getICCardListData(isRefresh: true);
|
||||
// }
|
||||
|
||||
@ -335,7 +335,7 @@ class _ElectronicKeyDetailPageState extends State<ElectronicKeyDetailPage> {
|
||||
thumbColor: CupertinoColors.white,
|
||||
value: state.isRemoteUnlock.value,
|
||||
onChanged: (bool value) async {
|
||||
final bool isNetWork = await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
@ -352,7 +352,7 @@ class _ElectronicKeyDetailPageState extends State<ElectronicKeyDetailPage> {
|
||||
thumbColor: CupertinoColors.white,
|
||||
value: state.onlyManageYouCreatesUser.value,
|
||||
onChanged: (bool value) async {
|
||||
final bool isNetWork = await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -68,8 +68,7 @@ class _ElectronicKeyListPageState extends State<ElectronicKeyListPage> {
|
||||
final bool? isDemoMode =
|
||||
await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -48,8 +48,7 @@ class _FaceListPageState extends State<FaceListPage> with RouteAware {
|
||||
onPressed: () async {
|
||||
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
@ -160,8 +159,7 @@ class _FaceListPageState extends State<FaceListPage> with RouteAware {
|
||||
Widget _buildDeleteBtn(FingerprintItemData faceItemData) {
|
||||
return GestureDetector(
|
||||
onTap: () async {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -128,6 +128,15 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage>
|
||||
|
||||
// 限时顶部选择日期
|
||||
Widget keyTimeLimitWidget() {
|
||||
// 获取当前时间
|
||||
DateTime now = DateTime.now();
|
||||
|
||||
// 获取各个部分
|
||||
int year = now.year;
|
||||
int month = now.month;
|
||||
int day = now.day;
|
||||
int hour = now.hour;
|
||||
int minute = now.minute;
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
Obx(() => CommonItem(
|
||||
@ -139,6 +148,13 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage>
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.tryParse(state.timeLimitBeginTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
minDate: PDuration(
|
||||
year: year,
|
||||
month: month,
|
||||
day: day,
|
||||
hour: hour,
|
||||
minute: minute,
|
||||
),
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value =
|
||||
@ -153,6 +169,13 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage>
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
minDate: PDuration(
|
||||
year: year,
|
||||
month: month,
|
||||
day: day,
|
||||
hour: hour,
|
||||
minute: minute,
|
||||
),
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value =
|
||||
|
||||
@ -54,8 +54,7 @@ class _FingerprintListPageState extends State<FingerprintListPage>
|
||||
onPressed: () async {
|
||||
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
@ -133,8 +132,7 @@ class _FingerprintListPageState extends State<FingerprintListPage>
|
||||
SlidableAction(
|
||||
onPressed: (BuildContext context) async {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ??
|
||||
false;
|
||||
await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
@ -46,8 +45,7 @@ class _IrisListPageState extends State<IrisListPage> {
|
||||
onPressed: () async {
|
||||
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
@ -80,11 +78,11 @@ class _IrisListPageState extends State<IrisListPage> {
|
||||
// "lockId": state.lockId.value,
|
||||
// "fromType": 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入
|
||||
// });
|
||||
final data =
|
||||
await Get.toNamed(Routers.addIrisTypeManagePage, arguments: <String, int>{
|
||||
'lockId': state.lockId.value,
|
||||
'fromType': 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入
|
||||
});
|
||||
final data = await Get.toNamed(Routers.addIrisTypeManagePage,
|
||||
arguments: <String, int>{
|
||||
'lockId': state.lockId.value,
|
||||
'fromType': 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入
|
||||
});
|
||||
if (data != null) {
|
||||
// logic.getFaceListData();
|
||||
}
|
||||
@ -130,10 +128,10 @@ class _IrisListPageState extends State<IrisListPage> {
|
||||
// ? "永久"
|
||||
// : "${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())}",
|
||||
() async {
|
||||
final data =
|
||||
await Get.toNamed(Routers.faceDetailPage, arguments: <String, FingerprintItemData>{
|
||||
'faceItemData': getFaceItemData,
|
||||
});
|
||||
final data = await Get.toNamed(Routers.faceDetailPage,
|
||||
arguments: <String, FingerprintItemData>{
|
||||
'faceItemData': getFaceItemData,
|
||||
});
|
||||
if (data != null) {
|
||||
// logic.getFaceListData();
|
||||
}
|
||||
@ -254,35 +252,35 @@ class _IrisListPageState extends State<IrisListPage> {
|
||||
);
|
||||
}
|
||||
|
||||
// void showDeletAlertDialog(BuildContext context) {
|
||||
// showCupertinoDialog(
|
||||
// context: context,
|
||||
// builder: (BuildContext context) {
|
||||
// return CupertinoAlertDialog(
|
||||
// title: const Text('提示'),
|
||||
// content: const Text('重置后,该锁的人脸都将被删除哦,确认要重置吗?'),
|
||||
// actions: <Widget>[
|
||||
// CupertinoDialogAction(
|
||||
// child: Text('取消'.tr),
|
||||
// onPressed: () {
|
||||
// Navigator.pop(context);
|
||||
// },
|
||||
// ),
|
||||
// CupertinoDialogAction(
|
||||
// child: Text('确定'.tr),
|
||||
// onPressed: () {
|
||||
// Navigator.pop(context);
|
||||
// state.isDeletFaceData = true;
|
||||
// state.isDeletAll = true;
|
||||
// state.deletKeyID = '1';
|
||||
// state.deletUserID = 'DeleteAll!@#';
|
||||
// state.deletFaceNo = 255;
|
||||
// // logic.senderAddFace();
|
||||
// },
|
||||
// ),
|
||||
// ],
|
||||
// );
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
// void showDeletAlertDialog(BuildContext context) {
|
||||
// showCupertinoDialog(
|
||||
// context: context,
|
||||
// builder: (BuildContext context) {
|
||||
// return CupertinoAlertDialog(
|
||||
// title: const Text('提示'),
|
||||
// content: const Text('重置后,该锁的人脸都将被删除哦,确认要重置吗?'),
|
||||
// actions: <Widget>[
|
||||
// CupertinoDialogAction(
|
||||
// child: Text('取消'.tr),
|
||||
// onPressed: () {
|
||||
// Navigator.pop(context);
|
||||
// },
|
||||
// ),
|
||||
// CupertinoDialogAction(
|
||||
// child: Text('确定'.tr),
|
||||
// onPressed: () {
|
||||
// Navigator.pop(context);
|
||||
// state.isDeletFaceData = true;
|
||||
// state.isDeletAll = true;
|
||||
// state.deletKeyID = '1';
|
||||
// state.deletUserID = 'DeleteAll!@#';
|
||||
// state.deletFaceNo = 255;
|
||||
// // logic.senderAddFace();
|
||||
// },
|
||||
// ),
|
||||
// ],
|
||||
// );
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
}
|
||||
|
||||
@ -126,6 +126,17 @@ class LockDetailLogic extends BaseGetXController {
|
||||
TalkStatus.answeredSuccessfully) {
|
||||
showToast('开锁成功'.tr);
|
||||
}
|
||||
// 如果是单次钥匙,则开锁成功之后调用删除
|
||||
if (state.keyInfos.value.keyType == 3) {
|
||||
final LockListInfoEntity entity = await ApiRepository.to
|
||||
.deletOwnerKeyData(
|
||||
lockId: state.keyInfos.value.lockId.toString(),
|
||||
keyId: state.keyInfos.value!.keyId.toString(),
|
||||
includeUnderlings: 0);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
AppLog.log("删除成功");
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 0x06:
|
||||
//无权限
|
||||
@ -532,8 +543,7 @@ class LockDetailLogic extends BaseGetXController {
|
||||
final List<int> getPublicKeyList =
|
||||
changeStringListToIntList(publicKey!);
|
||||
|
||||
AppLog.log(
|
||||
'发送同步锁记录命令:${BlueManage().connectDeviceName}');
|
||||
AppLog.log('发送同步锁记录命令:${BlueManage().connectDeviceName}');
|
||||
IoSenderManage.senderReferEventRecordTimeCommand(
|
||||
keyID: BlueManage().connectDeviceName,
|
||||
userID: await Storage.getUid(),
|
||||
|
||||
@ -1432,7 +1432,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
|
||||
//如果需要实名认证,需认证完成,方可开锁
|
||||
Future<void> isNeedRealNameAuthThenOpenLock() async {
|
||||
final bool isNetWork = await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
final bool isOpenLockNeedOnline = state.isOpenLockNeedOnline.value == 0;
|
||||
if (!isOpenLockNeedOnline && !isNetWork) {
|
||||
return;
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
@ -22,9 +21,12 @@ class UploadElectricQuantityPage extends StatefulWidget {
|
||||
_UploadElectricQuantityPageState();
|
||||
}
|
||||
|
||||
class _UploadElectricQuantityPageState extends State<UploadElectricQuantityPage> with RouteAware {
|
||||
final UploadElectricQuantityLogic logic = Get.put(UploadElectricQuantityLogic());
|
||||
final UploadElectricQuantityState state = Get.find<UploadElectricQuantityLogic>().state;
|
||||
class _UploadElectricQuantityPageState extends State<UploadElectricQuantityPage>
|
||||
with RouteAware {
|
||||
final UploadElectricQuantityLogic logic =
|
||||
Get.put(UploadElectricQuantityLogic());
|
||||
final UploadElectricQuantityState state =
|
||||
Get.find<UploadElectricQuantityLogic>().state;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@ -42,7 +44,8 @@ class _UploadElectricQuantityPageState extends State<UploadElectricQuantityPage>
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Text('电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新'.tr,
|
||||
child: Text(
|
||||
'电量信息可以通过网关远程更新,或通过手机蓝牙在锁旁边更新'.tr,
|
||||
style: TextStyle(fontSize: 20.sp),
|
||||
)),
|
||||
],
|
||||
@ -51,39 +54,42 @@ class _UploadElectricQuantityPageState extends State<UploadElectricQuantityPage>
|
||||
height: 40.h,
|
||||
),
|
||||
Obx(() => Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Text(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Text(
|
||||
"${"电池1电量".tr}:${state.lockBasicInfo.value.electricQuantity ?? ""}%",
|
||||
style: TextStyle(fontSize: 20.sp),
|
||||
)),
|
||||
],
|
||||
)),
|
||||
],
|
||||
)),
|
||||
Visibility(
|
||||
visible: (state.lockSetInfoData.value.lockFeature ?? LockFeature()).isSupportBackupBattery == 1,
|
||||
visible:
|
||||
(state.lockSetInfoData.value.lockFeature ?? LockFeature())
|
||||
.isSupportBackupBattery ==
|
||||
1,
|
||||
child: Obx(() => Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Text(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Text(
|
||||
"${"电池2电量".tr}:${state.lockBasicInfo.value.electricQuantityStandby ?? ""}%",
|
||||
style: TextStyle(fontSize: 20.sp),
|
||||
)),
|
||||
],
|
||||
)),
|
||||
],
|
||||
)),
|
||||
),
|
||||
SizedBox(height: 10.h),
|
||||
Obx(() => Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Text(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Text(
|
||||
"${"电量更新时间".tr}:${state.uploadElectricQuantityDate.value == 0 ? "-" : DateTool().dateToYMDHNString(state.uploadElectricQuantityDate.value.toString())}",
|
||||
style: TextStyle(fontSize: 20.sp),
|
||||
)),
|
||||
],
|
||||
)),
|
||||
],
|
||||
)),
|
||||
SizedBox(
|
||||
height: 30.h,
|
||||
),
|
||||
@ -94,7 +100,7 @@ class _UploadElectricQuantityPageState extends State<UploadElectricQuantityPage>
|
||||
// margin: EdgeInsets.only(left: 03.w, right: 30.w, top: 20.w),
|
||||
padding: EdgeInsets.only(top: 20.w, bottom: 20.w),
|
||||
onClick: () async {
|
||||
final bool isNetWork = await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
@ -102,8 +108,7 @@ class _UploadElectricQuantityPageState extends State<UploadElectricQuantityPage>
|
||||
}),
|
||||
],
|
||||
),
|
||||
)
|
||||
);
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
@ -19,7 +18,7 @@ class BurglarAlarmPage extends StatefulWidget {
|
||||
State<BurglarAlarmPage> createState() => _BurglarAlarmPageState();
|
||||
}
|
||||
|
||||
class _BurglarAlarmPageState extends State<BurglarAlarmPage> with RouteAware{
|
||||
class _BurglarAlarmPageState extends State<BurglarAlarmPage> with RouteAware {
|
||||
final BurglarAlarmLogic logic = Get.put(BurglarAlarmLogic());
|
||||
final BurglarAlarmState state = Get.find<BurglarAlarmLogic>().state;
|
||||
|
||||
@ -49,27 +48,28 @@ class _BurglarAlarmPageState extends State<BurglarAlarmPage> with RouteAware{
|
||||
height: 20.h,
|
||||
),
|
||||
Obx(() => Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Text(
|
||||
"${"当前模式".tr} : ${state.burglarAlarmEnable.value == 1 ? '已开启'.tr : '已关闭'.tr}",
|
||||
style:
|
||||
TextStyle(fontSize: 22.sp, fontWeight: FontWeight.w600),
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Text(
|
||||
"${"当前模式".tr} : ${state.burglarAlarmEnable.value == 1 ? '已开启'.tr : '已关闭'.tr}",
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp, fontWeight: FontWeight.w600),
|
||||
)),
|
||||
],
|
||||
)),
|
||||
],
|
||||
)),
|
||||
SizedBox(
|
||||
height: 40.h,
|
||||
),
|
||||
Obx(() => SubmitBtn(
|
||||
btnName: state.burglarAlarmEnable.value == 1 ? '关闭'.tr : '开启'.tr,
|
||||
btnName:
|
||||
state.burglarAlarmEnable.value == 1 ? '关闭'.tr : '开启'.tr,
|
||||
borderRadius: 20.w,
|
||||
fontSize: 32.sp,
|
||||
// margin: EdgeInsets.only(left: 03.w, right: 30.w, top: 20.w),
|
||||
padding: EdgeInsets.only(top: 20.w, bottom: 20.w),
|
||||
onClick: () async {
|
||||
final bool isNetWork = await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
@ -77,8 +77,7 @@ class _BurglarAlarmPageState extends State<BurglarAlarmPage> with RouteAware{
|
||||
})),
|
||||
],
|
||||
),
|
||||
)
|
||||
);
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
@ -137,5 +136,4 @@ class _BurglarAlarmPageState extends State<BurglarAlarmPage> with RouteAware{
|
||||
state.ifCurrentScreen.value = false;
|
||||
state.sureBtnState.value = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -182,8 +182,7 @@ class _LockSetPageState extends State<LockSetPage>
|
||||
// logic.deletLockInfoData();
|
||||
// showDeletAlertDialog(context);
|
||||
// showDeletPasswordAlertDialog(context);
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -798,8 +798,48 @@ class UploadDataLogic extends BaseGetXController {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
state.indexCount.value = 0;
|
||||
state.sureBtnState.value = 0;
|
||||
if (uploadType == 1) {
|
||||
// 1设置
|
||||
// state.indexCount.value = 0;
|
||||
// state.sureBtnState.value = 0;
|
||||
// showToast('上传成功'.tr);
|
||||
} else {
|
||||
// 2开门方式
|
||||
switch (recordType) {
|
||||
// case 1:
|
||||
// // 电子钥匙
|
||||
//
|
||||
// break;
|
||||
case 2:
|
||||
// 密码上传成功之后,获取卡列表
|
||||
getUpdataLockCardList();
|
||||
break;
|
||||
case 3:
|
||||
// IC卡上传成功,获取指纹列表
|
||||
getUpdataLockFingerprintList();
|
||||
break;
|
||||
case 4:
|
||||
// 指纹上传成功,获取人脸列表
|
||||
getUpdataLockFaceList();
|
||||
break;
|
||||
case 5:
|
||||
// 人脸上传成功,获取掌静脉列表
|
||||
getUpdataLockPalmVeinList();
|
||||
break;
|
||||
case 6:
|
||||
// 掌静脉上传成功,获取锁遥控
|
||||
getUpdataLockRemoteControlList();
|
||||
break;
|
||||
case 7:
|
||||
// 遥控上传成功,获取锁设置
|
||||
getUpdataLockSet();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
// state.indexCount.value = 0;
|
||||
// state.sureBtnState.value = 0;
|
||||
dismissEasyLoading();
|
||||
}
|
||||
}
|
||||
|
||||
@ -68,7 +68,7 @@ class _PalmListPageState extends State<PalmListPage> with RouteAware {
|
||||
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
@ -143,7 +143,7 @@ class _PalmListPageState extends State<PalmListPage> with RouteAware {
|
||||
SlidableAction(
|
||||
onPressed: (BuildContext context) async {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ??
|
||||
await logic.isConnected() ??
|
||||
false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
|
||||
@ -68,8 +68,7 @@ class _PasswordKeyListPageState extends State<PasswordKeyListPage>
|
||||
final bool? isDemoMode =
|
||||
await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
final bool isNetWork = await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
@ -157,7 +156,7 @@ class _PasswordKeyListPageState extends State<PasswordKeyListPage>
|
||||
SlidableAction(
|
||||
onPressed: (BuildContext context) async {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ??
|
||||
await logic.isConnected() ??
|
||||
false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
|
||||
@ -207,7 +207,7 @@ class _RemoteControlDetailPageState extends State<RemoteControlDetailPage> with
|
||||
padding: EdgeInsets.only(top: 25.w, bottom: 25.w),
|
||||
onClick: () async {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -68,7 +68,7 @@ class _RemoteControlListPageState extends State<RemoteControlListPage> with Rout
|
||||
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ?? false;
|
||||
await logic.isConnected() ?? false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
}
|
||||
@ -144,7 +144,7 @@ class _RemoteControlListPageState extends State<RemoteControlListPage> with Rout
|
||||
SlidableAction(
|
||||
onPressed: (BuildContext context) async {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ??
|
||||
await logic.isConnected() ??
|
||||
false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
|
||||
@ -62,7 +62,7 @@ class _MinePersonInfoResetPasswordPageState
|
||||
onClick: state.canSub.value
|
||||
? () async {
|
||||
final bool isNetWork =
|
||||
await LockMainLogic.to()?.judgeTheNetwork() ??
|
||||
await logic.isConnected() ??
|
||||
false;
|
||||
if (!isNetWork) {
|
||||
return;
|
||||
|
||||
@ -16,14 +16,22 @@ class AudioPlayerManager {
|
||||
|
||||
// 单例的 AudioPlayer 实例
|
||||
final AudioPlayer _audioPlayer = AudioPlayer();
|
||||
// 播放状态,防止重复播放
|
||||
bool _isPlaying = false;
|
||||
|
||||
// 播放铃声
|
||||
Future<void> playRingtone() async {
|
||||
if (_isPlaying) {
|
||||
log(text: 'Ringtone is already playing.');
|
||||
return;
|
||||
}
|
||||
try {
|
||||
await _audioPlayer.setReleaseMode(ReleaseMode.loop);
|
||||
await _audioPlayer.play(AssetSource('ring1.mp3'));
|
||||
_isPlaying = true;
|
||||
log(text: 'Ringtone started playing.');
|
||||
} catch (e) {
|
||||
_isPlaying = false;
|
||||
log(text: 'Error playing ringtone: $e');
|
||||
}
|
||||
}
|
||||
@ -31,12 +39,12 @@ class AudioPlayerManager {
|
||||
// 停止播放铃声
|
||||
Future<void> stopRingtone() async {
|
||||
try {
|
||||
// 不需要设置 ReleaseMode,在停止时保持默认即可
|
||||
_audioPlayer.setReleaseMode(ReleaseMode.loop);
|
||||
await _audioPlayer.stop();
|
||||
|
||||
_isPlaying = false;
|
||||
log(text: 'Ringtone stopped.');
|
||||
} catch (e) {
|
||||
_isPlaying = false;
|
||||
log(text: 'Error stopping ringtone: $e');
|
||||
}
|
||||
}
|
||||
@ -45,8 +53,10 @@ class AudioPlayerManager {
|
||||
Future<void> pauseRingtone() async {
|
||||
try {
|
||||
await _audioPlayer.pause();
|
||||
_isPlaying = false;
|
||||
log(text: 'Ringtone paused.');
|
||||
} catch (e) {
|
||||
_isPlaying = false;
|
||||
log(text: 'Error pausing ringtone: $e');
|
||||
}
|
||||
}
|
||||
@ -54,8 +64,10 @@ class AudioPlayerManager {
|
||||
Future<void> resumeRingtone() async {
|
||||
try {
|
||||
await _audioPlayer.resume();
|
||||
_isPlaying = true;
|
||||
log(text: 'Ringtone resumed.');
|
||||
} catch (e) {
|
||||
_isPlaying = false;
|
||||
log(text: 'Error resuming ringtone: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,7 +4,9 @@ import 'dart:typed_data';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:star_lock/appRouters.dart';
|
||||
import 'package:star_lock/app_settings/app_settings.dart';
|
||||
import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart';
|
||||
import 'package:star_lock/talk/starChart/constant/message_type_constant.dart';
|
||||
import 'package:star_lock/talk/starChart/constant/talk_status.dart';
|
||||
import 'package:star_lock/talk/starChart/entity/scp_message.dart';
|
||||
@ -16,6 +18,8 @@ import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart';
|
||||
import 'package:star_lock/talk/starChart/proto/talk_expect.pb.dart';
|
||||
import 'package:star_lock/talk/starChart/views/talkView/talk_view_logic.dart';
|
||||
import 'package:star_lock/talk/starChart/views/talkView/talk_view_state.dart';
|
||||
import 'package:star_lock/tools/commonDataManage.dart';
|
||||
import 'package:star_lock/tools/storage.dart';
|
||||
|
||||
import '../../star_chart_manage.dart';
|
||||
|
||||
@ -32,9 +36,10 @@ class UdpTalkExpectHandler extends ScpMessageBaseHandle
|
||||
}
|
||||
|
||||
@override
|
||||
void handleResp(ScpMessage scpMessage) {
|
||||
void handleResp(ScpMessage scpMessage) async {
|
||||
// 收到预期音视频数据回复
|
||||
final TalkExpectResp talkExpectResp = scpMessage.Payload;
|
||||
|
||||
if (talkExpectResp != null) {
|
||||
// print('收到预期音视频数据回复,scpMessage:$scpMessage');
|
||||
// 停止发送预期数据的定时器
|
||||
@ -45,7 +50,7 @@ class UdpTalkExpectHandler extends ScpMessageBaseHandle
|
||||
startChartManage.rotateAngle = talkExpectResp.rotate;
|
||||
startChartManage.videoWidth = talkExpectResp.width;
|
||||
startChartManage.videoHeight = talkExpectResp.height;
|
||||
AppLog.log('视频画面需要旋转:${talkExpectResp.rotate},画面宽高:${talkExpectResp.width}-${talkExpectResp.height}');
|
||||
|
||||
// 收到预期数据的应答后,代表建立了连接,启动通话保持的监听
|
||||
// 启动通话保持监听定时器(用来判断如果x秒内没有收到通话保持则执行的操作);
|
||||
talkePingOverTimeTimerManager.start();
|
||||
@ -58,6 +63,53 @@ class UdpTalkExpectHandler extends ScpMessageBaseHandle
|
||||
talkStatus.setAnsweredSuccessfully();
|
||||
// 主动呼叫时需要启动ping
|
||||
startChartManage.startTalkPingMessageTimer();
|
||||
} else if (talkStatus.status != TalkStatus.answeredSuccessfully) {
|
||||
playRingtone();
|
||||
}
|
||||
AppLog.log(
|
||||
'视频画面需要旋转:${talkExpectResp.rotate},画面宽高:${talkExpectResp.width}-${talkExpectResp.height}');
|
||||
// 获取锁支持项
|
||||
final LockListInfoItemEntity currentKeyInfo =
|
||||
CommonDataManage().currentKeyInfo;
|
||||
// 0、wifi保活 1、wifi不保活图传 2、wifi不保活可视对讲
|
||||
var isWifiLockType = currentKeyInfo.lockFeature?.wifiLockType == 1;
|
||||
|
||||
final LockListInfoGroupEntity? lockListInfoGroupEntity =
|
||||
await Storage.getLockMainListData();
|
||||
if (lockListInfoGroupEntity != null) {
|
||||
lockListInfoGroupEntity!.groupList?.forEach((element) {
|
||||
final lockList = element.lockList;
|
||||
if (lockList != null && lockList.length != 0) {
|
||||
for (var lockInfo in lockList) {
|
||||
final peerId = lockInfo.network?.peerId;
|
||||
if (peerId != null && peerId != '') {
|
||||
if (peerId == scpMessage.FromPeerId) {
|
||||
isWifiLockType = lockInfo.lockFeature?.wifiLockType == 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
if (isWifiLockType ||
|
||||
(talkExpectResp.rotate == 0 &&
|
||||
talkExpectResp.width == 640 &&
|
||||
talkExpectResp.height == 480)) {
|
||||
Get.toNamed(Routers.imageTransmissionView);
|
||||
|
||||
return;
|
||||
}
|
||||
if (startChartManage
|
||||
.getDefaultTalkExpect()
|
||||
.videoType
|
||||
.contains(VideoTypeE.H264)) {
|
||||
Get.toNamed(
|
||||
Routers.h264View,
|
||||
);
|
||||
} else {
|
||||
Get.toNamed(
|
||||
Routers.starChartTalkView,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -90,52 +90,10 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
|
||||
}) async {
|
||||
// 发送预期数据、通知锁板需要获取视频数据
|
||||
_handleRequestSendExpect(lockPeerID: lockPeerID);
|
||||
// 播放铃声
|
||||
//test:使用自定义铃声
|
||||
playRingtone();
|
||||
// 显示状态栏弹窗
|
||||
// _showTalkRequestNotification(talkObjectName: talkObjectName);
|
||||
// 设置为等待接听状态
|
||||
talkStatus.setPassiveCallWaitingAnswer();
|
||||
|
||||
// 获取锁支持项
|
||||
final LockListInfoItemEntity currentKeyInfo =
|
||||
CommonDataManage().currentKeyInfo;
|
||||
var isWifiLockType = currentKeyInfo.lockFeature?.wifiLockType == 1;
|
||||
|
||||
final LockListInfoGroupEntity? lockListInfoGroupEntity =
|
||||
await Storage.getLockMainListData();
|
||||
if (lockListInfoGroupEntity != null) {
|
||||
lockListInfoGroupEntity!.groupList?.forEach((element) {
|
||||
final lockList = element.lockList;
|
||||
if (lockList != null && lockList.length != 0) {
|
||||
for (var lockInfo in lockList) {
|
||||
final peerId = lockInfo.network?.peerId;
|
||||
if (peerId != null && peerId != '') {
|
||||
if (peerId == lockPeerID) {
|
||||
isWifiLockType = lockInfo.lockFeature?.wifiLockType == 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
if (isWifiLockType) {
|
||||
Get.toNamed(Routers.imageTransmissionView);
|
||||
return;
|
||||
}
|
||||
if (startChartManage
|
||||
.getDefaultTalkExpect()
|
||||
.videoType
|
||||
.contains(VideoTypeE.H264)) {
|
||||
Get.toNamed(
|
||||
Routers.h264WebView,
|
||||
);
|
||||
} else {
|
||||
Get.toNamed(
|
||||
Routers.starChartTalkView,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 收到来电请求时进行本地通知
|
||||
|
||||
@ -430,7 +430,7 @@ class StartChartManage {
|
||||
// 优先使用H264,其次是MJPEG
|
||||
if (isH264) {
|
||||
Get.toNamed(
|
||||
Routers.h264WebView,
|
||||
Routers.h264View,
|
||||
);
|
||||
} else if (isMJpeg) {
|
||||
Get.toNamed(
|
||||
|
||||
@ -0,0 +1,3 @@
|
||||
import 'package:star_lock/tools/baseGetXController.dart';
|
||||
|
||||
class PermissionGuidanceLogic extends BaseGetXController {}
|
||||
109
lib/talk/starChart/views/guide/permission_guidance_page.dart
Normal file
109
lib/talk/starChart/views/guide/permission_guidance_page.dart
Normal file
@ -0,0 +1,109 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
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/tools/titleAppBar.dart';
|
||||
|
||||
class PermissionGuidancePage extends StatefulWidget {
|
||||
const PermissionGuidancePage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<PermissionGuidancePage> createState() => _PermissionGuidancePageState();
|
||||
}
|
||||
|
||||
class _PermissionGuidancePageState extends State<PermissionGuidancePage> {
|
||||
final PageController _pageController = PageController();
|
||||
int _currentPage = 0;
|
||||
|
||||
final List<Map<String, String>> _stepsData = [
|
||||
{
|
||||
'image': 'images/guide/1.png',
|
||||
'text': '步骤1:打开应用信息,点击通知管理选项',
|
||||
},
|
||||
{
|
||||
'image': 'images/guide/2.png',
|
||||
'text': '步骤2:下滑点击呼叫提醒的通知选项',
|
||||
},
|
||||
{
|
||||
'image': 'images/guide/3.png',
|
||||
'text': '步骤3:选择在锁定屏幕上的选项设置',
|
||||
},
|
||||
{
|
||||
'image': 'images/guide/4.png',
|
||||
'text': '步骤4:设置为显示通知及其内容',
|
||||
},
|
||||
];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: TitleAppBar(
|
||||
barTitle: '锁屏通知开启方式'.tr,
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor,
|
||||
backAction: () {
|
||||
Get.back();
|
||||
},
|
||||
),
|
||||
body: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: PageView.builder(
|
||||
controller: _pageController,
|
||||
onPageChanged: (index) {
|
||||
setState(() {
|
||||
_currentPage = index;
|
||||
});
|
||||
},
|
||||
itemCount: _stepsData.length,
|
||||
itemBuilder: (context, index) {
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Image.asset(
|
||||
_stepsData[index]['image']!,
|
||||
width: 1.sw,
|
||||
height: 0.55.sh,
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
SizedBox(height: 32.h),
|
||||
Text(
|
||||
_stepsData[index]['text']!,
|
||||
style: TextStyle(fontSize: 28.sp),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
SizedBox(height: 16),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: List.generate(_stepsData.length, (index) {
|
||||
return Container(
|
||||
margin: EdgeInsets.symmetric(horizontal: 4),
|
||||
width: 10,
|
||||
height: 10,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: _currentPage == index
|
||||
? AppColors.mainColor
|
||||
: Colors.grey[300],
|
||||
),
|
||||
);
|
||||
}),
|
||||
),
|
||||
SizedBox(height: 24),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_pageController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,3 @@
|
||||
class PermissionGuidanceState {
|
||||
|
||||
}
|
||||
@ -1,6 +1,9 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:star_lock/appRouters.dart';
|
||||
import 'package:star_lock/app_settings/app_colors.dart';
|
||||
import 'package:star_lock/talk/call/callTalk.dart';
|
||||
import 'package:star_lock/talk/starChart/constant/talk_status.dart';
|
||||
@ -52,18 +55,42 @@ class _ImageTransmissionPageState extends State<ImageTransmissionPage>
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
String handlerAppBarTitle() {
|
||||
if (startChartManage.rotateAngle == 0 &&
|
||||
startChartManage.videoWidth == 640 &&
|
||||
startChartManage.videoHeight == 480) {
|
||||
return '';
|
||||
}
|
||||
return '图传'.tr;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.mainBackgroundColor,
|
||||
resizeToAvoidBottomInset: false,
|
||||
appBar: TitleAppBar(
|
||||
barTitle: '图传'.tr,
|
||||
barTitle: handlerAppBarTitle(),
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor,
|
||||
backAction: () {
|
||||
logic.udpHangUpAction();
|
||||
},
|
||||
actionsList: [
|
||||
Visibility(
|
||||
visible: state.currentLanguage == 'zh_CN' && Platform.isAndroid,
|
||||
child: IconButton(
|
||||
icon: Icon(
|
||||
Icons.notification_add_sharp,
|
||||
size: 32.w,
|
||||
color: Colors.white,
|
||||
),
|
||||
onPressed: () {
|
||||
Get.toNamed(Routers.permissionGuidancePage);
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
body: Obx(() => Column(
|
||||
children: [
|
||||
@ -124,7 +151,7 @@ class _ImageTransmissionPageState extends State<ImageTransmissionPage>
|
||||
borderRadius: BorderRadius.circular(30.h),
|
||||
child: Container(
|
||||
width: barWidth,
|
||||
height: double.infinity,
|
||||
// height: double.infinity,
|
||||
child: RotatedBox(
|
||||
quarterTurns: startChartManage.rotateAngle ~/ 90,
|
||||
child: RawImage(
|
||||
|
||||
@ -13,6 +13,7 @@ import 'package:star_lock/talk/starChart/constant/talk_status.dart';
|
||||
import 'package:star_lock/talk/starChart/handle/other/talk_data_repository.dart';
|
||||
import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart';
|
||||
import 'package:star_lock/talk/starChart/status/star_chart_talk_status.dart';
|
||||
import 'package:star_lock/translations/current_locale_tool.dart';
|
||||
|
||||
import '../../../../tools/storage.dart';
|
||||
|
||||
@ -91,4 +92,7 @@ class ImageTransmissionState{
|
||||
RxBool hasAudioData = false.obs; // 是否有音频数据
|
||||
RxInt lastAudioTimestamp = 0.obs; // 最后接收到的音频数据的时间戳
|
||||
Rx<ui.Image?> currentImage = Rx<ui.Image?>(null);
|
||||
|
||||
RxString currentLanguage =
|
||||
CurrentLocaleTool.getCurrentLocaleString().obs; // 当前选择语言
|
||||
}
|
||||
@ -9,6 +9,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:star_lock/appRouters.dart';
|
||||
import 'package:star_lock/flavors.dart';
|
||||
import 'package:star_lock/talk/call/callTalk.dart';
|
||||
import 'package:star_lock/talk/starChart/constant/talk_status.dart';
|
||||
@ -332,9 +333,10 @@ class _TalkViewNativeDecodePageState extends State<TalkViewNativeDecodePage>
|
||||
color: state.currentQuality.value == q
|
||||
? AppColors.mainColor
|
||||
: Colors.black,
|
||||
fontWeight: state.currentQuality.value == q
|
||||
? FontWeight.bold
|
||||
: FontWeight.normal,
|
||||
fontWeight:
|
||||
state.currentQuality.value == q
|
||||
? FontWeight.bold
|
||||
: FontWeight.normal,
|
||||
fontSize: 28.sp,
|
||||
),
|
||||
),
|
||||
@ -350,9 +352,27 @@ class _TalkViewNativeDecodePageState extends State<TalkViewNativeDecodePage>
|
||||
);
|
||||
},
|
||||
child: Container(
|
||||
child: Icon(Icons.high_quality_outlined, color: Colors.white, size: 38.w),
|
||||
child: Icon(Icons.high_quality_outlined,
|
||||
color: Colors.white, size: 38.w),
|
||||
),
|
||||
),
|
||||
Visibility(
|
||||
visible: state.currentLanguage == 'zh_CN' && Platform.isAndroid,
|
||||
child: SizedBox(width: 38.w),
|
||||
),
|
||||
Visibility(
|
||||
visible: state.currentLanguage == 'zh_CN' && Platform.isAndroid,
|
||||
child: IconButton(
|
||||
icon: Icon(
|
||||
Icons.notification_add_sharp,
|
||||
size: 32.w,
|
||||
color: Colors.white,
|
||||
),
|
||||
onPressed: () {
|
||||
Get.toNamed(Routers.permissionGuidancePage);
|
||||
},
|
||||
),
|
||||
)
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@ -15,6 +15,7 @@ import 'package:star_lock/talk/starChart/handle/other/packet_loss_statistics.dar
|
||||
import 'package:star_lock/talk/starChart/handle/other/talk_data_repository.dart';
|
||||
import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart';
|
||||
import 'package:star_lock/talk/starChart/status/star_chart_talk_status.dart';
|
||||
import 'package:star_lock/translations/current_locale_tool.dart';
|
||||
import 'package:video_decode_plugin/video_decode_plugin.dart';
|
||||
|
||||
import '../../../../tools/storage.dart';
|
||||
@ -120,4 +121,7 @@ class TalkViewNativeDecodeState {
|
||||
|
||||
// 当前清晰度选项,初始为'高清'
|
||||
RxString currentQuality = '高清'.obs; // 可选:高清、标清、流畅
|
||||
|
||||
RxString currentLanguage =
|
||||
CurrentLocaleTool.getCurrentLocaleString().obs; // 当前选择语言
|
||||
}
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
@ -7,6 +8,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:star_lock/appRouters.dart';
|
||||
import 'package:star_lock/flavors.dart';
|
||||
import 'package:star_lock/talk/call/callTalk.dart';
|
||||
import 'package:star_lock/talk/starChart/constant/talk_status.dart';
|
||||
@ -405,6 +407,23 @@ class _TalkViewPageState extends State<TalkViewPage>
|
||||
image: const AssetImage('images/main/icon_lockDetail_rectangle.png'),
|
||||
),
|
||||
),
|
||||
Visibility(
|
||||
visible: state.currentLanguage == 'zh_CN' && Platform.isAndroid,
|
||||
child: SizedBox(width: 38.w),
|
||||
),
|
||||
Visibility(
|
||||
visible: state.currentLanguage == 'zh_CN' && Platform.isAndroid,
|
||||
child: IconButton(
|
||||
icon: Icon(
|
||||
Icons.notification_add_sharp,
|
||||
size: 32.w,
|
||||
color: Colors.white,
|
||||
),
|
||||
onPressed: () {
|
||||
Get.toNamed(Routers.permissionGuidancePage);
|
||||
},
|
||||
),
|
||||
)
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@ -13,6 +13,7 @@ import 'package:star_lock/talk/starChart/constant/talk_status.dart';
|
||||
import 'package:star_lock/talk/starChart/handle/other/talk_data_repository.dart';
|
||||
import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart';
|
||||
import 'package:star_lock/talk/starChart/status/star_chart_talk_status.dart';
|
||||
import 'package:star_lock/translations/current_locale_tool.dart';
|
||||
|
||||
import '../../../../tools/storage.dart';
|
||||
|
||||
@ -91,4 +92,7 @@ class TalkViewState {
|
||||
RxBool hasAudioData = false.obs; // 是否有音频数据
|
||||
RxInt lastAudioTimestamp = 0.obs; // 最后接收到的音频数据的时间戳
|
||||
Rx<ui.Image?> currentImage = Rx<ui.Image?>(null);
|
||||
|
||||
RxString currentLanguage =
|
||||
CurrentLocaleTool.getCurrentLocaleString().obs; // 当前选择语言
|
||||
}
|
||||
|
||||
@ -57,6 +57,8 @@ extension ExtensionAppDept on AppDept {
|
||||
const Locale ukL = Locale('uk', 'UA');
|
||||
const Locale hiL = Locale('hi', 'IN');
|
||||
const Locale urL = Locale('ur', 'PK');
|
||||
const Locale hyL = Locale('hy', 'AM');
|
||||
const Locale kaL = Locale('ka', 'GE');
|
||||
const Locale srCyrillic = Locale('sr', 'RS');
|
||||
|
||||
return [
|
||||
@ -98,6 +100,8 @@ extension ExtensionAppDept on AppDept {
|
||||
ukL,
|
||||
hiL,
|
||||
urL,
|
||||
hyL,
|
||||
kaL,
|
||||
srCyrillic
|
||||
];
|
||||
}
|
||||
@ -187,6 +191,10 @@ enum LanguageType {
|
||||
hindi,
|
||||
//乌尔都语
|
||||
urdu,
|
||||
//亚美尼亚语
|
||||
armenian,
|
||||
//格鲁吉亚语
|
||||
georgian,
|
||||
}
|
||||
|
||||
extension ExtensionLanguageType on LanguageType {
|
||||
@ -310,6 +318,12 @@ extension ExtensionLanguageType on LanguageType {
|
||||
case LanguageType.urdu:
|
||||
str = '乌尔都语'.tr;
|
||||
break;
|
||||
case LanguageType.armenian:
|
||||
str = '亚美尼亚语'.tr;
|
||||
break;
|
||||
case LanguageType.georgian:
|
||||
str = '格鲁吉亚语'.tr;
|
||||
break;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
@ -436,6 +450,12 @@ extension ExtensionLanguageType on LanguageType {
|
||||
case 'ur':
|
||||
languageType = LanguageType.urdu;
|
||||
break;
|
||||
case 'hy':
|
||||
languageType = LanguageType.armenian;
|
||||
break;
|
||||
case 'ka':
|
||||
languageType = LanguageType.georgian;
|
||||
break;
|
||||
default:
|
||||
languageType = LanguageType.english;
|
||||
break;
|
||||
@ -641,6 +661,16 @@ extension ExtensionLanguageType on LanguageType {
|
||||
return locale;
|
||||
}
|
||||
break;
|
||||
case LanguageType.armenian:
|
||||
if (locale.languageCode == 'hy' && locale.countryCode == 'AM') {
|
||||
return locale;
|
||||
}
|
||||
break;
|
||||
case LanguageType.georgian:
|
||||
if (locale.languageCode == 'ka' && locale.countryCode == 'GE') {
|
||||
return locale;
|
||||
}
|
||||
break;
|
||||
case LanguageType.system:
|
||||
// TODO: Handle this case.
|
||||
break;
|
||||
|
||||
@ -80,6 +80,8 @@ class TranslationLoader {
|
||||
static Map<String, String> _daMap = <String, String>{};
|
||||
static Map<String, String> _hiMap = <String, String>{};
|
||||
static Map<String, String> _urMap = <String, String>{};
|
||||
static Map<String, String> _hyMap = <String, String>{};
|
||||
static Map<String, String> _kaMap = <String, String>{};
|
||||
|
||||
static Map<String, String> get zhDic => _zhMap;
|
||||
static Map<String, String> get enDic => _enMap;
|
||||
@ -122,6 +124,8 @@ class TranslationLoader {
|
||||
static Map<String, String> get srMap => _srMap;
|
||||
static Map<String, String> get hiMap => _hiMap;
|
||||
static Map<String, String> get urMap => _urMap;
|
||||
static Map<String, String> get hyMap => _hyMap;
|
||||
static Map<String, String> get kaMap => _kaMap;
|
||||
|
||||
static Future<void> loadTranslation() async {
|
||||
_zhMap = await _loadJsonFile('lan/lan_zh.json');
|
||||
@ -165,6 +169,8 @@ class TranslationLoader {
|
||||
_srMap = await _loadJsonFile('lan/lan_sr_cyrl.json');
|
||||
_hiMap = await _loadJsonFile('lan/lan_hi.json');
|
||||
_urMap = await _loadJsonFile('lan/lan_ur.json');
|
||||
_hyMap = await _loadJsonFile('lan/lan_hy.json');
|
||||
_kaMap = await _loadJsonFile('lan/lan_ka.json');
|
||||
}
|
||||
|
||||
static Future<Map<String, String>> _loadJsonFile(String filePath) async =>
|
||||
|
||||
@ -42,6 +42,8 @@ class TranslationMessage extends Translations {
|
||||
'da_DK': TranslationLoader.daDic,
|
||||
'hi_IN': TranslationLoader.hiMap,
|
||||
'ur_PK': TranslationLoader.urMap,
|
||||
'hy_AM': TranslationLoader.hyMap,
|
||||
'ka_GE': TranslationLoader.kaMap,
|
||||
};
|
||||
|
||||
void updateLocal(Locale l) => Get.updateLocale(l);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user