From fc352a6da3c09d179de41cf967de5258b84a857e Mon Sep 17 00:00:00 2001 From: Serhii Date: Sat, 27 Jan 2024 04:34:38 +0200 Subject: [PATCH] Cw 428 send to nostr addresses (#1271) * add nostr address resolver * Add Nostr localization --------- Co-authored-by: OmarHatem --- lib/entities/parse_address_from_domain.dart | 28 +++- lib/entities/parsed_address.dart | 27 +++- lib/nostr/nostr_api.dart | 142 ++++++++++++++++++ lib/nostr/nostr_user.dart | 35 +++++ lib/src/screens/exchange/exchange_page.dart | 2 +- .../widgets/extract_address_from_parsed.dart | 5 + lib/view_model/send/output.dart | 2 +- pubspec_base.yaml | 6 + res/values/strings_ar.arb | 6 +- res/values/strings_bg.arb | 6 +- res/values/strings_cs.arb | 6 +- res/values/strings_de.arb | 6 +- res/values/strings_en.arb | 6 +- res/values/strings_es.arb | 6 +- res/values/strings_fr.arb | 6 +- res/values/strings_ha.arb | 6 +- res/values/strings_hi.arb | 6 +- res/values/strings_hr.arb | 6 +- res/values/strings_id.arb | 6 +- res/values/strings_it.arb | 6 +- res/values/strings_ja.arb | 6 +- res/values/strings_ko.arb | 6 +- res/values/strings_my.arb | 6 +- res/values/strings_nl.arb | 6 +- res/values/strings_pl.arb | 6 +- res/values/strings_pt.arb | 6 +- res/values/strings_ru.arb | 6 +- res/values/strings_th.arb | 6 +- res/values/strings_tl.arb | 6 +- res/values/strings_tr.arb | 6 +- res/values/strings_uk.arb | 6 +- res/values/strings_ur.arb | 6 +- res/values/strings_yo.arb | 6 +- res/values/strings_zh.arb | 6 +- 34 files changed, 370 insertions(+), 33 deletions(-) create mode 100644 lib/nostr/nostr_api.dart create mode 100644 lib/nostr/nostr_user.dart diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index e184f5649..52bcc495b 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -6,12 +6,14 @@ import 'package:cake_wallet/entities/parsed_address.dart'; import 'package:cake_wallet/entities/unstoppable_domain_address.dart'; import 'package:cake_wallet/entities/emoji_string_extension.dart'; import 'package:cake_wallet/mastodon/mastodon_api.dart'; +import 'package:cake_wallet/nostr/nostr_api.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/twitter/twitter_api.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:cake_wallet/entities/fio_address_provider.dart'; +import 'package:flutter/cupertino.dart'; class AddressResolver { AddressResolver({required this.yatService, required this.wallet, required this.settingsStore}) @@ -58,7 +60,16 @@ class AddressResolver { }); } - Future resolve(String text, String ticker) async { + bool isEmailFormat(String address) { + final RegExp emailRegex = RegExp( + r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', + caseSensitive: false, + ); + return emailRegex.hasMatch(address); + } + + + Future resolve(BuildContext context, String text, String ticker) async { try { if (text.startsWith('@') && !text.substring(1).contains('@')) { if(settingsStore.lookupsTwitter) { @@ -165,6 +176,21 @@ class AddressResolver { } } } + if (isEmailFormat(text)) { + final nostrProfile = await NostrProfileHandler.queryProfile(context, text); + if (nostrProfile?.relays != null) { + final nostrUserData = + await NostrProfileHandler.processRelays(context, nostrProfile!, text); + + if (nostrUserData != null) { + String? addressFromBio = extractAddressByType( + raw: nostrUserData.about, type: CryptoCurrency.fromString(ticker)); + if (addressFromBio != null) { + return ParsedAddress.nostrAddress(address: addressFromBio, name: text); + } + } + } + } } catch (e) { print(e.toString()); } diff --git a/lib/entities/parsed_address.dart b/lib/entities/parsed_address.dart index df20dd9ee..d414a827d 100644 --- a/lib/entities/parsed_address.dart +++ b/lib/entities/parsed_address.dart @@ -2,7 +2,18 @@ import 'package:cake_wallet/entities/openalias_record.dart'; import 'package:cake_wallet/entities/yat_record.dart'; -enum ParseFrom { unstoppableDomains, openAlias, yatRecord, fio, notParsed, twitter, ens, contact, mastodon } +enum ParseFrom { + unstoppableDomains, + openAlias, + yatRecord, + fio, + notParsed, + twitter, + ens, + contact, + mastodon, + nostr +} class ParsedAddress { ParsedAddress({ @@ -11,9 +22,9 @@ class ParsedAddress { this.description = '', this.parseFrom = ParseFrom.notParsed, }); - + factory ParsedAddress.fetchEmojiAddress({ - List? addresses, + List? addresses, required String name, }){ if (addresses?.isEmpty ?? true) { @@ -28,7 +39,7 @@ class ParsedAddress { } factory ParsedAddress.fetchUnstoppableDomainAddress({ - String? address, + String? address, required String name, }){ if (address?.isEmpty ?? true) { @@ -94,6 +105,14 @@ class ParsedAddress { ); } + factory ParsedAddress.nostrAddress({required String address, required String name}) { + return ParsedAddress( + addresses: [address], + name: name, + parseFrom: ParseFrom.nostr, + ); + } + final List addresses; final String name; final String description; diff --git a/lib/nostr/nostr_api.dart b/lib/nostr/nostr_api.dart new file mode 100644 index 000000000..7c0eea5ef --- /dev/null +++ b/lib/nostr/nostr_api.dart @@ -0,0 +1,142 @@ +import 'dart:convert'; + +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/nostr/nostr_user.dart'; +import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; +import 'package:cake_wallet/src/widgets/picker.dart'; +import 'package:cake_wallet/utils/show_pop_up.dart'; +import 'package:flutter/material.dart'; +import 'package:nostr_tools/nostr_tools.dart'; + +class NostrProfileHandler { + static final relayToDomainMap = { + 'relay.snort.social': 'snort.social', + }; + + static Nip05 _nip05 = Nip05(); + + static Future queryProfile(BuildContext context, String nip05Address) async { + var profile = await _nip05.queryProfile(nip05Address); + if (profile?.pubkey != null) { + if (profile?.relays?.isNotEmpty == true) { + return profile; + } else { + await _showErrorDialog(context, S.of(context).no_relays, S.of(context).no_relays_message); + } + } + return null; + } + + static Future processRelays( + BuildContext context, ProfilePointer profile, String nip05Address) async { + String userDomain = _extractDomain(nip05Address); + const int metaData = 0; + + for (String relayUrl in profile.relays ?? []) { + final relayDomain = _getDomainFromRelayUrl(relayUrl); + final formattedRelayDomain = relayToDomainMap[relayDomain] ?? relayDomain; + if (formattedRelayDomain == userDomain) { + final userDomainData = await _fetchInfoFromRelay(relayUrl, profile.pubkey, [metaData]); + if (userDomainData != null) { + return userDomainData; + } + } + } + await _showErrorDialog(context, S.of(context).no_relays, S.of(context).no_relay_on_domain); + + String? chosenRelayUrl = await _showRelayChoiceDialog(context, profile.relays ?? []); + if (chosenRelayUrl != null) { + final userData = await _fetchInfoFromRelay(chosenRelayUrl, profile.pubkey, [metaData]); + if (userData != null) { + return userData; + } + } + + return null; + } + + static Future _fetchInfoFromRelay( + String relayUrl, String userPubKey, List kinds) async { + try { + final relay = RelayApi(relayUrl: relayUrl); + final stream = await relay.connect(); + + relay.sub([ + Filter( + kinds: kinds, + authors: [userPubKey], + ) + ]); + + await for (var message in stream) { + if (message.type == 'EVENT') { + final event = message.message as Event; + + final eventContent = json.decode(event.content) as Map; + + final userMetadata = UserMetadata.fromJson(eventContent); + relay.close(); + return userMetadata; + } + } + + relay.close(); + return null; + } catch (e) { + print('[!] Error with relay $relayUrl: $e'); + return null; + } + } + + static Future _showErrorDialog( + BuildContext context, String title, String errorMessage) async { + if (context.mounted) { + await showPopUp( + context: context, + builder: (BuildContext dialogContext) { + return AlertWithOneAction( + alertTitle: title, + alertContent: errorMessage, + buttonText: S.of(dialogContext).ok, + buttonAction: () => Navigator.of(dialogContext).pop(), + ); + }, + ); + } + } + + static String _extractDomain(String nip05Address) { + var parts = nip05Address.split('@'); + return parts.length == 2 ? parts[1] : ''; + } + + static String _getDomainFromRelayUrl(String relayUrl) { + try { + var uri = Uri.parse(relayUrl); + return uri.host; + } catch (e) { + print('Error parsing URL: $e'); + return ''; + } + } + + static Future _showRelayChoiceDialog(BuildContext context, List relays) async { + String? selectedRelay; + + if (context.mounted) { + await showPopUp( + context: context, + builder: (BuildContext dialogContext) { + return Picker( + selectedAtIndex: 0, + title: S.of(dialogContext).choose_relay, + items: relays, + onItemSelected: (String relay) => selectedRelay = relay, + ); + }, + ); + } + + return selectedRelay; + } +} diff --git a/lib/nostr/nostr_user.dart b/lib/nostr/nostr_user.dart new file mode 100644 index 000000000..4b1694a11 --- /dev/null +++ b/lib/nostr/nostr_user.dart @@ -0,0 +1,35 @@ + +class UserMetadata { + final String name; + final String lnurl; + final String email; + final String picture; + final String about; + final String nip05; + final String banner; + final String website; + + UserMetadata({ + required this.name, + required this.lnurl, + required this.email, + required this.picture, + required this.about, + required this.nip05, + required this.banner, + required this.website, + }); + + factory UserMetadata.fromJson(Map json) { + return UserMetadata( + name: json['name'] as String? ?? '', + lnurl: json['lud06'] as String? ?? '', + email: json['lud16'] as String? ?? '', + picture: json['picture'] as String? ?? '', + about: json['about'] as String? ?? '', + nip05: json['nip05'] as String? ?? '', + banner: json['banner'] as String? ?? '', + website: json['website'] as String? ?? '', + ); + } +} \ No newline at end of file diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index b3fbd19a7..94b51301c 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -557,7 +557,7 @@ class ExchangePage extends BasePage { } Future fetchParsedAddress(BuildContext context, String domain, String ticker) async { - final parsedAddress = await getIt.get().resolve(domain, ticker); + final parsedAddress = await getIt.get().resolve(context, domain, ticker); final address = await extractAddressFromParsed(context, parsedAddress); return address; } diff --git a/lib/src/screens/send/widgets/extract_address_from_parsed.dart b/lib/src/screens/send/widgets/extract_address_from_parsed.dart index 73bff23c1..bb09d4ca3 100644 --- a/lib/src/screens/send/widgets/extract_address_from_parsed.dart +++ b/lib/src/screens/send/widgets/extract_address_from_parsed.dart @@ -43,6 +43,11 @@ Future extractAddressFromParsed( content = S.of(context).extracted_address_content('${parsedAddress.name} (Mastodon)'); address = parsedAddress.addresses.first; break; + case ParseFrom.nostr: + title = S.of(context).address_detected; + content = S.of(context).extracted_address_content('${parsedAddress.name} (Nostr NIP-05)'); + address = parsedAddress.addresses.first; + break; case ParseFrom.yatRecord: if (parsedAddress.name.isEmpty) { title = S.of(context).yat_error; diff --git a/lib/view_model/send/output.dart b/lib/view_model/send/output.dart index 73fb535f2..e40000139 100644 --- a/lib/view_model/send/output.dart +++ b/lib/view_model/send/output.dart @@ -262,7 +262,7 @@ abstract class OutputBase with Store { Future fetchParsedAddress(BuildContext context) async { final domain = address; final ticker = cryptoCurrencyHandler().title.toLowerCase(); - parsedAddress = await getIt.get().resolve(domain, ticker); + parsedAddress = await getIt.get().resolve(context, domain, ticker); extractedAddress = await extractAddressFromParsed(context, parsedAddress); note = parsedAddress.description; } diff --git a/pubspec_base.yaml b/pubspec_base.yaml index 45f675043..f38482ec3 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -105,6 +105,7 @@ dependencies: socks5_proxy: ^1.0.4 flutter_svg: ^2.0.9 polyseed: ^0.0.2 + nostr_tools: ^1.0.9 dev_dependencies: flutter_test: @@ -123,6 +124,11 @@ dev_dependencies: url: https://github.com/cake-tech/google-translator.git version: 1.0.0 +dependency_overrides: + bech32: + git: + url: https://github.com/cake-tech/bech32.git + flutter_icons: image_path: "assets/images/app_logo.png" android: true diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 8fbcb481c..f8ff07bd2 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -764,5 +764,9 @@ "confirmed_tx": "مؤكد", "transaction_details_source_address": "عنوان المصدر", "pause_wallet_creation": ".ﺎﻴًﻟﺎﺣ ﺎﺘًﻗﺆﻣ ﺔﻔﻗﻮﺘﻣ Haven Wallet ءﺎﺸﻧﺇ ﻰﻠﻋ ﺓﺭﺪﻘﻟﺍ", - "camera_consent": ".ﻞﻴﺻﺎﻔﺘﻟﺍ ﻰﻠﻋ ﻝﻮﺼﺤﻠﻟ ﻢﻬﺑ ﺔﺻﺎﺨﻟﺍ ﺔﻴﺻﻮﺼﺨﻟﺍ ﺔﺳﺎﻴﺳ ﻦﻣ ﻖﻘﺤﺘﻟﺍ ﻰﺟﺮﻳ .${provider} ﻝﻮﻠ" + "camera_consent": ".ﻞﻴﺻﺎﻔﺘﻟﺍ ﻰﻠﻋ ﻝﻮﺼﺤﻠﻟ ﻢﻬﺑ ﺔﺻﺎﺨﻟﺍ ﺔﻴﺻﻮﺼﺨﻟﺍ ﺔﺳﺎﻴﺳ ﻦﻣ ﻖﻘﺤﺘﻟﺍ ﻰﺟﺮﻳ .${provider} ﻝﻮﻠ", + "no_relays": " ﺕﻼﺣﺮﻤﻟﺍ ﻻ", + "choose_relay": " ﻡﺍﺪﺨﺘﺳﻼﻟ ﻊﺑﺎﺘﺘﻟﺍ ﺭﺎﻴﺘﺧﺍ ءﺎﺟﺮﻟﺍ", + "no_relays_message": ".ﻪﺑ ﺹﺎﺨﻟﺍ Nostr ﻞﺠﺳ ﻰﻟﺇ ﺕﻼﺣﺮﻤﻟﺍ ﺔﻓﺎﺿﻹ ﻢﻠﺘﺴﻤﻟﺍ ﺩﺎﺷﺭﺇ ﻰﺟﺮﻳ .ﺕﻼﺣﺮﻣ ﻱﺃ ﻰﻠﻋ ﻱﻮﺘﺤﻳ ﻻ", + "no_relay_on_domain": ".ﻡﺍﺪﺨﺘﺳﻼﻟ ﻊﺑﺎﺘﺘﻟﺍ ﺭﺎﻴﺘﺧﺍ ءﺎﺟﺮﻟﺍ .ﺡﺎﺘﻣ ﺮﻴﻏ ﻞﻴﺣﺮﺘﻟﺍ ﻥﺃ ﻭﺃ ﻡﺪﺨﺘﺴﻤﻟﺍ ﻝﺎﺠﻤﻟ ﻞﻴﺣﺮﺗ ﺪ" } diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 1707c3f8c..8e6a6c1ee 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -760,5 +760,9 @@ "confirmed_tx": "Потвърдено", "transaction_details_source_address": "Адрес на източника", "pause_wallet_creation": "Възможността за създаване на Haven Wallet в момента е на пауза.", - "camera_consent": "Вашият фотоапарат ще бъде използван за заснемане на изображение с цел идентификация от ${provider}. Моля, проверете тяхната политика за поверителност за подробности." + "camera_consent": "Вашият фотоапарат ще бъде използван за заснемане на изображение с цел идентификация от ${provider}. Моля, проверете тяхната политика за поверителност за подробности.", + "no_relays": "Без релета", + "choose_relay": "Моля, изберете реле, което да използвате", + "no_relays_message": "Намерихме запис Nostr NIP-05 за този потребител, но той не съдържа релета. Моля, инструктирайте получателя да добави релета към своя Nostr запис.", + "no_relay_on_domain": "Няма реле за домейна на потребителя или релето не е налично. Моля, изберете реле, което да използвате." } diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index dfae6717c..a739fa05b 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -760,5 +760,9 @@ "confirmed_tx": "Potvrzeno", "transaction_details_source_address": "Zdrojová adresa", "pause_wallet_creation": "Možnost vytvářet Haven Wallet je momentálně pozastavena.", - "camera_consent": "Váš fotoaparát použije k pořízení snímku pro účely identifikace ${provider}. Podrobnosti najdete v jejich Zásadách ochrany osobních údajů." + "camera_consent": "Váš fotoaparát použije k pořízení snímku pro účely identifikace ${provider}. Podrobnosti najdete v jejich Zásadách ochrany osobních údajů.", + "no_relays": "Žádná relé", + "choose_relay": "Vyberte relé, které chcete použít", + "no_relays_message": "Pro tohoto uživatele jsme našli záznam Nostr NIP-05, který však neobsahuje žádná relé. Požádejte příjemce, aby přidal přenosy do svého záznamu Nostr.", + "no_relay_on_domain": "Pro doménu uživatele neexistuje přenos nebo je přenos nedostupný. Vyberte relé, které chcete použít." } diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index b96861f4d..872b8bec2 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -768,5 +768,9 @@ "confirmed_tx": "Bestätigt", "transaction_details_source_address": "Quelladresse", "pause_wallet_creation": "Die Möglichkeit, Haven Wallet zu erstellen, ist derzeit pausiert.", - "camera_consent": "Mit Ihrer Kamera wird bis zum ${provider} ein Bild zur Identifizierung aufgenommen. Weitere Informationen finden Sie in deren Datenschutzbestimmungen." + "camera_consent": "Mit Ihrer Kamera wird bis zum ${provider} ein Bild zur Identifizierung aufgenommen. Weitere Informationen finden Sie in deren Datenschutzbestimmungen.", + "no_relays": "Keine Relais", + "choose_relay": "Bitte wählen Sie ein zu verwendendes Relais aus", + "no_relays_message": "Wir haben einen Nostr NIP-05-Eintrag für diesen Benutzer gefunden, der jedoch keine Relays enthält. Bitte weisen Sie den Empfänger an, Relays zu seinem Nostr-Datensatz hinzuzufügen.", + "no_relay_on_domain": "Es gibt kein Relay für die Domäne des Benutzers oder das Relay ist nicht verfügbar. Bitte wählen Sie ein zu verwendendes Relais aus." } diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 10c130a0c..3ec496b6c 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -769,5 +769,9 @@ "confirmed_tx": "Confirmed", "transaction_details_source_address": "Source address", "pause_wallet_creation": "Ability to create Haven Wallet is currently paused.", - "camera_consent": "Your camera will be used to capture an image for identification purposes by ${provider}. Please check their Privacy Policy for details." + "camera_consent": "Your camera will be used to capture an image for identification purposes by ${provider}. Please check their Privacy Policy for details.", + "no_relays": "No relays", + "choose_relay": "Please choose a relay to use", + "no_relays_message": "We found a Nostr NIP-05 record for this user, but it does not contain any relays. Please instruct the recipient to add relays to their Nostr record.", + "no_relay_on_domain": "There isn't a relay for user's domain or the relay is unavailable. Please choose a relay to use." } diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 5bec3b0ae..ab97e764d 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -768,5 +768,9 @@ "confirmed_tx": "Confirmado", "transaction_details_source_address": "Dirección de la fuente", "pause_wallet_creation": "La capacidad para crear Haven Wallet está actualmente pausada.", - "camera_consent": "Su cámara será utilizada para capturar una imagen con fines de identificación por ${provider}. Consulte su Política de privacidad para obtener más detalles." + "camera_consent": "Su cámara será utilizada para capturar una imagen con fines de identificación por ${provider}. Consulte su Política de privacidad para obtener más detalles.", + "no_relays": "Sin relevos", + "choose_relay": "Por favor elija un relé para usar", + "no_relays_message": "Encontramos un registro Nostr NIP-05 para este usuario, pero no contiene ningún relé. Indique al destinatario que agregue retransmisiones a su registro Nostr.", + "no_relay_on_domain": "No hay una retransmisión para el dominio del usuario o la retransmisión no está disponible. Elija un relé para usar." } diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 9ce607b20..619c35276 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -768,5 +768,9 @@ "confirmed_tx": "Confirmé", "transaction_details_source_address": "Adresse source", "pause_wallet_creation": "La possibilité de créer Haven Wallet est actuellement suspendue.", - "camera_consent": "Votre appareil photo sera utilisé pour capturer une image à des fins d'identification par ${provider}. Veuillez consulter leur politique de confidentialité pour plus de détails." + "camera_consent": "Votre appareil photo sera utilisé pour capturer une image à des fins d'identification par ${provider}. Veuillez consulter leur politique de confidentialité pour plus de détails.", + "no_relays": "Pas de relais", + "choose_relay": "Veuillez choisir un relais à utiliser", + "no_relays_message": "Nous avons trouvé un enregistrement Nostr NIP-05 pour cet utilisateur, mais il ne contient aucun relais. Veuillez demander au destinataire d'ajouter des relais à son enregistrement Nostr.", + "no_relay_on_domain": "Il n'existe pas de relais pour le domaine de l'utilisateur ou le relais n'est pas disponible. Veuillez choisir un relais à utiliser." } diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 47426aa8c..dd38a4ec3 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -750,5 +750,9 @@ "confirmed_tx": "Tabbatar", "transaction_details_source_address": "Adireshin Incord", "pause_wallet_creation": "A halin yanzu an dakatar da ikon ƙirƙirar Haven Wallet.", - "camera_consent": "Za a yi amfani da kyamarar ku don ɗaukar hoto don dalilai na tantancewa ta ${provider}. Da fatan za a duba Manufar Sirri don cikakkun bayanai." + "camera_consent": "Za a yi amfani da kyamarar ku don ɗaukar hoto don dalilai na tantancewa ta ${provider}. Da fatan za a duba Manufar Sirri don cikakkun bayanai.", + "no_relays": "Babu relays", + "choose_relay": "Da fatan za a zaɓi gudun ba da sanda don amfani", + "no_relays_message": "Mun sami rikodin Nostr NIP-05 don wannan mai amfani, amma ba ya ƙunshe da kowane relays. Da fatan za a umurci mai karɓa ya ƙara relays zuwa rikodin su na Nostr.", + "no_relay_on_domain": "Babu gudun ba da sanda ga yankin mai amfani ko kuma ba a samu ba. Da fatan za a zaɓi gudun ba da sanda don amfani." } diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 91bf40d60..b37aa7c12 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -768,5 +768,9 @@ "confirmed_tx": "की पुष्टि", "transaction_details_source_address": "स्रोत पता", "pause_wallet_creation": "हेवन वॉलेट बनाने की क्षमता फिलहाल रुकी हुई है।", - "camera_consent": "आपके कैमरे का उपयोग ${provider} द्वारा पहचान उद्देश्यों के लिए एक छवि कैप्चर करने के लिए किया जाएगा। विवरण के लिए कृपया उनकी गोपनीयता नीति जांचें।" + "camera_consent": "आपके कैमरे का उपयोग ${provider} द्वारा पहचान उद्देश्यों के लिए एक छवि कैप्चर करने के लिए किया जाएगा। विवरण के लिए कृपया उनकी गोपनीयता नीति जांचें।", + "no_relays": "कोई रिले नहीं", + "choose_relay": "कृपया उपयोग करने के लिए एक रिले चुनें", + "no_relays_message": "हमें इस उपयोगकर्ता के लिए एक Nostr NIP-05 रिकॉर्ड मिला, लेकिन इसमें कोई रिले नहीं है। कृपया प्राप्तकर्ता को अपने नॉस्ट्र रिकॉर्ड में रिले जोड़ने का निर्देश दें।", + "no_relay_on_domain": "उपयोगकर्ता के डोमेन के लिए कोई रिले नहीं है या रिले अनुपलब्ध है। कृपया उपयोग करने के लिए एक रिले चुनें।" } diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index b3c49ce78..c1ba66bb2 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -766,5 +766,9 @@ "confirmed_tx": "Potvrđen", "transaction_details_source_address": "Adresa izvora", "pause_wallet_creation": "Mogućnost stvaranja novčanika Haven trenutno je pauzirana.", - "camera_consent": "Vaš će fotoaparat koristiti za snimanje slike u svrhu identifikacije od strane ${provider}. Pojedinosti potražite u njihovoj politici privatnosti." + "camera_consent": "Vaš će fotoaparat koristiti za snimanje slike u svrhu identifikacije od strane ${provider}. Pojedinosti potražite u njihovoj politici privatnosti.", + "no_relays": "Nema releja", + "choose_relay": "Odaberite relej za korištenje", + "no_relays_message": "Pronašli smo zapis Nostr NIP-05 za ovog korisnika, ali on ne sadrži nikakve releje. Uputite primatelja da doda releje u svoj Nostr zapis.", + "no_relay_on_domain": "Ne postoji relej za korisničku domenu ili je relej nedostupan. Odaberite relej za korištenje." } diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 2a8fd06e8..b736f3977 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -756,5 +756,9 @@ "confirmed_tx": "Dikonfirmasi", "transaction_details_source_address": "Alamat sumber", "pause_wallet_creation": "Kemampuan untuk membuat Haven Wallet saat ini dijeda.", - "camera_consent": "Kamera Anda akan digunakan untuk mengambil gambar untuk tujuan identifikasi oleh ${provider}. Silakan periksa Kebijakan Privasi mereka untuk detailnya." + "camera_consent": "Kamera Anda akan digunakan untuk mengambil gambar untuk tujuan identifikasi oleh ${provider}. Silakan periksa Kebijakan Privasi mereka untuk detailnya.", + "no_relays": "Tidak ada relay", + "choose_relay": "Silakan pilih relai yang akan digunakan", + "no_relays_message": "Kami menemukan catatan Nostr NIP-05 untuk pengguna ini, tetapi tidak berisi relay apa pun. Harap instruksikan penerima untuk menambahkan relay ke catatan Nostr mereka.", + "no_relay_on_domain": "Tidak ada relai untuk domain pengguna atau relai tidak tersedia. Silakan pilih relai yang akan digunakan." } diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 01e88d56f..adcaa3204 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -768,5 +768,9 @@ "confirmed_tx": "Confermato", "transaction_details_source_address": "Indirizzo di partenza", "pause_wallet_creation": "La possibilità di creare Haven Wallet è attualmente sospesa.", - "camera_consent": "La tua fotocamera verrà utilizzata per acquisire un'immagine a scopo identificativo da ${provider}. Si prega di controllare la loro Informativa sulla privacy per i dettagli." + "camera_consent": "La tua fotocamera verrà utilizzata per acquisire un'immagine a scopo identificativo da ${provider}. Si prega di controllare la loro Informativa sulla privacy per i dettagli.", + "no_relays": "Nessun relè", + "choose_relay": "Scegli un relè da utilizzare", + "no_relays_message": "Abbiamo trovato un record Nostr NIP-05 per questo utente, ma non contiene alcun relè. Si prega di indicare al destinatario di aggiungere inoltri al proprio record Nostr.", + "no_relay_on_domain": "Non esiste un inoltro per il dominio dell'utente oppure l'inoltro non è disponibile. Scegli un relè da utilizzare." } diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 07bf5fca8..9dabebc45 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -768,5 +768,9 @@ "confirmed_tx": "確認済み", "transaction_details_source_address": "ソースアドレス", "pause_wallet_creation": "Haven Wallet を作成する機能は現在一時停止されています。", - "camera_consent": "あなたのカメラは、${provider}_ までに識別目的で画像を撮影するために使用されます。詳細については、プライバシー ポリシーをご確認ください。" + "camera_consent": "あなたのカメラは、${provider}_ までに識別目的で画像を撮影するために使用されます。詳細については、プライバシー ポリシーをご確認ください。", + "no_relays": "リレーなし", + "choose_relay": "使用するリレーを選択してください", + "no_relays_message": "このユーザーの Nostr NIP-05 レコードが見つかりましたが、リレーは含まれていません。受信者に Nostr レコードにリレーを追加するよう指示してください。", + "no_relay_on_domain": "ユーザーのドメインのリレーが存在しないか、リレーが使用できません。使用するリレーを選択してください。" } diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 7ea1ea85d..ee41a369b 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -766,5 +766,9 @@ "confirmed_tx": "확인", "transaction_details_source_address": "소스 주소", "pause_wallet_creation": "Haven Wallet 생성 기능이 현재 일시 중지되었습니다.", - "camera_consent": "귀하의 카메라는 ${provider}의 식별 목적으로 이미지를 캡처하는 데 사용됩니다. 자세한 내용은 해당 개인정보 보호정책을 확인하세요." + "camera_consent": "귀하의 카메라는 ${provider}의 식별 목적으로 이미지를 캡처하는 데 사용됩니다. 자세한 내용은 해당 개인정보 보호정책을 확인하세요.", + "no_relays": "릴레이 없음", + "choose_relay": "사용할 릴레이를 선택해주세요", + "no_relays_message": "이 사용자에 대한 Nostr NIP-05 레코드를 찾았지만 릴레이가 포함되어 있지 않습니다. 수신자에게 Nostr 기록에 릴레이를 추가하도록 지시하십시오.", + "no_relay_on_domain": "사용자 도메인에 릴레이가 없거나 릴레이를 사용할 수 없습니다. 사용할 릴레이를 선택해주세요." } diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 9559d224e..199d72660 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -766,5 +766,9 @@ "confirmed_tx": "အတည်ပြုသည်", "transaction_details_source_address": "အရင်းအမြစ်လိပ်စာ", "pause_wallet_creation": "Haven Wallet ဖန်တီးနိုင်မှုကို လောလောဆယ် ခေတ္တရပ်ထားသည်။", - "camera_consent": "မှတ်ပုံတင်ခြင်းရည်ရွယ်ချက်များအတွက် ${provider} တွင် သင့်ကင်မရာကို အသုံးပြုပါမည်။ အသေးစိတ်အတွက် ၎င်းတို့၏ ကိုယ်ရေးကိုယ်တာမူဝါဒကို စစ်ဆေးပါ။" + "camera_consent": "မှတ်ပုံတင်ခြင်းရည်ရွယ်ချက်များအတွက် ${provider} တွင် သင့်ကင်မရာကို အသုံးပြုပါမည်။ အသေးစိတ်အတွက် ၎င်းတို့၏ ကိုယ်ရေးကိုယ်တာမူဝါဒကို စစ်ဆေးပါ။", + "no_relays": "Relay မရှိပါ။", + "choose_relay": "အသုံးပြုရန် relay ကိုရွေးချယ်ပါ။", + "no_relays_message": "ဤအသုံးပြုသူအတွက် Nostr NIP-05 မှတ်တမ်းကို ကျွန်ုပ်တို့တွေ့ရှိသော်လည်း ၎င်းတွင် မည်သည့် relays မှ မပါဝင်ပါ။ ကျေးဇူးပြု၍ လက်ခံသူကို ၎င်းတို့၏ Nostr မှတ်တမ်းတွင် ထပ်လောင်းထည့်ရန် ညွှန်ကြားပါ။", + "no_relay_on_domain": "အသုံးပြုသူ၏ဒိုမိန်းအတွက် ထပ်ဆင့်လွှင့်ခြင်း မရှိပါ သို့မဟုတ် ထပ်ဆင့်လွှင့်ခြင်း မရနိုင်ပါ။ အသုံးပြုရန် relay ကိုရွေးချယ်ပါ။" } diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 23a635a99..9f27236aa 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -768,5 +768,9 @@ "confirmed_tx": "Bevestigd", "transaction_details_source_address": "Bron adres", "pause_wallet_creation": "De mogelijkheid om Haven Wallet te maken is momenteel onderbroken.", - "camera_consent": "Uw camera wordt gebruikt om vóór ${provider} een beeld vast te leggen voor identificatiedoeleinden. Raadpleeg hun privacybeleid voor meer informatie." + "camera_consent": "Uw camera wordt gebruikt om vóór ${provider} een beeld vast te leggen voor identificatiedoeleinden. Raadpleeg hun privacybeleid voor meer informatie.", + "no_relays": "Geen relais", + "choose_relay": "Kies een relais dat u wilt gebruiken", + "no_relays_message": "We hebben een Nostr NIP-05-record voor deze gebruiker gevonden, maar deze bevat geen relays. Instrueer de ontvanger om relays toe te voegen aan zijn Nostr-record.", + "no_relay_on_domain": "Er is geen relay voor het domein van de gebruiker of de relay is niet beschikbaar. Kies een relais dat u wilt gebruiken." } diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index f3e9db35c..c6e4806b1 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -768,5 +768,9 @@ "confirmed_tx": "Potwierdzony", "transaction_details_source_address": "Adres źródłowy", "pause_wallet_creation": "Możliwość utworzenia Portfela Haven jest obecnie wstrzymana.", - "camera_consent": "Twój aparat zostanie użyty do przechwycenia obrazu w celach identyfikacyjnych przez ${provider}. Aby uzyskać szczegółowe informacje, sprawdź ich Politykę prywatności." + "camera_consent": "Twój aparat zostanie użyty do przechwycenia obrazu w celach identyfikacyjnych przez ${provider}. Aby uzyskać szczegółowe informacje, sprawdź ich Politykę prywatności.", + "no_relays": "Żadnych przekaźników", + "choose_relay": "Wybierz przekaźnik, którego chcesz użyć", + "no_relays_message": "Znaleźliśmy rekord Nostr NIP-05 dla tego użytkownika, ale nie zawiera on żadnych przekaźników. Poinstruuj odbiorcę, aby dodał przekaźniki do swojego rekordu Nostr.", + "no_relay_on_domain": "Brak przekaźnika dla domeny użytkownika lub przekaźnik jest niedostępny. Wybierz przekaźnik, którego chcesz użyć." } diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 42c4cec28..b9694d223 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -767,5 +767,9 @@ "confirmed_tx": "Confirmado", "transaction_details_source_address": "Endereço de Origem", "pause_wallet_creation": "A capacidade de criar a Haven Wallet está atualmente pausada.", - "camera_consent": "Sua câmera será usada para capturar uma imagem para fins de identificação por ${provider}. Por favor, verifique a Política de Privacidade para obter detalhes." + "camera_consent": "Sua câmera será usada para capturar uma imagem para fins de identificação por ${provider}. Por favor, verifique a Política de Privacidade para obter detalhes.", + "no_relays": "Sem relés", + "choose_relay": "Escolha um relé para usar", + "no_relays_message": "Encontramos um registro Nostr NIP-05 para este usuário, mas ele não contém nenhum relé. Instrua o destinatário a adicionar retransmissões ao seu registro Nostr.", + "no_relay_on_domain": "Não há uma retransmissão para o domínio do usuário ou a retransmissão está indisponível. Escolha um relé para usar." } diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index edc6993a0..3e5d2cec2 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -768,5 +768,9 @@ "confirmed_tx": "Подтвержденный", "transaction_details_source_address": "Адрес источника", "pause_wallet_creation": "Возможность создания Haven Wallet в настоящее время приостановлена.", - "camera_consent": "Ваша камера будет использоваться для захвата изображения в целях идентификации ${provider}. Пожалуйста, ознакомьтесь с их Политикой конфиденциальности для получения подробной информации." + "camera_consent": "Ваша камера будет использоваться для захвата изображения в целях идентификации ${provider}. Пожалуйста, ознакомьтесь с их Политикой конфиденциальности для получения подробной информации.", + "no_relays": "Нет реле", + "choose_relay": "Пожалуйста, выберите реле для использования", + "no_relays_message": "Мы нашли запись Nostr NIP-05 для этого пользователя, но она не содержит никаких реле. Попросите получателя добавить реле в свою запись Nostr.", + "no_relay_on_domain": "Для домена пользователя реле не существует или реле недоступно. Пожалуйста, выберите реле для использования." } diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 80fa3f9c6..a9fe67959 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -766,5 +766,9 @@ "confirmed_tx": "ซึ่งยืนยันแล้ว", "transaction_details_source_address": "ที่อยู่แหล่งกำเนิด", "pause_wallet_creation": "ขณะนี้ความสามารถในการสร้าง Haven Wallet ถูกหยุดชั่วคราว", - "camera_consent": "กล้องของคุณจะถูกนำมาใช้เพื่อจับภาพเพื่อวัตถุประสงค์ในการระบุตัวตนภายใน ${provider} โปรดตรวจสอบนโยบายความเป็นส่วนตัวเพื่อดูรายละเอียด" + "camera_consent": "กล้องของคุณจะถูกนำมาใช้เพื่อจับภาพเพื่อวัตถุประสงค์ในการระบุตัวตนภายใน ${provider} โปรดตรวจสอบนโยบายความเป็นส่วนตัวเพื่อดูรายละเอียด", + "no_relays": "ไม่มีรีเลย์", + "choose_relay": "กรุณาเลือกรีเลย์ที่จะใช้", + "no_relays_message": "เราพบบันทึก Nostr NIP-05 สำหรับผู้ใช้รายนี้ แต่ไม่มีรีเลย์ใดๆ โปรดแนะนำให้ผู้รับเพิ่มรีเลย์ลงในบันทึก Nostr ของตน", + "no_relay_on_domain": "ไม่มีการส่งต่อสำหรับโดเมนของผู้ใช้ หรือการส่งต่อไม่พร้อมใช้งาน กรุณาเลือกรีเลย์ที่จะใช้" } diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 558f26911..3d05cc700 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -762,5 +762,9 @@ "confirmed_tx": "Nakumpirma", "transaction_details_source_address": "SOURCE ADDRESS", "pause_wallet_creation": "Kasalukuyang naka-pause ang kakayahang gumawa ng Haven Wallet.", - "camera_consent": "Gagamitin ang iyong camera upang kumuha ng larawan para sa mga layunin ng pagkakakilanlan sa pamamagitan ng ${provider}. Pakisuri ang kanilang Patakaran sa Privacy para sa mga detalye." + "camera_consent": "Gagamitin ang iyong camera upang kumuha ng larawan para sa mga layunin ng pagkakakilanlan sa pamamagitan ng ${provider}. Pakisuri ang kanilang Patakaran sa Privacy para sa mga detalye.", + "no_relays": "Walang mga relay", + "choose_relay": "Mangyaring pumili ng relay na gagamitin", + "no_relays_message": "Nakakita kami ng Nostr NIP-05 record para sa user na ito, ngunit hindi ito naglalaman ng anumang mga relay. Mangyaring atasan ang tatanggap na magdagdag ng mga relay sa kanilang Nostr record.", + "no_relay_on_domain": "Walang relay para sa domain ng user o hindi available ang relay. Mangyaring pumili ng relay na gagamitin." } diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index bbbecaf5c..62243838d 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -766,5 +766,9 @@ "confirmed_tx": "Onaylanmış", "transaction_details_source_address": "Kaynak adresi", "pause_wallet_creation": "Haven Cüzdanı oluşturma yeteneği şu anda duraklatıldı.", - "camera_consent": "Kameranız ${provider} tarihine kadar tanımlama amacıyla bir görüntü yakalamak için kullanılacaktır. Ayrıntılar için lütfen Gizlilik Politikalarını kontrol edin." + "camera_consent": "Kameranız ${provider} tarihine kadar tanımlama amacıyla bir görüntü yakalamak için kullanılacaktır. Ayrıntılar için lütfen Gizlilik Politikalarını kontrol edin.", + "no_relays": "Röle yok", + "choose_relay": "Lütfen kullanmak için bir röle seçin", + "no_relays_message": "Bu kullanıcı için bir Nostr NIP-05 kaydı bulduk ancak bu kayıt herhangi bir aktarma içermiyor. Lütfen alıcıya Nostr kayıtlarına aktarma eklemesi talimatını verin.", + "no_relay_on_domain": "Kullanıcının alanı için bir geçiş yok veya geçiş kullanılamıyor. Lütfen kullanmak için bir röle seçin." } diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index a1d08b352..def086b2e 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -768,5 +768,9 @@ "confirmed_tx": "Підтверджений", "transaction_details_source_address": "Адреса джерела", "pause_wallet_creation": "Можливість створення гаманця Haven зараз призупинено.", - "camera_consent": "Ваша камера використовуватиметься для зйомки зображення з метою ідентифікації ${provider}. Будь ласка, ознайомтеся з їхньою політикою конфіденційності, щоб дізнатися більше." + "camera_consent": "Ваша камера використовуватиметься для зйомки зображення з метою ідентифікації ${provider}. Будь ласка, ознайомтеся з їхньою політикою конфіденційності, щоб дізнатися більше.", + "no_relays": "Без реле", + "choose_relay": "Будь ласка, виберіть реле для використання", + "no_relays_message": "Ми знайшли запис Nostr NIP-05 для цього користувача, але він не містить жодних реле. Будь ласка, попросіть одержувача додати реле до свого запису Nostr.", + "no_relay_on_domain": "Немає ретранслятора для домену користувача або ретранслятор недоступний. Будь ласка, виберіть реле для використання." } diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 517aa9ded..34b1042ac 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -760,5 +760,9 @@ "confirmed_tx": "تصدیق", "transaction_details_source_address": "ماخذ ایڈریس", "pause_wallet_creation": "Haven Wallet ۔ﮯﮨ ﻑﻮﻗﻮﻣ ﻝﺎﺤﻟﺍ ﯽﻓ ﺖﯿﻠﮨﺍ ﯽﮐ ﮯﻧﺎﻨﺑ", - "camera_consent": "۔ﮟﯿﮭﮑﯾﺩ ﯽﺴﯿﻟﺎﭘ ﯽﺴﯾﻮﯿﺋﺍﺮﭘ ﯽﮐ ﻥﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ﮯﯿﻟ ﮯﮐ ﺕﻼ${provider}ﯿﺼﻔﺗ ۔ﺎﮔ ﮯﺋﺎﺟ ﺎﯿﮐ ﻝﺎﻤﻌﺘﺳﺍ ﮯﯿﻟ" + "camera_consent": "۔ﮟﯿﮭﮑﯾﺩ ﯽﺴﯿﻟﺎﭘ ﯽﺴﯾﻮﯿﺋﺍﺮﭘ ﯽﮐ ﻥﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ﮯﯿﻟ ﮯﮐ ﺕﻼ${provider}ﯿﺼﻔﺗ ۔ﺎﮔ ﮯﺋﺎﺟ ﺎﯿﮐ ﻝﺎﻤﻌﺘﺳﺍ ﮯﯿﻟ", + "no_relays": " ۔ﮟﯿﮩﻧ ﮯﻠﯾﺭ ﯽﺋﻮﮐ", + "choose_relay": " ۔ﮟﯾﺮﮐ ﺏﺎﺨﺘﻧﺍ ﺎﮐ ﮯﻠﯾﺭ ﮯﯿﻟ ﮯﮐ ﮯﻧﺮﮐ ﻝﺎﻤﻌﺘﺳﺍ ﻡﺮﮐ ﮦﺍﺮﺑ", + "no_relays_message": "۔ﮟﯾﺮﮐ ﻞﻣﺎﺷ ﮯﻠﯾﺭ ﮟﯿﻣ ﮈﺭﺎﮑﯾﺭ ﺮﭩﺳﻮﻧ ﮯﻨﭘﺍ ﮦﻭ ﮧﮐ ﮟﯾﺩ ﺖﯾﺍﺪﮨ ﻮﮐ ﮦﺪﻨﻨﮐ ﻝﻮﺻﻭ ﻡﺮﮐ ﮦﺍﺮﺑ ۔", + "no_relay_on_domain": "۔ﮟﯾﺮﮐ ﺏﺎﺨﺘﻧﺍ ﺎﮐ ﮯﻠﯾﺭ ﮯﯿﻟ ﮯﮐ ﮯﻧﺮﮐ ﻝﺎﻤﻌﺘﺳﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ۔ﮯﮨ ﮟﯿﮩﻧ ﺏﺎﯿﺘﺳﺩ ﮯﻠﯾﺭ ﺎﯾ ﮯﮨ ﮟ" } diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 298c73c67..12769ec91 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -762,5 +762,9 @@ "confirmed_tx": "Jẹrisi", "transaction_details_source_address": "Adirẹsi orisun", "pause_wallet_creation": "Agbara lati ṣẹda Haven Wallet ti wa ni idaduro lọwọlọwọ.", - "camera_consent": "Kamẹra rẹ yoo ṣee lo lati ya aworan kan fun awọn idi idanimọ nipasẹ ${provider}. Jọwọ ṣayẹwo Ilana Aṣiri wọn fun awọn alaye." + "camera_consent": "Kamẹra rẹ yoo ṣee lo lati ya aworan kan fun awọn idi idanimọ nipasẹ ${provider}. Jọwọ ṣayẹwo Ilana Aṣiri wọn fun awọn alaye.", + "no_relays": "Ko si relays", + "choose_relay": "Jọwọ yan yii lati lo", + "no_relays_message": "A ri igbasilẹ Nostr NIP-05 fun olumulo yii, ṣugbọn ko ni eyikeyi awọn iṣipopada ninu. Jọwọ sọ fun olugba lati ṣafikun awọn isunmọ si igbasilẹ Nostr wọn.", + "no_relay_on_domain": "Ko si iṣipopada fun agbegbe olumulo tabi yiyi ko si. Jọwọ yan yii lati lo." } diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 20255e76c..cdffd8141 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -767,5 +767,9 @@ "confirmed_tx": "确认的", "transaction_details_source_address": "源地址", "pause_wallet_creation": "创建 Haven 钱包的功能当前已暂停。", - "camera_consent": "${provider} 将使用您的相机拍摄图像以供识别之用。请查看他们的隐私政策了解详情。" + "camera_consent": "${provider} 将使用您的相机拍摄图像以供识别之用。请查看他们的隐私政策了解详情。", + "no_relays": "无继电器", + "choose_relay": "请选择要使用的继电器", + "no_relays_message": "我们找到了该用户的 Nostr NIP-05 记录,但它不包含任何中继。请指示收件人将中继添加到他们的 Nostr 记录中。", + "no_relay_on_domain": "用户域没有中继或中继不可用。请选择要使用的继电器。" }