From d997ee81a1698c46f0cc2b16c5a1d4c98fec1c03 Mon Sep 17 00:00:00 2001 From: Serhii Date: Thu, 2 Nov 2023 19:19:39 +0200 Subject: [PATCH] CW-315-Add-a-toast-message-to-enable-denied-permissions-in-device-settings (#1157) * add permission handler * localization * minor fixes --------- Co-authored-by: OmarHatem --- .../nodes/node_create_or_edit_page.dart | 2 +- .../nodes/pow_node_create_or_edit_page.dart | 2 +- .../screens/restore/restore_options_page.dart | 5 +++ .../wc_connections_listing_view.dart | 5 +++ lib/src/widgets/address_text_field.dart | 5 +++ lib/utils/permission_handler.dart | 32 +++++++++++++++++++ .../node_create_or_edit_view_model.dart | 8 ++++- res/values/strings_ar.arb | 1 + res/values/strings_bg.arb | 1 + res/values/strings_cs.arb | 1 + res/values/strings_de.arb | 1 + res/values/strings_en.arb | 1 + res/values/strings_es.arb | 1 + res/values/strings_fr.arb | 1 + res/values/strings_ha.arb | 1 + res/values/strings_hi.arb | 1 + res/values/strings_hr.arb | 1 + res/values/strings_id.arb | 1 + res/values/strings_it.arb | 1 + res/values/strings_ja.arb | 1 + res/values/strings_ko.arb | 1 + res/values/strings_my.arb | 1 + res/values/strings_nl.arb | 1 + res/values/strings_pl.arb | 1 + res/values/strings_pt.arb | 1 + res/values/strings_ru.arb | 1 + res/values/strings_th.arb | 1 + res/values/strings_tl.arb | 1 + res/values/strings_tr.arb | 1 + res/values/strings_uk.arb | 1 + res/values/strings_ur.arb | 1 + res/values/strings_yo.arb | 1 + res/values/strings_zh.arb | 1 + 33 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 lib/utils/permission_handler.dart diff --git a/lib/src/screens/nodes/node_create_or_edit_page.dart b/lib/src/screens/nodes/node_create_or_edit_page.dart index 3525160e8..ff9d59719 100644 --- a/lib/src/screens/nodes/node_create_or_edit_page.dart +++ b/lib/src/screens/nodes/node_create_or_edit_page.dart @@ -69,7 +69,7 @@ class NodeCreateOrEditPage extends BasePage { @override Widget trailing(BuildContext context) => IconButton( onPressed: () async { - await nodeCreateOrEditViewModel.scanQRCodeForNewNode(); + await nodeCreateOrEditViewModel.scanQRCodeForNewNode(context); }, splashColor: Colors.transparent, highlightColor: Colors.transparent, diff --git a/lib/src/screens/nodes/pow_node_create_or_edit_page.dart b/lib/src/screens/nodes/pow_node_create_or_edit_page.dart index 8460579ef..e91791881 100644 --- a/lib/src/screens/nodes/pow_node_create_or_edit_page.dart +++ b/lib/src/screens/nodes/pow_node_create_or_edit_page.dart @@ -69,7 +69,7 @@ class PowNodeCreateOrEditPage extends BasePage { @override Widget trailing(BuildContext context) => IconButton( onPressed: () async { - await nodeCreateOrEditViewModel.scanQRCodeForNewNode(); + await nodeCreateOrEditViewModel.scanQRCodeForNewNode(context); }, splashColor: Colors.transparent, highlightColor: Colors.transparent, diff --git a/lib/src/screens/restore/restore_options_page.dart b/lib/src/screens/restore/restore_options_page.dart index 2ca210c00..2252551cc 100644 --- a/lib/src/screens/restore/restore_options_page.dart +++ b/lib/src/screens/restore/restore_options_page.dart @@ -12,6 +12,8 @@ import 'package:cake_wallet/routes.dart'; import 'package:flutter/cupertino.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/generated/i18n.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:cake_wallet/utils/permission_handler.dart'; class RestoreOptionsPage extends BasePage { RestoreOptionsPage({required this.isNewInstall}); @@ -55,6 +57,9 @@ class RestoreOptionsPage extends BasePage { padding: EdgeInsets.only(top: 24), child: OptionTile( onPressed: () async { + bool isCameraPermissionGranted = + await PermissionHandler.checkPermission(Permission.camera, context); + if (!isCameraPermissionGranted) return; bool isPinSet = false; if (isNewInstall) { await Navigator.pushNamed(context, Routes.setupPin, diff --git a/lib/src/screens/wallet_connect/wc_connections_listing_view.dart b/lib/src/screens/wallet_connect/wc_connections_listing_view.dart index bb60dc4ad..359d96b26 100644 --- a/lib/src/screens/wallet_connect/wc_connections_listing_view.dart +++ b/lib/src/screens/wallet_connect/wc_connections_listing_view.dart @@ -8,10 +8,12 @@ import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/utils/device_info.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:walletconnect_flutter_v2/walletconnect_flutter_v2.dart'; import 'package:cake_wallet/entities/qr_scanner.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; +import 'package:cake_wallet/utils/permission_handler.dart'; import 'widgets/pairing_item_widget.dart'; import 'wc_pairing_detail_page.dart'; @@ -58,6 +60,9 @@ class WCPairingsWidget extends BasePage { final String? uri; if (DeviceInfo.instance.isMobile) { + bool isCameraPermissionGranted = + await PermissionHandler.checkPermission(Permission.camera, context); + if (!isCameraPermissionGranted) return; uri = await presentQRScanner(); } else { uri = await _showEnterWalletConnectURIPopUp(context); diff --git a/lib/src/widgets/address_text_field.dart b/lib/src/widgets/address_text_field.dart index 000e6325e..fcdbad701 100644 --- a/lib/src/widgets/address_text_field.dart +++ b/lib/src/widgets/address_text_field.dart @@ -9,6 +9,8 @@ import 'package:cake_wallet/entities/qr_scanner.dart'; import 'package:cake_wallet/entities/contact_base.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cake_wallet/themes/extensions/send_page_theme.dart'; +import 'package:cake_wallet/utils/permission_handler.dart'; +import 'package:permission_handler/permission_handler.dart'; enum AddressTextFieldOption { paste, qrCode, addressBook } @@ -188,6 +190,9 @@ class AddressTextField extends StatelessWidget { } Future _presentQRScanner(BuildContext context) async { + bool isCameraPermissionGranted = + await PermissionHandler.checkPermission(Permission.camera, context); + if (!isCameraPermissionGranted) return; final code = await presentQRScanner(); if (code.isEmpty) { return; diff --git a/lib/utils/permission_handler.dart b/lib/utils/permission_handler.dart new file mode 100644 index 000000000..7e8a8f710 --- /dev/null +++ b/lib/utils/permission_handler.dart @@ -0,0 +1,32 @@ +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/utils/show_bar.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class PermissionHandler { + static Future checkPermission(Permission permission, BuildContext context) async { + final Map _permissionMessages = { + Permission.camera: S.of(context).camera_permission_is_required, + }; + + var status = await permission.status; + + if (status.isDenied) { + status = await permission.request(); + } + + if (status.isPermanentlyDenied || status.isDenied) { + String? message = _permissionMessages[permission]; + if (message != null) { + showBar(context, message); + } + return false; + } + + if (status.isGranted) { + return true; + } + + return false; + } +} diff --git a/lib/view_model/node_list/node_create_or_edit_view_model.dart b/lib/view_model/node_list/node_create_or_edit_view_model.dart index f749ed0d5..0fb9a83c6 100644 --- a/lib/view_model/node_list/node_create_or_edit_view_model.dart +++ b/lib/view_model/node_list/node_create_or_edit_view_model.dart @@ -1,11 +1,14 @@ import 'package:cake_wallet/core/execution_state.dart'; import 'package:cake_wallet/entities/qr_scanner.dart'; import 'package:cake_wallet/store/settings_store.dart'; +import 'package:flutter/cupertino.dart'; import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; import 'package:cw_core/node.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:collection/collection.dart'; +import 'package:cake_wallet/utils/permission_handler.dart'; +import 'package:permission_handler/permission_handler.dart'; part 'node_create_or_edit_view_model.g.dart'; @@ -175,8 +178,11 @@ abstract class NodeCreateOrEditViewModelBase with Store { void setAsCurrent(Node node) => _settingsStore.nodes[_walletType] = node; @action - Future scanQRCodeForNewNode() async { + Future scanQRCodeForNewNode(BuildContext context) async { try { + bool isCameraPermissionGranted = + await PermissionHandler.checkPermission(Permission.camera, context); + if (!isCameraPermissionGranted) return; String code = await presentQRScanner(); if (code.isEmpty) { diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 96b237783..fa5eb4960 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -723,5 +723,6 @@ "enter_seed_phrase": "أدخل عبارة البذور الخاصة بك", "add_contact": "ﻝﺎﺼﺗﺍ ﺔﻬﺟ ﺔﻓﺎﺿﺇ", "exchange_provider_unsupported": "${providerName} لم يعد مدعومًا!", + "camera_permission_is_required": ".ﺍﺮﻴﻣﺎﻜﻟﺍ ﻥﺫﺇ ﺏﻮﻠﻄﻣ", "switchToETHWallet": "ﻯﺮﺧﺃ ﺓﺮﻣ ﺔﻟﻭﺎﺤﻤﻟﺍﻭ Ethereum ﺔﻈﻔﺤﻣ ﻰﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻰﺟﺮﻳ" } diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 11eb30e8f..49ae4076f 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -719,5 +719,6 @@ "enter_seed_phrase": "Въведете вашата фраза за семена", "add_contact": "Добави контакт", "exchange_provider_unsupported": "${providerName} вече не се поддържа!", + "camera_permission_is_required": "Изисква се разрешение за камерата.\nМоля, активирайте го от настройките на приложението.", "switchToETHWallet": "Моля, преминете към портфейл Ethereum и опитайте отново" } diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index 6de65a921..38c49492e 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -719,5 +719,6 @@ "enter_seed_phrase": "Zadejte svou frázi semen", "add_contact": "Přidat kontakt", "exchange_provider_unsupported": "${providerName} již není podporováno!", + "camera_permission_is_required": "Vyžaduje se povolení fotoaparátu.\nPovolte jej v nastavení aplikace.", "switchToETHWallet": "Přejděte na peněženku Ethereum a zkuste to znovu" } diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 2cfbd8e21..306272aa4 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -727,5 +727,6 @@ "enter_seed_phrase": "Geben Sie Ihre Seed-Phrase ein", "add_contact": "Kontakt hinzufügen", "exchange_provider_unsupported": "${providerName} wird nicht mehr unterstützt!", + "camera_permission_is_required": "Eine Kameraerlaubnis ist erforderlich.\nBitte aktivieren Sie es in den App-Einstellungen.", "switchToETHWallet": "Bitte wechseln Sie zu einem Ethereum-Wallet und versuchen Sie es erneut" } diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index aad508e2e..4589f9d3e 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -728,5 +728,6 @@ "enter_seed_phrase": "Enter your seed phrase", "add_contact": "Add contact", "exchange_provider_unsupported": "${providerName} is no longer supported!", + "camera_permission_is_required": "Camera permission is required. \nPlease enable it from app settings.", "switchToETHWallet": "Please switch to an Ethereum wallet and try again" } diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 4dc954599..221e1a293 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -727,5 +727,6 @@ "enter_seed_phrase": "Ingrese su frase de semillas", "add_contact": "Agregar contacto", "exchange_provider_unsupported": "¡${providerName} ya no es compatible!", + "camera_permission_is_required": "Se requiere permiso de la cámara.\nHabilítelo desde la configuración de la aplicación.", "switchToETHWallet": "Cambie a una billetera Ethereum e inténtelo nuevamente." } diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 13671d986..f2549c3e6 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -727,5 +727,6 @@ "enter_seed_phrase": "Entrez votre phrase de semence", "add_contact": "Ajouter le contact", "exchange_provider_unsupported": "${providerName} n'est plus pris en charge!", + "camera_permission_is_required": "L'autorisation de la caméra est requise.\nVeuillez l'activer à partir des paramètres de l'application.", "switchToETHWallet": "Veuillez passer à un portefeuille Ethereum et réessayer" } diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 6430986be..d181c15b5 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -705,5 +705,6 @@ "enter_seed_phrase": "Shigar da Sert Sentarku", "add_contact": "Ƙara lamba", "exchange_provider_unsupported": "${providerName}", + "camera_permission_is_required": "Ana buƙatar izinin kyamara.\nDa fatan za a kunna shi daga saitunan app.", "switchToETHWallet": "Da fatan za a canza zuwa walat ɗin Ethereum kuma a sake gwadawa" } diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 047d3a0d6..c47622a19 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -727,5 +727,6 @@ "enter_seed_phrase": "अपना बीज वाक्यांश दर्ज करें", "add_contact": "संपर्क जोड़ें", "exchange_provider_unsupported": "${providerName} अब समर्थित नहीं है!", + "camera_permission_is_required": "कैमरे की अनुमति आवश्यक है.\nकृपया इसे ऐप सेटिंग से सक्षम करें।", "switchToETHWallet": "कृपया एथेरियम वॉलेट पर स्विच करें और पुनः प्रयास करें" } diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index e532703da..6c3a4df3d 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -725,5 +725,6 @@ "enter_seed_phrase": "Unesite svoju sjemensku frazu", "add_contact": "Dodaj kontakt", "exchange_provider_unsupported": "${providerName} više nije podržan!", + "camera_permission_is_required": "Potrebno je dopuštenje kamere.\nOmogućite ga u postavkama aplikacije.", "switchToETHWallet": "Prijeđite na Ethereum novčanik i pokušajte ponovno" } diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 1ba4d7978..4c7f8c167 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -715,5 +715,6 @@ "enter_seed_phrase": "Masukkan frasa benih Anda", "add_contact": "Tambah kontak", "exchange_provider_unsupported": "${providerName} tidak lagi didukung!", + "camera_permission_is_required": "Izin kamera diperlukan.\nSilakan aktifkan dari pengaturan aplikasi.", "switchToETHWallet": "Silakan beralih ke dompet Ethereum dan coba lagi" } diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 0f137971b..5b2d46ac1 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -727,5 +727,6 @@ "enter_seed_phrase": "Inserisci la tua frase di semi", "add_contact": "Aggiungi contatto", "exchange_provider_unsupported": "${providerName} non è più supportato!", + "camera_permission_is_required": "È richiesta l'autorizzazione della fotocamera.\nAbilitalo dalle impostazioni dell'app.", "switchToETHWallet": "Passa a un portafoglio Ethereum e riprova" } diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index aa8fee600..36e8fe90f 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -727,5 +727,6 @@ "enter_seed_phrase": "シードフレーズを入力してください", "add_contact": "連絡先を追加", "exchange_provider_unsupported": "${providerName}はサポートされなくなりました!", + "camera_permission_is_required": "カメラの許可が必要です。\nアプリの設定から有効にしてください。", "switchToETHWallet": "イーサリアムウォレットに切り替えてもう一度お試しください" } diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 6b2a12929..d03de7731 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -725,5 +725,6 @@ "enter_seed_phrase": "시드 문구를 입력하십시오", "add_contact": "주소록에 추가", "exchange_provider_unsupported": "${providerName}은 더 이상 지원되지 않습니다!", + "camera_permission_is_required": "카메라 권한이 필요합니다.\n앱 설정에서 활성화해 주세요.", "switchToETHWallet": "이더리움 지갑으로 전환한 후 다시 시도해 주세요." } diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 0268d0375..a844ba99f 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -725,5 +725,6 @@ "enter_seed_phrase": "သင့်ရဲ့မျိုးစေ့စကားစုကိုရိုက်ထည့်ပါ", "add_contact": "အဆက်အသွယ်ထည့်ပါ။", "exchange_provider_unsupported": "${providerName} မရှိတော့ပါ!", + "camera_permission_is_required": "ကင်မရာခွင့်ပြုချက် လိုအပ်ပါသည်။\nအက်ပ်ဆက်တင်များမှ ၎င်းကိုဖွင့်ပါ။", "switchToETHWallet": "ကျေးဇူးပြု၍ Ethereum ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ။" } diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 8706fb8ab..6f3f24bb4 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -727,5 +727,6 @@ "enter_seed_phrase": "Voer uw zaadzin in", "add_contact": "Contactpersoon toevoegen", "exchange_provider_unsupported": "${providerName} wordt niet langer ondersteund!", + "camera_permission_is_required": "Cameratoestemming is vereist.\nSchakel dit in via de app-instellingen.", "switchToETHWallet": "Schakel over naar een Ethereum-portemonnee en probeer het opnieuw" } diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 9c09cb520..2520d57a1 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -727,5 +727,6 @@ "enter_seed_phrase": "Wprowadź swoją frazę nasienną", "add_contact": "Dodaj kontakt", "exchange_provider_unsupported": "${providerName} nie jest już obsługiwany!", + "camera_permission_is_required": "Wymagane jest pozwolenie na korzystanie z aparatu.\nWłącz tę funkcję w ustawieniach aplikacji.", "switchToETHWallet": "Przejdź na portfel Ethereum i spróbuj ponownie" } diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 0e3206549..49fda1bee 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -726,5 +726,6 @@ "enter_seed_phrase": "Digite sua frase de semente", "add_contact": "Adicionar contato", "exchange_provider_unsupported": "${providerName} não é mais suportado!", + "camera_permission_is_required": "É necessária permissão da câmera.\nAtive-o nas configurações do aplicativo.", "switchToETHWallet": "Mude para uma carteira Ethereum e tente novamente" } diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 2f9d4846f..b4c4681b9 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -727,5 +727,6 @@ "enter_seed_phrase": "Введите свою семенную фразу", "add_contact": "Добавить контакт", "exchange_provider_unsupported": "${providerName} больше не поддерживается!", + "camera_permission_is_required": "Требуется разрешение камеры.\nПожалуйста, включите его в настройках приложения.", "switchToETHWallet": "Пожалуйста, переключитесь на кошелек Ethereum и повторите попытку." } diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index fc38e69df..91c05c968 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -725,5 +725,6 @@ "enter_seed_phrase": "ป้อนวลีเมล็ดพันธุ์ของคุณ", "add_contact": "เพิ่มผู้ติดต่อ", "exchange_provider_unsupported": "${providerName} ไม่ได้รับการสนับสนุนอีกต่อไป!", + "camera_permission_is_required": "ต้องได้รับอนุญาตจากกล้อง\nโปรดเปิดใช้งานจากการตั้งค่าแอป", "switchToETHWallet": "โปรดเปลี่ยนไปใช้กระเป๋าเงิน Ethereum แล้วลองอีกครั้ง" } diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 4c847c84e..546b1515c 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -722,5 +722,6 @@ "enter_seed_phrase": "Ipasok ang iyong pariralang binhi", "add_contact": "Magdagdag ng contact", "exchange_provider_unsupported": "Ang ${providerName} ay hindi na suportado!", + "camera_permission_is_required": "Kinakailangan ang pahintulot sa camera.\nMangyaring paganahin ito mula sa mga setting ng app.", "switchToETHWallet": "Mangyaring lumipat sa isang Ethereum wallet at subukang muli" } diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 7ac1546f5..60e276513 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -725,5 +725,6 @@ "enter_seed_phrase": "Tohum ifadenizi girin", "add_contact": "Kişi ekle", "exchange_provider_unsupported": "${providerName} artık desteklenmiyor!", + "camera_permission_is_required": "Kamera izni gereklidir.\nLütfen uygulama ayarlarından etkinleştirin.", "switchToETHWallet": "Lütfen bir Ethereum cüzdanına geçin ve tekrar deneyin" } diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index ad5fb22c7..034260c13 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -727,5 +727,6 @@ "enter_seed_phrase": "Введіть свою насіннєву фразу", "add_contact": "Додати контакт", "exchange_provider_unsupported": "${providerName} більше не підтримується!", + "camera_permission_is_required": "Потрібен дозвіл камери.\nУвімкніть його в налаштуваннях програми.", "switchToETHWallet": "Перейдіть на гаманець Ethereum і повторіть спробу" } diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 027f4e052..237fa24dd 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -719,5 +719,6 @@ "enter_seed_phrase": "اپنے بیج کا جملہ درج کریں", "add_contact": "۔ﮟﯾﺮﮐ ﻞﻣﺎﺷ ﮧﻄﺑﺍﺭ", "exchange_provider_unsupported": "${providerName} اب تعاون نہیں کیا جاتا ہے!", + "camera_permission_is_required": "۔ﮯﮨ ﺭﺎﮐﺭﺩ ﺕﺯﺎﺟﺍ ﯽﮐ ﮮﺮﻤﯿﮐ", "switchToETHWallet": "۔ﮟﯾﺮﮐ ﺶﺷﻮﮐ ﮦﺭﺎﺑﻭﺩ ﺭﻭﺍ ﮟﯾﺮﮐ ﭻﺋﻮﺳ ﺮﭘ ﭧﯿﻟﺍﻭ Ethereum ﻡﺮﮐ ﮦﺍﺮﺑ" } diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 98c80bc48..df06da974 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -721,5 +721,6 @@ "enter_seed_phrase": "Tẹ ọrọ-iru irugbin rẹ", "add_contact": "Fi olubasọrọ kun", "exchange_provider_unsupported": "${providerName} ko ni atilẹyin mọ!", + "camera_permission_is_required": "A nilo igbanilaaye kamẹra.\nJọwọ jeki o lati app eto.", "switchToETHWallet": "Jọwọ yipada si apamọwọ Ethereum ki o tun gbiyanju lẹẹkansi" } diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index ac46a3fc6..4a464b50f 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -726,5 +726,6 @@ "enter_seed_phrase": "输入您的种子短语", "add_contact": "增加联系人", "exchange_provider_unsupported": "${providerName}不再支持!", + "camera_permission_is_required": "需要相机许可。\n请从应用程序设置中启用它。", "switchToETHWallet": "请切换到以太坊钱包并重试" }