From c0f8b166ea952b308fe53c50815f54d8961eacc9 Mon Sep 17 00:00:00 2001 From: Forte11Cuba Date: Thu, 12 Mar 2026 10:53:50 -0600 Subject: [PATCH] feat: NFC support for Cashu token read/write --- android/app/src/main/AndroidManifest.xml | 3 + l10n.yaml | 1 - lib/core/services/nfc_service.dart | 213 +++++++++++++++++++++ lib/l10n/app_de.arb | 11 ++ lib/l10n/app_en.arb | 19 ++ lib/l10n/app_es.arb | 19 ++ lib/l10n/app_fr.arb | 11 ++ lib/l10n/app_it.arb | 11 ++ lib/l10n/app_ja.arb | 11 ++ lib/l10n/app_ko.arb | 11 ++ lib/l10n/app_localizations.dart | 117 ++++++++--- lib/l10n/app_localizations_de.dart | 136 +++++++++---- lib/l10n/app_localizations_en.dart | 87 +++++++-- lib/l10n/app_localizations_es.dart | 111 ++++++++--- lib/l10n/app_localizations_fr.dart | 151 +++++++++++---- lib/l10n/app_localizations_it.dart | 117 ++++++++--- lib/l10n/app_localizations_ja.dart | 45 ++++- lib/l10n/app_localizations_ko.dart | 51 ++++- lib/l10n/app_localizations_pt.dart | 117 ++++++++--- lib/l10n/app_localizations_ru.dart | 108 ++++++++--- lib/l10n/app_localizations_sw.dart | 108 ++++++++--- lib/l10n/app_localizations_zh.dart | 30 ++- lib/l10n/app_pt.arb | 11 ++ lib/l10n/app_ru.arb | 11 ++ lib/l10n/app_sw.arb | 11 ++ lib/l10n/app_zh.arb | 11 ++ lib/screens/4_receive/receive_screen.dart | 129 +++++++++++++ lib/screens/5_send/share_token_screen.dart | 191 +++++++++++++++--- pubspec.lock | 82 ++++---- pubspec.yaml | 6 +- 30 files changed, 1606 insertions(+), 334 deletions(-) create mode 100644 lib/core/services/nfc_service.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index cb25fd9..769226c 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -7,6 +7,9 @@ + + + checkState() async { + try { + final availability = await NfcManager.instance.checkAvailability(); + return switch (availability) { + NfcAvailability.enabled => NfcState.enabled, + NfcAvailability.disabled => NfcState.disabled, + NfcAvailability.unsupported => NfcState.unsupported, + }; + } catch (_) { + return NfcState.unsupported; + } + } + + /// Write a Cashu token to an NFC tag as NDEF Text Record. + static Future startWrite({ + required String token, + required void Function() onSuccess, + required void Function(String error) onError, + }) async { + NfcManager.instance.startSession( + pollingOptions: {NfcPollingOption.iso14443}, + onDiscovered: (NfcTag tag) async { + final ndef = NdefAndroid.from(tag); + if (ndef == null || !ndef.isWritable) { + onError('Tag is not writable'); + NfcManager.instance.stopSession(); + return; + } + + // Build NDEF Text Record: [status byte][language code][text] + final textBytes = Uint8List.fromList(token.codeUnits); + final languageCode = Uint8List.fromList('en'.codeUnits); + final payload = Uint8List(1 + languageCode.length + textBytes.length); + payload[0] = languageCode.length; // status byte (UTF-8, no length) + payload.setRange(1, 1 + languageCode.length, languageCode); + payload.setRange(1 + languageCode.length, payload.length, textBytes); + + // Check size + if (payload.length + 7 > ndef.maxSize) { + onError('Token too large for this NFC tag ' + '(${payload.length + 7}B > ${ndef.maxSize}B)'); + NfcManager.instance.stopSession(); + return; + } + + try { + final message = NdefMessage(records: [ + NdefRecord( + typeNameFormat: TypeNameFormat.wellKnown, + type: Uint8List.fromList([0x54]), // 'T' = Text Record + identifier: Uint8List(0), + payload: payload, + ), + ]); + await ndef.writeNdefMessage(message); + onSuccess(); + NfcManager.instance.stopSession(); + } catch (e) { + onError(e.toString()); + NfcManager.instance.stopSession(); + } + }, + ); + } + + /// Stop any active NFC session. + static void stopWrite() { + NfcManager.instance.stopSession(); + } + + /// Start reading NFC tags for Cashu tokens. + static Future startRead({ + required void Function(String token) onTokenRead, + required void Function(String error) onError, + }) async { + NfcManager.instance.startSession( + pollingOptions: {NfcPollingOption.iso14443}, + onDiscovered: (NfcTag tag) async { + final ndef = NdefAndroid.from(tag); + if (ndef == null) { + onError('Tag does not contain NDEF data'); + NfcManager.instance.stopSession(); + return; + } + + try { + final message = ndef.cachedNdefMessage ?? await ndef.getNdefMessage(); + if (message == null) { + onError('No NDEF message on tag'); + NfcManager.instance.stopSession(); + return; + } + + final token = _extractToken(message); + if (token != null) { + onTokenRead(token); + NfcManager.instance.stopSession(); + } else { + onError('No Cashu token found on tag'); + NfcManager.instance.stopSession(); + } + } catch (e) { + onError(e.toString()); + NfcManager.instance.stopSession(); + } + }, + ); + } + + /// Stop any active NFC read session. + static void stopRead() { + NfcManager.instance.stopSession(); + } + + /// Extract a Cashu token from an NDEF message. + static String? _extractToken(NdefMessage message) { + for (final record in message.records) { + // Text Record + if (record.typeNameFormat == TypeNameFormat.wellKnown && + record.type.length == 1 && + record.type[0] == 0x54) { + final text = _decodeTextRecord(record); + if (text != null && _isCashuToken(text)) { + return text; + } + } + + // URI Record + if (record.typeNameFormat == TypeNameFormat.wellKnown && + record.type.length == 1 && + record.type[0] == 0x55) { + final uri = _decodeUriRecord(record); + if (uri != null) { + final token = _extractTokenFromUri(uri); + if (token != null) return token; + } + } + } + return null; + } + + /// Decode NDEF Text Record payload. + static String? _decodeTextRecord(NdefRecord record) { + if (record.payload.isEmpty) return null; + final languageCodeLength = record.payload[0] & 0x3F; + if (record.payload.length <= 1 + languageCodeLength) return null; + return String.fromCharCodes( + record.payload.sublist(1 + languageCodeLength)); + } + + /// Decode NDEF URI Record payload. + static String? _decodeUriRecord(NdefRecord record) { + if (record.payload.isEmpty) return null; + const prefixes = [ + '', // 0x00 + 'http://www.', // 0x01 + 'https://www.', // 0x02 + 'http://', // 0x03 + 'https://', // 0x04 + ]; + final prefixIndex = record.payload[0]; + final prefix = prefixIndex < prefixes.length ? prefixes[prefixIndex] : ''; + final rest = String.fromCharCodes(record.payload.sublist(1)); + return '$prefix$rest'; + } + + /// Extract token from a URL like https://wallet.com/#token=cashuA... + static String? _extractTokenFromUri(String uri) { + try { + final parsed = Uri.parse(uri); + final fragment = parsed.fragment; + if (fragment.startsWith('token=')) { + return fragment.substring(6); + } + final tokenParam = parsed.queryParameters['token']; + if (tokenParam != null && _isCashuToken(tokenParam)) { + return tokenParam; + } + } catch (_) {} + return null; + } + + /// Check if a string looks like a Cashu token. + static bool _isCashuToken(String text) { + final lower = text.toLowerCase().trim(); + return lower.startsWith('cashua') || + lower.startsWith('cashub') || + lower.startsWith('creqa'); + } +} diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 8ee375d..e8ef8fc 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -141,6 +141,17 @@ "emojiCopiedToClipboard": "Token als Emoji kopiert 🥜", "peanutDecodeError": "Emoji-Token konnte nicht dekodiert werden. Möglicherweise beschädigt.", + "nfcWrite": "Auf NFC-Tag schreiben", + "nfcRead": "NFC-Tag lesen", + "nfcHoldNear": "Gerät an NFC-Tag halten...", + "nfcWriteSuccess": "Token auf NFC-Tag geschrieben", + "nfcWriteError": "NFC-Schreibfehler: {error}", + "@nfcWriteError": { "placeholders": { "error": { "type": "String" } } }, + "nfcReadError": "NFC-Lesefehler: {error}", + "@nfcReadError": { "placeholders": { "error": { "type": "String" } } }, + "nfcDisabled": "NFC ist deaktiviert. Aktiviere es in den Einstellungen.", + "nfcUnsupported": "Dieses Gerät unterstützt kein NFC", + "amountToDeposit": "Einzuzahlender Betrag:", "descriptionOptional": "Beschreibung (optional):", "depositPlaceholder": "Wofür ist diese Einzahlung?", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 93c9f81..0f581c2 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -116,6 +116,25 @@ "emojiCopiedToClipboard": "Token copied as emoji 🥜", "peanutDecodeError": "Could not decode emoji token. It may be corrupted.", + "nfcWrite": "Write to NFC tag", + "nfcRead": "Read NFC tag", + "nfcHoldNear": "Hold device near NFC tag...", + "nfcWriteSuccess": "Token written to NFC tag", + "nfcWriteError": "NFC write error: {error}", + "@nfcWriteError": { + "placeholders": { + "error": { "type": "String" } + } + }, + "nfcReadError": "NFC read error: {error}", + "@nfcReadError": { + "placeholders": { + "error": { "type": "String" } + } + }, + "nfcDisabled": "NFC is disabled. Enable it in Settings.", + "nfcUnsupported": "This device does not support NFC", + "amountToDeposit": "Amount to deposit:", "descriptionOptional": "Description (optional):", "depositPlaceholder": "What is this deposit for?", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 7f5bbb9..e9efe8c 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -141,6 +141,25 @@ "emojiCopiedToClipboard": "Token copiado como emoji 🥜", "peanutDecodeError": "No se pudo decodificar el token emoji. Puede estar corrupto.", + "nfcWrite": "Escribir en tag NFC", + "nfcRead": "Leer tag NFC", + "nfcHoldNear": "Acerca el dispositivo al tag NFC...", + "nfcWriteSuccess": "Token escrito en tag NFC", + "nfcWriteError": "Error NFC al escribir: {error}", + "@nfcWriteError": { + "placeholders": { + "error": { "type": "String" } + } + }, + "nfcReadError": "Error NFC al leer: {error}", + "@nfcReadError": { + "placeholders": { + "error": { "type": "String" } + } + }, + "nfcDisabled": "NFC está desactivado. Actívalo en Ajustes.", + "nfcUnsupported": "Este dispositivo no soporta NFC", + "amountToDeposit": "Monto a depositar:", "descriptionOptional": "Descripción (opcional):", "depositPlaceholder": "¿Para qué es esta recarga?", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 99be06c..408ccbb 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -141,6 +141,17 @@ "emojiCopiedToClipboard": "Token copié en emoji 🥜", "peanutDecodeError": "Impossible de décoder le token emoji. Il est peut-être corrompu.", + "nfcWrite": "Écrire sur tag NFC", + "nfcRead": "Lire tag NFC", + "nfcHoldNear": "Approchez l'appareil du tag NFC...", + "nfcWriteSuccess": "Token écrit sur le tag NFC", + "nfcWriteError": "Erreur NFC écriture : {error}", + "@nfcWriteError": { "placeholders": { "error": { "type": "String" } } }, + "nfcReadError": "Erreur NFC lecture : {error}", + "@nfcReadError": { "placeholders": { "error": { "type": "String" } } }, + "nfcDisabled": "NFC est désactivé. Activez-le dans les Paramètres.", + "nfcUnsupported": "Cet appareil ne prend pas en charge le NFC", + "amountToDeposit": "Montant à déposer :", "descriptionOptional": "Description (optionnelle) :", "depositPlaceholder": "À quoi sert ce dépôt ?", diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index f63f355..e4887ee 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -141,6 +141,17 @@ "emojiCopiedToClipboard": "Token copiato come emoji 🥜", "peanutDecodeError": "Impossibile decodificare il token emoji. Potrebbe essere corrotto.", + "nfcWrite": "Scrivi su tag NFC", + "nfcRead": "Leggi tag NFC", + "nfcHoldNear": "Avvicina il dispositivo al tag NFC...", + "nfcWriteSuccess": "Token scritto sul tag NFC", + "nfcWriteError": "Errore NFC scrittura: {error}", + "@nfcWriteError": { "placeholders": { "error": { "type": "String" } } }, + "nfcReadError": "Errore NFC lettura: {error}", + "@nfcReadError": { "placeholders": { "error": { "type": "String" } } }, + "nfcDisabled": "NFC è disattivato. Attivalo nelle Impostazioni.", + "nfcUnsupported": "Questo dispositivo non supporta NFC", + "amountToDeposit": "Importo da depositare:", "descriptionOptional": "Descrizione (opzionale):", "depositPlaceholder": "A cosa serve questo deposito?", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index eb89257..b8e5b65 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -141,6 +141,17 @@ "emojiCopiedToClipboard": "トークンを絵文字としてコピーしました 🥜", "peanutDecodeError": "絵文字トークンをデコードできませんでした。破損している可能性があります。", + "nfcWrite": "NFCタグに書き込む", + "nfcRead": "NFCタグを読み取る", + "nfcHoldNear": "デバイスをNFCタグに近づけてください...", + "nfcWriteSuccess": "トークンをNFCタグに書き込みました", + "nfcWriteError": "NFC書き込みエラー: {error}", + "@nfcWriteError": { "placeholders": { "error": { "type": "String" } } }, + "nfcReadError": "NFC読み取りエラー: {error}", + "@nfcReadError": { "placeholders": { "error": { "type": "String" } } }, + "nfcDisabled": "NFCが無効です。設定で有効にしてください。", + "nfcUnsupported": "このデバイスはNFCに対応していません", + "amountToDeposit": "入金額:", "descriptionOptional": "説明(任意):", "depositPlaceholder": "この入金は何のためですか?", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 5f661ad..8f7b64c 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -141,6 +141,17 @@ "emojiCopiedToClipboard": "토큰이 이모지로 복사되었습니다 🥜", "peanutDecodeError": "이모지 토큰을 디코딩할 수 없습니다. 손상되었을 수 있습니다.", + "nfcWrite": "NFC 태그에 쓰기", + "nfcRead": "NFC 태그 읽기", + "nfcHoldNear": "기기를 NFC 태그에 가까이 대세요...", + "nfcWriteSuccess": "토큰이 NFC 태그에 기록되었습니다", + "nfcWriteError": "NFC 쓰기 오류: {error}", + "@nfcWriteError": { "placeholders": { "error": { "type": "String" } } }, + "nfcReadError": "NFC 읽기 오류: {error}", + "@nfcReadError": { "placeholders": { "error": { "type": "String" } } }, + "nfcDisabled": "NFC가 비활성화되어 있습니다. 설정에서 활성화하세요.", + "nfcUnsupported": "이 기기는 NFC를 지원하지 않습니다", + "amountToDeposit": "입금할 금액:", "descriptionOptional": "설명 (선택사항):", "depositPlaceholder": "이 입금은 무엇을 위한 것인가요?", diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index c2636fc..8678b68 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -71,7 +71,8 @@ import 'app_localizations_zh.dart'; /// be consistent with the languages listed in the L10n.supportedLocales /// property. abstract class L10n { - L10n(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + L10n(String locale) + : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; @@ -91,12 +92,13 @@ abstract class L10n { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; + static const List> localizationsDelegates = + >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ @@ -110,7 +112,7 @@ abstract class L10n { Locale('pt'), Locale('ru'), Locale('sw'), - Locale('zh') + Locale('zh'), ]; /// No description provided for @appName. @@ -725,6 +727,54 @@ abstract class L10n { /// **'No se pudo decodificar el token emoji. Puede estar corrupto.'** String get peanutDecodeError; + /// No description provided for @nfcWrite. + /// + /// In es, this message translates to: + /// **'Escribir en tag NFC'** + String get nfcWrite; + + /// No description provided for @nfcRead. + /// + /// In es, this message translates to: + /// **'Leer tag NFC'** + String get nfcRead; + + /// No description provided for @nfcHoldNear. + /// + /// In es, this message translates to: + /// **'Acerca el dispositivo al tag NFC...'** + String get nfcHoldNear; + + /// No description provided for @nfcWriteSuccess. + /// + /// In es, this message translates to: + /// **'Token escrito en tag NFC'** + String get nfcWriteSuccess; + + /// No description provided for @nfcWriteError. + /// + /// In es, this message translates to: + /// **'Error NFC al escribir: {error}'** + String nfcWriteError(String error); + + /// No description provided for @nfcReadError. + /// + /// In es, this message translates to: + /// **'Error NFC al leer: {error}'** + String nfcReadError(String error); + + /// No description provided for @nfcDisabled. + /// + /// In es, this message translates to: + /// **'NFC está desactivado. Actívalo en Ajustes.'** + String get nfcDisabled; + + /// No description provided for @nfcUnsupported. + /// + /// In es, this message translates to: + /// **'Este dispositivo no soporta NFC'** + String get nfcUnsupported; + /// No description provided for @amountToDeposit. /// /// In es, this message translates to: @@ -2175,34 +2225,55 @@ class _L10nDelegate extends LocalizationsDelegate { } @override - bool isSupported(Locale locale) => ['de', 'en', 'es', 'fr', 'it', 'ja', 'ko', 'pt', 'ru', 'sw', 'zh'].contains(locale.languageCode); + bool isSupported(Locale locale) => [ + 'de', + 'en', + 'es', + 'fr', + 'it', + 'ja', + 'ko', + 'pt', + 'ru', + 'sw', + 'zh', + ].contains(locale.languageCode); @override bool shouldReload(_L10nDelegate old) => false; } L10n lookupL10n(Locale locale) { - - // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'de': return L10nDe(); - case 'en': return L10nEn(); - case 'es': return L10nEs(); - case 'fr': return L10nFr(); - case 'it': return L10nIt(); - case 'ja': return L10nJa(); - case 'ko': return L10nKo(); - case 'pt': return L10nPt(); - case 'ru': return L10nRu(); - case 'sw': return L10nSw(); - case 'zh': return L10nZh(); + case 'de': + return L10nDe(); + case 'en': + return L10nEn(); + case 'es': + return L10nEs(); + case 'fr': + return L10nFr(); + case 'it': + return L10nIt(); + case 'ja': + return L10nJa(); + case 'ko': + return L10nKo(); + case 'pt': + return L10nPt(); + case 'ru': + return L10nRu(); + case 'sw': + return L10nSw(); + case 'zh': + return L10nZh(); } throw FlutterError( 'L10n.delegate failed to load unsupported locale "$locale". This is likely ' 'an issue with the localizations generation tool. Please file an issue ' 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.' + 'that was used.', ); } diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index dd56426..949a922 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -1,5 +1,5 @@ +// ignore: unused_import import 'package:intl/intl.dart' as intl; - import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -60,7 +60,8 @@ class L10nDe extends L10n { String get generatingSeed => 'Sichere Generierung deiner Seed-Phrase'; @override - String get createWalletDescription => 'Eine 12-Wort Seed-Phrase wird generiert.\nBewahre sie an einem sicheren Ort auf.'; + String get createWalletDescription => + 'Eine 12-Wort Seed-Phrase wird generiert.\nBewahre sie an einem sicheren Ort auf.'; @override String get generateWallet => 'Wallet generieren'; @@ -69,10 +70,12 @@ class L10nDe extends L10n { String get walletCreated => 'Wallet erstellt!'; @override - String get walletCreatedDescription => 'Deine Wallet ist bereit. Wir empfehlen, jetzt ein Backup deiner Seed-Phrase zu erstellen.'; + String get walletCreatedDescription => + 'Deine Wallet ist bereit. Wir empfehlen, jetzt ein Backup deiner Seed-Phrase zu erstellen.'; @override - String get backupWarning => 'Ohne Backup verlierst du den Zugang zu deinen Mitteln, wenn du das Gerät verlierst.'; + String get backupWarning => + 'Ohne Backup verlierst du den Zugang zu deinen Mitteln, wenn du das Gerät verlierst.'; @override String get backupNow => 'Jetzt sichern'; @@ -87,13 +90,15 @@ class L10nDe extends L10n { String get seedPhraseTitle => 'Deine Seed-Phrase'; @override - String get seedPhraseDescription => 'Speichere diese 12 Wörter in der richtigen Reihenfolge. Sie sind der einzige Weg, deine Wallet wiederherzustellen.'; + String get seedPhraseDescription => + 'Speichere diese 12 Wörter in der richtigen Reihenfolge. Sie sind der einzige Weg, deine Wallet wiederherzustellen.'; @override String get revealSeedPhrase => 'Seed-Phrase anzeigen'; @override - String get tapToReveal => 'Tippe auf den Button, um\ndeine Seed-Phrase anzuzeigen'; + String get tapToReveal => + 'Tippe auf den Button, um\ndeine Seed-Phrase anzuzeigen'; @override String get copyToClipboard => 'In Zwischenablage kopieren'; @@ -105,7 +110,8 @@ class L10nDe extends L10n { String get neverShareSeed => 'Teile deine Seed-Phrase niemals mit anderen.'; @override - String get confirmBackup => 'Ich habe meine Seed-Phrase an einem sicheren Ort gespeichert'; + String get confirmBackup => + 'Ich habe meine Seed-Phrase an einem sicheren Ort gespeichert'; @override String get continue_ => 'Weiter'; @@ -117,7 +123,8 @@ class L10nDe extends L10n { String get enterSeedPhrase => 'Gib deine Seed-Phrase ein'; @override - String get enterSeedDescription => 'Gib die 12 oder 24 Wörter durch Leerzeichen getrennt ein.'; + String get enterSeedDescription => + 'Gib die 12 oder 24 Wörter durch Leerzeichen getrennt ein.'; @override String get seedPlaceholder => 'wort1 wort2 wort3 ...'; @@ -131,7 +138,8 @@ class L10nDe extends L10n { String get needWords => '(du brauchst 12 oder 24)'; @override - String get restoreScanningMint => 'Mint wird nach vorhandenen Token durchsucht...'; + String get restoreScanningMint => + 'Mint wird nach vorhandenen Token durchsucht...'; @override String restoreError(String error) { @@ -310,7 +318,8 @@ class L10nDe extends L10n { } @override - String get keepTokenWarning => 'Bewahre diesen Token auf, bis der Empfänger ihn einlöst. Wenn du ihn verlierst, verlierst du die Mittel.'; + String get keepTokenWarning => + 'Bewahre diesen Token auf, bis der Empfänger ihn einlöst. Wenn du ihn verlierst, verlierst du die Mittel.'; @override String get tokenCopiedToClipboard => 'Token in Zwischenablage kopiert'; @@ -322,7 +331,37 @@ class L10nDe extends L10n { String get emojiCopiedToClipboard => 'Token als Emoji kopiert 🥜'; @override - String get peanutDecodeError => 'Emoji-Token konnte nicht dekodiert werden. Möglicherweise beschädigt.'; + String get peanutDecodeError => + 'Emoji-Token konnte nicht dekodiert werden. Möglicherweise beschädigt.'; + + @override + String get nfcWrite => 'Auf NFC-Tag schreiben'; + + @override + String get nfcRead => 'NFC-Tag lesen'; + + @override + String get nfcHoldNear => 'Gerät an NFC-Tag halten...'; + + @override + String get nfcWriteSuccess => 'Token auf NFC-Tag geschrieben'; + + @override + String nfcWriteError(String error) { + return 'NFC-Schreibfehler: $error'; + } + + @override + String nfcReadError(String error) { + return 'NFC-Lesefehler: $error'; + } + + @override + String get nfcDisabled => + 'NFC ist deaktiviert. Aktiviere es in den Einstellungen.'; + + @override + String get nfcUnsupported => 'Dieses Gerät unterstützt kein NFC'; @override String get amountToDeposit => 'Einzuzahlender Betrag:'; @@ -459,7 +498,8 @@ class L10nDe extends L10n { String get noPendingTransactions => 'Keine ausstehenden Transaktionen'; @override - String get allTransactionsCompleted => 'Alle deine Transaktionen sind abgeschlossen'; + String get allTransactionsCompleted => + 'Alle deine Transaktionen sind abgeschlossen'; @override String get noEcashTransactions => 'Keine Ecash Transaktionen'; @@ -471,7 +511,8 @@ class L10nDe extends L10n { String get noLightningTransactions => 'Keine Lightning Transaktionen'; @override - String get depositOrWithdrawLightning => 'Zahle ein oder hebe ab via Lightning'; + String get depositOrWithdrawLightning => + 'Zahle ein oder hebe ab via Lightning'; @override String get pendingStatus => 'Ausstehend'; @@ -674,7 +715,8 @@ class L10nDe extends L10n { String get close => 'Schließen'; @override - String get aboutDescription => 'Eine Cashu Wallet mit kubanischer DNA für die ganze Welt. Bruder von LaChispa.'; + String get aboutDescription => + 'Eine Cashu Wallet mit kubanischer DNA für die ganze Welt. Bruder von LaChispa.'; @override String get couldNotOpenLink => 'Link konnte nicht geöffnet werden'; @@ -686,7 +728,8 @@ class L10nDe extends L10n { String get actionIrreversible => 'Diese Aktion ist unwiderruflich'; @override - String get deleteWalletWarning => 'Alle Daten werden gelöscht, einschließlich deiner Seed-Phrase und Tokens. Stelle sicher, dass du ein Backup hast.'; + String get deleteWalletWarning => + 'Alle Daten werden gelöscht, einschließlich deiner Seed-Phrase und Tokens. Stelle sicher, dass du ein Backup hast.'; @override String get typeDeleteToConfirm => 'Gib \"LÖSCHEN\" zur Bestätigung ein:'; @@ -703,19 +746,22 @@ class L10nDe extends L10n { String get recoverTokensTitle => 'Tokens wiederherstellen'; @override - String get recoverTokensDescription => 'Mints scannen, um Tokens wiederherzustellen, die mit deiner Seed-Phrase verknüpft sind (NUT-13)'; + String get recoverTokensDescription => + 'Mints scannen, um Tokens wiederherzustellen, die mit deiner Seed-Phrase verknüpft sind (NUT-13)'; @override String get useCurrentSeedPhrase => 'Meine aktuelle Seed-Phrase verwenden'; @override - String get scanWithSavedWords => 'Mints mit den gespeicherten 12 Wörtern scannen'; + String get scanWithSavedWords => + 'Mints mit den gespeicherten 12 Wörtern scannen'; @override String get useOtherSeedPhrase => 'Andere Seed-Phrase verwenden'; @override - String get recoverFromOtherWords => 'Tokens von anderen 12 Wörtern wiederherstellen'; + String get recoverFromOtherWords => + 'Tokens von anderen 12 Wörtern wiederherstellen'; @override String get mintsToScan => 'Zu scannende Mints:'; @@ -729,7 +775,8 @@ class L10nDe extends L10n { String get specificMint => 'Ein bestimmter Mint'; @override - String get enterMnemonicWords => 'Gib die 12 Wörter durch Leerzeichen getrennt ein...'; + String get enterMnemonicWords => + 'Gib die 12 Wörter durch Leerzeichen getrennt ein...'; @override String get scanMints => 'Mints scannen'; @@ -749,7 +796,8 @@ class L10nDe extends L10n { } @override - String get scanCompleteNoTokens => 'Scan abgeschlossen. Keine neuen Tokens gefunden.'; + String get scanCompleteNoTokens => + 'Scan abgeschlossen. Keine neuen Tokens gefunden.'; @override String mintsWithError(int count) { @@ -772,7 +820,8 @@ class L10nDe extends L10n { } @override - String get noTokensForMnemonic => 'Keine Tokens mit diesem Mnemonic verknüpft gefunden.'; + String get noTokensForMnemonic => + 'Keine Tokens mit diesem Mnemonic verknüpft gefunden.'; @override String get noConnectedMints => 'Keine verbundenen Mints'; @@ -852,7 +901,8 @@ class L10nDe extends L10n { String get deleteMintConfirmTitle => 'Mint löschen'; @override - String get deleteMintConfirmMessage => 'Wenn du Guthaben auf diesem Mint hast, geht es verloren. Bist du sicher?'; + String get deleteMintConfirmMessage => + 'Wenn du Guthaben auf diesem Mint hast, geht es verloren. Bist du sicher?'; @override String get delete => 'Löschen'; @@ -905,19 +955,24 @@ class L10nDe extends L10n { String get tokenSavedForLater => 'Token zum späteren Einlösen gespeichert'; @override - String get noConnectionTokenSaved => 'Keine Verbindung. Token zum späteren Einlösen gespeichert.'; + String get noConnectionTokenSaved => + 'Keine Verbindung. Token zum späteren Einlösen gespeichert.'; @override - String get unknownMintOffline => 'Dieser Token stammt von einem unbekannten Mint. Verbinde dich mit dem Internet, um ihn hinzuzufügen und den Token einzulösen.'; + String get unknownMintOffline => + 'Dieser Token stammt von einem unbekannten Mint. Verbinde dich mit dem Internet, um ihn hinzuzufügen und den Token einzulösen.'; @override - String get noConnectionTryLater => 'Keine Verbindung zum Mint. Versuche es später erneut.'; + String get noConnectionTryLater => + 'Keine Verbindung zum Mint. Versuche es später erneut.'; @override - String get saveTokenError => 'Fehler beim Speichern des Tokens. Bitte erneut versuchen.'; + String get saveTokenError => + 'Fehler beim Speichern des Tokens. Bitte erneut versuchen.'; @override - String get pendingTokenLimitReached => 'Limit für ausstehende Tokens erreicht (max 50)'; + String get pendingTokenLimitReached => + 'Limit für ausstehende Tokens erreicht (max 50)'; @override String get filterToReceive => 'Zu empfangen'; @@ -994,10 +1049,12 @@ class L10nDe extends L10n { String get unrecognizedQrCode => 'Nicht erkannter QR-Code'; @override - String get scanCashuTokenHint => 'Scanne einen Cashu Token (cashuA... oder cashuB...)'; + String get scanCashuTokenHint => + 'Scanne einen Cashu Token (cashuA... oder cashuB...)'; @override - String get scanLightningInvoiceHint => 'Scanne eine Lightning Rechnung (lnbc...)'; + String get scanLightningInvoiceHint => + 'Scanne eine Lightning Rechnung (lnbc...)'; @override String get addMintQuestion => 'Diesen Mint hinzufügen?'; @@ -1006,7 +1063,8 @@ class L10nDe extends L10n { String get cameraPermissionDenied => 'Kamera-Berechtigung verweigert'; @override - String get paymentRequestNotSupported => 'Zahlungsanfragen werden noch nicht unterstützt'; + String get paymentRequestNotSupported => + 'Zahlungsanfragen werden noch nicht unterstützt'; @override String get p2pkTitle => 'P2PK-Schlüssel'; @@ -1015,10 +1073,12 @@ class L10nDe extends L10n { String get p2pkSettingsDescription => 'Gesperrtes ecash empfangen'; @override - String get p2pkExperimental => 'P2PK ist experimentell. Mit Vorsicht verwenden.'; + String get p2pkExperimental => + 'P2PK ist experimentell. Mit Vorsicht verwenden.'; @override - String get p2pkPendingSendWarning => 'Du hast einen ausstehenden P2PK-Versand. Gehe zum Verlauf und aktualisiere, nachdem der Empfänger den Token eingelöst hat.'; + String get p2pkPendingSendWarning => + 'Du hast einen ausstehenden P2PK-Versand. Gehe zum Verlauf und aktualisiere, nachdem der Empfänger den Token eingelöst hat.'; @override String get p2pkExperimentalShort => 'Experimentell'; @@ -1075,7 +1135,8 @@ class L10nDe extends L10n { String get p2pkLockedToOther => 'Für anderen Schlüssel gesperrt'; @override - String get p2pkCannotUnlock => 'Du hast nicht den Schlüssel, um diesen Token zu entsperren'; + String get p2pkCannotUnlock => + 'Du hast nicht den Schlüssel, um diesen Token zu entsperren'; @override String get p2pkEnterPrivateKey => 'Privaten Schlüssel eingeben (nsec)'; @@ -1084,13 +1145,15 @@ class L10nDe extends L10n { String get p2pkDeleteTitle => 'Schlüssel löschen'; @override - String get p2pkDeleteConfirm => 'Diesen Schlüssel löschen? Du kannst keine Token mehr empfangen, die daran gesperrt sind.'; + String get p2pkDeleteConfirm => + 'Diesen Schlüssel löschen? Du kannst keine Token mehr empfangen, die daran gesperrt sind.'; @override String get p2pkRequiresConnection => 'P2PK erfordert Verbindung zum Mint'; @override - String get p2pkErrorMaxKeysReached => 'Maximale Anzahl importierter Schlüssel erreicht (10)'; + String get p2pkErrorMaxKeysReached => + 'Maximale Anzahl importierter Schlüssel erreicht (10)'; @override String get p2pkErrorInvalidNsec => 'Ungültiger nsec'; @@ -1102,5 +1165,6 @@ class L10nDe extends L10n { String get p2pkErrorKeyNotFound => 'Schlüssel nicht gefunden'; @override - String get p2pkErrorCannotDeletePrimary => 'Primärschlüssel kann nicht gelöscht werden'; + String get p2pkErrorCannotDeletePrimary => + 'Primärschlüssel kann nicht gelöscht werden'; } diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index af2374b..456b824 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -1,5 +1,5 @@ +// ignore: unused_import import 'package:intl/intl.dart' as intl; - import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -60,7 +60,8 @@ class L10nEn extends L10n { String get generatingSeed => 'Generating your seed phrase securely'; @override - String get createWalletDescription => 'A 12-word seed phrase will be generated.\nStore it in a safe place.'; + String get createWalletDescription => + 'A 12-word seed phrase will be generated.\nStore it in a safe place.'; @override String get generateWallet => 'Generate wallet'; @@ -69,10 +70,12 @@ class L10nEn extends L10n { String get walletCreated => 'Wallet created!'; @override - String get walletCreatedDescription => 'Your wallet is ready. We recommend backing up your seed phrase now.'; + String get walletCreatedDescription => + 'Your wallet is ready. We recommend backing up your seed phrase now.'; @override - String get backupWarning => 'Without backup, you will lose access to your funds if you lose the device.'; + String get backupWarning => + 'Without backup, you will lose access to your funds if you lose the device.'; @override String get backupNow => 'Backup now'; @@ -87,7 +90,8 @@ class L10nEn extends L10n { String get seedPhraseTitle => 'Your seed phrase'; @override - String get seedPhraseDescription => 'Save these 12 words in order. They are the only way to recover your wallet.'; + String get seedPhraseDescription => + 'Save these 12 words in order. They are the only way to recover your wallet.'; @override String get revealSeedPhrase => 'Reveal seed phrase'; @@ -117,7 +121,8 @@ class L10nEn extends L10n { String get enterSeedPhrase => 'Enter your seed phrase'; @override - String get enterSeedDescription => 'Type the 12 or 24 words separated by spaces.'; + String get enterSeedDescription => + 'Type the 12 or 24 words separated by spaces.'; @override String get seedPlaceholder => 'word1 word2 word3 ...'; @@ -310,7 +315,8 @@ class L10nEn extends L10n { } @override - String get keepTokenWarning => 'Keep this token until the recipient claims it. If you lose it, you will lose the funds.'; + String get keepTokenWarning => + 'Keep this token until the recipient claims it. If you lose it, you will lose the funds.'; @override String get tokenCopiedToClipboard => 'Token copied to clipboard'; @@ -322,7 +328,36 @@ class L10nEn extends L10n { String get emojiCopiedToClipboard => 'Token copied as emoji 🥜'; @override - String get peanutDecodeError => 'Could not decode emoji token. It may be corrupted.'; + String get peanutDecodeError => + 'Could not decode emoji token. It may be corrupted.'; + + @override + String get nfcWrite => 'Write to NFC tag'; + + @override + String get nfcRead => 'Read NFC tag'; + + @override + String get nfcHoldNear => 'Hold device near NFC tag...'; + + @override + String get nfcWriteSuccess => 'Token written to NFC tag'; + + @override + String nfcWriteError(String error) { + return 'NFC write error: $error'; + } + + @override + String nfcReadError(String error) { + return 'NFC read error: $error'; + } + + @override + String get nfcDisabled => 'NFC is disabled. Enable it in Settings.'; + + @override + String get nfcUnsupported => 'This device does not support NFC'; @override String get amountToDeposit => 'Amount to deposit:'; @@ -674,7 +709,8 @@ class L10nEn extends L10n { String get close => 'Close'; @override - String get aboutDescription => 'A Cashu wallet with Cuban DNA for the entire world. Brother of LaChispa.'; + String get aboutDescription => + 'A Cashu wallet with Cuban DNA for the entire world. Brother of LaChispa.'; @override String get couldNotOpenLink => 'Could not open link'; @@ -686,7 +722,8 @@ class L10nEn extends L10n { String get actionIrreversible => 'This action is irreversible'; @override - String get deleteWalletWarning => 'All data will be deleted including your seed phrase and tokens. Make sure you have a backup.'; + String get deleteWalletWarning => + 'All data will be deleted including your seed phrase and tokens. Make sure you have a backup.'; @override String get typeDeleteToConfirm => 'Type \"DELETE\" to confirm:'; @@ -703,7 +740,8 @@ class L10nEn extends L10n { String get recoverTokensTitle => 'Recover tokens'; @override - String get recoverTokensDescription => 'Scan mints to recover tokens associated with your seed phrase (NUT-13)'; + String get recoverTokensDescription => + 'Scan mints to recover tokens associated with your seed phrase (NUT-13)'; @override String get useCurrentSeedPhrase => 'Use my current seed phrase'; @@ -772,7 +810,8 @@ class L10nEn extends L10n { } @override - String get noTokensForMnemonic => 'No tokens found associated with that mnemonic.'; + String get noTokensForMnemonic => + 'No tokens found associated with that mnemonic.'; @override String get noConnectedMints => 'No connected mints'; @@ -852,7 +891,8 @@ class L10nEn extends L10n { String get deleteMintConfirmTitle => 'Delete mint'; @override - String get deleteMintConfirmMessage => 'If you have balance in this mint, it will be lost. Are you sure?'; + String get deleteMintConfirmMessage => + 'If you have balance in this mint, it will be lost. Are you sure?'; @override String get delete => 'Delete'; @@ -905,10 +945,12 @@ class L10nEn extends L10n { String get tokenSavedForLater => 'Token saved to claim later'; @override - String get noConnectionTokenSaved => 'No connection. Token saved to claim later.'; + String get noConnectionTokenSaved => + 'No connection. Token saved to claim later.'; @override - String get unknownMintOffline => 'This token is from an unknown mint. Connect to the internet to add it and claim the token.'; + String get unknownMintOffline => + 'This token is from an unknown mint. Connect to the internet to add it and claim the token.'; @override String get noConnectionTryLater => 'No connection to mint. Try again later.'; @@ -917,7 +959,8 @@ class L10nEn extends L10n { String get saveTokenError => 'Error saving token. Please try again.'; @override - String get pendingTokenLimitReached => 'Pending tokens limit reached (max 50)'; + String get pendingTokenLimitReached => + 'Pending tokens limit reached (max 50)'; @override String get filterToReceive => 'To receive'; @@ -994,7 +1037,8 @@ class L10nEn extends L10n { String get unrecognizedQrCode => 'Unrecognized QR code'; @override - String get scanCashuTokenHint => 'Scan a Cashu token (cashuA... or cashuB...)'; + String get scanCashuTokenHint => + 'Scan a Cashu token (cashuA... or cashuB...)'; @override String get scanLightningInvoiceHint => 'Scan a Lightning invoice (lnbc...)'; @@ -1006,7 +1050,8 @@ class L10nEn extends L10n { String get cameraPermissionDenied => 'Camera permission denied'; @override - String get paymentRequestNotSupported => 'Payment requests are not yet supported'; + String get paymentRequestNotSupported => + 'Payment requests are not yet supported'; @override String get p2pkTitle => 'P2PK Keys'; @@ -1018,7 +1063,8 @@ class L10nEn extends L10n { String get p2pkExperimental => 'P2PK is experimental. Use with caution.'; @override - String get p2pkPendingSendWarning => 'You have a pending P2PK send. Go to history and refresh after the recipient claims the token.'; + String get p2pkPendingSendWarning => + 'You have a pending P2PK send. Go to history and refresh after the recipient claims the token.'; @override String get p2pkExperimentalShort => 'Experimental'; @@ -1084,7 +1130,8 @@ class L10nEn extends L10n { String get p2pkDeleteTitle => 'Delete key'; @override - String get p2pkDeleteConfirm => 'Delete this key? You won\'t be able to receive tokens locked to it.'; + String get p2pkDeleteConfirm => + 'Delete this key? You won\'t be able to receive tokens locked to it.'; @override String get p2pkRequiresConnection => 'P2PK requires connection to the mint'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index b6b96e7..75f0aac 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -1,5 +1,5 @@ +// ignore: unused_import import 'package:intl/intl.dart' as intl; - import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -60,7 +60,8 @@ class L10nEs extends L10n { String get generatingSeed => 'Generando tu frase semilla de forma segura'; @override - String get createWalletDescription => 'Se generará una frase semilla de 12 palabras.\nGuárdala en un lugar seguro.'; + String get createWalletDescription => + 'Se generará una frase semilla de 12 palabras.\nGuárdala en un lugar seguro.'; @override String get generateWallet => 'Generar wallet'; @@ -69,10 +70,12 @@ class L10nEs extends L10n { String get walletCreated => '¡Wallet creada!'; @override - String get walletCreatedDescription => 'Tu wallet está lista. Te recomendamos hacer backup de tu frase semilla ahora.'; + String get walletCreatedDescription => + 'Tu wallet está lista. Te recomendamos hacer backup de tu frase semilla ahora.'; @override - String get backupWarning => 'Sin backup, perderás acceso a tus fondos si pierdes el dispositivo.'; + String get backupWarning => + 'Sin backup, perderás acceso a tus fondos si pierdes el dispositivo.'; @override String get backupNow => 'Hacer backup ahora'; @@ -87,7 +90,8 @@ class L10nEs extends L10n { String get seedPhraseTitle => 'Tu frase semilla'; @override - String get seedPhraseDescription => 'Guarda estas 12 palabras en orden. Son la única forma de recuperar tu wallet.'; + String get seedPhraseDescription => + 'Guarda estas 12 palabras en orden. Son la única forma de recuperar tu wallet.'; @override String get revealSeedPhrase => 'Revelar frase semilla'; @@ -117,7 +121,8 @@ class L10nEs extends L10n { String get enterSeedPhrase => 'Ingresa tu frase semilla'; @override - String get enterSeedDescription => 'Escribe las 12 o 24 palabras separadas por espacios.'; + String get enterSeedDescription => + 'Escribe las 12 o 24 palabras separadas por espacios.'; @override String get seedPlaceholder => 'palabra1 palabra2 palabra3 ...'; @@ -310,7 +315,8 @@ class L10nEs extends L10n { } @override - String get keepTokenWarning => 'Guarda este token hasta que el receptor lo reclame. Si lo pierdes, perderás los fondos.'; + String get keepTokenWarning => + 'Guarda este token hasta que el receptor lo reclame. Si lo pierdes, perderás los fondos.'; @override String get tokenCopiedToClipboard => 'Token copiado al portapapeles'; @@ -322,7 +328,36 @@ class L10nEs extends L10n { String get emojiCopiedToClipboard => 'Token copiado como emoji 🥜'; @override - String get peanutDecodeError => 'No se pudo decodificar el token emoji. Puede estar corrupto.'; + String get peanutDecodeError => + 'No se pudo decodificar el token emoji. Puede estar corrupto.'; + + @override + String get nfcWrite => 'Escribir en tag NFC'; + + @override + String get nfcRead => 'Leer tag NFC'; + + @override + String get nfcHoldNear => 'Acerca el dispositivo al tag NFC...'; + + @override + String get nfcWriteSuccess => 'Token escrito en tag NFC'; + + @override + String nfcWriteError(String error) { + return 'Error NFC al escribir: $error'; + } + + @override + String nfcReadError(String error) { + return 'Error NFC al leer: $error'; + } + + @override + String get nfcDisabled => 'NFC está desactivado. Actívalo en Ajustes.'; + + @override + String get nfcUnsupported => 'Este dispositivo no soporta NFC'; @override String get amountToDeposit => 'Monto a depositar:'; @@ -459,7 +494,8 @@ class L10nEs extends L10n { String get noPendingTransactions => 'Sin transacciones pendientes'; @override - String get allTransactionsCompleted => 'Todas tus transacciones están completadas'; + String get allTransactionsCompleted => + 'Todas tus transacciones están completadas'; @override String get noEcashTransactions => 'Sin transacciones Ecash'; @@ -674,7 +710,8 @@ class L10nEs extends L10n { String get close => 'Cerrar'; @override - String get aboutDescription => 'Un wallet de Cashu con ADN cubano para el mundo entero. Hermano de LaChispa.'; + String get aboutDescription => + 'Un wallet de Cashu con ADN cubano para el mundo entero. Hermano de LaChispa.'; @override String get couldNotOpenLink => 'No se pudo abrir el enlace'; @@ -686,7 +723,8 @@ class L10nEs extends L10n { String get actionIrreversible => 'Esta acción es irreversible'; @override - String get deleteWalletWarning => 'Se eliminarán todos los datos incluyendo tu seed phrase y tokens. Asegúrate de tener un backup.'; + String get deleteWalletWarning => + 'Se eliminarán todos los datos incluyendo tu seed phrase y tokens. Asegúrate de tener un backup.'; @override String get typeDeleteToConfirm => 'Escribe \"BORRAR\" para confirmar:'; @@ -703,13 +741,15 @@ class L10nEs extends L10n { String get recoverTokensTitle => 'Recuperar tokens'; @override - String get recoverTokensDescription => 'Escanea los mints para recuperar tokens asociados a tu seed phrase (NUT-13)'; + String get recoverTokensDescription => + 'Escanea los mints para recuperar tokens asociados a tu seed phrase (NUT-13)'; @override String get useCurrentSeedPhrase => 'Usar mi seed phrase actual'; @override - String get scanWithSavedWords => 'Escanear mints con las 12 palabras guardadas'; + String get scanWithSavedWords => + 'Escanear mints con las 12 palabras guardadas'; @override String get useOtherSeedPhrase => 'Usar otra seed phrase'; @@ -729,7 +769,8 @@ class L10nEs extends L10n { String get specificMint => 'Un mint específico'; @override - String get enterMnemonicWords => 'Ingresa las 12 palabras separadas por espacios...'; + String get enterMnemonicWords => + 'Ingresa las 12 palabras separadas por espacios...'; @override String get scanMints => 'Escanear mints'; @@ -749,7 +790,8 @@ class L10nEs extends L10n { } @override - String get scanCompleteNoTokens => 'Escaneo completado. No se encontraron tokens nuevos.'; + String get scanCompleteNoTokens => + 'Escaneo completado. No se encontraron tokens nuevos.'; @override String mintsWithError(int count) { @@ -772,7 +814,8 @@ class L10nEs extends L10n { } @override - String get noTokensForMnemonic => 'No se encontraron tokens asociados a ese mnemonic.'; + String get noTokensForMnemonic => + 'No se encontraron tokens asociados a ese mnemonic.'; @override String get noConnectedMints => 'No hay mints conectados'; @@ -852,7 +895,8 @@ class L10nEs extends L10n { String get deleteMintConfirmTitle => 'Eliminar mint'; @override - String get deleteMintConfirmMessage => 'Si tienes balance en este mint, se perderá. ¿Estás seguro?'; + String get deleteMintConfirmMessage => + 'Si tienes balance en este mint, se perderá. ¿Estás seguro?'; @override String get delete => 'Eliminar'; @@ -905,10 +949,12 @@ class L10nEs extends L10n { String get tokenSavedForLater => 'Token guardado para reclamar después'; @override - String get noConnectionTokenSaved => 'Sin conexión. Token guardado para reclamar después.'; + String get noConnectionTokenSaved => + 'Sin conexión. Token guardado para reclamar después.'; @override - String get unknownMintOffline => 'Este token es de un mint desconocido. Conéctate a internet para agregarlo y reclamar el token.'; + String get unknownMintOffline => + 'Este token es de un mint desconocido. Conéctate a internet para agregarlo y reclamar el token.'; @override String get noConnectionTryLater => 'Sin conexión al mint. Intenta más tarde.'; @@ -917,7 +963,8 @@ class L10nEs extends L10n { String get saveTokenError => 'Error al guardar el token. Intenta de nuevo.'; @override - String get pendingTokenLimitReached => 'Límite de tokens pendientes alcanzado (max 50)'; + String get pendingTokenLimitReached => + 'Límite de tokens pendientes alcanzado (max 50)'; @override String get filterToReceive => 'Para recibir'; @@ -994,10 +1041,12 @@ class L10nEs extends L10n { String get unrecognizedQrCode => 'Código QR no reconocido'; @override - String get scanCashuTokenHint => 'Escanea un token Cashu (cashuA... o cashuB...)'; + String get scanCashuTokenHint => + 'Escanea un token Cashu (cashuA... o cashuB...)'; @override - String get scanLightningInvoiceHint => 'Escanea un invoice Lightning (lnbc...)'; + String get scanLightningInvoiceHint => + 'Escanea un invoice Lightning (lnbc...)'; @override String get addMintQuestion => '¿Agregar este mint?'; @@ -1006,7 +1055,8 @@ class L10nEs extends L10n { String get cameraPermissionDenied => 'Permiso de cámara denegado'; @override - String get paymentRequestNotSupported => 'Los payment requests aún no están soportados'; + String get paymentRequestNotSupported => + 'Los payment requests aún no están soportados'; @override String get p2pkTitle => 'Claves P2PK'; @@ -1018,7 +1068,8 @@ class L10nEs extends L10n { String get p2pkExperimental => 'P2PK es experimental. Úsala con precaución.'; @override - String get p2pkPendingSendWarning => 'Tienes un envío P2PK pendiente. Ve al historial y presiona actualizar después de que el destinatario reclame el token.'; + String get p2pkPendingSendWarning => + 'Tienes un envío P2PK pendiente. Ve al historial y presiona actualizar después de que el destinatario reclame el token.'; @override String get p2pkExperimentalShort => 'Experimental'; @@ -1075,7 +1126,8 @@ class L10nEs extends L10n { String get p2pkLockedToOther => 'Bloqueado para otra clave'; @override - String get p2pkCannotUnlock => 'No tienes la clave para desbloquear este token'; + String get p2pkCannotUnlock => + 'No tienes la clave para desbloquear este token'; @override String get p2pkEnterPrivateKey => 'Ingresa la clave privada (nsec)'; @@ -1084,13 +1136,15 @@ class L10nEs extends L10n { String get p2pkDeleteTitle => 'Eliminar clave'; @override - String get p2pkDeleteConfirm => '¿Eliminar esta clave? No podrás recibir tokens bloqueados a ella.'; + String get p2pkDeleteConfirm => + '¿Eliminar esta clave? No podrás recibir tokens bloqueados a ella.'; @override String get p2pkRequiresConnection => 'P2PK requiere conexión al mint'; @override - String get p2pkErrorMaxKeysReached => 'Máximo de claves importadas alcanzado (10)'; + String get p2pkErrorMaxKeysReached => + 'Máximo de claves importadas alcanzado (10)'; @override String get p2pkErrorInvalidNsec => 'nsec inválido'; @@ -1102,5 +1156,6 @@ class L10nEs extends L10n { String get p2pkErrorKeyNotFound => 'Clave no encontrada'; @override - String get p2pkErrorCannotDeletePrimary => 'No se puede eliminar la clave principal'; + String get p2pkErrorCannotDeletePrimary => + 'No se puede eliminar la clave principal'; } diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index df0bbce..ffb3729 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -1,5 +1,5 @@ +// ignore: unused_import import 'package:intl/intl.dart' as intl; - import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -57,10 +57,12 @@ class L10nFr extends L10n { String get creatingWallet => 'Création de votre portefeuille...'; @override - String get generatingSeed => 'Génération sécurisée de votre phrase de récupération'; + String get generatingSeed => + 'Génération sécurisée de votre phrase de récupération'; @override - String get createWalletDescription => 'Une phrase de récupération de 12 mots sera générée.\nConservez-la dans un endroit sûr.'; + String get createWalletDescription => + 'Une phrase de récupération de 12 mots sera générée.\nConservez-la dans un endroit sûr.'; @override String get generateWallet => 'Générer le portefeuille'; @@ -69,10 +71,12 @@ class L10nFr extends L10n { String get walletCreated => 'Portefeuille créé !'; @override - String get walletCreatedDescription => 'Votre portefeuille est prêt. Nous vous recommandons de sauvegarder votre phrase de récupération maintenant.'; + String get walletCreatedDescription => + 'Votre portefeuille est prêt. Nous vous recommandons de sauvegarder votre phrase de récupération maintenant.'; @override - String get backupWarning => 'Sans sauvegarde, vous perdrez l\'accès à vos fonds si vous perdez l\'appareil.'; + String get backupWarning => + 'Sans sauvegarde, vous perdrez l\'accès à vos fonds si vous perdez l\'appareil.'; @override String get backupNow => 'Sauvegarder maintenant'; @@ -87,13 +91,15 @@ class L10nFr extends L10n { String get seedPhraseTitle => 'Votre phrase de récupération'; @override - String get seedPhraseDescription => 'Conservez ces 12 mots dans l\'ordre. C\'est le seul moyen de récupérer votre portefeuille.'; + String get seedPhraseDescription => + 'Conservez ces 12 mots dans l\'ordre. C\'est le seul moyen de récupérer votre portefeuille.'; @override String get revealSeedPhrase => 'Révéler la phrase de récupération'; @override - String get tapToReveal => 'Appuyez sur le bouton pour révéler\nvotre phrase de récupération'; + String get tapToReveal => + 'Appuyez sur le bouton pour révéler\nvotre phrase de récupération'; @override String get copyToClipboard => 'Copier dans le presse-papiers'; @@ -102,10 +108,12 @@ class L10nFr extends L10n { String get seedCopied => 'Phrase copiée dans le presse-papiers'; @override - String get neverShareSeed => 'Ne partagez jamais votre phrase de récupération avec personne.'; + String get neverShareSeed => + 'Ne partagez jamais votre phrase de récupération avec personne.'; @override - String get confirmBackup => 'J\'ai sauvegardé ma phrase de récupération dans un endroit sûr'; + String get confirmBackup => + 'J\'ai sauvegardé ma phrase de récupération dans un endroit sûr'; @override String get continue_ => 'Continuer'; @@ -117,7 +125,8 @@ class L10nFr extends L10n { String get enterSeedPhrase => 'Entrez votre phrase de récupération'; @override - String get enterSeedDescription => 'Tapez les 12 ou 24 mots séparés par des espaces.'; + String get enterSeedDescription => + 'Tapez les 12 ou 24 mots séparés par des espaces.'; @override String get seedPlaceholder => 'mot1 mot2 mot3 ...'; @@ -310,7 +319,8 @@ class L10nFr extends L10n { } @override - String get keepTokenWarning => 'Conservez ce token jusqu\'à ce que le destinataire le réclame. Si vous le perdez, vous perdrez les fonds.'; + String get keepTokenWarning => + 'Conservez ce token jusqu\'à ce que le destinataire le réclame. Si vous le perdez, vous perdrez les fonds.'; @override String get tokenCopiedToClipboard => 'Token copié dans le presse-papiers'; @@ -322,7 +332,37 @@ class L10nFr extends L10n { String get emojiCopiedToClipboard => 'Token copié en emoji 🥜'; @override - String get peanutDecodeError => 'Impossible de décoder le token emoji. Il est peut-être corrompu.'; + String get peanutDecodeError => + 'Impossible de décoder le token emoji. Il est peut-être corrompu.'; + + @override + String get nfcWrite => 'Écrire sur tag NFC'; + + @override + String get nfcRead => 'Lire tag NFC'; + + @override + String get nfcHoldNear => 'Approchez l\'appareil du tag NFC...'; + + @override + String get nfcWriteSuccess => 'Token écrit sur le tag NFC'; + + @override + String nfcWriteError(String error) { + return 'Erreur NFC écriture : $error'; + } + + @override + String nfcReadError(String error) { + return 'Erreur NFC lecture : $error'; + } + + @override + String get nfcDisabled => + 'NFC est désactivé. Activez-le dans les Paramètres.'; + + @override + String get nfcUnsupported => 'Cet appareil ne prend pas en charge le NFC'; @override String get amountToDeposit => 'Montant à déposer :'; @@ -373,7 +413,8 @@ class L10nFr extends L10n { String get description => 'Description :'; @override - String get invoiceCopiedToClipboard => 'Facture copiée dans le presse-papiers'; + String get invoiceCopiedToClipboard => + 'Facture copiée dans le presse-papiers'; @override String deposited(String amount, String unit) { @@ -459,7 +500,8 @@ class L10nFr extends L10n { String get noPendingTransactions => 'Aucune transaction en attente'; @override - String get allTransactionsCompleted => 'Toutes vos transactions sont terminées'; + String get allTransactionsCompleted => + 'Toutes vos transactions sont terminées'; @override String get noEcashTransactions => 'Aucune transaction Ecash'; @@ -576,7 +618,8 @@ class L10nFr extends L10n { String get recoverTokens => 'Récupérer les tokens'; @override - String get scanMintsWithSeed => 'Scanner les mints avec la phrase de récupération'; + String get scanMintsWithSeed => + 'Scanner les mints avec la phrase de récupération'; @override String get appearanceSection => 'LANGUE'; @@ -674,7 +717,8 @@ class L10nFr extends L10n { String get close => 'Fermer'; @override - String get aboutDescription => 'Un portefeuille Cashu avec ADN cubain pour le monde entier. Frère de LaChispa.'; + String get aboutDescription => + 'Un portefeuille Cashu avec ADN cubain pour le monde entier. Frère de LaChispa.'; @override String get couldNotOpenLink => 'Impossible d\'ouvrir le lien'; @@ -686,7 +730,8 @@ class L10nFr extends L10n { String get actionIrreversible => 'Cette action est irréversible'; @override - String get deleteWalletWarning => 'Toutes les données seront supprimées, y compris votre phrase de récupération et vos tokens. Assurez-vous d\'avoir une sauvegarde.'; + String get deleteWalletWarning => + 'Toutes les données seront supprimées, y compris votre phrase de récupération et vos tokens. Assurez-vous d\'avoir une sauvegarde.'; @override String get typeDeleteToConfirm => 'Tapez \"SUPPRIMER\" pour confirmer :'; @@ -703,13 +748,16 @@ class L10nFr extends L10n { String get recoverTokensTitle => 'Récupérer les tokens'; @override - String get recoverTokensDescription => 'Scanner les mints pour récupérer les tokens associés à votre phrase de récupération (NUT-13)'; + String get recoverTokensDescription => + 'Scanner les mints pour récupérer les tokens associés à votre phrase de récupération (NUT-13)'; @override - String get useCurrentSeedPhrase => 'Utiliser ma phrase de récupération actuelle'; + String get useCurrentSeedPhrase => + 'Utiliser ma phrase de récupération actuelle'; @override - String get scanWithSavedWords => 'Scanner les mints avec les 12 mots sauvegardés'; + String get scanWithSavedWords => + 'Scanner les mints avec les 12 mots sauvegardés'; @override String get useOtherSeedPhrase => 'Utiliser une autre phrase de récupération'; @@ -729,7 +777,8 @@ class L10nFr extends L10n { String get specificMint => 'Un mint spécifique'; @override - String get enterMnemonicWords => 'Entrez les 12 mots séparés par des espaces...'; + String get enterMnemonicWords => + 'Entrez les 12 mots séparés par des espaces...'; @override String get scanMints => 'Scanner les mints'; @@ -749,7 +798,8 @@ class L10nFr extends L10n { } @override - String get scanCompleteNoTokens => 'Scan terminé. Aucun nouveau token trouvé.'; + String get scanCompleteNoTokens => + 'Scan terminé. Aucun nouveau token trouvé.'; @override String mintsWithError(int count) { @@ -772,7 +822,8 @@ class L10nFr extends L10n { } @override - String get noTokensForMnemonic => 'Aucun token trouvé associé à ce mnémonique.'; + String get noTokensForMnemonic => + 'Aucun token trouvé associé à ce mnémonique.'; @override String get noConnectedMints => 'Aucun mint connecté'; @@ -852,7 +903,8 @@ class L10nFr extends L10n { String get deleteMintConfirmTitle => 'Supprimer le mint'; @override - String get deleteMintConfirmMessage => 'Si vous avez un solde sur ce mint, il sera perdu. Êtes-vous sûr ?'; + String get deleteMintConfirmMessage => + 'Si vous avez un solde sur ce mint, il sera perdu. Êtes-vous sûr ?'; @override String get delete => 'Supprimer'; @@ -905,19 +957,24 @@ class L10nFr extends L10n { String get tokenSavedForLater => 'Token sauvegardé pour réclamer plus tard'; @override - String get noConnectionTokenSaved => 'Pas de connexion. Token sauvegardé pour réclamer plus tard.'; + String get noConnectionTokenSaved => + 'Pas de connexion. Token sauvegardé pour réclamer plus tard.'; @override - String get unknownMintOffline => 'Ce token provient d\'un mint inconnu. Connectez-vous à Internet pour l\'ajouter et réclamer le token.'; + String get unknownMintOffline => + 'Ce token provient d\'un mint inconnu. Connectez-vous à Internet pour l\'ajouter et réclamer le token.'; @override - String get noConnectionTryLater => 'Pas de connexion au mint. Réessayez plus tard.'; + String get noConnectionTryLater => + 'Pas de connexion au mint. Réessayez plus tard.'; @override - String get saveTokenError => 'Erreur lors de la sauvegarde du token. Veuillez réessayer.'; + String get saveTokenError => + 'Erreur lors de la sauvegarde du token. Veuillez réessayer.'; @override - String get pendingTokenLimitReached => 'Limite de tokens en attente atteinte (max 50)'; + String get pendingTokenLimitReached => + 'Limite de tokens en attente atteinte (max 50)'; @override String get filterToReceive => 'À recevoir'; @@ -926,7 +983,8 @@ class L10nFr extends L10n { String get noPendingTokens => 'Aucun token en attente'; @override - String get noPendingTokensHint => 'Sauvegardez des tokens pour les réclamer plus tard'; + String get noPendingTokensHint => + 'Sauvegardez des tokens pour les réclamer plus tard'; @override String get pendingBadge => 'EN ATTENTE'; @@ -985,19 +1043,23 @@ class L10nFr extends L10n { String get pointCameraAtQr => 'Pointez la caméra vers le code QR'; @override - String get pointCameraAtCashuQr => 'Pointez la caméra vers le QR du token Cashu'; + String get pointCameraAtCashuQr => + 'Pointez la caméra vers le QR du token Cashu'; @override - String get pointCameraAtInvoiceQr => 'Pointez la caméra vers le QR de la facture'; + String get pointCameraAtInvoiceQr => + 'Pointez la caméra vers le QR de la facture'; @override String get unrecognizedQrCode => 'Code QR non reconnu'; @override - String get scanCashuTokenHint => 'Scannez un token Cashu (cashuA... ou cashuB...)'; + String get scanCashuTokenHint => + 'Scannez un token Cashu (cashuA... ou cashuB...)'; @override - String get scanLightningInvoiceHint => 'Scannez une facture Lightning (lnbc...)'; + String get scanLightningInvoiceHint => + 'Scannez une facture Lightning (lnbc...)'; @override String get addMintQuestion => 'Ajouter ce mint ?'; @@ -1006,7 +1068,8 @@ class L10nFr extends L10n { String get cameraPermissionDenied => 'Permission de la caméra refusée'; @override - String get paymentRequestNotSupported => 'Les demandes de paiement ne sont pas encore prises en charge'; + String get paymentRequestNotSupported => + 'Les demandes de paiement ne sont pas encore prises en charge'; @override String get p2pkTitle => 'Clés P2PK'; @@ -1015,10 +1078,12 @@ class L10nFr extends L10n { String get p2pkSettingsDescription => 'Recevoir ecash verrouillé'; @override - String get p2pkExperimental => 'P2PK est expérimental. Utiliser avec prudence.'; + String get p2pkExperimental => + 'P2PK est expérimental. Utiliser avec prudence.'; @override - String get p2pkPendingSendWarning => 'Vous avez un envoi P2PK en attente. Allez dans l\'historique et actualisez après que le destinataire a réclamé le jeton.'; + String get p2pkPendingSendWarning => + 'Vous avez un envoi P2PK en attente. Allez dans l\'historique et actualisez après que le destinataire a réclamé le jeton.'; @override String get p2pkExperimentalShort => 'Expérimental'; @@ -1075,7 +1140,8 @@ class L10nFr extends L10n { String get p2pkLockedToOther => 'Verrouillé pour une autre clé'; @override - String get p2pkCannotUnlock => 'Vous n\'avez pas la clé pour déverrouiller ce token'; + String get p2pkCannotUnlock => + 'Vous n\'avez pas la clé pour déverrouiller ce token'; @override String get p2pkEnterPrivateKey => 'Entrer la clé privée (nsec)'; @@ -1084,13 +1150,15 @@ class L10nFr extends L10n { String get p2pkDeleteTitle => 'Supprimer la clé'; @override - String get p2pkDeleteConfirm => 'Supprimer cette clé ? Vous ne pourrez plus recevoir de tokens verrouillés dessus.'; + String get p2pkDeleteConfirm => + 'Supprimer cette clé ? Vous ne pourrez plus recevoir de tokens verrouillés dessus.'; @override String get p2pkRequiresConnection => 'P2PK nécessite une connexion au mint'; @override - String get p2pkErrorMaxKeysReached => 'Nombre maximum de clés importées atteint (10)'; + String get p2pkErrorMaxKeysReached => + 'Nombre maximum de clés importées atteint (10)'; @override String get p2pkErrorInvalidNsec => 'nsec invalide'; @@ -1102,5 +1170,6 @@ class L10nFr extends L10n { String get p2pkErrorKeyNotFound => 'Clé non trouvée'; @override - String get p2pkErrorCannotDeletePrimary => 'Impossible de supprimer la clé principale'; + String get p2pkErrorCannotDeletePrimary => + 'Impossible de supprimer la clé principale'; } diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index bc46fac..9fd1681 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -1,5 +1,5 @@ +// ignore: unused_import import 'package:intl/intl.dart' as intl; - import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -60,7 +60,8 @@ class L10nIt extends L10n { String get generatingSeed => 'Generazione sicura della tua frase seed'; @override - String get createWalletDescription => 'Verrà generata una frase seed di 12 parole.\nConservala in un luogo sicuro.'; + String get createWalletDescription => + 'Verrà generata una frase seed di 12 parole.\nConservala in un luogo sicuro.'; @override String get generateWallet => 'Genera portafoglio'; @@ -69,10 +70,12 @@ class L10nIt extends L10n { String get walletCreated => 'Portafoglio creato!'; @override - String get walletCreatedDescription => 'Il tuo portafoglio è pronto. Ti consigliamo di fare il backup della frase seed ora.'; + String get walletCreatedDescription => + 'Il tuo portafoglio è pronto. Ti consigliamo di fare il backup della frase seed ora.'; @override - String get backupWarning => 'Senza backup, perderai l\'accesso ai tuoi fondi se perdi il dispositivo.'; + String get backupWarning => + 'Senza backup, perderai l\'accesso ai tuoi fondi se perdi il dispositivo.'; @override String get backupNow => 'Backup adesso'; @@ -87,7 +90,8 @@ class L10nIt extends L10n { String get seedPhraseTitle => 'La tua frase seed'; @override - String get seedPhraseDescription => 'Conserva queste 12 parole in ordine. Sono l\'unico modo per recuperare il tuo portafoglio.'; + String get seedPhraseDescription => + 'Conserva queste 12 parole in ordine. Sono l\'unico modo per recuperare il tuo portafoglio.'; @override String get revealSeedPhrase => 'Mostra frase seed'; @@ -102,7 +106,8 @@ class L10nIt extends L10n { String get seedCopied => 'Frase copiata negli appunti'; @override - String get neverShareSeed => 'Non condividere mai la tua frase seed con nessuno.'; + String get neverShareSeed => + 'Non condividere mai la tua frase seed con nessuno.'; @override String get confirmBackup => 'Ho salvato la mia frase seed in un luogo sicuro'; @@ -117,7 +122,8 @@ class L10nIt extends L10n { String get enterSeedPhrase => 'Inserisci la tua frase seed'; @override - String get enterSeedDescription => 'Scrivi le 12 o 24 parole separate da spazi.'; + String get enterSeedDescription => + 'Scrivi le 12 o 24 parole separate da spazi.'; @override String get seedPlaceholder => 'parola1 parola2 parola3 ...'; @@ -310,7 +316,8 @@ class L10nIt extends L10n { } @override - String get keepTokenWarning => 'Conserva questo token finché il destinatario non lo riscatta. Se lo perdi, perderai i fondi.'; + String get keepTokenWarning => + 'Conserva questo token finché il destinatario non lo riscatta. Se lo perdi, perderai i fondi.'; @override String get tokenCopiedToClipboard => 'Token copiato negli appunti'; @@ -322,7 +329,36 @@ class L10nIt extends L10n { String get emojiCopiedToClipboard => 'Token copiato come emoji 🥜'; @override - String get peanutDecodeError => 'Impossibile decodificare il token emoji. Potrebbe essere corrotto.'; + String get peanutDecodeError => + 'Impossibile decodificare il token emoji. Potrebbe essere corrotto.'; + + @override + String get nfcWrite => 'Scrivi su tag NFC'; + + @override + String get nfcRead => 'Leggi tag NFC'; + + @override + String get nfcHoldNear => 'Avvicina il dispositivo al tag NFC...'; + + @override + String get nfcWriteSuccess => 'Token scritto sul tag NFC'; + + @override + String nfcWriteError(String error) { + return 'Errore NFC scrittura: $error'; + } + + @override + String nfcReadError(String error) { + return 'Errore NFC lettura: $error'; + } + + @override + String get nfcDisabled => 'NFC è disattivato. Attivalo nelle Impostazioni.'; + + @override + String get nfcUnsupported => 'Questo dispositivo non supporta NFC'; @override String get amountToDeposit => 'Importo da depositare:'; @@ -459,7 +495,8 @@ class L10nIt extends L10n { String get noPendingTransactions => 'Nessuna transazione in attesa'; @override - String get allTransactionsCompleted => 'Tutte le tue transazioni sono completate'; + String get allTransactionsCompleted => + 'Tutte le tue transazioni sono completate'; @override String get noEcashTransactions => 'Nessuna transazione Ecash'; @@ -674,7 +711,8 @@ class L10nIt extends L10n { String get close => 'Chiudi'; @override - String get aboutDescription => 'Un portafoglio Cashu con DNA cubano per il mondo intero. Fratello di LaChispa.'; + String get aboutDescription => + 'Un portafoglio Cashu con DNA cubano per il mondo intero. Fratello di LaChispa.'; @override String get couldNotOpenLink => 'Impossibile aprire il link'; @@ -686,7 +724,8 @@ class L10nIt extends L10n { String get actionIrreversible => 'Questa azione è irreversibile'; @override - String get deleteWalletWarning => 'Tutti i dati verranno eliminati, inclusa la frase seed e i token. Assicurati di avere un backup.'; + String get deleteWalletWarning => + 'Tutti i dati verranno eliminati, inclusa la frase seed e i token. Assicurati di avere un backup.'; @override String get typeDeleteToConfirm => 'Scrivi \"ELIMINA\" per confermare:'; @@ -703,7 +742,8 @@ class L10nIt extends L10n { String get recoverTokensTitle => 'Recupera token'; @override - String get recoverTokensDescription => 'Scansiona i mint per recuperare i token associati alla tua frase seed (NUT-13)'; + String get recoverTokensDescription => + 'Scansiona i mint per recuperare i token associati alla tua frase seed (NUT-13)'; @override String get useCurrentSeedPhrase => 'Usa la mia frase seed attuale'; @@ -729,7 +769,8 @@ class L10nIt extends L10n { String get specificMint => 'Un mint specifico'; @override - String get enterMnemonicWords => 'Inserisci le 12 parole separate da spazi...'; + String get enterMnemonicWords => + 'Inserisci le 12 parole separate da spazi...'; @override String get scanMints => 'Scansiona mint'; @@ -749,7 +790,8 @@ class L10nIt extends L10n { } @override - String get scanCompleteNoTokens => 'Scansione completata. Nessun nuovo token trovato.'; + String get scanCompleteNoTokens => + 'Scansione completata. Nessun nuovo token trovato.'; @override String mintsWithError(int count) { @@ -772,7 +814,8 @@ class L10nIt extends L10n { } @override - String get noTokensForMnemonic => 'Nessun token trovato associato a questo mnemonic.'; + String get noTokensForMnemonic => + 'Nessun token trovato associato a questo mnemonic.'; @override String get noConnectedMints => 'Nessun mint connesso'; @@ -852,7 +895,8 @@ class L10nIt extends L10n { String get deleteMintConfirmTitle => 'Elimina mint'; @override - String get deleteMintConfirmMessage => 'Se hai saldo su questo mint, verrà perso. Sei sicuro?'; + String get deleteMintConfirmMessage => + 'Se hai saldo su questo mint, verrà perso. Sei sicuro?'; @override String get delete => 'Elimina'; @@ -905,19 +949,23 @@ class L10nIt extends L10n { String get tokenSavedForLater => 'Token salvato per riscattarlo dopo'; @override - String get noConnectionTokenSaved => 'Nessuna connessione. Token salvato per riscattarlo dopo.'; + String get noConnectionTokenSaved => + 'Nessuna connessione. Token salvato per riscattarlo dopo.'; @override - String get unknownMintOffline => 'Questo token proviene da un mint sconosciuto. Connettiti a internet per aggiungerlo e riscattare il token.'; + String get unknownMintOffline => + 'Questo token proviene da un mint sconosciuto. Connettiti a internet per aggiungerlo e riscattare il token.'; @override - String get noConnectionTryLater => 'Nessuna connessione al mint. Riprova più tardi.'; + String get noConnectionTryLater => + 'Nessuna connessione al mint. Riprova più tardi.'; @override String get saveTokenError => 'Errore nel salvare il token. Riprova.'; @override - String get pendingTokenLimitReached => 'Limite token in attesa raggiunto (max 50)'; + String get pendingTokenLimitReached => + 'Limite token in attesa raggiunto (max 50)'; @override String get filterToReceive => 'Da ricevere'; @@ -985,19 +1033,23 @@ class L10nIt extends L10n { String get pointCameraAtQr => 'Punta la fotocamera sul codice QR'; @override - String get pointCameraAtCashuQr => 'Punta la fotocamera sul QR del token Cashu'; + String get pointCameraAtCashuQr => + 'Punta la fotocamera sul QR del token Cashu'; @override - String get pointCameraAtInvoiceQr => 'Punta la fotocamera sul QR della fattura'; + String get pointCameraAtInvoiceQr => + 'Punta la fotocamera sul QR della fattura'; @override String get unrecognizedQrCode => 'Codice QR non riconosciuto'; @override - String get scanCashuTokenHint => 'Scansiona un token Cashu (cashuA... o cashuB...)'; + String get scanCashuTokenHint => + 'Scansiona un token Cashu (cashuA... o cashuB...)'; @override - String get scanLightningInvoiceHint => 'Scansiona una fattura Lightning (lnbc...)'; + String get scanLightningInvoiceHint => + 'Scansiona una fattura Lightning (lnbc...)'; @override String get addMintQuestion => 'Aggiungere questo mint?'; @@ -1006,7 +1058,8 @@ class L10nIt extends L10n { String get cameraPermissionDenied => 'Permesso fotocamera negato'; @override - String get paymentRequestNotSupported => 'Le richieste di pagamento non sono ancora supportate'; + String get paymentRequestNotSupported => + 'Le richieste di pagamento non sono ancora supportate'; @override String get p2pkTitle => 'Chiavi P2PK'; @@ -1018,7 +1071,8 @@ class L10nIt extends L10n { String get p2pkExperimental => 'P2PK è sperimentale. Usare con cautela.'; @override - String get p2pkPendingSendWarning => 'Hai un invio P2PK in sospeso. Vai alla cronologia e aggiorna dopo che il destinatario ha riscattato il token.'; + String get p2pkPendingSendWarning => + 'Hai un invio P2PK in sospeso. Vai alla cronologia e aggiorna dopo che il destinatario ha riscattato il token.'; @override String get p2pkExperimentalShort => 'Sperimentale'; @@ -1084,13 +1138,15 @@ class L10nIt extends L10n { String get p2pkDeleteTitle => 'Elimina chiave'; @override - String get p2pkDeleteConfirm => 'Eliminare questa chiave? Non potrai ricevere token bloccati ad essa.'; + String get p2pkDeleteConfirm => + 'Eliminare questa chiave? Non potrai ricevere token bloccati ad essa.'; @override String get p2pkRequiresConnection => 'P2PK richiede connessione al mint'; @override - String get p2pkErrorMaxKeysReached => 'Numero massimo di chiavi importate raggiunto (10)'; + String get p2pkErrorMaxKeysReached => + 'Numero massimo di chiavi importate raggiunto (10)'; @override String get p2pkErrorInvalidNsec => 'nsec non valido'; @@ -1102,5 +1158,6 @@ class L10nIt extends L10n { String get p2pkErrorKeyNotFound => 'Chiave non trovata'; @override - String get p2pkErrorCannotDeletePrimary => 'Impossibile eliminare la chiave principale'; + String get p2pkErrorCannotDeletePrimary => + 'Impossibile eliminare la chiave principale'; } diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index d52a6ad..b171288 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -1,5 +1,5 @@ +// ignore: unused_import import 'package:intl/intl.dart' as intl; - import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -69,7 +69,8 @@ class L10nJa extends L10n { String get walletCreated => 'ウォレット作成完了!'; @override - String get walletCreatedDescription => 'ウォレットの準備ができました。今すぐシードフレーズをバックアップすることをお勧めします。'; + String get walletCreatedDescription => + 'ウォレットの準備ができました。今すぐシードフレーズをバックアップすることをお勧めします。'; @override String get backupWarning => 'バックアップがないと、デバイスを紛失した場合に資金にアクセスできなくなります。'; @@ -324,6 +325,34 @@ class L10nJa extends L10n { @override String get peanutDecodeError => '絵文字トークンをデコードできませんでした。破損している可能性があります。'; + @override + String get nfcWrite => 'NFCタグに書き込む'; + + @override + String get nfcRead => 'NFCタグを読み取る'; + + @override + String get nfcHoldNear => 'デバイスをNFCタグに近づけてください...'; + + @override + String get nfcWriteSuccess => 'トークンをNFCタグに書き込みました'; + + @override + String nfcWriteError(String error) { + return 'NFC書き込みエラー: $error'; + } + + @override + String nfcReadError(String error) { + return 'NFC読み取りエラー: $error'; + } + + @override + String get nfcDisabled => 'NFCが無効です。設定で有効にしてください。'; + + @override + String get nfcUnsupported => 'このデバイスはNFCに対応していません'; + @override String get amountToDeposit => '入金額:'; @@ -686,7 +715,8 @@ class L10nJa extends L10n { String get actionIrreversible => 'この操作は取り消せません'; @override - String get deleteWalletWarning => 'シードフレーズとトークンを含むすべてのデータが削除されます。バックアップがあることを確認してください。'; + String get deleteWalletWarning => + 'シードフレーズとトークンを含むすべてのデータが削除されます。バックアップがあることを確認してください。'; @override String get typeDeleteToConfirm => '確認のため「DELETE」と入力:'; @@ -703,7 +733,8 @@ class L10nJa extends L10n { String get recoverTokensTitle => 'トークンを復元'; @override - String get recoverTokensDescription => 'シードフレーズに関連付けられたトークンを復元するためにMintをスキャン(NUT-13)'; + String get recoverTokensDescription => + 'シードフレーズに関連付けられたトークンを復元するためにMintをスキャン(NUT-13)'; @override String get useCurrentSeedPhrase => '現在のシードフレーズを使用'; @@ -908,7 +939,8 @@ class L10nJa extends L10n { String get noConnectionTokenSaved => '接続なし。トークンを保存しました。後で請求できます。'; @override - String get unknownMintOffline => 'このトークンは不明なMintからのものです。インターネットに接続してMintを追加し、トークンを請求してください。'; + String get unknownMintOffline => + 'このトークンは不明なMintからのものです。インターネットに接続してMintを追加し、トークンを請求してください。'; @override String get noConnectionTryLater => 'Mintに接続できません。後でもう一度お試しください。'; @@ -1018,7 +1050,8 @@ class L10nJa extends L10n { String get p2pkExperimental => 'P2PKは実験的機能です。注意してご使用ください。'; @override - String get p2pkPendingSendWarning => '保留中のP2PK送信があります。受取人がトークンを受け取った後、履歴で更新してください。'; + String get p2pkPendingSendWarning => + '保留中のP2PK送信があります。受取人がトークンを受け取った後、履歴で更新してください。'; @override String get p2pkExperimentalShort => '実験的'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index 4cf8d03..17a4571 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -1,5 +1,5 @@ +// ignore: unused_import import 'package:intl/intl.dart' as intl; - import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -60,7 +60,8 @@ class L10nKo extends L10n { String get generatingSeed => '시드 문구를 안전하게 생성 중'; @override - String get createWalletDescription => '12개의 단어로 된 시드 문구가 생성됩니다.\n안전한 곳에 보관하세요.'; + String get createWalletDescription => + '12개의 단어로 된 시드 문구가 생성됩니다.\n안전한 곳에 보관하세요.'; @override String get generateWallet => '지갑 생성'; @@ -69,7 +70,8 @@ class L10nKo extends L10n { String get walletCreated => '지갑이 생성되었습니다!'; @override - String get walletCreatedDescription => '지갑이 준비되었습니다. 지금 시드 문구를 백업하는 것을 권장합니다.'; + String get walletCreatedDescription => + '지갑이 준비되었습니다. 지금 시드 문구를 백업하는 것을 권장합니다.'; @override String get backupWarning => '백업 없이는 기기를 분실하면 자금에 접근할 수 없습니다.'; @@ -87,7 +89,8 @@ class L10nKo extends L10n { String get seedPhraseTitle => '시드 문구'; @override - String get seedPhraseDescription => '이 12개의 단어를 순서대로 저장하세요. 지갑을 복구하는 유일한 방법입니다.'; + String get seedPhraseDescription => + '이 12개의 단어를 순서대로 저장하세요. 지갑을 복구하는 유일한 방법입니다.'; @override String get revealSeedPhrase => '시드 문구 보기'; @@ -324,6 +327,34 @@ class L10nKo extends L10n { @override String get peanutDecodeError => '이모지 토큰을 디코딩할 수 없습니다. 손상되었을 수 있습니다.'; + @override + String get nfcWrite => 'NFC 태그에 쓰기'; + + @override + String get nfcRead => 'NFC 태그 읽기'; + + @override + String get nfcHoldNear => '기기를 NFC 태그에 가까이 대세요...'; + + @override + String get nfcWriteSuccess => '토큰이 NFC 태그에 기록되었습니다'; + + @override + String nfcWriteError(String error) { + return 'NFC 쓰기 오류: $error'; + } + + @override + String nfcReadError(String error) { + return 'NFC 읽기 오류: $error'; + } + + @override + String get nfcDisabled => 'NFC가 비활성화되어 있습니다. 설정에서 활성화하세요.'; + + @override + String get nfcUnsupported => '이 기기는 NFC를 지원하지 않습니다'; + @override String get amountToDeposit => '입금할 금액:'; @@ -686,7 +717,8 @@ class L10nKo extends L10n { String get actionIrreversible => '이 작업은 되돌릴 수 없습니다'; @override - String get deleteWalletWarning => '시드 문구와 토큰을 포함한 모든 데이터가 삭제됩니다. 백업이 있는지 확인하세요.'; + String get deleteWalletWarning => + '시드 문구와 토큰을 포함한 모든 데이터가 삭제됩니다. 백업이 있는지 확인하세요.'; @override String get typeDeleteToConfirm => '확인하려면 \"삭제\"를 입력하세요:'; @@ -703,7 +735,8 @@ class L10nKo extends L10n { String get recoverTokensTitle => '토큰 복구'; @override - String get recoverTokensDescription => '시드 문구와 연결된 토큰을 복구하기 위해 mint 스캔 (NUT-13)'; + String get recoverTokensDescription => + '시드 문구와 연결된 토큰을 복구하기 위해 mint 스캔 (NUT-13)'; @override String get useCurrentSeedPhrase => '현재 시드 문구 사용'; @@ -908,7 +941,8 @@ class L10nKo extends L10n { String get noConnectionTokenSaved => '연결 없음. 나중에 청구하기 위해 토큰이 저장되었습니다.'; @override - String get unknownMintOffline => '이 토큰은 알 수 없는 mint의 것입니다. 인터넷에 연결하여 추가하고 토큰을 청구하세요.'; + String get unknownMintOffline => + '이 토큰은 알 수 없는 mint의 것입니다. 인터넷에 연결하여 추가하고 토큰을 청구하세요.'; @override String get noConnectionTryLater => 'Mint에 연결할 수 없음. 나중에 다시 시도하세요.'; @@ -1018,7 +1052,8 @@ class L10nKo extends L10n { String get p2pkExperimental => 'P2PK는 실험적 기능입니다. 주의하여 사용하세요.'; @override - String get p2pkPendingSendWarning => '대기 중인 P2PK 전송이 있습니다. 수신자가 토큰을 수령한 후 기록에서 새로고침하세요.'; + String get p2pkPendingSendWarning => + '대기 중인 P2PK 전송이 있습니다. 수신자가 토큰을 수령한 후 기록에서 새로고침하세요.'; @override String get p2pkExperimentalShort => '실험적'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 5d625a0..b360696 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -1,5 +1,5 @@ +// ignore: unused_import import 'package:intl/intl.dart' as intl; - import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -60,7 +60,8 @@ class L10nPt extends L10n { String get generatingSeed => 'Gerando sua frase semente de forma segura'; @override - String get createWalletDescription => 'Uma frase semente de 12 palavras será gerada.\nGuarde-a em um lugar seguro.'; + String get createWalletDescription => + 'Uma frase semente de 12 palavras será gerada.\nGuarde-a em um lugar seguro.'; @override String get generateWallet => 'Gerar wallet'; @@ -69,10 +70,12 @@ class L10nPt extends L10n { String get walletCreated => 'Wallet criada!'; @override - String get walletCreatedDescription => 'Sua wallet está pronta. Recomendamos fazer backup da sua frase semente agora.'; + String get walletCreatedDescription => + 'Sua wallet está pronta. Recomendamos fazer backup da sua frase semente agora.'; @override - String get backupWarning => 'Sem backup, você perderá acesso aos seus fundos se perder o dispositivo.'; + String get backupWarning => + 'Sem backup, você perderá acesso aos seus fundos se perder o dispositivo.'; @override String get backupNow => 'Fazer backup agora'; @@ -87,7 +90,8 @@ class L10nPt extends L10n { String get seedPhraseTitle => 'Sua frase semente'; @override - String get seedPhraseDescription => 'Guarde estas 12 palavras em ordem. Elas são a única forma de recuperar sua wallet.'; + String get seedPhraseDescription => + 'Guarde estas 12 palavras em ordem. Elas são a única forma de recuperar sua wallet.'; @override String get revealSeedPhrase => 'Revelar frase semente'; @@ -102,7 +106,8 @@ class L10nPt extends L10n { String get seedCopied => 'Frase copiada para área de transferência'; @override - String get neverShareSeed => 'Nunca compartilhe sua frase semente com ninguém.'; + String get neverShareSeed => + 'Nunca compartilhe sua frase semente com ninguém.'; @override String get confirmBackup => 'Guardei minha frase semente em um lugar seguro'; @@ -117,7 +122,8 @@ class L10nPt extends L10n { String get enterSeedPhrase => 'Digite sua frase semente'; @override - String get enterSeedDescription => 'Digite as 12 ou 24 palavras separadas por espaços.'; + String get enterSeedDescription => + 'Digite as 12 ou 24 palavras separadas por espaços.'; @override String get seedPlaceholder => 'palavra1 palavra2 palavra3 ...'; @@ -310,10 +316,12 @@ class L10nPt extends L10n { } @override - String get keepTokenWarning => 'Guarde este token até que o destinatário o resgate. Se você perdê-lo, perderá os fundos.'; + String get keepTokenWarning => + 'Guarde este token até que o destinatário o resgate. Se você perdê-lo, perderá os fundos.'; @override - String get tokenCopiedToClipboard => 'Token copiado para área de transferência'; + String get tokenCopiedToClipboard => + 'Token copiado para área de transferência'; @override String get copyAsEmoji => 'Copiar como emoji'; @@ -322,7 +330,36 @@ class L10nPt extends L10n { String get emojiCopiedToClipboard => 'Token copiado como emoji 🥜'; @override - String get peanutDecodeError => 'Não foi possível decodificar o token emoji. Pode estar corrompido.'; + String get peanutDecodeError => + 'Não foi possível decodificar o token emoji. Pode estar corrompido.'; + + @override + String get nfcWrite => 'Escrever em tag NFC'; + + @override + String get nfcRead => 'Ler tag NFC'; + + @override + String get nfcHoldNear => 'Aproxime o dispositivo da tag NFC...'; + + @override + String get nfcWriteSuccess => 'Token escrito na tag NFC'; + + @override + String nfcWriteError(String error) { + return 'Erro NFC ao escrever: $error'; + } + + @override + String nfcReadError(String error) { + return 'Erro NFC ao ler: $error'; + } + + @override + String get nfcDisabled => 'NFC está desativado. Ative nas Configurações.'; + + @override + String get nfcUnsupported => 'Este dispositivo não suporta NFC'; @override String get amountToDeposit => 'Valor a depositar:'; @@ -373,7 +410,8 @@ class L10nPt extends L10n { String get description => 'Descrição:'; @override - String get invoiceCopiedToClipboard => 'Invoice copiado para área de transferência'; + String get invoiceCopiedToClipboard => + 'Invoice copiado para área de transferência'; @override String deposited(String amount, String unit) { @@ -459,7 +497,8 @@ class L10nPt extends L10n { String get noPendingTransactions => 'Sem transações pendentes'; @override - String get allTransactionsCompleted => 'Todas as suas transações estão completas'; + String get allTransactionsCompleted => + 'Todas as suas transações estão completas'; @override String get noEcashTransactions => 'Sem transações Ecash'; @@ -674,7 +713,8 @@ class L10nPt extends L10n { String get close => 'Fechar'; @override - String get aboutDescription => 'Uma wallet Cashu com DNA cubano para o mundo inteiro. Irmã de LaChispa.'; + String get aboutDescription => + 'Uma wallet Cashu com DNA cubano para o mundo inteiro. Irmã de LaChispa.'; @override String get couldNotOpenLink => 'Não foi possível abrir o link'; @@ -686,7 +726,8 @@ class L10nPt extends L10n { String get actionIrreversible => 'Esta ação é irreversível'; @override - String get deleteWalletWarning => 'Todos os dados serão excluídos, incluindo sua frase semente e tokens. Certifique-se de ter um backup.'; + String get deleteWalletWarning => + 'Todos os dados serão excluídos, incluindo sua frase semente e tokens. Certifique-se de ter um backup.'; @override String get typeDeleteToConfirm => 'Digite \"APAGAR\" para confirmar:'; @@ -703,7 +744,8 @@ class L10nPt extends L10n { String get recoverTokensTitle => 'Recuperar tokens'; @override - String get recoverTokensDescription => 'Escanear mints para recuperar tokens associados à sua frase semente (NUT-13)'; + String get recoverTokensDescription => + 'Escanear mints para recuperar tokens associados à sua frase semente (NUT-13)'; @override String get useCurrentSeedPhrase => 'Usar minha frase semente atual'; @@ -729,7 +771,8 @@ class L10nPt extends L10n { String get specificMint => 'Um mint específico'; @override - String get enterMnemonicWords => 'Digite as 12 palavras separadas por espaços...'; + String get enterMnemonicWords => + 'Digite as 12 palavras separadas por espaços...'; @override String get scanMints => 'Escanear mints'; @@ -749,7 +792,8 @@ class L10nPt extends L10n { } @override - String get scanCompleteNoTokens => 'Escaneamento completo. Nenhum token novo encontrado.'; + String get scanCompleteNoTokens => + 'Escaneamento completo. Nenhum token novo encontrado.'; @override String mintsWithError(int count) { @@ -772,7 +816,8 @@ class L10nPt extends L10n { } @override - String get noTokensForMnemonic => 'Nenhum token encontrado associado a esse mnemônico.'; + String get noTokensForMnemonic => + 'Nenhum token encontrado associado a esse mnemônico.'; @override String get noConnectedMints => 'Nenhum mint conectado'; @@ -852,7 +897,8 @@ class L10nPt extends L10n { String get deleteMintConfirmTitle => 'Excluir mint'; @override - String get deleteMintConfirmMessage => 'Se você tiver saldo neste mint, ele será perdido. Tem certeza?'; + String get deleteMintConfirmMessage => + 'Se você tiver saldo neste mint, ele será perdido. Tem certeza?'; @override String get delete => 'Excluir'; @@ -905,10 +951,12 @@ class L10nPt extends L10n { String get tokenSavedForLater => 'Token salvo para resgatar depois'; @override - String get noConnectionTokenSaved => 'Sem conexão. Token salvo para resgatar depois.'; + String get noConnectionTokenSaved => + 'Sem conexão. Token salvo para resgatar depois.'; @override - String get unknownMintOffline => 'Este token é de um mint desconhecido. Conecte-se à internet para adicioná-lo e resgatar o token.'; + String get unknownMintOffline => + 'Este token é de um mint desconhecido. Conecte-se à internet para adicioná-lo e resgatar o token.'; @override String get noConnectionTryLater => 'Sem conexão ao mint. Tente mais tarde.'; @@ -917,7 +965,8 @@ class L10nPt extends L10n { String get saveTokenError => 'Erro ao salvar o token. Tente novamente.'; @override - String get pendingTokenLimitReached => 'Limite de tokens pendentes atingido (máx 50)'; + String get pendingTokenLimitReached => + 'Limite de tokens pendentes atingido (máx 50)'; @override String get filterToReceive => 'Para receber'; @@ -994,10 +1043,12 @@ class L10nPt extends L10n { String get unrecognizedQrCode => 'Código QR não reconhecido'; @override - String get scanCashuTokenHint => 'Escaneie um token Cashu (cashuA... ou cashuB...)'; + String get scanCashuTokenHint => + 'Escaneie um token Cashu (cashuA... ou cashuB...)'; @override - String get scanLightningInvoiceHint => 'Escaneie um invoice Lightning (lnbc...)'; + String get scanLightningInvoiceHint => + 'Escaneie um invoice Lightning (lnbc...)'; @override String get addMintQuestion => 'Adicionar este mint?'; @@ -1006,7 +1057,8 @@ class L10nPt extends L10n { String get cameraPermissionDenied => 'Permissão de câmera negada'; @override - String get paymentRequestNotSupported => 'Solicitações de pagamento ainda não são suportadas'; + String get paymentRequestNotSupported => + 'Solicitações de pagamento ainda não são suportadas'; @override String get p2pkTitle => 'Chaves P2PK'; @@ -1018,7 +1070,8 @@ class L10nPt extends L10n { String get p2pkExperimental => 'P2PK é experimental. Use com cautela.'; @override - String get p2pkPendingSendWarning => 'Você tem um envio P2PK pendente. Vá ao histórico e atualize após o destinatário resgatar o token.'; + String get p2pkPendingSendWarning => + 'Você tem um envio P2PK pendente. Vá ao histórico e atualize após o destinatário resgatar o token.'; @override String get p2pkExperimentalShort => 'Experimental'; @@ -1075,7 +1128,8 @@ class L10nPt extends L10n { String get p2pkLockedToOther => 'Bloqueado para outra chave'; @override - String get p2pkCannotUnlock => 'Você não tem a chave para desbloquear este token'; + String get p2pkCannotUnlock => + 'Você não tem a chave para desbloquear este token'; @override String get p2pkEnterPrivateKey => 'Digite a chave privada (nsec)'; @@ -1084,13 +1138,15 @@ class L10nPt extends L10n { String get p2pkDeleteTitle => 'Excluir chave'; @override - String get p2pkDeleteConfirm => 'Excluir esta chave? Você não poderá receber tokens bloqueados para ela.'; + String get p2pkDeleteConfirm => + 'Excluir esta chave? Você não poderá receber tokens bloqueados para ela.'; @override String get p2pkRequiresConnection => 'P2PK requer conexão com o mint'; @override - String get p2pkErrorMaxKeysReached => 'Número máximo de chaves importadas atingido (10)'; + String get p2pkErrorMaxKeysReached => + 'Número máximo de chaves importadas atingido (10)'; @override String get p2pkErrorInvalidNsec => 'nsec inválido'; @@ -1102,5 +1158,6 @@ class L10nPt extends L10n { String get p2pkErrorKeyNotFound => 'Chave não encontrada'; @override - String get p2pkErrorCannotDeletePrimary => 'Não é possível excluir a chave principal'; + String get p2pkErrorCannotDeletePrimary => + 'Não é possível excluir a chave principal'; } diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 54669e3..21b00aa 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -1,5 +1,5 @@ +// ignore: unused_import import 'package:intl/intl.dart' as intl; - import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -33,7 +33,8 @@ class L10nRu extends L10n { String get loadingMessage6 => 'Go full Calle...'; @override - String get loadingMessage7 => 'Cashu + Bitchat = Конфиденциальность + Свобода'; + String get loadingMessage7 => + 'Cashu + Bitchat = Конфиденциальность + Свобода'; @override String get aboutTagline => 'Конфиденциальность без границ.'; @@ -60,7 +61,8 @@ class L10nRu extends L10n { String get generatingSeed => 'Безопасная генерация вашей сид-фразы'; @override - String get createWalletDescription => 'Будет сгенерирована сид-фраза из 12 слов.\nСохраните её в безопасном месте.'; + String get createWalletDescription => + 'Будет сгенерирована сид-фраза из 12 слов.\nСохраните её в безопасном месте.'; @override String get generateWallet => 'Создать кошелёк'; @@ -69,10 +71,12 @@ class L10nRu extends L10n { String get walletCreated => 'Кошелёк создан!'; @override - String get walletCreatedDescription => 'Ваш кошелёк готов. Рекомендуем сделать резервную копию сид-фразы сейчас.'; + String get walletCreatedDescription => + 'Ваш кошелёк готов. Рекомендуем сделать резервную копию сид-фразы сейчас.'; @override - String get backupWarning => 'Без резервной копии вы потеряете доступ к средствам при потере устройства.'; + String get backupWarning => + 'Без резервной копии вы потеряете доступ к средствам при потере устройства.'; @override String get backupNow => 'Сделать резервную копию'; @@ -87,7 +91,8 @@ class L10nRu extends L10n { String get seedPhraseTitle => 'Ваша сид-фраза'; @override - String get seedPhraseDescription => 'Сохраните эти 12 слов по порядку. Это единственный способ восстановить кошелёк.'; + String get seedPhraseDescription => + 'Сохраните эти 12 слов по порядку. Это единственный способ восстановить кошелёк.'; @override String get revealSeedPhrase => 'Показать сид-фразу'; @@ -310,7 +315,8 @@ class L10nRu extends L10n { } @override - String get keepTokenWarning => 'Сохраните этот токен, пока получатель не заберёт его. Если потеряете — потеряете средства.'; + String get keepTokenWarning => + 'Сохраните этот токен, пока получатель не заберёт его. Если потеряете — потеряете средства.'; @override String get tokenCopiedToClipboard => 'Токен скопирован в буфер обмена'; @@ -322,7 +328,36 @@ class L10nRu extends L10n { String get emojiCopiedToClipboard => 'Токен скопирован как эмодзи 🥜'; @override - String get peanutDecodeError => 'Не удалось декодировать эмодзи-токен. Возможно, он повреждён.'; + String get peanutDecodeError => + 'Не удалось декодировать эмодзи-токен. Возможно, он повреждён.'; + + @override + String get nfcWrite => 'Записать на NFC-метку'; + + @override + String get nfcRead => 'Читать NFC-метку'; + + @override + String get nfcHoldNear => 'Поднесите устройство к NFC-метке...'; + + @override + String get nfcWriteSuccess => 'Токен записан на NFC-метку'; + + @override + String nfcWriteError(String error) { + return 'Ошибка записи NFC: $error'; + } + + @override + String nfcReadError(String error) { + return 'Ошибка чтения NFC: $error'; + } + + @override + String get nfcDisabled => 'NFC отключён. Включите в Настройках.'; + + @override + String get nfcUnsupported => 'Это устройство не поддерживает NFC'; @override String get amountToDeposit => 'Сумма для пополнения:'; @@ -393,7 +428,8 @@ class L10nRu extends L10n { String get invalidInvoice => 'Недействительный счёт'; @override - String get invalidInvoiceMalformed => 'Недействительный или повреждённый счёт'; + String get invalidInvoiceMalformed => + 'Недействительный или повреждённый счёт'; @override String get feeReserved => 'Зарезервированная комиссия:'; @@ -471,7 +507,8 @@ class L10nRu extends L10n { String get noLightningTransactions => 'Нет Lightning транзакций'; @override - String get depositOrWithdrawLightning => 'Пополните или выведите через Lightning'; + String get depositOrWithdrawLightning => + 'Пополните или выведите через Lightning'; @override String get pendingStatus => 'Ожидание'; @@ -674,7 +711,8 @@ class L10nRu extends L10n { String get close => 'Закрыть'; @override - String get aboutDescription => 'Cashu кошелёк с кубинской ДНК для всего мира. Брат LaChispa.'; + String get aboutDescription => + 'Cashu кошелёк с кубинской ДНК для всего мира. Брат LaChispa.'; @override String get couldNotOpenLink => 'Не удалось открыть ссылку'; @@ -686,7 +724,8 @@ class L10nRu extends L10n { String get actionIrreversible => 'Это действие необратимо'; @override - String get deleteWalletWarning => 'Все данные будут удалены, включая сид-фразу и токены. Убедитесь, что у вас есть резервная копия.'; + String get deleteWalletWarning => + 'Все данные будут удалены, включая сид-фразу и токены. Убедитесь, что у вас есть резервная копия.'; @override String get typeDeleteToConfirm => 'Введите \"УДАЛИТЬ\" для подтверждения:'; @@ -703,7 +742,8 @@ class L10nRu extends L10n { String get recoverTokensTitle => 'Восстановить токены'; @override - String get recoverTokensDescription => 'Сканировать mint для восстановления токенов, связанных с вашей сид-фразой (NUT-13)'; + String get recoverTokensDescription => + 'Сканировать mint для восстановления токенов, связанных с вашей сид-фразой (NUT-13)'; @override String get useCurrentSeedPhrase => 'Использовать текущую сид-фразу'; @@ -738,7 +778,8 @@ class L10nRu extends L10n { String get selectMintToScan => 'Выберите mint для сканирования'; @override - String get mnemonicMustHaveWords => 'Мнемоника должна содержать 12 или 24 слова'; + String get mnemonicMustHaveWords => + 'Мнемоника должна содержать 12 или 24 слова'; @override String get noConnectedMintsToScan => 'Нет подключённых mint для сканирования'; @@ -749,7 +790,8 @@ class L10nRu extends L10n { } @override - String get scanCompleteNoTokens => 'Сканирование завершено. Новых токенов не найдено.'; + String get scanCompleteNoTokens => + 'Сканирование завершено. Новых токенов не найдено.'; @override String mintsWithError(int count) { @@ -772,7 +814,8 @@ class L10nRu extends L10n { } @override - String get noTokensForMnemonic => 'Токены, связанные с этой мнемоникой, не найдены.'; + String get noTokensForMnemonic => + 'Токены, связанные с этой мнемоникой, не найдены.'; @override String get noConnectedMints => 'Нет подключённых mint'; @@ -852,7 +895,8 @@ class L10nRu extends L10n { String get deleteMintConfirmTitle => 'Удалить mint'; @override - String get deleteMintConfirmMessage => 'Если у вас есть баланс на этом mint, он будет потерян. Вы уверены?'; + String get deleteMintConfirmMessage => + 'Если у вас есть баланс на этом mint, он будет потерян. Вы уверены?'; @override String get delete => 'Удалить'; @@ -905,10 +949,12 @@ class L10nRu extends L10n { String get tokenSavedForLater => 'Токен сохранён для получения позже'; @override - String get noConnectionTokenSaved => 'Нет соединения. Токен сохранён для получения позже.'; + String get noConnectionTokenSaved => + 'Нет соединения. Токен сохранён для получения позже.'; @override - String get unknownMintOffline => 'Этот токен от неизвестного mint. Подключитесь к интернету, чтобы добавить его и получить токен.'; + String get unknownMintOffline => + 'Этот токен от неизвестного mint. Подключитесь к интернету, чтобы добавить его и получить токен.'; @override String get noConnectionTryLater => 'Нет соединения с mint. Попробуйте позже.'; @@ -917,7 +963,8 @@ class L10nRu extends L10n { String get saveTokenError => 'Ошибка сохранения токена. Попробуйте снова.'; @override - String get pendingTokenLimitReached => 'Достигнут лимит ожидающих токенов (макс 50)'; + String get pendingTokenLimitReached => + 'Достигнут лимит ожидающих токенов (макс 50)'; @override String get filterToReceive => 'К получению'; @@ -994,7 +1041,8 @@ class L10nRu extends L10n { String get unrecognizedQrCode => 'Нераспознанный QR-код'; @override - String get scanCashuTokenHint => 'Сканируйте Cashu токен (cashuA... или cashuB...)'; + String get scanCashuTokenHint => + 'Сканируйте Cashu токен (cashuA... или cashuB...)'; @override String get scanLightningInvoiceHint => 'Сканируйте Lightning счёт (lnbc...)'; @@ -1006,7 +1054,8 @@ class L10nRu extends L10n { String get cameraPermissionDenied => 'Доступ к камере запрещён'; @override - String get paymentRequestNotSupported => 'Запросы на оплату пока не поддерживаются'; + String get paymentRequestNotSupported => + 'Запросы на оплату пока не поддерживаются'; @override String get p2pkTitle => 'Ключи P2PK'; @@ -1015,10 +1064,12 @@ class L10nRu extends L10n { String get p2pkSettingsDescription => 'Получить заблокированный ecash'; @override - String get p2pkExperimental => 'P2PK экспериментальный. Используйте с осторожностью.'; + String get p2pkExperimental => + 'P2PK экспериментальный. Используйте с осторожностью.'; @override - String get p2pkPendingSendWarning => 'У вас есть ожидающая отправка P2PK. Перейдите в историю и обновите после того, как получатель заберёт токен.'; + String get p2pkPendingSendWarning => + 'У вас есть ожидающая отправка P2PK. Перейдите в историю и обновите после того, как получатель заберёт токен.'; @override String get p2pkExperimentalShort => 'Экспериментальный'; @@ -1075,7 +1126,8 @@ class L10nRu extends L10n { String get p2pkLockedToOther => 'Заблокировано для другого ключа'; @override - String get p2pkCannotUnlock => 'У вас нет ключа для разблокировки этого токена'; + String get p2pkCannotUnlock => + 'У вас нет ключа для разблокировки этого токена'; @override String get p2pkEnterPrivateKey => 'Введите приватный ключ (nsec)'; @@ -1084,13 +1136,15 @@ class L10nRu extends L10n { String get p2pkDeleteTitle => 'Удалить ключ'; @override - String get p2pkDeleteConfirm => 'Удалить этот ключ? Вы не сможете получать токены заблокированные на него.'; + String get p2pkDeleteConfirm => + 'Удалить этот ключ? Вы не сможете получать токены заблокированные на него.'; @override String get p2pkRequiresConnection => 'P2PK требует подключения к mint'; @override - String get p2pkErrorMaxKeysReached => 'Достигнуто максимальное количество импортированных ключей (10)'; + String get p2pkErrorMaxKeysReached => + 'Достигнуто максимальное количество импортированных ключей (10)'; @override String get p2pkErrorInvalidNsec => 'Недействительный nsec'; diff --git a/lib/l10n/app_localizations_sw.dart b/lib/l10n/app_localizations_sw.dart index f4e7129..9da90bf 100644 --- a/lib/l10n/app_localizations_sw.dart +++ b/lib/l10n/app_localizations_sw.dart @@ -1,5 +1,5 @@ +// ignore: unused_import import 'package:intl/intl.dart' as intl; - import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -60,7 +60,8 @@ class L10nSw extends L10n { String get generatingSeed => 'Kutengeneza maneno yako ya mbegu kwa usalama'; @override - String get createWalletDescription => 'Maneno 12 ya mbegu yatatengenezwa.\nYahifadhi mahali salama.'; + String get createWalletDescription => + 'Maneno 12 ya mbegu yatatengenezwa.\nYahifadhi mahali salama.'; @override String get generateWallet => 'Tengeneza pochi'; @@ -69,10 +70,12 @@ class L10nSw extends L10n { String get walletCreated => 'Pochi imeundwa!'; @override - String get walletCreatedDescription => 'Pochi yako iko tayari. Tunakushauri uhifadhi nakala ya maneno yako ya mbegu sasa.'; + String get walletCreatedDescription => + 'Pochi yako iko tayari. Tunakushauri uhifadhi nakala ya maneno yako ya mbegu sasa.'; @override - String get backupWarning => 'Bila nakala, utapoteza uwezo wa kufikia fedha zako ukipoteza kifaa.'; + String get backupWarning => + 'Bila nakala, utapoteza uwezo wa kufikia fedha zako ukipoteza kifaa.'; @override String get backupNow => 'Hifadhi nakala sasa'; @@ -87,7 +90,8 @@ class L10nSw extends L10n { String get seedPhraseTitle => 'Maneno yako ya mbegu'; @override - String get seedPhraseDescription => 'Hifadhi maneno haya 12 kwa mpangilio. Ndiyo njia pekee ya kurejesha pochi yako.'; + String get seedPhraseDescription => + 'Hifadhi maneno haya 12 kwa mpangilio. Ndiyo njia pekee ya kurejesha pochi yako.'; @override String get revealSeedPhrase => 'Onyesha maneno ya mbegu'; @@ -117,7 +121,8 @@ class L10nSw extends L10n { String get enterSeedPhrase => 'Ingiza maneno yako ya mbegu'; @override - String get enterSeedDescription => 'Andika maneno 12 au 24 yakitengwa na nafasi.'; + String get enterSeedDescription => + 'Andika maneno 12 au 24 yakitengwa na nafasi.'; @override String get seedPlaceholder => 'neno1 neno2 neno3 ...'; @@ -273,7 +278,8 @@ class L10nSw extends L10n { String get noActiveMint => 'Hakuna mint inayofanya kazi'; @override - String get offlineModeMessage => 'Hakuna muunganisho. Kutumia hali ya nje ya mtandao...'; + String get offlineModeMessage => + 'Hakuna muunganisho. Kutumia hali ya nje ya mtandao...'; @override String get confirmSend => 'Thibitisha kutuma'; @@ -310,7 +316,8 @@ class L10nSw extends L10n { } @override - String get keepTokenWarning => 'Hifadhi tokeni hii hadi mpokeaji aidai. Ukiipoteza, utapoteza fedha.'; + String get keepTokenWarning => + 'Hifadhi tokeni hii hadi mpokeaji aidai. Ukiipoteza, utapoteza fedha.'; @override String get tokenCopiedToClipboard => 'Tokeni imenakiliwa kwenye ubao'; @@ -322,7 +329,36 @@ class L10nSw extends L10n { String get emojiCopiedToClipboard => 'Tokeni imenakiliwa kama emoji 🥜'; @override - String get peanutDecodeError => 'Imeshindwa kusimbua tokeni ya emoji. Inaweza kuwa imeharibika.'; + String get peanutDecodeError => + 'Imeshindwa kusimbua tokeni ya emoji. Inaweza kuwa imeharibika.'; + + @override + String get nfcWrite => 'Andika kwenye NFC tag'; + + @override + String get nfcRead => 'Soma NFC tag'; + + @override + String get nfcHoldNear => 'Karibia kifaa kwenye NFC tag...'; + + @override + String get nfcWriteSuccess => 'Tokeni imeandikwa kwenye NFC tag'; + + @override + String nfcWriteError(String error) { + return 'Hitilafu ya NFC kuandika: $error'; + } + + @override + String nfcReadError(String error) { + return 'Hitilafu ya NFC kusoma: $error'; + } + + @override + String get nfcDisabled => 'NFC imezimwa. Iwashe katika Mipangilio.'; + + @override + String get nfcUnsupported => 'Kifaa hiki hakitumii NFC'; @override String get amountToDeposit => 'Kiasi cha kuweka:'; @@ -674,7 +710,8 @@ class L10nSw extends L10n { String get close => 'Funga'; @override - String get aboutDescription => 'Pochi ya Cashu yenye DNA ya Cuba kwa ulimwengu wote. Ndugu wa LaChispa.'; + String get aboutDescription => + 'Pochi ya Cashu yenye DNA ya Cuba kwa ulimwengu wote. Ndugu wa LaChispa.'; @override String get couldNotOpenLink => 'Haikuweza kufungua kiungo'; @@ -686,7 +723,8 @@ class L10nSw extends L10n { String get actionIrreversible => 'Kitendo hiki hakiwezi kutenduliwa'; @override - String get deleteWalletWarning => 'Data zote zitafutwa ikiwa ni pamoja na maneno yako ya mbegu na tokeni. Hakikisha una nakala.'; + String get deleteWalletWarning => + 'Data zote zitafutwa ikiwa ni pamoja na maneno yako ya mbegu na tokeni. Hakikisha una nakala.'; @override String get typeDeleteToConfirm => 'Andika \"FUTA\" kuthibitisha:'; @@ -703,13 +741,15 @@ class L10nSw extends L10n { String get recoverTokensTitle => 'Rejesha tokeni'; @override - String get recoverTokensDescription => 'Changanua mint kurejesha tokeni zinazohusiana na maneno yako ya mbegu (NUT-13)'; + String get recoverTokensDescription => + 'Changanua mint kurejesha tokeni zinazohusiana na maneno yako ya mbegu (NUT-13)'; @override String get useCurrentSeedPhrase => 'Tumia maneno yangu ya mbegu ya sasa'; @override - String get scanWithSavedWords => 'Changanua mint na maneno 12 yaliyohifadhiwa'; + String get scanWithSavedWords => + 'Changanua mint na maneno 12 yaliyohifadhiwa'; @override String get useOtherSeedPhrase => 'Tumia maneno mengine ya mbegu'; @@ -741,7 +781,8 @@ class L10nSw extends L10n { String get mnemonicMustHaveWords => 'Mnemonic lazima iwe na maneno 12 au 24'; @override - String get noConnectedMintsToScan => 'Hakuna mint zilizounganishwa za kuchanganua'; + String get noConnectedMintsToScan => + 'Hakuna mint zilizounganishwa za kuchanganua'; @override String recoveredTokens(String tokens, int mints) { @@ -749,7 +790,8 @@ class L10nSw extends L10n { } @override - String get scanCompleteNoTokens => 'Uchanganuzi umekamilika. Hakuna tokeni mpya zilizopatikana.'; + String get scanCompleteNoTokens => + 'Uchanganuzi umekamilika. Hakuna tokeni mpya zilizopatikana.'; @override String mintsWithError(int count) { @@ -772,7 +814,8 @@ class L10nSw extends L10n { } @override - String get noTokensForMnemonic => 'Hakuna tokeni zilizopatikana zinazohusiana na mnemonic hiyo.'; + String get noTokensForMnemonic => + 'Hakuna tokeni zilizopatikana zinazohusiana na mnemonic hiyo.'; @override String get noConnectedMints => 'Hakuna mint zilizounganishwa'; @@ -852,7 +895,8 @@ class L10nSw extends L10n { String get deleteMintConfirmTitle => 'Futa mint'; @override - String get deleteMintConfirmMessage => 'Ukiwa na salio katika mint hii, itapotea. Una uhakika?'; + String get deleteMintConfirmMessage => + 'Ukiwa na salio katika mint hii, itapotea. Una uhakika?'; @override String get delete => 'Futa'; @@ -905,19 +949,23 @@ class L10nSw extends L10n { String get tokenSavedForLater => 'Tokeni imehifadhiwa kudai baadaye'; @override - String get noConnectionTokenSaved => 'Hakuna muunganisho. Tokeni imehifadhiwa kudai baadaye.'; + String get noConnectionTokenSaved => + 'Hakuna muunganisho. Tokeni imehifadhiwa kudai baadaye.'; @override - String get unknownMintOffline => 'Tokeni hii ni kutoka mint isiyojulikana. Unganisha na mtandao kuongeza na kudai tokeni.'; + String get unknownMintOffline => + 'Tokeni hii ni kutoka mint isiyojulikana. Unganisha na mtandao kuongeza na kudai tokeni.'; @override - String get noConnectionTryLater => 'Hakuna muunganisho na mint. Jaribu baadaye.'; + String get noConnectionTryLater => + 'Hakuna muunganisho na mint. Jaribu baadaye.'; @override String get saveTokenError => 'Hitilafu ya kuhifadhi tokeni. Jaribu tena.'; @override - String get pendingTokenLimitReached => 'Kikomo cha tokeni zinazosubiri kimefikiwa (upeo 50)'; + String get pendingTokenLimitReached => + 'Kikomo cha tokeni zinazosubiri kimefikiwa (upeo 50)'; @override String get filterToReceive => 'Za kupokea'; @@ -985,7 +1033,8 @@ class L10nSw extends L10n { String get pointCameraAtQr => 'Elekeza kamera kwenye msimbo wa QR'; @override - String get pointCameraAtCashuQr => 'Elekeza kamera kwenye QR ya tokeni ya Cashu'; + String get pointCameraAtCashuQr => + 'Elekeza kamera kwenye QR ya tokeni ya Cashu'; @override String get pointCameraAtInvoiceQr => 'Elekeza kamera kwenye QR ya ankara'; @@ -994,10 +1043,12 @@ class L10nSw extends L10n { String get unrecognizedQrCode => 'Msimbo wa QR haujatambuliwa'; @override - String get scanCashuTokenHint => 'Changanua tokeni ya Cashu (cashuA... au cashuB...)'; + String get scanCashuTokenHint => + 'Changanua tokeni ya Cashu (cashuA... au cashuB...)'; @override - String get scanLightningInvoiceHint => 'Changanua ankara ya Lightning (lnbc...)'; + String get scanLightningInvoiceHint => + 'Changanua ankara ya Lightning (lnbc...)'; @override String get addMintQuestion => 'Ongeza mint hii?'; @@ -1018,7 +1069,8 @@ class L10nSw extends L10n { String get p2pkExperimental => 'P2PK ni ya majaribio. Tumia kwa uangalifu.'; @override - String get p2pkPendingSendWarning => 'Una usafirishaji wa P2PK unaosubiri. Nenda kwenye historia na usasishe baada ya mpokeaji kudai tokeni.'; + String get p2pkPendingSendWarning => + 'Una usafirishaji wa P2PK unaosubiri. Nenda kwenye historia na usasishe baada ya mpokeaji kudai tokeni.'; @override String get p2pkExperimentalShort => 'Majaribio'; @@ -1084,13 +1136,15 @@ class L10nSw extends L10n { String get p2pkDeleteTitle => 'Futa ufunguo'; @override - String get p2pkDeleteConfirm => 'Futa ufunguo huu? Hutaweza kupokea tokeni zilizofungwa kwake.'; + String get p2pkDeleteConfirm => + 'Futa ufunguo huu? Hutaweza kupokea tokeni zilizofungwa kwake.'; @override String get p2pkRequiresConnection => 'P2PK inahitaji muunganisho kwa mint'; @override - String get p2pkErrorMaxKeysReached => 'Idadi ya juu ya funguo zilizoingizwa imefikiwa (10)'; + String get p2pkErrorMaxKeysReached => + 'Idadi ya juu ya funguo zilizoingizwa imefikiwa (10)'; @override String get p2pkErrorInvalidNsec => 'nsec batili'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index fe962cb..f0f7b03 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -1,5 +1,5 @@ +// ignore: unused_import import 'package:intl/intl.dart' as intl; - import 'app_localizations.dart'; // ignore_for_file: type=lint @@ -324,6 +324,34 @@ class L10nZh extends L10n { @override String get peanutDecodeError => '无法解码表情符号代币。可能已损坏。'; + @override + String get nfcWrite => '写入NFC标签'; + + @override + String get nfcRead => '读取NFC标签'; + + @override + String get nfcHoldNear => '将设备靠近NFC标签...'; + + @override + String get nfcWriteSuccess => '代币已写入NFC标签'; + + @override + String nfcWriteError(String error) { + return 'NFC写入错误:$error'; + } + + @override + String nfcReadError(String error) { + return 'NFC读取错误:$error'; + } + + @override + String get nfcDisabled => 'NFC已禁用,请在设置中启用。'; + + @override + String get nfcUnsupported => '此设备不支持NFC'; + @override String get amountToDeposit => '存入金额:'; diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 28e3b9b..a1cfc06 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -141,6 +141,17 @@ "emojiCopiedToClipboard": "Token copiado como emoji 🥜", "peanutDecodeError": "Não foi possível decodificar o token emoji. Pode estar corrompido.", + "nfcWrite": "Escrever em tag NFC", + "nfcRead": "Ler tag NFC", + "nfcHoldNear": "Aproxime o dispositivo da tag NFC...", + "nfcWriteSuccess": "Token escrito na tag NFC", + "nfcWriteError": "Erro NFC ao escrever: {error}", + "@nfcWriteError": { "placeholders": { "error": { "type": "String" } } }, + "nfcReadError": "Erro NFC ao ler: {error}", + "@nfcReadError": { "placeholders": { "error": { "type": "String" } } }, + "nfcDisabled": "NFC está desativado. Ative nas Configurações.", + "nfcUnsupported": "Este dispositivo não suporta NFC", + "amountToDeposit": "Valor a depositar:", "descriptionOptional": "Descrição (opcional):", "depositPlaceholder": "Para que é este depósito?", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index f469f46..0a2d3b4 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -141,6 +141,17 @@ "emojiCopiedToClipboard": "Токен скопирован как эмодзи 🥜", "peanutDecodeError": "Не удалось декодировать эмодзи-токен. Возможно, он повреждён.", + "nfcWrite": "Записать на NFC-метку", + "nfcRead": "Читать NFC-метку", + "nfcHoldNear": "Поднесите устройство к NFC-метке...", + "nfcWriteSuccess": "Токен записан на NFC-метку", + "nfcWriteError": "Ошибка записи NFC: {error}", + "@nfcWriteError": { "placeholders": { "error": { "type": "String" } } }, + "nfcReadError": "Ошибка чтения NFC: {error}", + "@nfcReadError": { "placeholders": { "error": { "type": "String" } } }, + "nfcDisabled": "NFC отключён. Включите в Настройках.", + "nfcUnsupported": "Это устройство не поддерживает NFC", + "amountToDeposit": "Сумма для пополнения:", "descriptionOptional": "Описание (необязательно):", "depositPlaceholder": "Для чего это пополнение?", diff --git a/lib/l10n/app_sw.arb b/lib/l10n/app_sw.arb index 3a1681b..42f638a 100644 --- a/lib/l10n/app_sw.arb +++ b/lib/l10n/app_sw.arb @@ -141,6 +141,17 @@ "emojiCopiedToClipboard": "Tokeni imenakiliwa kama emoji 🥜", "peanutDecodeError": "Imeshindwa kusimbua tokeni ya emoji. Inaweza kuwa imeharibika.", + "nfcWrite": "Andika kwenye NFC tag", + "nfcRead": "Soma NFC tag", + "nfcHoldNear": "Karibia kifaa kwenye NFC tag...", + "nfcWriteSuccess": "Tokeni imeandikwa kwenye NFC tag", + "nfcWriteError": "Hitilafu ya NFC kuandika: {error}", + "@nfcWriteError": { "placeholders": { "error": { "type": "String" } } }, + "nfcReadError": "Hitilafu ya NFC kusoma: {error}", + "@nfcReadError": { "placeholders": { "error": { "type": "String" } } }, + "nfcDisabled": "NFC imezimwa. Iwashe katika Mipangilio.", + "nfcUnsupported": "Kifaa hiki hakitumii NFC", + "amountToDeposit": "Kiasi cha kuweka:", "descriptionOptional": "Maelezo (si lazima):", "depositPlaceholder": "Amana hii ni ya nini?", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 52c5f12..8741263 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -141,6 +141,17 @@ "emojiCopiedToClipboard": "代币已复制为表情符号 🥜", "peanutDecodeError": "无法解码表情符号代币。可能已损坏。", + "nfcWrite": "写入NFC标签", + "nfcRead": "读取NFC标签", + "nfcHoldNear": "将设备靠近NFC标签...", + "nfcWriteSuccess": "代币已写入NFC标签", + "nfcWriteError": "NFC写入错误:{error}", + "@nfcWriteError": { "placeholders": { "error": { "type": "String" } } }, + "nfcReadError": "NFC读取错误:{error}", + "@nfcReadError": { "placeholders": { "error": { "type": "String" } } }, + "nfcDisabled": "NFC已禁用,请在设置中启用。", + "nfcUnsupported": "此设备不支持NFC", + "amountToDeposit": "存入金额:", "descriptionOptional": "描述(可选):", "depositPlaceholder": "这笔存款是用于什么?", diff --git a/lib/screens/4_receive/receive_screen.dart b/lib/screens/4_receive/receive_screen.dart index 1fddaa4..75c20b1 100644 --- a/lib/screens/4_receive/receive_screen.dart +++ b/lib/screens/4_receive/receive_screen.dart @@ -9,6 +9,7 @@ import '../../core/utils/formatters.dart'; import '../../core/utils/incoming_data_parser.dart' hide TokenInfo; import '../../core/utils/nostr_utils.dart'; import '../../core/utils/peanut_codec.dart'; +import '../../core/services/nfc_service.dart'; import '../../widgets/common/gradient_background.dart'; import '../../widgets/common/glass_card.dart'; import '../../widgets/common/primary_button.dart'; @@ -47,9 +48,14 @@ class _ReceiveScreenState extends State { bool _showManualKey = false; // Toggle para mostrar/ocultar nsec String? _manualKeyError; + // NFC + NfcState _nfcState = NfcState.unsupported; + bool _nfcReading = false; + @override void initState() { super.initState(); + _checkNfc(); // Pre-cargar token inicial si existe if (widget.initialToken != null && widget.initialToken!.isNotEmpty) { WidgetsBinding.instance.addPostFrameCallback((_) { @@ -61,11 +67,19 @@ class _ReceiveScreenState extends State { @override void dispose() { + if (_nfcReading) NfcService.stopRead(); _tokenController.dispose(); _manualKeyController.dispose(); super.dispose(); } + Future _checkNfc() async { + final state = await NfcService.checkState(); + if (mounted) { + setState(() => _nfcState = state); + } + } + @override Widget build(BuildContext context) { return GradientBackground( @@ -246,6 +260,9 @@ class _ReceiveScreenState extends State { // Botón pegar (expandido) Expanded(child: _buildPasteButton()), const SizedBox(width: 12), + // Botón NFC (siempre visible) + _buildNfcButton(), + const SizedBox(width: 12), // Botón escanear QR _buildScanButton(), ], @@ -292,6 +309,118 @@ class _ReceiveScreenState extends State { ); } + Widget _buildNfcButton() { + final isNfcEnabled = _nfcState == NfcState.enabled; + final isNfcUnsupported = _nfcState == NfcState.unsupported; + + return Tooltip( + message: isNfcUnsupported + ? L10n.of(context)!.nfcUnsupported + : isNfcEnabled + ? L10n.of(context)!.nfcRead + : L10n.of(context)!.nfcDisabled, + child: GestureDetector( + onTap: _toggleNfcRead, + child: Opacity( + opacity: isNfcUnsupported ? 0.3 : 1.0, + child: Container( + padding: const EdgeInsets.all(AppDimensions.paddingSmall + 4), + decoration: BoxDecoration( + color: _nfcReading + ? AppColors.primaryAction.withValues(alpha: 0.3) + : Colors.white.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: _nfcReading + ? AppColors.primaryAction + : Colors.white.withValues(alpha: 0.2), + width: 1, + ), + ), + child: Icon( + LucideIcons.nfc, + color: _nfcReading + ? AppColors.primaryAction + : isNfcEnabled + ? AppColors.textSecondary + : AppColors.textSecondary.withValues(alpha: 0.5), + size: 24, + ), + ), + ), + ), + ); + } + + void _toggleNfcRead() async { + // Re-check state in case user toggled NFC in settings + final currentState = await NfcService.checkState(); + if (mounted) setState(() => _nfcState = currentState); + + if (currentState == NfcState.unsupported) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context)!.nfcUnsupported), + backgroundColor: AppColors.textSecondary, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + ); + return; + } + + if (currentState == NfcState.disabled) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context)!.nfcDisabled), + backgroundColor: AppColors.warning, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + ); + return; + } + + if (_nfcReading) { + NfcService.stopRead(); + setState(() => _nfcReading = false); + return; + } + + setState(() => _nfcReading = true); + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context)!.nfcHoldNear), + backgroundColor: AppColors.primaryAction, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + ); + + NfcService.startRead( + onTokenRead: (token) { + if (!mounted) return; + setState(() => _nfcReading = false); + _tokenController.text = token; + _onTokenChanged(token); + }, + onError: (error) { + if (!mounted) return; + setState(() => _nfcReading = false); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context)!.nfcReadError(error)), + backgroundColor: AppColors.error, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8)), + ), + ); + }, + ); + } + Widget _buildScanButton() { return GestureDetector( onTap: _openScanner, diff --git a/lib/screens/5_send/share_token_screen.dart b/lib/screens/5_send/share_token_screen.dart index bc6344e..2ec5fbf 100644 --- a/lib/screens/5_send/share_token_screen.dart +++ b/lib/screens/5_send/share_token_screen.dart @@ -10,6 +10,7 @@ import '../../core/constants/colors.dart'; import '../../core/constants/dimensions.dart'; import '../../core/utils/formatters.dart'; import '../../core/utils/peanut_codec.dart'; +import '../../core/services/nfc_service.dart'; import '../../widgets/common/gradient_background.dart'; import '../../widgets/common/glass_card.dart'; import '../../widgets/common/primary_button.dart'; @@ -45,18 +46,32 @@ class _ShareTokenScreenState extends State { int _currentInterval = _intervalMedium; String _speedLabel = 'M'; + // NFC + NfcState _nfcState = NfcState.unsupported; + bool _nfcWriting = false; + @override void initState() { super.initState(); _encodeTokenToUR(); + _checkNfc(); } @override void dispose() { _animationTimer?.cancel(); + if (_nfcWriting) NfcService.stopWrite(); + super.dispose(); } + Future _checkNfc() async { + final state = await NfcService.checkState(); + if (mounted) { + setState(() => _nfcState = state); + } + } + void _encodeTokenToUR() { // Parsear el token string a objeto Token de cdk-flutter final token = cdk.Token.parse(encoded: widget.token); @@ -156,9 +171,14 @@ class _ShareTokenScreenState extends State { const SizedBox(height: AppDimensions.paddingMedium), - // Botones copiar y compartir + // Botones principales: copiar y compartir _buildActionButtons(context), + const SizedBox(height: AppDimensions.paddingSmall), + + // Botones secundarios: bean (peanut) y NFC + _buildSecondaryActions(context), + const SizedBox(height: AppDimensions.paddingLarge), // Advertencia @@ -415,27 +435,7 @@ class _ShareTokenScreenState extends State { ), ), ), - const SizedBox(width: AppDimensions.paddingSmall), - // Copiar como emoji (peanut encoding) - Tooltip( - message: L10n.of(context)!.copyAsEmoji, - child: GestureDetector( - onTap: () => _copyPeanut(context), - child: Container( - padding: const EdgeInsets.all(16), - decoration: BoxDecoration( - color: Colors.white.withValues(alpha: 0.1), - borderRadius: BorderRadius.circular(16), - border: Border.all( - color: Colors.white.withValues(alpha: 0.2), - width: 1, - ), - ), - child: Icon(LucideIcons.bean, color: AppColors.primaryAction, size: 22), - ), - ), - ), - const SizedBox(width: AppDimensions.paddingSmall), + const SizedBox(width: AppDimensions.paddingMedium), // Compartir Expanded( child: GestureDetector( @@ -471,6 +471,75 @@ class _ShareTokenScreenState extends State { ); } + Widget _buildSecondaryActions(BuildContext context) { + final isNfcEnabled = _nfcState == NfcState.enabled; + final isNfcUnsupported = _nfcState == NfcState.unsupported; + + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Copiar como emoji (peanut encoding) + Tooltip( + message: L10n.of(context)!.copyAsEmoji, + child: GestureDetector( + onTap: () => _copyPeanut(context), + child: Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.07), + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: Colors.white.withValues(alpha: 0.1), + width: 1, + ), + ), + child: Icon(LucideIcons.bean, color: AppColors.primaryAction, size: 20), + ), + ), + ), + const SizedBox(width: 12), + // NFC - siempre visible con 3 estados + Tooltip( + message: isNfcUnsupported + ? L10n.of(context)!.nfcUnsupported + : isNfcEnabled + ? L10n.of(context)!.nfcWrite + : L10n.of(context)!.nfcDisabled, + child: GestureDetector( + onTap: () => _writeNfc(context), + child: Opacity( + opacity: isNfcUnsupported ? 0.3 : 1.0, + child: Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: _nfcWriting + ? AppColors.primaryAction.withValues(alpha: 0.3) + : Colors.white.withValues(alpha: 0.07), + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: _nfcWriting + ? AppColors.primaryAction + : Colors.white.withValues(alpha: 0.1), + width: 1, + ), + ), + child: Icon( + LucideIcons.nfc, + color: _nfcWriting + ? AppColors.primaryAction + : isNfcEnabled + ? AppColors.textSecondary + : AppColors.textSecondary.withValues(alpha: 0.5), + size: 20, + ), + ), + ), + ), + ), + ], + ); + } + Widget _buildWarning() { return Container( padding: const EdgeInsets.all(AppDimensions.paddingMedium), @@ -542,6 +611,84 @@ class _ShareTokenScreenState extends State { ); } + void _writeNfc(BuildContext context) async { + // Re-check state in case user toggled NFC in settings + final currentState = await NfcService.checkState(); + if (mounted) setState(() => _nfcState = currentState); + + if (currentState == NfcState.unsupported) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context)!.nfcUnsupported), + backgroundColor: AppColors.textSecondary, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + ); + return; + } + + if (currentState == NfcState.disabled) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context)!.nfcDisabled), + backgroundColor: AppColors.warning, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + ); + return; + } + + if (_nfcWriting) { + // Cancel active session + NfcService.stopWrite(); + setState(() => _nfcWriting = false); + return; + } + + setState(() => _nfcWriting = true); + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context)!.nfcHoldNear), + backgroundColor: AppColors.primaryAction, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + ); + + NfcService.startWrite( + token: widget.token, + onSuccess: () { + if (!mounted) return; + setState(() => _nfcWriting = false); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context)!.nfcWriteSuccess), + backgroundColor: AppColors.success, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8)), + ), + ); + }, + onError: (error) { + if (!mounted) return; + setState(() => _nfcWriting = false); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context)!.nfcWriteError(error)), + backgroundColor: AppColors.error, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8)), + ), + ); + }, + ); + } + void _goToHome(BuildContext context) { Navigator.of(context).popUntil((route) => route.isFirst); } diff --git a/pubspec.lock b/pubspec.lock index bd0f7d9..d3ba557 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -94,10 +94,10 @@ packages: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" checked_yaml: dependency: transitive description: @@ -118,18 +118,18 @@ packages: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" collection: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.19.1" convert: dependency: transitive description: @@ -174,10 +174,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.3" ffi: dependency: transitive description: @@ -370,10 +370,10 @@ packages: dependency: "direct main" description: name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" url: "https://pub.dev" source: hosted - version: "0.19.0" + version: "0.20.2" js: dependency: transitive description: @@ -394,26 +394,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: @@ -434,26 +434,26 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.19" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" meta: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.17.0" mime: dependency: transitive description: @@ -470,6 +470,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.2.3" + ndef_record: + dependency: "direct main" + description: + name: ndef_record + sha256: "210ffb12284961cab9e44b99462143316d9a20cd992581170706069ef77d74a6" + url: "https://pub.dev" + source: hosted + version: "1.4.2" nested: dependency: transitive description: @@ -478,6 +486,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + nfc_manager: + dependency: "direct main" + description: + name: nfc_manager + sha256: "24c78b0e5702da53e7f8794d073624c0bee7cd99924f257cbd11f5d1c5866879" + url: "https://pub.dev" + source: hosted + version: "4.1.1" package_info_plus: dependency: "direct main" description: @@ -498,10 +514,10 @@ packages: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" path_provider: dependency: "direct main" description: @@ -759,18 +775,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" string_scanner: dependency: transitive description: @@ -799,10 +815,10 @@ packages: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.10" typed_data: dependency: transitive description: @@ -895,10 +911,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: @@ -948,5 +964,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.6.0 <4.0.0" + dart: ">=3.11.0 <4.0.0" flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index 03241ab..595cf35 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0+2 environment: - sdk: ^3.6.0 + sdk: ^3.11.0 dependencies: flutter: @@ -56,6 +56,10 @@ dependencies: # UUID generator for pending tokens uuid: ^4.3.3 + # NFC for token sharing + nfc_manager: ^4.1.1 + ndef_record: ^1.4.2 + # BIP32 for NIP-06 key derivation (P2PK) bip32: ^2.0.0 package_info_plus: ^9.0.0