Merge branch 'develop_sky_liyi' into 'develop_sky'

Develop sky liyi

See merge request StarlockTeam/app-starlock!243
This commit is contained in:
李仪 2025-08-08 01:59:52 +00:00
commit 84be5b7617
61 changed files with 1816 additions and 69 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "بعد إعادة الضبط ، سيتم حذف الأوردة المشطية للقفل. هل أنت متأكد أنك تريد إعادة الضبط ؟",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "След нулиране, метакарпалните вени на ключалката ще бъдат изтрити. Сигурен ли сте, че искате да се възстанови?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "ব্যান্ডোটারআইসেট, হাসিপাল রিরিইনস্ফথেলকবইল্ডজেডড।?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetování budou metakarpální žíly zámku odstraněny. Jste si jistý, že chcete resetovat?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter nulstilling, de metacarpal vener i låsen vil blive slettet. Er du sikker på at du vil nulstille?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nach dem Zurücksetzen werden die Mittelhand adern des Schlosses gelöscht. Sind Sie sicher, dass Sie zurücksetzen wollen?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, οι μετακάρπιες φλέβες της κλειδαριάς θα διαγραφούν. Είστε σίγουροι ότι θέλετε να επαναφέρετε;",

View File

@ -1084,6 +1084,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "After reset, the metacarpal veins of the lock will be deleted. Are you sure you want to reset?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Después del reinicio, se eliminarán las venas metacarpiales de la cerradura. ¿Está seguro de que desea restablecer?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku metakarpaalveenid. Kas tõesti soovid lähtestada?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Kun lukko on nollattu, metakarppinen suoneet poistetaan. Haluatko varmasti palauttaa?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Après réinitialisation, les veines métacarpiennes de la serrure seront supprimées. Êtes-vous sûr de vouloir réinitialiser?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "לאחר איפוס, הורידים של המנעול יימחקו. אתה בטוח שברצונך לאפס?",

View File

@ -1084,6 +1084,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "रीसेट के बाद, लॉक के मेटाकार्पल नसों को हटा दिया जाएगा। क्या आप निश्चित रूप से रीसेट करना चाहते हैं?",

View File

@ -1083,6 +1083,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 你確定要重置啊?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nakon resetiranja, metakarpalne vene brave će biti izbrisane. Jeste li sigurni da želite resetiranje?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "A reset után a zár metakarpális erei törlődnek. Biztos vagy benne, hogy vissza akarsz állítani?",

View File

@ -1084,6 +1084,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Վերագործարկումից հետո կողպեքի մետակարպալ երակները կջնջվեն: Իրո՞ք ցանկանում եք վերակայել:",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Setelah mengulang, pembuluh darah metakarpal dari kunci akan dihapus. Yakin ingin mengatur ulang?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Dopo il reset, le vene metacarpali della serratura verranno cancellate. Sei sicuro di voler reimpostare?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "リセット後、ロックの中手骨静脈が削除されます。リセットしてもよろしいですか。",

View File

@ -1084,6 +1084,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "გადატვირთვის შემდეგ, საკეტის მეტაკარპალური ვენები წაიშლება. დარწმუნებული ხართ, რომ გსურთ გადატვირთვა?",

View File

@ -1085,6 +1085,7 @@
"乌尔都语": "乌尔都语",
"亚美尼亚语": "亚美尼亚语",
"格鲁吉亚语": "格鲁吉亚语",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Қайта ысырып тастағаннан соң бұғаттағы метакарпалар өшіріледі. Шынымен ысырып тастауды қалайсыз ба?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "재설정 후 잠금 장치의 중수골 정맥이 삭제됩니다. 당신은 당신이 재설정 하시겠습니까?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po reset užrakto metakarpinės venos bus ištrintos. Ar tikrai norite atstatyti?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, urat metacarpal kunci akan dipadamkan. Adakah anda pasti anda mahu menetapkan semula?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Na reset worden de middenhandsbeenaders van het slot verwijderd. Weet je zeker dat je wilt resetten?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po zresetowaniu żyły śródręcza zamka zostaną usunięte. Czy na pewno chcesz zresetować?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Após a reinicialização, as veias do metacarpo do bloqueio serão excluídas. Tens a certeza que queres reiniciar?",

1170
lan/lan_pt_br.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "După resetare, venele metacarpale ale încuietorii vor fi şterse. Sigur doriți să resetați?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "После сброса пястные вены замка будут удалены. Вы уверены, что хотите сбросить?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetovaní budú metakarpálne žily zámku vymazané. Ste si istí, že chcete obnoviť?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Након ресетовања, метакарпалне вене браве ће бити избрисане. Да ли сте сигурни да желите да ресетујете?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter återställd, de metakarpal venerna i låset tas bort. Är du säker på att du vill återställa?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "หลังจากรีเซ็ตแล้วหลอดเลือดดำ metacarpal ของล็อคจะถูกลบออกคุณแน่ใจว่าอยากจะรีเซ็ต?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sıfırlamadan sonra, kilidin metacarpal damarları silinecektir. Sıfırlamak istediğine emin misin?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 是否確實要重置?",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Після скидання п'ясткові вени замку будуть видалені. Ви впевнені, що хочете скинути налаштування?",

View File

@ -1084,6 +1084,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "ری سیٹ کرنے کے بعد ، لاک کی میٹاکارپل رگیں حذف کردی جائیں گی۔ کیا آپ واقعی دوبارہ ترتیب دینا چاہتے ہیں؟",

View File

@ -1082,6 +1082,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"繁体中文(中国台湾)": "繁體中文(中國臺灣)",
"繁体中文(中国香港)": "繁體中文(中國香港)",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "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?",

View File

@ -1087,6 +1087,7 @@
"乌尔都语": "اوردو",
"亚美尼亚语": "Հայերեն",
"格鲁吉亚语": "ქართული",
"巴西葡萄牙语": "Português do Brasil",
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置后,该锁的掌静脉都将被删除哦,确认要重置吗?",
"在线": "在线",
"离线": "离线",

348
langAzure.py Normal file
View File

@ -0,0 +1,348 @@
#!/usr/bin/python3
import datetime
import json
import os
import re
import sys
import time
from typing import Dict
import requests
# 运行格式方式一python langAzure.py
# 运行格式方式二python3 langAzure.py
# 语言文件路径
path = "./resources/lang/"
# 原语言
SOURCE_LANG = 'en_US'
# 过滤不翻译的语言
FILTER_LANG = ['zh_CN', 'en_US']
# Azure翻译语言映射基于: https://docs.azure.cn/zh-cn/ai-services/translator/text-translation/reference/v3/translate
# 语言代码https://api.translator.azure.cn/languages?api-version=3.0&scope=translation
AZURE_LANG_MAP = {
# 'zh_CN': {
# 'name': '简体中文',
# 'code': 'zh-Hans'
# },
# 'zh_TW': {
# 'name': '繁体中文',
# 'code': 'zh-Hant',
# },
# 'zh_HK': {
# 'name': '粤语(繁体)',
# 'code': 'yue',
# },
# 'en_US': {
# 'name': '英文',
# 'code': 'en',
# },
# 'fr_FR': {
# 'name': '法语',
# 'code': 'fr',
# },
# 'ru_RU': {
# 'name': '俄语',
# 'code': 'ru',
# },
# 'de_DE': {
# 'name': '德语',
# 'code': 'de',
# },
# 'ja_JP': {
# 'name': '日语',
# 'code': 'ja',
# },
# 'ko_KR': {
# 'name': '韩语',
# 'code': 'ko',
# },
# 'it_IT': {
# 'name': '意大利语',
# 'code': 'it',
# },
# 'pt_PT': {
# 'name': '葡萄牙语',
# 'code': 'pt-PT',
# },
# 'es_ES': {
# 'name': '西班牙语',
# 'code': 'es',
# },
# 'ar_SA': {
# 'name': '阿拉伯语',
# 'code': 'ar',
# },
# 'vi_VN': {
# 'name': '越南语',
# 'code': 'vi',
# },
# 'ms_MY': {
# 'name': '马来语',
# 'code': 'ms',
# },
# 'nl_NL': {
# 'name': '荷兰语',
# 'code': 'nl',
# },
# 'ro_RO': {
# 'name': '罗马尼亚语',
# 'code': 'ro',
# },
# 'lt_LT': {
# 'name': '立陶宛语',
# 'code': 'lt',
# },
# 'sv_SE': {
# 'name': '瑞典语',
# 'code': 'sv',
# },
# 'et_EE': {
# 'name': '爱沙尼亚语',
# 'code': 'et',
# },
# 'pl_PL': {
# 'name': '波兰语',
# 'code': 'pl',
# },
# 'sk_SK': {
# 'name': '斯洛伐克语',
# 'code': 'sk',
# },
# 'cs_CZ': {
# 'name': '捷克语',
# 'code': 'cs',
# },
# 'el_GR': {
# 'name': '希腊语',
# 'code': 'el',
# },
# 'he_IL': {
# 'name': '希伯来语',
# 'code': 'he',
# },
# 'tr_TR': {
# 'name': '土耳其语',
# 'code': 'tr',
# },
# 'hu_HU': {
# 'name': '匈牙利语',
# 'code': 'hu',
# },
# 'bg_BG': {
# 'name': '保加利亚语',
# 'code': 'bg',
# },
# 'kk_KZ': {
# 'name': '哈萨克语',
# 'code': 'kk',
# },
# 'bn_BD': {
# 'name': '孟加拉语',
# 'code': 'bn',
# },
# 'hr_HR': {
# 'name': '克罗地亚语',
# 'code': 'hr',
# },
# 'th_TH': {
# 'name': '泰语',
# 'code': 'th',
# },
# 'id_ID': {
# 'name': '印尼语',
# 'code': 'id',
# },
# 'fi_FI': {
# 'name': '芬兰语',
# 'code': 'fi',
# },
# 'da_DK': {
# 'name': '丹麦语',
# 'code': 'da',
# },
# 'uk_UA': {
# 'name': '乌克兰语',
# 'code': 'uk',
# },
# 'sr_RS': {
# 'name': '塞尔维亚语(西里尔)',
# 'code': 'sr-Cyrl',
# },
# 'hi_IN': {
# 'name': '印地语',
# 'code': 'hi',
# },
# 'ur_PK': {
# 'name': '乌尔都语',
# 'code': 'ur',
# },
# 'hy_AM': {
# 'name': '亚美尼亚语',
# 'code': 'hy',
# },
# 'ka_GE': {
# 'name': '格鲁吉亚语',
# 'code': 'ka',
# },
'pt_BR': {
'name': '葡萄牙语 (巴西)',
'code': 'pt',
},
}
# =============================== 以下为固定代码,非必要请勿修改 ===============================
# Azure配置
AZURE_CONFIG = {
'api_url': 'https://api.cognitive.microsofttranslator.com',
'subscription_key': '5UGFXbyyyIlwtvFbl5HUeWeHffW9aKLNIiZlqWsRZuLaFSmXfxfzJQQJ99BGAC3pKaRXJ3w3AAAbACOGpL8p', # 替换为您的订阅密钥
'region': 'eastasia', # 替换为您的区域,例如 'eastasia'
}
def main():
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)
# 遍历AZURE_LANG_MAP
for key in AZURE_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
# 检查key是否包含中文
has_chinese = bool(re.search(r'[\u4e00-\u9fff]', en_us_key))
text_to_translate = en_us_key if has_chinese else en_us_data[en_us_key]
print('语言:%s 正在翻译处理第%d/%d批数据 是否中文:%s' % (key, current, total, has_chinese))
# 过滤已存在的key
if en_us_key in datas:
continue
# 异常处理
try:
if has_chinese:
# 从中文翻译到目标语言
datas[en_us_key] = azure_translation('zh-Hans', AZURE_LANG_MAP[key]['code'], text_to_translate)
else:
# 从英文翻译到目标语言
datas[en_us_key] = azure_translation(AZURE_LANG_MAP[SOURCE_LANG]['code'], AZURE_LANG_MAP[key]['code'], text_to_translate)
# 延迟1秒避免API限制
#time.sleep(1)
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 azure_translation(source_language, target_language, text):
"""
使用Azure翻译API进行文本翻译
Args:
source_language: 源语言代码
target_language: 目标语言代码
text: 要翻译的文本
Returns:
翻译后的文本
"""
# 构建API端点
endpoint = f"{AZURE_CONFIG['api_url']}/translate"
# 设置参数
params = {
'api-version': '3.0',
'from': source_language,
'to': target_language
}
# 设置请求头
headers = {
'Ocp-Apim-Subscription-Key': AZURE_CONFIG['subscription_key'],
'Ocp-Apim-Subscription-Region': AZURE_CONFIG['region'],
'Content-type': 'application/json',
'X-ClientTraceId': str(datetime.datetime.now().timestamp())
}
# 构建请求体
body = [{'text': text}]
try:
# 发送请求
response = requests.post(endpoint, params=params, headers=headers, json=body)
# 检查响应状态
if response.status_code != 200:
raise Exception(f"Azure翻译API请求失败状态码{response.status_code},响应:{response.text}")
# 解析响应
result = response.json()
# 提取翻译结果
if result and len(result) > 0 and 'translations' in result[0]:
return result[0]['translations'][0]['text']
else:
raise Exception(f"Azure翻译API响应格式异常{result}")
except requests.exceptions.RequestException as e:
raise Exception(f"Azure翻译API网络请求异常{str(e)}")
except json.JSONDecodeError as e:
raise Exception(f"Azure翻译API响应JSON解析异常{str(e)}")
# 创建文件
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
if __name__ == "__main__":
# 检查配置
if AZURE_CONFIG['subscription_key'] == 'YOUR_SUBSCRIPTION_KEY':
print("错误请先在脚本中配置您的Azure订阅密钥")
print("请修改AZURE_CONFIG中的subscription_key和region")
sys.exit(1)
main()

View File

@ -321,24 +321,23 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
} else {
return item.recordStr ?? '';
}
case 20:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'密码'.tr +
'开锁'.tr +
'ID${item.username}';
'${'昵称'.tr}${item.username}'+'${'密码'.tr}${item.keyboardPwd}';
case 30:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
''.tr +
'开锁'.tr +
'ID${item.username}';
'${'昵称'.tr}${item.username}';
case 40:
if (item.username != null && item.username != '') {
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'蓝牙'.tr +
'开锁'.tr +
'' +
'ID'.tr +
'${'昵称'.tr}'.tr +
'${item.username}';
} else {
return '${formatTimestampToHHmm(item.operateDate!)} ' +
@ -353,55 +352,58 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'组合模式'.tr +
'开锁'.tr +
'ID${item.username}';
'${'昵称'.tr}${item.username}';
case 60:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'添加指纹'.tr +
'ID${item.username}';
'添加'.tr +
'指纹'.tr +
'${'昵称'.tr}${item.username}';
case 70:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'添加密码'.tr +
'ID${item.username}';
'添加'.tr +
'密码'.tr +
'${'昵称'.tr}${item.username}';
case 80:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'添加卡'.tr +
'ID${item.username}';
'添加'.tr +
''.tr +
'${'昵称'.tr}${item.username}';
case 90:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'删除'.tr +
'指纹'.tr +
'ID${item.username}';
'${'昵称'.tr}${item.username}';
case 100:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'删除'.tr +
'密码'.tr +
'ID${item.username}';
'${'昵称'.tr}${item.username}';
case 110:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'删除'.tr +
''.tr +
'ID${item.username}';
'${'昵称'.tr}${item.username}';
case 160:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'人脸'.tr +
'开锁'.tr +
'ID${item.username}';
'${'昵称'.tr}${item.username}';
case 190:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'胁迫指纹'.tr +
'开锁'.tr +
'ID${item.username}';
'${'昵称'.tr}${item.username}';
case 200:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'胁迫密码'.tr +
'开锁'.tr +
'ID${item.username}';
'${'昵称'.tr}${item.username}';
case 210:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'胁迫卡片'.tr +
'开锁'.tr +
'ID${item.username}';
'${'昵称'.tr}${item.username}';
default:
return item.recordStr ?? '';
}

View File

@ -123,25 +123,25 @@ class _AddFingerprintPageState extends State<AddFingerprintPage> with RouteAware
String iconPath = '';
switch (number) {
case 1:
iconPath = 'images/main/icon_addFingerprint_fingerprint_one.png';
iconPath = 'images/main/addFingerprint/1.jpg';
break;
case 2:
iconPath = 'images/main/icon_addFingerprint_fingerprint_two.png';
iconPath = 'images/main/addFingerprint/2.jpg';
break;
case 3:
iconPath = 'images/main/icon_addFingerprint_fingerprint_three.png';
iconPath = 'images/main/addFingerprint/3.jpg';
break;
case 4:
iconPath = 'images/main/icon_addFingerprint_fingerprint_four.png';
iconPath = 'images/main/addFingerprint/4.jpg';
break;
case 5:
iconPath = 'images/main/icon_addFingerprint_fingerprint_five.png';
iconPath = 'images/main/addFingerprint/5.jpg';
break;
case 6:
iconPath = 'images/main/icon_addFingerprint_fingerprint_six.png';
iconPath = 'images/main/addFingerprint/6.jpg';
break;
default:
iconPath = 'images/main/icon_addFingerprint_fingerprint_one.png';
iconPath = 'images/main/addFingerprint/0.jpg';
break;
}
return iconPath;

View File

@ -0,0 +1,67 @@
class ActivateInfoResponse {
ActivateInfoResponse({
this.description,
this.errorCode,
this.data, // List<ActivateInfo>
this.errorMsg,
});
ActivateInfoResponse.fromJson(dynamic json) {
description = json['description'];
errorCode = json['errorCode'];
// json['data'] List<ActivateInfo>
data = json['data'] != null
? (json['data'] as List).map((item) => ActivateInfo.fromJson(item)).toList()
: [];
errorMsg = json['errorMsg'];
}
String? description;
int? errorCode;
List<ActivateInfo>? data; // List<ActivateInfo>
String? errorMsg;
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['description'] = description;
map['errorCode'] = errorCode;
if (data != null) {
// List<ActivateInfo> JSON
map['data'] = data!.map((item) => item.toJson()).toList();
}
map['errorMsg'] = errorMsg;
return map;
}
@override
String toString() {
return 'ActivateInfoResponse{description: $description, errorCode: $errorCode, data: $data, errorMsg: $errorMsg}';
}
}
class ActivateInfo {
String? platformName;
int? platform;
ActivateInfo({
this.platformName,
this.platform,
});
ActivateInfo.fromJson(dynamic json) {
platformName = json['platformName'] ?? '';
platform = json['platform'] ?? '';
}
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['platformName'] = platformName;
map['platform'] = platform;
return map;
}
@override
String toString() {
return 'ActivateInfo{platformName: $platformName, platform: $platform}';
}
}

View File

@ -371,10 +371,35 @@ class LockDetailLogic extends BaseGetXController {
final int userNo = (indexList[1] * 256) + indexList[2];
indexMap['user'] = userNo.toString();
// AppLog.log('userNouserNouserNouserNo:$userNo');
if (userNo == 0xFFFF) {
// 线16F(0x1F)
final List<int> passwordData =
indexList.sublist(7, 17); // 10
// F(0x1F)
int endIndex = passwordData.indexOf(0x1F);
if (endIndex == -1) {
//
endIndex = passwordData.length;
}
//
final List<int> actualPasswordData =
passwordData.sublist(0, endIndex);
//
String passwordHex = actualPasswordData
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
.join();
//
passwordHex = passwordHex.replaceAll(RegExp(r'[^0-9]'), '');
indexMap['password'] = passwordHex;
// indexMap['password'] = passwordHex; //
AppLog.log('离线密码开锁:$passwordHex');
} else {
final List<int> passwordData = indexList.sublist(7, 17);
final String password = utf8String(passwordData);
indexMap['password'] = password.toString();
}
final List<int> passwordData = indexList.sublist(7, 17);
final String password = utf8String(passwordData);
indexMap['password'] = password.toString();
// AppLog.log('passwordpasswordpassword:$password');
indexMap['success'] = '1';

View File

@ -1,5 +1,8 @@
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/main/lockDetail/lockSet/thirdPartyPlatform/third_party_platform_state.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/network/start_company_api.dart';
import 'package:star_lock/tools/baseGetXController.dart';
class ThirdPartyPlatformLogic extends BaseGetXController {
@ -11,6 +14,24 @@ class ThirdPartyPlatformLogic extends BaseGetXController {
// dismissEasyLoading();
}
/// TPP支持
void getActivateInfo() async {
final model = state.lockSetInfoData.value.lockBasicInfo?.model;
if (model != null && model != '') {
final response = await StartCompanyApi.to.getActivateInfo(model: model);
if (response.errorCode!.codeIsSuccessful) {
AppLog.log('${response.data}');
}
}
}
@override
void onReady() async {
// TODO: implement onReady
super.onReady();
getActivateInfo();
}
@override
void dispose() {
dismissEasyLoading();

View File

@ -295,21 +295,24 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
action: () {
final PDuration selectDate =
PDuration.parse(DateTime.tryParse(state.endTime.value));
Pickers.showDatePicker(context,
selectDate: selectDate,
// maxDate传入三年以后得今天的时间
maxDate: PDuration(
year: DateTime.now().year + 3,
month: DateTime.now().month,
day: DateTime.now().day),
minDate: PDuration(
year: DateTime.now().year,
month: DateTime.now().month,
day: DateTime.now().day),
mode: DateMode.YMDH,
hourShow24: true, onConfirm: (PDuration p) {
state.endTime.value = DateTool().getYMDHNDateString(p, 4);
});
Pickers.showDatePicker(
context,
selectDate: selectDate,
// maxDate传入三年以后得今天的时间
maxDate: PDuration(
year: DateTime.now().year + 3,
month: DateTime.now().month,
day: DateTime.now().day),
minDate: PDuration(
year: DateTime.now().year,
month: DateTime.now().month,
day: DateTime.now().day),
mode: DateMode.YMDH,
hourShow24: true,
onConfirm: (PDuration p) {
state.endTime.value = DateTool().getYMDHNDateString(p, 4);
},
);
}),
Container(height: 10.h),
],
@ -427,19 +430,20 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
CommonDataManage().currentKeyInfo.model ==
IoModelVendor.model_XL_WIFI),
child: CommonItem(
leftTitel: '结束日期'.tr,
rightTitle: state.endTime.value,
isHaveLine: true,
isHaveDirection: true,
action: () {
final PDuration selectDate =
PDuration.parse(DateTime.tryParse(state.endTime.value));
Pickers.showDatePicker(context,
selectDate: selectDate,
mode: DateMode.YMDH, onConfirm: (PDuration p) {
state.endTime.value = DateTool().getYMDHNDateString(p, 4);
});
}),
leftTitel: '结束日期'.tr,
rightTitle: state.endTime.value,
isHaveLine: true,
isHaveDirection: true,
action: () {
final PDuration selectDate =
PDuration.parse(DateTime.tryParse(state.endTime.value));
Pickers.showDatePicker(context,
selectDate: selectDate,
mode: DateMode.YMDH, onConfirm: (PDuration p) {
state.endTime.value = DateTool().getYMDHNDateString(p, 4);
});
},
),
),
CommonItem(
leftTitel: '生效时间'.tr,
@ -458,20 +462,26 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
}, hourShow24: true);
}),
CommonItem(
leftTitel: '失效时间'.tr,
rightTitle: state.loopFailureDate.value,
isHaveDirection: true,
action: () {
final PDuration selectDate = PDuration.parse(
DateTool().dateToDateTime(state.loopFailureDate.value, 0));
Pickers.showDatePicker(context,
selectDate: selectDate,
mode: DateMode.H, onConfirm: (PDuration p) {
leftTitel: '失效时间'.tr,
rightTitle: state.loopFailureDate.value,
isHaveDirection: true,
action: () {
final PDuration selectDate = PDuration.parse(
DateTool().dateToDateTime(state.loopFailureDate.value, 0));
Pickers.showDatePicker(
context,
selectDate: selectDate,
mode: DateMode.H,
onConfirm: (PDuration p) {
state.loopFailureDate.value =
DateTool().getYMDHNDateString(p, 5);
state.loopEndHours.value = p.hour!;
}, hourShow24: true);
}),
state.endTime.value = DateTool().getYMDHNDateString(p, 4);
},
hourShow24: true,
);
},
),
],
);
}

View File

@ -305,4 +305,6 @@ abstract class Api {
'/lockSetting/updateLockSetting'; //
final String reportBuyRequestURL =
'/service/reportBuyRequest'; //
final String getActivateInfoURL =
'/api/authCode/getTppSupport'; // ttp
}

View File

@ -0,0 +1,41 @@
import 'dart:convert';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/lockDetail/ActivateInfoResponse.dart';
import 'package:star_lock/network/api_provider.dart';
import 'package:star_lock/network/api_provider_base.dart';
import 'package:star_lock/talk/starChart/entity/relay_info_entity.dart';
import 'package:star_lock/talk/starChart/entity/report_information_data.dart';
import 'package:star_lock/talk/starChart/entity/star_chart_register_node_entity.dart';
import 'package:star_lock/tools/storage.dart';
class StartCompanyApi extends BaseProvider {
// url
String _startChartHost = 'https://company.skychip.top';
static StartCompanyApi get to => Get.put(StartCompanyApi());
// host
set startChartHost(String value) {
_startChartHost = value;
}
// host
String get startChartHost => _startChartHost;
// ttp查询
Future<ActivateInfoResponse> getActivateInfo({
required String model,
}) async {
final response = await post(
_startChartHost + getActivateInfoURL.toUrl,
jsonEncode(<String, dynamic>{
'model': model,
}),
isUnShowLoading: true,
isUserBaseUrl: false,
);
return ActivateInfoResponse.fromJson(response.body);
}
}

View File

@ -60,6 +60,7 @@ extension ExtensionAppDept on AppDept {
const Locale hyL = Locale('hy', 'AM');
const Locale kaL = Locale('ka', 'GE');
const Locale srCyrillic = Locale('sr', 'RS');
const Locale ptBrL = Locale('pt', 'BR');
return [
enL,
@ -102,7 +103,8 @@ extension ExtensionAppDept on AppDept {
urL,
hyL,
kaL,
srCyrillic
srCyrillic,
ptBrL
];
}
}
@ -195,6 +197,8 @@ enum LanguageType {
armenian,
//
georgian,
// 西
brazilianPortuguese,
}
extension ExtensionLanguageType on LanguageType {
@ -324,6 +328,9 @@ extension ExtensionLanguageType on LanguageType {
case LanguageType.georgian:
str = '格鲁吉亚语'.tr;
break;
case LanguageType.brazilianPortuguese:
str = '巴西葡萄牙语'.tr;
break;
}
return str;
}
@ -364,7 +371,11 @@ extension ExtensionLanguageType on LanguageType {
languageType = LanguageType.italian;
break;
case 'pt':
languageType = LanguageType.portuguese;
if (countryCode.toLowerCase() == 'br') {
languageType = LanguageType.brazilianPortuguese;
} else {
languageType = LanguageType.portuguese;
}
break;
case 'es':
languageType = LanguageType.spanish;
@ -671,6 +682,11 @@ extension ExtensionLanguageType on LanguageType {
return locale;
}
break;
case LanguageType.brazilianPortuguese:
if (locale.languageCode == 'pt' && locale.countryCode == 'BR') {
return locale;
}
break;
case LanguageType.system:
// TODO: Handle this case.
break;

View File

@ -82,6 +82,7 @@ class TranslationLoader {
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> _ptBrMap = <String, String>{};
static Map<String, String> get zhDic => _zhMap;
static Map<String, String> get enDic => _enMap;
@ -126,6 +127,7 @@ class TranslationLoader {
static Map<String, String> get urMap => _urMap;
static Map<String, String> get hyMap => _hyMap;
static Map<String, String> get kaMap => _kaMap;
static Map<String, String> get ptBrMap => _ptBrMap;
static Future<void> loadTranslation() async {
_zhMap = await _loadJsonFile('lan/lan_zh.json');
@ -171,6 +173,7 @@ class TranslationLoader {
_urMap = await _loadJsonFile('lan/lan_ur.json');
_hyMap = await _loadJsonFile('lan/lan_hy.json');
_kaMap = await _loadJsonFile('lan/lan_ka.json');
_ptBrMap = await _loadJsonFile('lan/lan_pt_br.json');
}
static Future<Map<String, String>> _loadJsonFile(String filePath) async =>