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