feat: Enable NFTs for Solana wallet (#2082)

* feat: Enable NFTs for Solana wallet * Add localization for texts * Adjust file naming * Adjust file naming

David Adegoke committed Mar 14, 2025 at 17:30 UTC 0f301a71a22ce7543375d82f16c09fdc1dc41819
38 files changed +819 -248
lib/entities/solana_nft_asset_model.dart new
+130
@@ -0,0 +1,130 @@
1 +class SolanaNFTAssetModel {
2 + String? address;
3 + String? mint;
4 + String? standard;
5 + String? name;
6 + String? symbol;
7 + String? description;
8 + String? imageOriginalUrl;
9 + String? externalUrl;
10 + String? metadataOriginalUrl;
11 + String? totalSupply;
12 + Metaplex? metaplex;
13 + Collection? collection;
14 + Contract? contract;
15 +
16 + SolanaNFTAssetModel({
17 + this.address,
18 + this.mint,
19 + this.standard,
20 + this.name,
21 + this.symbol,
22 + this.description,
23 + this.imageOriginalUrl,
24 + this.externalUrl,
25 + this.metadataOriginalUrl,
26 + this.totalSupply,
27 + this.metaplex,
28 + this.collection,
29 + this.contract,
30 + });
31 +
32 + factory SolanaNFTAssetModel.fromJson(Map<String, dynamic> json) {
33 + return SolanaNFTAssetModel(
34 + address: json['address'] as String?,
35 + mint: json['mint'] as String?,
36 + standard: json['standard'] as String?,
37 + name: json['name'] as String?,
38 + symbol: json['symbol'] as String?,
39 + description: json['description'] as String?,
40 + imageOriginalUrl: json['imageOriginalUrl'] as String?,
41 + externalUrl: json['externalUrl'] as String?,
42 + metadataOriginalUrl: json['metadataOriginalUrl'] as String?,
43 + totalSupply: json['totalSupply'] as String?,
44 + metaplex: json['metaplex'] != null
45 + ? Metaplex.fromJson(json['metaplex'] as Map<String, dynamic>)
46 + : null,
47 + collection: json['collection'] != null
48 + ? Collection.fromJson(json['collection'] as Map<String, dynamic>)
49 + : null,
50 + contract: json['contract'] != null
51 + ? Contract.fromJson(json['contract'] as Map<String, dynamic>)
52 + : null,
53 + );
54 + }
55 +}
56 +
57 +class Metaplex {
58 + String? metadataUri;
59 + String? updateAuthority;
60 + int? sellerFeeBasisPoints;
61 + int? primarySaleHappened;
62 + bool? isMutable;
63 + bool? masterEdition;
64 +
65 + Metaplex(
66 + {this.metadataUri,
67 + this.updateAuthority,
68 + this.sellerFeeBasisPoints,
69 + this.primarySaleHappened,
70 + this.isMutable,
71 + this.masterEdition});
72 +
73 + factory Metaplex.fromJson(Map<String, dynamic> json) {
74 + return Metaplex(
75 + metadataUri: json['metadataUri'] as String?,
76 + updateAuthority: json['updateAuthority'] as String?,
77 + sellerFeeBasisPoints: json['sellerFeeBasisPoints'] as int?,
78 + primarySaleHappened: json['primarySaleHappened'] as int?,
79 + isMutable: json['isMutable'] as bool?,
80 + masterEdition: json['masterEdition'] as bool?,
81 + );
82 + }
83 +}
84 +
85 +class Collection {
86 + String? collectionAddress;
87 + String? name;
88 + String? description;
89 + String? imageOriginalUrl;
90 + String? externalUrl;
91 + String? metaplexMint;
92 + int? sellerFeeBasisPoints;
93 +
94 + Collection(
95 + {this.collectionAddress,
96 + this.name,
97 + this.description,
98 + this.imageOriginalUrl,
99 + this.externalUrl,
100 + this.metaplexMint,
101 + this.sellerFeeBasisPoints});
102 +
103 + factory Collection.fromJson(Map<String, dynamic> json) {
104 + return Collection(
105 + collectionAddress: json['collectionAddress'] as String?,
106 + name: json['name'] as String?,
107 + description: json['description'] as String?,
108 + imageOriginalUrl: json['imageOriginalUrl'] as String?,
109 + externalUrl: json['externalUrl'] as String?,
110 + metaplexMint: json['metaplexMint'] as String?,
111 + sellerFeeBasisPoints: json['sellerFeeBasisPoints'] as int?,
112 + );
113 + }
114 +}
115 +
116 +class Contract {
117 + String? type;
118 + String? name;
119 + String? symbol;
120 +
121 + Contract({this.type, this.name, this.symbol});
122 +
123 + factory Contract.fromJson(Map<String, dynamic> json) {
124 + return Contract(
125 + type: json['type'] as String?,
126 + name: json['name'] as String?,
127 + symbol: json['symbol'] as String?,
128 + );
129 + }
130 +}
lib/reactions/wallet_connect.dart
+12 -1
@@ -12,6 +12,17 @@ bool isEVMCompatibleChain(WalletType walletType) {
12 }
13 }
14
15 +bool isNFTACtivatedChain(WalletType walletType) {
16 + switch (walletType) {
17 + case WalletType.polygon:
18 + case WalletType.ethereum:
19 + case WalletType.solana:
20 + return true;
21 + default:
22 + return false;
23 + }
24 +}
25 +
26 bool isWalletConnectCompatibleChain(WalletType walletType) {
27 switch (walletType) {
28 case WalletType.polygon:
@@ -55,7 +66,7 @@ String getChainNameBasedOnWalletType(WalletType walletType) {
66 case WalletType.polygon:
67 return 'polygon';
68 case WalletType.solana:
58 - return 'solana';
69 + return 'mainnet';
70 default:
71 return '';
72 }
lib/router.dart
+1 -1
@@ -771,7 +771,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
771 case Routes.nftDetailsPage:
772 return MaterialPageRoute<void>(
773 builder: (_) => NFTDetailsPage(
774 - nftAsset: settings.arguments as NFTAssetModel,
774 + arguments: settings.arguments as NFTDetailsPageArguments,
775 dashboardViewModel: getIt.get<DashboardViewModel>(),
776 ),
777 );
lib/src/screens/dashboard/pages/balance/balance_page.dart
+5 -5
@@ -23,13 +23,13 @@ class BalancePage extends StatelessWidget {
23 Widget build(BuildContext context) {
24 return Observer(
25 builder: (context) {
26 - final isEVMCompatible = isEVMCompatibleChain(dashboardViewModel.type);
26 + final isNFTActivated = isNFTACtivatedChain(dashboardViewModel.type);
27 return DefaultTabController(
28 - key: ValueKey<bool>(isEVMCompatible),
29 - length: isEVMCompatible ? 2 : 1,
28 + key: ValueKey<bool>(isNFTActivated),
29 + length: isNFTActivated ? 2 : 1,
30 child: Column(
31 children: [
32 - if (isEVMCompatible)
32 + if (isNFTActivated)
33 Align(
34 alignment: Alignment.centerLeft,
35 child: Padding(
@@ -76,7 +76,7 @@ class BalancePage extends StatelessWidget {
76 physics: NeverScrollableScrollPhysics(),
77 children: [
78 CryptoBalanceWidget(dashboardViewModel: dashboardViewModel),
79 - if (isEVMCompatible) NFTListingPage(nftViewModel: nftViewModel)
79 + if (isNFTActivated) NFTListingPage(nftViewModel: nftViewModel)
80 ],
81 ),
82 ),
lib/src/screens/dashboard/pages/nft_details_page.dart
+183 -87
@@ -1,3 +1,5 @@
1 +import 'package:flutter/material.dart';
2 +import 'package:cake_wallet/entities/solana_nft_asset_model.dart';
3 import 'package:cake_wallet/entities/wallet_nft_response.dart';
4 import 'package:cake_wallet/generated/i18n.dart';
5 import 'package:cake_wallet/src/screens/base_page.dart';
@@ -8,21 +10,23 @@ import 'package:cake_wallet/themes/extensions/balance_page_theme.dart';
10 import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
11 import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
12 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
11 -import 'package:flutter/material.dart';
13
14 class NFTDetailsPage extends BasePage {
14 - NFTDetailsPage({required this.dashboardViewModel, required this.nftAsset});
15 + NFTDetailsPage({
16 + required this.dashboardViewModel,
17 + required this.arguments,
18 + Key? key,
19 + });
20
21 final DashboardViewModel dashboardViewModel;
17 - final NFTAssetModel nftAsset;
22 + final NFTDetailsPageArguments arguments;
23
24 @override
25 bool get gradientBackground => true;
26
27 @override
28 Widget Function(BuildContext, Widget) get rootWrapper =>
24 - (BuildContext context, Widget scaffold) =>
25 - GradientBackground(scaffold: scaffold);
29 + (BuildContext context, Widget scaffold) => GradientBackground(scaffold: scaffold);
30
31 @override
32 bool get resizeToAvoidBottomInset => false;
@@ -30,15 +34,14 @@ class NFTDetailsPage extends BasePage {
34 @override
35 Widget get endDrawer => MenuWidget(
36 dashboardViewModel,
33 - ValueKey('nft_details_page_menu_widget_key'),
37 + const ValueKey('nft_details_page_menu_widget_key'),
38 );
39
40 @override
41 Widget trailing(BuildContext context) {
42 final menuButton = Image.asset(
43 'assets/images/menu.png',
40 - color:
41 - Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
44 + color: Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
45 );
46
47 return Container(
@@ -58,119 +61,200 @@ class NFTDetailsPage extends BasePage {
61 @override
62 Widget body(BuildContext context) {
63 return SingleChildScrollView(
61 - child: Column(
62 - children: [
63 - Container(
64 - width: double.infinity,
65 - margin: const EdgeInsets.all(16),
66 - padding: const EdgeInsets.symmetric(vertical: 16),
67 - decoration: BoxDecoration(
68 - borderRadius: BorderRadius.circular(30.0),
69 - border: Border.all(
70 - color: Theme.of(context)
71 - .extension<BalancePageTheme>()!
72 - .cardBorderColor,
73 - width: 1,
64 + child: Container(
65 + width: double.infinity,
66 + margin: const EdgeInsets.all(16),
67 + padding: const EdgeInsets.symmetric(vertical: 16),
68 + decoration: BoxDecoration(
69 + borderRadius: BorderRadius.circular(30.0),
70 + border: Border.all(
71 + color: Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor,
72 + width: 1,
73 + ),
74 + color: Theme.of(context).extension<SyncIndicatorTheme>()!.syncedBackgroundColor,
75 + ),
76 + child: arguments.isSolanaNFT
77 + ? SolanaNFTDetailsWidget(
78 + solanaNftAsset: arguments.solanaNFTAssetModel,
79 + )
80 + : EVMChainNFTDetailsWidget(
81 + nftAsset: arguments.nftAsset,
82 ),
75 - color: Theme.of(context)
76 - .extension<SyncIndicatorTheme>()!
77 - .syncedBackgroundColor,
78 - ),
79 - child: Column(
80 - crossAxisAlignment: CrossAxisAlignment.start,
81 - children: [
82 - Container(
83 - height: MediaQuery.sizeOf(context).height / 2.5,
84 - width: double.infinity,
85 - clipBehavior: Clip.hardEdge,
86 - margin: const EdgeInsets.all(8),
87 - decoration: BoxDecoration(
88 - borderRadius: BorderRadius.circular(16.0),
89 - border: Border.all(
90 - color: Theme.of(context)
91 - .extension<BalancePageTheme>()!
92 - .cardBorderColor,
93 - width: 1,
94 - ),
95 - color: Theme.of(context)
96 - .extension<SyncIndicatorTheme>()!
97 - .syncedBackgroundColor,
98 -
99 - ),
100 - child: CakeImageWidget(
101 - imageUrl: nftAsset.normalizedMetadata?.imageUrl,
102 - ),
103 - ),
104 - SizedBox(height: 16),
105 - _NFTSingleInfoTile(
106 - infoType: S.current.name,
107 - infoValue: nftAsset.normalizedMetadata?.name ?? '---',
108 - ),
109 -
110 - if (nftAsset.normalizedMetadata?.description != null) ...[
111 - SizedBox(height: 16),
112 - _NFTSingleInfoTile(
113 - infoType: S.current.description,
114 - infoValue: nftAsset.normalizedMetadata?.description ?? '---',
115 - ),
116 - ],
117 -
118 - SizedBox(height: 16),
119 - _NFTSingleInfoTile(
120 - infoType: S.current.contractName,
121 - infoValue: nftAsset.name ?? '---',
122 - ),
123 - SizedBox(height: 8),
124 - _NFTSingleInfoTile(
125 - infoType: S.current.contractSymbol,
126 - infoValue: nftAsset.symbol ?? '---',
127 - ),
128 - ],
129 - ),
83 + ),
84 + );
85 + }
86 +}
87 +
88 +class _NFTImageWidget extends StatelessWidget {
89 + final String? imageUrl;
90 +
91 + const _NFTImageWidget({Key? key, this.imageUrl}) : super(key: key);
92 +
93 + @override
94 + Widget build(BuildContext context) {
95 + final balanceTheme = Theme.of(context).extension<BalancePageTheme>()!;
96 + final syncTheme = Theme.of(context).extension<SyncIndicatorTheme>()!;
97 +
98 + return Container(
99 + height: MediaQuery.sizeOf(context).height / 2.5,
100 + width: double.infinity,
101 + margin: const EdgeInsets.all(8),
102 + clipBehavior: Clip.hardEdge,
103 + decoration: BoxDecoration(
104 + borderRadius: BorderRadius.circular(16.0),
105 + border: Border.all(
106 + color: balanceTheme.cardBorderColor,
107 + width: 1,
108 + ),
109 + color: syncTheme.syncedBackgroundColor,
110 + ),
111 + child: CakeImageWidget(imageUrl: imageUrl),
112 + );
113 + }
114 +}
115 +
116 +class EVMChainNFTDetailsWidget extends StatelessWidget {
117 + final NFTAssetModel? nftAsset;
118 +
119 + const EVMChainNFTDetailsWidget({Key? key, this.nftAsset}) : super(key: key);
120 +
121 + @override
122 + Widget build(BuildContext context) {
123 + if (nftAsset == null) {
124 + return Center(child: Text(S.current.no_extra_detail));
125 + }
126 +
127 + final metadata = nftAsset!.normalizedMetadata;
128 +
129 + return Column(
130 + crossAxisAlignment: CrossAxisAlignment.start,
131 + children: [
132 + _NFTImageWidget(imageUrl: metadata?.imageUrl),
133 + const SizedBox(height: 16),
134 + _NFTSingleInfoTile(
135 + infoType: S.current.name,
136 + infoValue: metadata?.name ?? '---',
137 + ),
138 + if (metadata?.description != null) ...[
139 + const SizedBox(height: 16),
140 + _NFTSingleInfoTile(
141 + infoType: S.current.description,
142 + infoValue: metadata!.description ?? '---',
143 ),
144 ],
132 - ),
145 + const SizedBox(height: 16),
146 + _NFTSingleInfoTile(
147 + infoType: S.current.contractName,
148 + infoValue: nftAsset!.name ?? '---',
149 + ),
150 + const SizedBox(height: 8),
151 + _NFTSingleInfoTile(
152 + infoType: S.current.contractSymbol,
153 + infoValue: nftAsset!.symbol ?? '---',
154 + ),
155 + ],
156 + );
157 + }
158 +}
159 +
160 +class SolanaNFTDetailsWidget extends StatelessWidget {
161 + final SolanaNFTAssetModel? solanaNftAsset;
162 +
163 + const SolanaNFTDetailsWidget({Key? key, this.solanaNftAsset}) : super(key: key);
164 +
165 + @override
166 + Widget build(BuildContext context) {
167 + if (solanaNftAsset == null) {
168 + return Center(child: Text(S.current.no_extra_detail));
169 + }
170 +
171 + return Column(
172 + crossAxisAlignment: CrossAxisAlignment.start,
173 + children: [
174 + _NFTImageWidget(imageUrl: solanaNftAsset?.imageOriginalUrl),
175 + const SizedBox(height: 16),
176 + _NFTSingleInfoTile(
177 + infoType: S.current.name,
178 + infoValue: solanaNftAsset?.name ?? '---',
179 + ),
180 + if (solanaNftAsset?.description != null) ...[
181 + const SizedBox(height: 16),
182 + _NFTSingleInfoTile(
183 + infoType: S.current.description,
184 + infoValue: solanaNftAsset!.description ?? '---',
185 + ),
186 + ],
187 + const SizedBox(height: 16),
188 + _NFTSingleInfoTile(
189 + infoType: S.current.mint_address,
190 + infoValue: solanaNftAsset?.mint ?? '---',
191 + ),
192 + const SizedBox(height: 16),
193 + _NFTSingleInfoTile(
194 + infoType: S.current.contractName,
195 + infoValue: solanaNftAsset?.contract?.name ?? '---',
196 + ),
197 + const SizedBox(height: 16),
198 + _NFTSingleInfoTile(
199 + infoType: S.current.contractSymbol,
200 + infoValue: solanaNftAsset?.contract?.symbol ?? '---',
201 + ),
202 + const SizedBox(height: 16),
203 + _NFTSingleInfoTile(
204 + infoType: S.current.collection_name,
205 + infoValue: solanaNftAsset?.collection?.name ?? '---',
206 + ),
207 + const SizedBox(height: 16),
208 + _NFTSingleInfoTile(
209 + infoType: S.current.collection_description,
210 + infoValue: solanaNftAsset?.collection?.description ?? '---',
211 + ),
212 + const SizedBox(height: 16),
213 + _NFTSingleInfoTile(
214 + infoType: S.current.collection_address,
215 + infoValue: solanaNftAsset?.collection?.collectionAddress ?? '---',
216 + ),
217 + const SizedBox(height: 16),
218 + ],
219 );
220 }
221 }
222
223 class _NFTSingleInfoTile extends StatelessWidget {
224 + final String infoType;
225 + final String infoValue;
226 +
227 const _NFTSingleInfoTile({
228 required this.infoType,
229 required this.infoValue,
230 });
231
143 - final String infoType;
144 - final String infoValue;
232 @override
233 Widget build(BuildContext context) {
234 + final balanceTheme = Theme.of(context).extension<BalancePageTheme>()!;
235 return Padding(
236 padding: const EdgeInsets.symmetric(horizontal: 24),
237 child: Column(
238 crossAxisAlignment: CrossAxisAlignment.start,
239 children: [
240 Text(
153 -infoType,
241 + infoType,
242 style: TextStyle(
243 fontSize: 12,
244 fontFamily: 'Lato',
245 fontWeight: FontWeight.w400,
158 - color: Theme.of(context)
159 - .extension<BalancePageTheme>()!
160 - .labelTextColor,
246 + color: balanceTheme.labelTextColor,
247 height: 1,
248 ),
249 ),
164 - SizedBox(height: 8),
250 + const SizedBox(height: 8),
251 Text(
252 infoValue,
253 style: TextStyle(
254 fontSize: 16,
255 fontFamily: 'Lato',
256 fontWeight: FontWeight.w600,
171 - color: Theme.of(context)
172 - .extension<BalancePageTheme>()!
173 - .assetTitleColor,
257 + color: balanceTheme.assetTitleColor,
258 height: 1,
259 ),
260 ),
@@ -179,3 +263,15 @@ infoType,
263 );
264 }
265 }
266 +
267 +class NFTDetailsPageArguments {
268 + NFTDetailsPageArguments({
269 + this.nftAsset,
270 + this.solanaNFTAssetModel,
271 + required this.isSolanaNFT,
272 + });
273 +
274 + final NFTAssetModel? nftAsset;
275 + final SolanaNFTAssetModel? solanaNFTAssetModel;
276 + final bool isSolanaNFT;
277 +}
lib/src/screens/dashboard/pages/nft_import_page.dart
+40 -43
@@ -6,6 +6,7 @@ import 'package:cake_wallet/src/widgets/primary_button.dart';
6 import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
7 import 'package:cake_wallet/themes/extensions/seed_widget_theme.dart';
8 import 'package:cake_wallet/view_model/dashboard/nft_view_model.dart';
9 +import 'package:cw_core/wallet_type.dart';
10 import 'package:flutter/material.dart';
11 import 'package:flutter/services.dart';
12 import 'package:flutter_mobx/flutter_mobx.dart';
@@ -68,7 +69,6 @@ class _ImportNFTPage extends BasePage {
69 child: Column(
70 crossAxisAlignment: CrossAxisAlignment.start,
71 children: [
71 -
72 Text(
73 S.current.address,
74 textAlign: TextAlign.center,
@@ -76,8 +76,7 @@ class _ImportNFTPage extends BasePage {
76 fontSize: 16,
77 fontFamily: 'Lato',
78 fontWeight: FontWeight.w800,
79 - color:
80 - Theme.of(context).extension<SeedWidgetTheme>()!.hintTextColor,
79 + color: Theme.of(context).extension<SeedWidgetTheme>()!.hintTextColor,
80 height: 1,
81 ),
82 ),
@@ -92,9 +91,7 @@ class _ImportNFTPage extends BasePage {
91 tokenAddressController.text = tokenAddress;
92 }
93 },
95 - borderColor: Theme.of(context)
96 - .extension<CakeTextTheme>()!
97 - .textfieldUnderlineColor,
94 + borderColor: Theme.of(context).extension<CakeTextTheme>()!.textfieldUnderlineColor,
95 iconColor: Theme.of(context).primaryColor,
96 placeholder: '0x...',
97 textStyle: TextStyle(
@@ -108,46 +105,45 @@ class _ImportNFTPage extends BasePage {
105 color: PaletteDark.darkCyanBlue,
106 ),
107 ),
111 -
112 - SizedBox(height: 48),
113 - Text(
114 - S.current.tokenID,
115 - textAlign: TextAlign.center,
116 - style: TextStyle(
117 - fontSize: 16,
118 - fontFamily: 'Lato',
119 - fontWeight: FontWeight.w800,
120 - color: Theme.of(context).extension<SeedWidgetTheme>()!.hintTextColor,
121 - height: 1,
108 + if (nftViewModel.appStore.wallet!.type != WalletType.solana) ...[
109 + SizedBox(height: 48),
110 + Text(
111 + S.current.tokenID,
112 + textAlign: TextAlign.center,
113 + style: TextStyle(
114 + fontSize: 16,
115 + fontFamily: 'Lato',
116 + fontWeight: FontWeight.w800,
117 + color: Theme.of(context).extension<SeedWidgetTheme>()!.hintTextColor,
118 + height: 1,
119 + ),
120 ),
123 - ),
124 - AddressTextField(
125 - controller: tokenIDController,
126 - options: [AddressTextFieldOption.paste],
127 - onPushPasteButton: (context) async {
128 - final clipboard = await Clipboard.getData('text/plain');
129 - final tokenID = clipboard?.text ?? '';
121 + AddressTextField(
122 + controller: tokenIDController,
123 + options: [AddressTextFieldOption.paste],
124 + onPushPasteButton: (context) async {
125 + final clipboard = await Clipboard.getData('text/plain');
126 + final tokenID = clipboard?.text ?? '';
127
131 - if (tokenID.isNotEmpty) {
132 - tokenIDController.text = tokenID;
133 - }
134 - },
135 - borderColor: Theme.of(context)
136 - .extension<CakeTextTheme>()!
137 - .textfieldUnderlineColor,
138 - iconColor: Theme.of(context).primaryColor,
139 - placeholder: S.current.enterTokenID,
140 - textStyle: TextStyle(
141 - fontSize: 16,
142 - fontWeight: FontWeight.w400,
143 - color: PaletteDark.darkCyanBlue,
144 - ),
145 - hintStyle: TextStyle(
146 - fontSize: 16,
147 - fontWeight: FontWeight.w400,
148 - color: PaletteDark.darkCyanBlue,
128 + if (tokenID.isNotEmpty) {
129 + tokenIDController.text = tokenID;
130 + }
131 + },
132 + borderColor: Theme.of(context).extension<CakeTextTheme>()!.textfieldUnderlineColor,
133 + iconColor: Theme.of(context).primaryColor,
134 + placeholder: S.current.enterTokenID,
135 + textStyle: TextStyle(
136 + fontSize: 16,
137 + fontWeight: FontWeight.w400,
138 + color: PaletteDark.darkCyanBlue,
139 + ),
140 + hintStyle: TextStyle(
141 + fontSize: 16,
142 + fontWeight: FontWeight.w400,
143 + color: PaletteDark.darkCyanBlue,
144 + ),
145 ),
150 - ),
146 + ],
147 Spacer(),
148 Observer(builder: (context) {
149 return LoadingPrimaryButton(
@@ -161,6 +157,7 @@ class _ImportNFTPage extends BasePage {
157 },
158 );
159 }),
160 + SizedBox(height: 16),
161 ],
162 ),
163 );
lib/src/screens/dashboard/pages/nft_listing_page.dart
+73 -39
@@ -1,32 +1,37 @@
1 +import 'package:flutter/material.dart';
2 +import 'package:flutter_mobx/flutter_mobx.dart';
3 import 'package:cake_wallet/generated/i18n.dart';
4 import 'package:cake_wallet/routes.dart';
5 import 'package:cake_wallet/src/screens/dashboard/widgets/nft_tile_widget.dart';
6 +import 'package:cake_wallet/src/screens/dashboard/widgets/solana_nft_tile_widget.dart';
7 import 'package:cake_wallet/src/widgets/primary_button.dart';
8 import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
9 import 'package:cake_wallet/themes/extensions/exchange_page_theme.dart';
10 import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
11 import 'package:cake_wallet/view_model/dashboard/nft_view_model.dart';
9 -import 'package:flutter/material.dart';
10 -import 'package:flutter_mobx/flutter_mobx.dart';
12 +import 'package:cw_core/wallet_type.dart';
13
14 class NFTListingPage extends StatelessWidget {
15 final NFTViewModel nftViewModel;
16
17 const NFTListingPage({super.key, required this.nftViewModel});
18 +
19 @override
20 Widget build(BuildContext context) {
21 + final dashboardTheme = Theme.of(context).extension<DashboardPageTheme>()!;
22 + final syncIndicatorTheme = Theme.of(context).extension<SyncIndicatorTheme>()!;
23 + final exchangeTheme = Theme.of(context).extension<ExchangePageTheme>()!;
24 +
25 return Observer(
26 builder: (context) {
27 return Column(
28 children: [
22 - SizedBox(height: 16),
29 + const SizedBox(height: 16),
30 Padding(
24 - padding: EdgeInsets.only(left: 16, right: 16, bottom: 16),
31 + padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16),
32 child: PrimaryButton(
33 text: S.current.import,
27 - color: Theme.of(context)
28 - .extension<SyncIndicatorTheme>()!
29 - .syncedBackgroundColor,
34 + color: syncIndicatorTheme.syncedBackgroundColor,
35 textColor: Colors.white,
36 onPressed: () => Navigator.pushNamed(
37 context,
@@ -39,46 +44,75 @@ class NFTListingPage extends StatelessWidget {
44 Expanded(
45 child: Center(
46 child: CircularProgressIndicator(
42 - backgroundColor: Theme.of(context).extension<DashboardPageTheme>()!.textColor,
47 + backgroundColor: dashboardTheme.textColor,
48 valueColor: AlwaysStoppedAnimation<Color>(
44 - Theme.of(context)
45 - .extension<ExchangePageTheme>()!
46 - .firstGradientBottomPanelColor,
49 + exchangeTheme.firstGradientBottomPanelColor,
50 ),
51 ),
52 ),
50 - ),
51 - if (!nftViewModel.isLoading)
52 - Expanded(
53 - child: nftViewModel.nftAssetByWalletModels.isEmpty
54 - ? Center(
55 - child: Text(
56 - S.current.noNFTYet,
57 - textAlign: TextAlign.center,
58 - style: TextStyle(
59 - fontSize: 20,
60 - fontFamily: 'Lato',
61 - fontWeight: FontWeight.w600,
62 - color: Theme.of(context)
63 - .extension<DashboardPageTheme>()!
64 - .pageTitleTextColor,
65 - height: 1,
66 - ),
67 - ),
68 - )
69 - : ListView.separated(
70 - padding: EdgeInsets.symmetric(horizontal: 4, vertical: 16),
71 - separatorBuilder: (context, index) => SizedBox(height: 8),
72 - itemCount: nftViewModel.nftAssetByWalletModels.length,
73 - itemBuilder: (context, index) {
74 - final nftAsset = nftViewModel.nftAssetByWalletModels[index];
75 - return NFTTileWidget(nftAsset: nftAsset);
76 - },
77 - ),
53 )
54 + else
55 + Expanded(
56 + child: NFTListWidget(nftViewModel: nftViewModel),
57 + ),
58 ],
59 );
60 },
61 );
62 }
63 }
64 +
65 +class NFTListWidget extends StatelessWidget {
66 + const NFTListWidget({required this.nftViewModel, super.key});
67 +
68 + final NFTViewModel nftViewModel;
69 +
70 + @override
71 + Widget build(BuildContext context) {
72 + return Observer(
73 + builder: (context) {
74 + final isSolana = nftViewModel.appStore.wallet!.type == WalletType.solana;
75 +
76 + final emptyMessage = Center(
77 + child: Text(
78 + S.current.noNFTYet,
79 + textAlign: TextAlign.center,
80 + style: TextStyle(
81 + fontSize: 20,
82 + fontFamily: 'Lato',
83 + fontWeight: FontWeight.w600,
84 + color: Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
85 + height: 1,
86 + ),
87 + ),
88 + );
89 +
90 + if (isSolana) {
91 + if (nftViewModel.solanaNftAssetModels.isEmpty) return emptyMessage;
92 +
93 + return ListView.separated(
94 + padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 16),
95 + separatorBuilder: (context, index) => const SizedBox(height: 8),
96 + itemCount: nftViewModel.solanaNftAssetModels.length,
97 + itemBuilder: (context, index) {
98 + final nftAsset = nftViewModel.solanaNftAssetModels[index];
99 + return SolanaNFTTileWidget(nftAsset: nftAsset);
100 + },
101 + );
102 + } else {
103 + if (nftViewModel.nftAssetByWalletModels.isEmpty) return emptyMessage;
104 +
105 + return ListView.separated(
106 + padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 16),
107 + separatorBuilder: (context, index) => const SizedBox(height: 8),
108 + itemCount: nftViewModel.nftAssetByWalletModels.length,
109 + itemBuilder: (context, index) {
110 + final nftAsset = nftViewModel.nftAssetByWalletModels[index];
111 + return NFTTileWidget(nftAsset: nftAsset);
112 + },
113 + );
114 + }
115 + },
116 + );
117 + }
118 +}
lib/src/screens/dashboard/widgets/nft_tile_widget.dart
+9 -1
@@ -1,5 +1,6 @@
1 import 'package:cake_wallet/entities/wallet_nft_response.dart';
2 import 'package:cake_wallet/routes.dart';
3 +import 'package:cake_wallet/src/screens/dashboard/pages/nft_details_page.dart';
4 import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
5 import 'package:cake_wallet/themes/extensions/balance_page_theme.dart';
6 import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
@@ -12,7 +13,14 @@ class NFTTileWidget extends StatelessWidget {
13 @override
14 Widget build(BuildContext context) {
15 return InkWell(
15 - onTap: () => Navigator.pushNamed(context, Routes.nftDetailsPage, arguments: nftAsset),
16 + onTap: () => Navigator.pushNamed(
17 + context,
18 + Routes.nftDetailsPage,
19 + arguments: NFTDetailsPageArguments(
20 + isSolanaNFT: false,
21 + nftAsset: nftAsset,
22 + ),
23 + ),
24 child: Container(
25 width: double.infinity,
26 margin: const EdgeInsets.only(left: 16, right: 16),
lib/src/screens/dashboard/widgets/solana_nft_tile_widget.dart new
+97
@@ -0,0 +1,97 @@
1 +import 'package:flutter/material.dart';
2 +import 'package:cake_wallet/entities/solana_nft_asset_model.dart';
3 +import 'package:cake_wallet/routes.dart';
4 +import 'package:cake_wallet/src/screens/dashboard/pages/nft_details_page.dart';
5 +import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
6 +import 'package:cake_wallet/themes/extensions/balance_page_theme.dart';
7 +import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
8 +
9 +class SolanaNFTTileWidget extends StatelessWidget {
10 + const SolanaNFTTileWidget({super.key, required this.nftAsset});
11 +
12 + final SolanaNFTAssetModel nftAsset;
13 +
14 + @override
15 + Widget build(BuildContext context) {
16 + final balanceTheme = Theme.of(context).extension<BalancePageTheme>()!;
17 + final syncTheme = Theme.of(context).extension<SyncIndicatorTheme>()!;
18 +
19 + return InkWell(
20 + onTap: () {
21 + Navigator.pushNamed(
22 + context,
23 + Routes.nftDetailsPage,
24 + arguments: NFTDetailsPageArguments(
25 + isSolanaNFT: true,
26 + solanaNFTAssetModel: nftAsset,
27 + ),
28 + );
29 + },
30 + child: Container(
31 + width: double.infinity,
32 + margin: const EdgeInsets.symmetric(horizontal: 16),
33 + padding: const EdgeInsets.all(8),
34 + decoration: BoxDecoration(
35 + borderRadius: BorderRadius.circular(16.0),
36 + border: Border.all(
37 + color: balanceTheme.cardBorderColor,
38 + width: 1,
39 + ),
40 + color: syncTheme.syncedBackgroundColor,
41 + ),
42 + child: Row(
43 + children: [
44 + Container(
45 + height: 100,
46 + width: 100,
47 + margin: const EdgeInsets.all(8),
48 + clipBehavior: Clip.hardEdge,
49 + decoration: BoxDecoration(
50 + borderRadius: BorderRadius.circular(16.0),
51 + border: Border.all(
52 + color: balanceTheme.cardBorderColor,
53 + width: 1,
54 + ),
55 + color: syncTheme.syncedBackgroundColor,
56 + ),
57 + child: CakeImageWidget(
58 + imageUrl: nftAsset.imageOriginalUrl,
59 + ),
60 + ),
61 + Expanded(
62 + child: Column(
63 + mainAxisAlignment: MainAxisAlignment.center,
64 + crossAxisAlignment: CrossAxisAlignment.start,
65 + children: [
66 + Text(
67 + 'Symbol: ${nftAsset.symbol ?? '---'}',
68 + style: TextStyle(
69 + fontSize: 12,
70 + fontFamily: 'Lato',
71 + fontWeight: FontWeight.w400,
72 + color: balanceTheme.labelTextColor,
73 + height: 1,
74 + ),
75 + ),
76 + const SizedBox(height: 8),
77 + Text(
78 + (nftAsset.name?.isNotEmpty ?? false)
79 + ? nftAsset.name!
80 + : (nftAsset.symbol ?? '---'),
81 + style: TextStyle(
82 + fontSize: 20,
83 + fontFamily: 'Lato',
84 + fontWeight: FontWeight.w900,
85 + color: balanceTheme.assetTitleColor,
86 + height: 1,
87 + ),
88 + ),
89 + ],
90 + ),
91 + )
92 + ],
93 + ),
94 + ),
95 + );
96 + }
97 +}
lib/view_model/dashboard/nft_view_model.dart
+103 -45
@@ -2,8 +2,10 @@ import 'dart:convert';
2 import 'dart:developer';
3
4 import 'package:cake_wallet/core/wallet_connect/wc_bottom_sheet_service.dart';
5 +import 'package:cake_wallet/entities/solana_nft_asset_model.dart';
6 import 'package:cake_wallet/reactions/wallet_connect.dart';
7 import 'package:cake_wallet/src/screens/wallet_connect/widgets/message_display_widget.dart';
8 +import 'package:cw_core/wallet_type.dart';
9 import 'package:http/http.dart' as http;
10 import 'package:mobx/mobx.dart';
11 import 'package:cake_wallet/.secrets.g.dart' as secrets;
@@ -19,7 +21,8 @@ abstract class NFTViewModelBase with Store {
21 NFTViewModelBase(this.appStore, this.bottomSheetService)
22 : isLoading = false,
23 isImportNFTLoading = false,
22 - nftAssetByWalletModels = ObservableList() {
24 + nftAssetByWalletModels = ObservableList(),
25 + solanaNftAssetModels = ObservableList() {
26 getNFTAssetByWallet();
27
28 reaction((_) => appStore.wallet, (_) => getNFTAssetByWallet());
@@ -36,31 +39,44 @@ abstract class NFTViewModelBase with Store {
39
40 ObservableList<NFTAssetModel> nftAssetByWalletModels;
41
42 + ObservableList<SolanaNFTAssetModel> solanaNftAssetModels;
43 +
44 @action
45 Future<void> getNFTAssetByWallet() async {
41 - if (!isEVMCompatibleChain(appStore.wallet!.type)) return;
46 + final walletType = appStore.wallet!.type;
47 +
48 + if (!isNFTACtivatedChain(walletType)) return;
49
50 final walletAddress = appStore.wallet!.walletInfo.address;
51 log('Fetching wallet NFTs for $walletAddress');
52
46 - final chainName = getChainNameBasedOnWalletType(appStore.wallet!.type);
53 + final chainName = getChainNameBasedOnWalletType(walletType);
54 // the [chain] refers to the chain network that the nft is on
55 // the [format] refers to the number format type of the responses
56 // the [normalizedMetadata] field is a boolean that determines if
57 // the response would include a json string of the NFT Metadata that can be decoded
58 // and used within the wallet
59 // the [excludeSpam] field is a boolean that determines if spam nfts be excluded from the response.
53 - final uri = Uri.https(
54 - 'deep-index.moralis.io',
55 - '/api/v2.2/$walletAddress/nft',
56 - {
57 - "chain": chainName,
58 - "format": "decimal",
59 - "media_items": "false",
60 - "exclude_spam": "true",
61 - "normalizeMetadata": "true",
62 - },
63 - );
60 +
61 + Uri uri;
62 + if (walletType == WalletType.solana) {
63 + uri = Uri.https(
64 + 'solana-gateway.moralis.io',
65 + '/account/$chainName/$walletAddress/nft',
66 + );
67 + } else {
68 + uri = Uri.https(
69 + 'deep-index.moralis.io',
70 + '/api/v2.2/$walletAddress/nft',
71 + {
72 + "chain": chainName,
73 + "format": "decimal",
74 + "media_items": "false",
75 + "exclude_spam": "true",
76 + "normalizeMetadata": "true",
77 + },
78 + );
79 + }
80
81 try {
82 isLoading = true;
@@ -73,13 +89,30 @@ abstract class NFTViewModelBase with Store {
89 },
90 );
91
76 - final decodedResponse = jsonDecode(response.body) as Map<String, dynamic>;
92 + final decodedResponse = jsonDecode(response.body);
93 +
94 + if (walletType == WalletType.solana) {
95 + final results = await Future.wait(
96 + (decodedResponse as List<dynamic>).map(
97 + (x) {
98 + final data = x as Map<String, dynamic>;
99 + final mint = data['mint'] as String? ?? '';
100 + return getSolanaNFTDetails(mint, chainName);
101 + },
102 + ).toList(),
103 + );
104 +
105 + solanaNftAssetModels.clear();
106
78 - final result = WalletNFTsResponseModel.fromJson(decodedResponse).result ?? [];
107 + solanaNftAssetModels.addAll(results);
108 + } else {
109 + final result =
110 + WalletNFTsResponseModel.fromJson(decodedResponse as Map<String, dynamic>).result ?? [];
111
80 - nftAssetByWalletModels.clear();
112 + nftAssetByWalletModels.clear();
113
82 - nftAssetByWalletModels.addAll(result);
114 + nftAssetByWalletModels.addAll(result);
115 + }
116
117 isLoading = false;
118 } catch (e) {
@@ -94,51 +127,76 @@ abstract class NFTViewModelBase with Store {
127 }
128 }
129
130 + Future<SolanaNFTAssetModel> getSolanaNFTDetails(String address, String chainName) async {
131 + final uri = Uri.https(
132 + 'solana-gateway.moralis.io',
133 + '/nft/$chainName/$address/metadata',
134 + );
135 +
136 + final response = await http.get(
137 + uri,
138 + headers: {
139 + "Accept": "application/json",
140 + "X-API-Key": secrets.moralisApiKey,
141 + },
142 + );
143 +
144 + final decodedResponse = jsonDecode(response.body) as Map<String, dynamic>;
145 +
146 + return SolanaNFTAssetModel.fromJson(decodedResponse);
147 + }
148 +
149 @action
98 - Future<void> importNFT(String tokenAddress, String tokenId) async {
150 + Future<void> importNFT(String tokenAddress, String? tokenId) async {
151 final chainName = getChainNameBasedOnWalletType(appStore.wallet!.type);
152 // the [chain] refers to the chain network that the nft is on
153 // the [format] refers to the number format type of the responses
154 // the [normalizedMetadata] field is a boolean that determines if
155 // the response would include a json string of the NFT Metadata that can be decoded
156 // and used within the wallet
105 - final uri = Uri.https(
106 - 'deep-index.moralis.io',
107 - '/api/v2.2/nft/$tokenAddress/$tokenId',
108 - {
109 - "chain": chainName,
110 - "format": "decimal",
111 - "media_items": "false",
112 - "normalizeMetadata": "true",
113 - },
114 - );
157
158 try {
159 isImportNFTLoading = true;
160
119 - final response = await http.get(
120 - uri,
121 - headers: {
122 - "Accept": "application/json",
123 - "X-API-Key": secrets.moralisApiKey,
124 - },
125 - );
126 -
127 - final decodedResponse = jsonDecode(response.body) as Map<String, dynamic>;
128 -
129 - final nftAsset = NFTAssetModel.fromJson(decodedResponse);
130 -
131 - nftAssetByWalletModels.add(nftAsset);
132 -
133 - isImportNFTLoading = false;
161 + if (appStore.wallet!.type == WalletType.solana) {
162 + final result = await getSolanaNFTDetails(tokenAddress, chainName);
163 +
164 + solanaNftAssetModels.add(result);
165 + } else {
166 + final uri = Uri.https(
167 + 'deep-index.moralis.io',
168 + '/api/v2.2/nft/$tokenAddress/$tokenId',
169 + {
170 + "chain": chainName,
171 + "format": "decimal",
172 + "media_items": "false",
173 + "normalizeMetadata": "true",
174 + },
175 + );
176 +
177 + final response = await http.get(
178 + uri,
179 + headers: {
180 + "Accept": "application/json",
181 + "X-API-Key": secrets.moralisApiKey,
182 + },
183 + );
184 +
185 + final decodedResponse = jsonDecode(response.body) as Map<String, dynamic>;
186 +
187 + final nftAsset = NFTAssetModel.fromJson(decodedResponse);
188 +
189 + nftAssetByWalletModels.add(nftAsset);
190 + }
191 } catch (e) {
135 - isImportNFTLoading = false;
192 bottomSheetService.queueBottomSheet(
193 isModalDismissible: true,
194 widget: BottomSheetMessageDisplayWidget(
195 message: e.toString(),
196 ),
197 );
198 + } finally {
199 + isImportNFTLoading = false;
200 }
201 }
202 }
res/values/strings_ar.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "يغلق",
149 "coin_control": "التحكم في العملة (اختياري)",
150 "cold_or_recover_wallet": "أضف محفظة للقراءة فقط من Cupcake أو محفظة باردة أو استعاد محفظة ورقية",
151 + "collection_address": "عنوان التجميع",
152 + "collection_description": "وصف المجموعة",
153 + "collection_name": "اسم المجموعة",
154 "color_theme": "سمة اللون",
155 "commit_transaction_amount_fee": "تنفيذ الصفقة\nالمبلغ: ${amount}\nالرسوم: ${fee}",
156 "confirm": "تأكيد",
@@ -430,6 +433,7 @@
433 "methods": " ﻕﺮﻃُ",
434 "min_amount": "الحد الأدنى: ${value}",
435 "min_value": "الحد الأدنى: ${value} ${currency}",
436 + "mint_address": "عنوان النعناع",
437 "minutes_to_pin_code": "${minutes} دقيقة",
438 "mm": "MM",
439 "modify_2fa": "تعديل 2 عامل المصادقة",
@@ -457,6 +461,7 @@
461 "new_wallet": "إنشاء محفظة جديدة",
462 "newConnection": "ﺪﻳﺪﺟ ﻝﺎﺼﺗﺍ",
463 "no_cards_found": "لم يتم العثور على بطاقات",
464 + "no_extra_detail": "لا توجد تفاصيل إضافية متاحة",
465 "no_id_needed": "لا حاجة لID!",
466 "no_id_required": "لا ID مطلوب. اشحن وانفق في أي مكان",
467 "no_providers_available": "لا مقدمي الخدمات المتاحة",
@@ -675,8 +680,8 @@
680 "select_destination": ".ﻲﻃﺎﻴﺘﺣﻻﺍ ﺦﺴﻨﻟﺍ ﻒﻠﻣ ﺔﻬﺟﻭ ﺪﻳﺪﺤﺗ ءﺎﺟﺮﻟﺍ",
681 "select_hw_account_below": "الرجاء تحديد حساب الاستعادة أدناه:",
682 "select_sell_provider_notice": ".ﻖﻴﺒﻄﺘﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ ﻲﻓ ﻚﺑ ﺹﺎﺨﻟﺍ ﻲﺿﺍﺮﺘﻓﻻﺍ ﻊﻴﺒﻟﺍ ﺩﻭﺰﻣ ﻦﻴﻴﻌﺗ ﻖﻳﺮﻃ ﻦﻋ ﺔﺷﺎﺸﻟﺍ ﻩﺬﻫ ﻲﻄﺨﺗ",
678 - "selected_trocador_provider": "مزود تروكادور المختار",
683 "select_your_country": "الرجاء تحديد بلدك",
684 + "selected_trocador_provider": "مزود تروكادور المختار",
685 "sell": "بيع",
686 "sell_alert_content": ".ﺎﻬﻴﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻭﺃ Litecoin ﻭﺃ Ethereum ﻭﺃ Bitcoin ﺔﻈﻔﺤﻣ ءﺎﺸﻧﺇ ﻰﺟﺮﻳ .Litecoin ﻭ",
687 "sell_monero_com_alert_content": "بيع Monero غير مدعوم حتى الآن",
res/values/strings_bg.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "затвори",
149 "coin_control": "Управление на монетите (не е задължително)",
150 "cold_or_recover_wallet": "Добавете портфейл само за четене от Cupcake или студен портфейл или възстановете хартиен портфейл",
151 + "collection_address": "Адрес на колекцията",
152 + "collection_description": "Описание на колекцията",
153 + "collection_name": "Име на колекцията",
154 "color_theme": "Цвят",
155 "commit_transaction_amount_fee": "Изпълняване на транзакция\nСума: ${amount}\nТакса: ${fee}",
156 "confirm": "Потвърждаване",
@@ -430,6 +433,7 @@
433 "methods": "Методи",
434 "min_amount": "Мин: ${value}",
435 "min_value": "Мин: ${value} ${currency}",
436 + "mint_address": "Адрес на мента",
437 "minutes_to_pin_code": "${minute} минути",
438 "mm": "мм",
439 "modify_2fa": "Модифициране на тортата 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Нов портфейл",
462 "newConnection": "Нова връзка",
463 "no_cards_found": "Не са намерени карти",
464 + "no_extra_detail": "Няма налични допълнителни подробности",
465 "no_id_needed": "Без нужда от документ за самоличност!",
466 "no_id_required": "Без нужда от документ за самоличност. Използвайте навсякъде",
467 "no_providers_available": "Няма налични доставчици",
@@ -675,8 +680,8 @@
680 "select_destination": "Моля, изберете дестинация за архивния файл.",
681 "select_hw_account_below": "Моля, изберете кой акаунт да възстановите по -долу:",
682 "select_sell_provider_notice": "Изберете доставчик на продажба по-горе. Можете да пропуснете този екран, като зададете своя доставчик на продажба по подразбиране в настройките на приложението.",
678 - "selected_trocador_provider": "Избран доставчик на трокадор",
683 "select_your_country": "Моля, изберете вашата страна",
684 + "selected_trocador_provider": "Избран доставчик на трокадор",
685 "sell": "Продаване",
686 "sell_alert_content": "В момента поддържаме само продажбата на Bitcoin, Ethereum и Litecoin. Моля, създайте или превключете към своя портфейл Bitcoin, Ethereum или Litecoin.",
687 "sell_monero_com_alert_content": "Продажбата на Monero все още не се поддържа",
res/values/strings_cs.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "zavřít",
149 "coin_control": "Volba mincí (nepovinné)",
150 "cold_or_recover_wallet": "Přidejte peněženku pouze pro čtení z Cupcake nebo studené peněženky nebo obnovte papírovou peněženku",
151 + "collection_address": "Sběrná adresa",
152 + "collection_description": "Popis sbírky",
153 + "collection_name": "Název sbírky",
154 "color_theme": "Barevný motiv",
155 "commit_transaction_amount_fee": "Odeslat transakci\nČástka: ${amount}\nPoplatek: ${fee}",
156 "confirm": "Potvrdit",
@@ -430,6 +433,7 @@
433 "methods": "Metody",
434 "min_amount": "Min: ${value}",
435 "min_value": "Min: ${value} ${currency}",
436 + "mint_address": "Adresa máty",
437 "minutes_to_pin_code": "${minute} minutách",
438 "mm": "MM",
439 "modify_2fa": "Upravte Cake 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Nová peněženka",
462 "newConnection": "Nové připojení",
463 "no_cards_found": "Žádné karty nenalezeny",
464 + "no_extra_detail": "K dispozici nejsou žádné další podrobnosti",
465 "no_id_needed": "Žádné ID není potřeba!",
466 "no_id_required": "Žádní ID není potřeba. Dobijte si a utrácejte kdekoliv",
467 "no_providers_available": "Žádní poskytovatelé jsou k dispozici",
@@ -675,8 +680,8 @@
680 "select_destination": "Vyberte cíl pro záložní soubor.",
681 "select_hw_account_below": "Níže vyberte, který účet chcete obnovit:",
682 "select_sell_provider_notice": "Výše vyberte poskytovatele prodeje. Tuto obrazovku můžete přeskočit nastavením výchozího poskytovatele prodeje v nastavení aplikace.",
678 - "selected_trocador_provider": "Vybraný poskytovatel Trocador",
683 "select_your_country": "Vyberte prosím svou zemi",
684 + "selected_trocador_provider": "Vybraný poskytovatel Trocador",
685 "sell": "Prodat",
686 "sell_alert_content": "V současné době podporujeme pouze prodej bitcoinů, etherea a litecoinů. Vytvořte nebo přepněte na svou bitcoinovou, ethereum nebo litecoinovou peněženku.",
687 "sell_monero_com_alert_content": "Prodej Monero zatím není podporován",
res/values/strings_de.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Schließen",
149 "coin_control": "Coin Control (optional)",
150 "cold_or_recover_wallet": "Fügen Sie eine schreibgeschützte Wallet von Cupcake, eine Cold-Wallet oder eine Papier-Wallet hinzu.",
151 + "collection_address": "Sammeladresse",
152 + "collection_description": "Sammlung Beschreibung",
153 + "collection_name": "Sammlungsname",
154 "color_theme": "Farbthema",
155 "commit_transaction_amount_fee": "Transaktion absenden\nBetrag: ${amount}\nGebühr: ${fee}",
156 "confirm": "Bestätigen",
@@ -430,6 +433,7 @@
433 "methods": "Methoden",
434 "min_amount": "Min: ${value}",
435 "min_value": "Min: ${value} ${currency}",
436 + "mint_address": "Minzadresse",
437 "minutes_to_pin_code": "${minute} Minuten",
438 "mm": "MM",
439 "modify_2fa": "Cake 2FA ändern",
@@ -457,6 +461,7 @@
461 "new_wallet": "Neue Wallet",
462 "newConnection": "Neue Verbindung",
463 "no_cards_found": "Keine Karten gefunden",
464 + "no_extra_detail": "Keine zusätzlichen Details verfügbar",
465 "no_id_needed": "Keine ID erforderlich!",
466 "no_id_required": "Keine ID erforderlich. Upgraden und überall ausgeben",
467 "no_providers_available": "Keine Anbieter verfügbar",
@@ -676,8 +681,8 @@
681 "select_destination": "Bitte wählen Sie das Ziel für die Sicherungsdatei aus.",
682 "select_hw_account_below": "Bitte wählen Sie unten, welches Konto unten wiederhergestellt werden soll:",
683 "select_sell_provider_notice": "Wählen Sie oben einen Verkaufsanbieter aus. Sie können diesen Bildschirm überspringen, indem Sie in den App-Einstellungen Ihren Standard-Verkaufsanbieter festlegen.",
679 - "selected_trocador_provider": "Ausgewählter Trocador -Anbieter",
684 "select_your_country": "Bitte wählen Sie Ihr Land aus",
685 + "selected_trocador_provider": "Ausgewählter Trocador -Anbieter",
686 "sell": "Verkaufen",
687 "sell_alert_content": "Wir unterstützen derzeit nur den Verkauf von Bitcoin, Ethereum und Litecoin. Bitte erstellen Sie Ihr Bitcoin-, Ethereum- oder Litecoin-Wallet oder wechseln Sie zu diesem.",
688 "sell_monero_com_alert_content": "Der Verkauf von Monero wird noch nicht unterstützt",
res/values/strings_en.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Close",
149 "coin_control": "Coin control (optional)",
150 "cold_or_recover_wallet": "Add a read-only wallet from Cupcake or a cold wallet or recover a paper wallet",
151 + "collection_address": "Collection Address",
152 + "collection_description": "Collection Description",
153 + "collection_name": "Collection Name",
154 "color_theme": "Color theme",
155 "commit_transaction_amount_fee": "Commit transaction\nAmount: ${amount}\nFee: ${fee}",
156 "confirm": "Confirm",
@@ -430,6 +433,7 @@
433 "methods": "Methods",
434 "min_amount": "Min: ${value}",
435 "min_value": "Min: ${value} ${currency}",
436 + "mint_address": "Mint Address",
437 "minutes_to_pin_code": "${minute} minutes",
438 "mm": "MM",
439 "modify_2fa": "Modify Cake 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "New Wallet",
462 "newConnection": "New Connection",
463 "no_cards_found": "No cards found",
464 + "no_extra_detail": "No extra details available",
465 "no_id_needed": "No ID needed!",
466 "no_id_required": "No ID required. Top up and spend anywhere",
467 "no_providers_available": "No providers available",
@@ -676,8 +681,8 @@
681 "select_destination": "Please select destination for the backup file.",
682 "select_hw_account_below": "Please select which account to restore below:",
683 "select_sell_provider_notice": "Select a sell provider above. You can skip this screen by setting your default sell provider in app settings.",
679 - "selected_trocador_provider": "selected Trocador provider",
684 "select_your_country": "Please select your country",
685 + "selected_trocador_provider": "selected Trocador provider",
686 "sell": "Sell",
687 "sell_alert_content": "We currently only support the sale of Bitcoin, Ethereum and Litecoin. Please create or switch to your Bitcoin, Ethereum or Litecoin wallet.",
688 "sell_monero_com_alert_content": "Selling Monero is not supported yet",
res/values/strings_es.arb
+5
@@ -148,6 +148,9 @@
148 "close": "Cerca",
149 "coin_control": "Control de monedas (opcional)",
150 "cold_or_recover_wallet": "Agregue una billetera de solo lectura de Cupcake o una billetera en frío o recupere una billetera de papel",
151 + "collection_address": "Dirección de recolección",
152 + "collection_description": "Descripción de la colección",
153 + "collection_name": "Nombre de colección",
154 "color_theme": "Tema de color",
155 "commit_transaction_amount_fee": "Confirmar transacción\nCantidad: ${amount}\nCuota: ${fee}",
156 "confirm": "Confirmar",
@@ -430,6 +433,7 @@
433 "methods": "Métodos",
434 "min_amount": "Mínimo: ${value}",
435 "min_value": "Min: ${value} ${currency}",
436 + "mint_address": "Dirección menta",
437 "minutes_to_pin_code": "${minute} minutos",
438 "mm": "mm",
439 "modify_2fa": "Modificar 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Nueva billetera",
462 "newConnection": "Nueva conexión",
463 "no_cards_found": "No se encuentran cartas",
464 + "no_extra_detail": "No hay detalles adicionales disponibles",
465 "no_id_needed": "¡No se necesita identificación!",
466 "no_id_required": "No se requiere identificación. Recarga y gaste en cualquier lugar",
467 "no_providers_available": "No hay proveedores disponibles",
res/values/strings_fr.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Fermer",
149 "coin_control": "Contrôle optionnel des pièces (coins)",
150 "cold_or_recover_wallet": "Ajoutez un portefeuille en lecture seule de Cupcake ou d'un portefeuille froid ou récupérez un portefeuille en papier",
151 + "collection_address": "Adresse de collecte",
152 + "collection_description": "Description de la collection",
153 + "collection_name": "Nom de collection",
154 "color_theme": "Thème",
155 "commit_transaction_amount_fee": "Valider la transaction\nMontant : ${amount}\nFrais : ${fee}",
156 "confirm": "Confirmer",
@@ -430,6 +433,7 @@
433 "methods": "Méthodes",
434 "min_amount": "Min : ${value}",
435 "min_value": "Min: ${value} ${currency}",
436 + "mint_address": "Adresse de la menthe",
437 "minutes_to_pin_code": "${minute} minutes",
438 "mm": "MM",
439 "modify_2fa": "Modifier les paramètres Cake 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Nouveau Portefeuille (Wallet)",
462 "newConnection": "Nouvelle connexion",
463 "no_cards_found": "Pas de cartes trouvées",
464 + "no_extra_detail": "Aucun détail supplémentaire disponible",
465 "no_id_needed": "Aucune pièce d'identité nécessaire !",
466 "no_id_required": "Aucune pièce d'identité requise. Rechargez et dépensez n'importe où",
467 "no_providers_available": "Aucun fournisseur disponible",
@@ -675,8 +680,8 @@
680 "select_destination": "Veuillez sélectionner la destination du fichier de sauvegarde.",
681 "select_hw_account_below": "Veuillez sélectionner le compte à restaurer ci-dessous:",
682 "select_sell_provider_notice": "Sélectionnez un fournisseur de vente ci-dessus. Vous pouvez ignorer cet écran en définissant votre fournisseur de vente par défaut dans les paramètres de l'application.",
678 - "selected_trocador_provider": "fournisseur de trocador sélectionné",
683 "select_your_country": "Veuillez sélectionner votre pays",
684 + "selected_trocador_provider": "fournisseur de trocador sélectionné",
685 "sell": "Vendre",
686 "sell_alert_content": "Nous ne prenons actuellement en charge que la vente de Bitcoin, Ethereum et Litecoin. Veuillez créer ou basculer vers votre portefeuille Bitcoin, Ethereum ou Litecoin.",
687 "sell_monero_com_alert_content": "La vente de Monero n'est pas encore prise en charge",
res/values/strings_ha.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Rufa",
149 "coin_control": "Sarrafa tsabar kuɗi (na zaɓi)",
150 "cold_or_recover_wallet": "Aara wani walat mai karanta-kawai Cupcake ko walat ɗin mai sanyi ko murmurewa takarda takarda",
151 + "collection_address": "Adireshin tarin tarin",
152 + "collection_description": "Bayanin tarin",
153 + "collection_name": "Sunan tattara",
154 "color_theme": "Jigon launi",
155 "commit_transaction_amount_fee": "Aikata ciniki\nAdadi: ${amount}\nKuda: ${fee}",
156 "confirm": "Tabbatar",
@@ -430,6 +433,7 @@
433 "methods": "Hanyoyin",
434 "min_amount": "Min: ${value}",
435 "min_value": "Min: ${value} ${currency}",
436 + "mint_address": "Adireshin Mint",
437 "minutes_to_pin_code": "${minute} minti",
438 "mm": "MM",
439 "modify_2fa": "Gyara Cake 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Sabuwar Wallet",
462 "newConnection": "Sabuwar Haɗi",
463 "no_cards_found": "Babu katunan da aka samo",
464 + "no_extra_detail": "Babu ƙarin cikakkun bayanai",
465 "no_id_needed": "Babu ID da ake buƙata!",
466 "no_id_required": "Babu ID da ake buƙata. Yi da kuma ciyar a ko'ina",
467 "no_providers_available": "Babu masu samar da wadatar",
@@ -677,8 +682,8 @@
682 "select_destination": "Da fatan za a zaɓi wurin da za a yi wa madadin fayil ɗin.",
683 "select_hw_account_below": "Da fatan za a zabi wanda asusun zai gyara a ƙasa:",
684 "select_sell_provider_notice": "Zaɓi mai bada siyarwa a sama. Kuna iya tsallake wannan allon ta saita mai bada siyar da ku a cikin saitunan app.",
680 - "selected_trocador_provider": "Zabi mai bada TORACAD",
685 "select_your_country": "Da fatan za a zabi ƙasarku",
686 + "selected_trocador_provider": "Zabi mai bada TORACAD",
687 "sell": "sayar",
688 "sell_alert_content": "A halin yanzu muna tallafawa kawai siyar da Bitcoin, Ethereum da Litecoin. Da fatan za a ƙirƙiri ko canza zuwa walat ɗin ku na Bitcoin, Ethereum ko Litecoin.",
689 "sell_monero_com_alert_content": "Selling Monero bai sami ƙarshen mai bukatar samun ba",
res/values/strings_hi.arb
+7 -2
@@ -148,6 +148,9 @@
148 "close": "बंद करना",
149 "coin_control": "सिक्का नियंत्रण (वैकल्पिक)",
150 "cold_or_recover_wallet": "Cupcake या एक कोल्ड वॉलेट से एक रीड-ओनली वॉलेट जोड़ें या एक पेपर वॉलेट को पुनर्प्राप्त करें",
151 + "collection_address": "संग्रह पता",
152 + "collection_description": "संग्रह विवरण",
153 + "collection_name": "संग्रह नाम",
154 "color_theme": "रंग विषय",
155 "commit_transaction_amount_fee": "लेन-देन करें\nरकम: ${amount}\nशुल्क: ${fee}",
156 "confirm": "की पुष्टि करें",
@@ -430,6 +433,7 @@
433 "methods": "तरीकों",
434 "min_amount": "न्यूनतम: ${value}",
435 "min_value": "मिन: ${value} ${currency}",
436 + "mint_address": "टकसाल पता",
437 "minutes_to_pin_code": "${minute} मिनट",
438 "mm": "एमएम",
439 "modify_2fa": "केक 2FA संशोधित करें",
@@ -457,6 +461,7 @@
461 "new_wallet": "नया बटुआ",
462 "newConnection": "नया कनेक्शन",
463 "no_cards_found": "कोई कार्ड नहीं मिला",
464 + "no_extra_detail": "कोई अतिरिक्त विवरण उपलब्ध नहीं है",
465 "no_id_needed": "कोई आईडी नहीं चाहिए!",
466 "no_id_required": "कोई आईडी आवश्यक नहीं है। टॉप अप करें और कहीं भी खर्च करें",
467 "no_providers_available": "कोई प्रदाता उपलब्ध नहीं है",
@@ -509,8 +514,8 @@
514 "paste": "पेस्ट करें",
515 "pause_wallet_creation": "हेवन वॉलेट बनाने की क्षमता फिलहाल रुकी हुई है।",
516 "payment_id": "भुगतान ID: ",
512 - "payment_was_received": "आपका भुगतान प्राप्त हुआ था।",
517 "Payment_was_received": "आपका भुगतान प्राप्त हो गया था।",
518 + "payment_was_received": "आपका भुगतान प्राप्त हुआ था।",
519 "pending": " (अपूर्ण)",
520 "percentageOf": "${amount} का",
521 "pin_at_top": "शीर्ष पर ${token} पिन करें",
@@ -677,8 +682,8 @@
682 "select_destination": "कृपया बैकअप फ़ाइल के लिए गंतव्य का चयन करें।",
683 "select_hw_account_below": "कृपया नीचे पुनर्स्थापित करने के लिए कौन सा खाता चुनें:",
684 "select_sell_provider_notice": "ऊपर एक विक्रय प्रदाता का चयन करें। आप ऐप सेटिंग में अपना डिफ़ॉल्ट विक्रय प्रदाता सेट करके इस स्क्रीन को छोड़ सकते हैं।",
680 - "selected_trocador_provider": "चयनित ट्रोकैडर प्रदाता",
685 "select_your_country": "कृपया अपने देश का चयन करें",
686 + "selected_trocador_provider": "चयनित ट्रोकैडर प्रदाता",
687 "sell": "बेचना",
688 "sell_alert_content": "हम वर्तमान में केवल बिटकॉइन, एथेरियम और लाइटकॉइन की बिक्री का समर्थन करते हैं। कृपया अपना बिटकॉइन, एथेरियम या लाइटकॉइन वॉलेट बनाएं या उसमें स्विच करें।",
689 "sell_monero_com_alert_content": "मोनेरो बेचना अभी तक समर्थित नहीं है",
res/values/strings_hr.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Zatvoriti",
149 "coin_control": "Kontrola novca (nije obavezno)",
150 "cold_or_recover_wallet": "Dodajte novčanik samo za čitanje od Cupcake ili hladnog novčanika ili oporavite papirni novčanik",
151 + "collection_address": "Adresa prikupljanja",
152 + "collection_description": "Zbirka Opis opisa",
153 + "collection_name": "Naziv kolekcije",
154 "color_theme": "Shema boja",
155 "commit_transaction_amount_fee": "Izvrši transakciju \nAmount: ${amount}\nFee: ${fee}",
156 "confirm": "Potvrdi",
@@ -430,6 +433,7 @@
433 "methods": "Metode",
434 "min_amount": "Minimalno: ${value}",
435 "min_value": "Min.: ${value} ${currency}",
436 + "mint_address": "Adresa metvice",
437 "minutes_to_pin_code": "${minute} minuta",
438 "mm": "MM",
439 "modify_2fa": "Izmijenite tortu 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Novi novčanik",
462 "newConnection": "Nova veza",
463 "no_cards_found": "Nisu pronađene kartice",
464 + "no_extra_detail": "Nema dostupnih dodatnih detalja",
465 "no_id_needed": "Nije potreban ID!",
466 "no_id_required": "Nije potreban ID. Nadopunite i potrošite bilo gdje",
467 "no_providers_available": "Nema dostupnih pružatelja usluga",
@@ -675,8 +680,8 @@
680 "select_destination": "Odaberite odredište za datoteku sigurnosne kopije.",
681 "select_hw_account_below": "Molimo odaberite koji će se račun vratiti u nastavku:",
682 "select_sell_provider_notice": "Gore odaberite pružatelja usluga prodaje. Ovaj zaslon možete preskočiti postavljanjem zadanog pružatelja usluga prodaje u postavkama aplikacije.",
678 - "selected_trocador_provider": "Odabrani pružatelj usluga trokadora",
683 "select_your_country": "Odaberite svoju zemlju",
684 + "selected_trocador_provider": "Odabrani pružatelj usluga trokadora",
685 "sell": "Prodavati",
686 "sell_alert_content": "Trenutno podržavamo samo prodaju Bitcoina, Ethereuma i Litecoina. Izradite ili prijeđite na svoj Bitcoin, Ethereum ili Litecoin novčanik.",
687 "sell_monero_com_alert_content": "Prodaja Monera još nije podržana",
res/values/strings_hy.arb
+5
@@ -148,6 +148,9 @@
148 "close": "Փակել",
149 "coin_control": "Մետաղադրամի վերահսկում (ըստ ցանկության)",
150 "cold_or_recover_wallet": "Cupcake կամ ցուրտ դրամապանակից ավելացնել միայն ընթերցված դրամապանակ կամ վերականգնել թղթի դրամապանակը",
151 + "collection_address": "Հավաքածուի հասցե",
152 + "collection_description": "Հավաքածուի նկարագրությունը",
153 + "collection_name": "Հավաքածուի անուն",
154 "color_theme": "Գույների տեսք",
155 "commit_transaction_amount_fee": "Հաստատել գործարքը\nՍկզբնական գումար. ${amount}\nՄիջնորդավճար. ${fee}",
156 "confirm": "Հաստատել",
@@ -430,6 +433,7 @@
433 "methods": "Մեթոդներ",
434 "min_amount": "Նվազը: ${value}",
435 "min_value": "Նվազը: ${value} ${currency}",
436 + "mint_address": "Անանուխի հասցե",
437 "minutes_to_pin_code": "${minute} րոպե",
438 "mm": "ԱԱ",
439 "modify_2fa": "Փոփոխել Cake 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Նոր դրամապանակ",
462 "newConnection": "Նոր կապ",
463 "no_cards_found": "Ոչ մի քարտ չի գտնվել",
464 + "no_extra_detail": "Լրացուցիչ մանրամասներ մատչելի չեն",
465 "no_id_needed": "Ոչ մի փաստաթուղթ չի պահանջվում!",
466 "no_id_required": "Ոչ մի փաստաթուղթ չի պահանջվում։ Լրացրեք և ծախսեք ամենուր",
467 "no_relay_on_domain": "Տիրույթի համար ընդունող չկա կամ անհասանելի է։ Խնդրում ենք ընտրել ընդունող",
res/values/strings_id.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Menutup",
149 "coin_control": "Kontrol koin (opsional)",
150 "cold_or_recover_wallet": "Tambahkan dompet hanya baca dari Cupcake atau dompet dingin atau memulihkan dompet kertas",
151 + "collection_address": "Alamat Koleksi",
152 + "collection_description": "Deskripsi Koleksi",
153 + "collection_name": "Nama Koleksi",
154 "color_theme": "Tema warna",
155 "commit_transaction_amount_fee": "Lakukan transaksi\nJumlah: ${amount}\nBiaya: ${fee}",
156 "confirm": "Konfirmasi",
@@ -430,6 +433,7 @@
433 "methods": "Metode",
434 "min_amount": "Min: ${value}",
435 "min_value": "Min: ${value} ${currency}",
436 + "mint_address": "Alamat mint",
437 "minutes_to_pin_code": "${minute} menit",
438 "mm": "MM",
439 "modify_2fa": "Ubah Kue 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Dompet Baru",
462 "newConnection": "Koneksi Baru",
463 "no_cards_found": "Tidak ada kartu yang ditemukan",
464 + "no_extra_detail": "Tidak ada detail tambahan yang tersedia",
465 "no_id_needed": "Tidak perlu ID!",
466 "no_id_required": "Tidak perlu ID. Isi ulang dan belanja di mana saja",
467 "no_providers_available": "Tidak ada penyedia yang tersedia",
@@ -678,8 +683,8 @@
683 "select_destination": "Silakan pilih tujuan untuk file cadangan.",
684 "select_hw_account_below": "Pilih akun mana yang akan dikembalikan di bawah ini:",
685 "select_sell_provider_notice": "Pilih penyedia jual di atas. Anda dapat melewati layar ini dengan mengatur penyedia penjualan default Anda di pengaturan aplikasi.",
681 - "selected_trocador_provider": "Penyedia Trocador Terpilih",
686 "select_your_country": "Pilih negara Anda",
687 + "selected_trocador_provider": "Penyedia Trocador Terpilih",
688 "sell": "Jual",
689 "sell_alert_content": "Saat ini kami hanya mendukung penjualan Bitcoin, Ethereum, dan Litecoin. Harap buat atau alihkan ke dompet Bitcoin, Ethereum, atau Litecoin Anda.",
690 "sell_monero_com_alert_content": "Menjual Monero belum didukung",
res/values/strings_it.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Chiudi",
149 "coin_control": "Controllo valute (opzionale)",
150 "cold_or_recover_wallet": "Aggiungi un portafoglio di sola lettura da Cupcake o un cold wallet o recupera un portafoglio di carta",
151 + "collection_address": "Indirizzo di raccolta",
152 + "collection_description": "Descrizione della raccolta",
153 + "collection_name": "Nome della raccolta",
154 "color_theme": "Colore tema",
155 "commit_transaction_amount_fee": "Invia transazione\nAmmontare: ${amount}\nCommissione: ${fee}",
156 "confirm": "Conferma",
@@ -430,6 +433,7 @@
433 "methods": "Metodi",
434 "min_amount": "Min: ${value}",
435 "min_value": "Min: ${value} ${currency}",
436 + "mint_address": "Indirizzo di menta",
437 "minutes_to_pin_code": "${minute} minuti",
438 "mm": "mm",
439 "modify_2fa": "Modifica Cake 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Nuovo portafoglio",
462 "newConnection": "Nuova connessione",
463 "no_cards_found": "Nessuna carta trovata",
464 + "no_extra_detail": "Nessun dettaglio extra disponibile",
465 "no_id_needed": "Nessun ID necessario!",
466 "no_id_required": "Nessun ID richiesto. Ricarica e spendi ovunque",
467 "no_providers_available": "Nessun fornitore disponibile",
@@ -674,10 +679,10 @@
679 "select_backup_file": "Seleziona file di backup",
680 "select_buy_provider_notice": "Seleziona un provider di acquisto sopra. È possibile saltare questa schermata impostando il provider di acquisto predefinito nelle impostazioni dell'app.",
681 "select_destination": "Seleziona la destinazione per il file di backup.",
677 - "selected_trocador_provider": "Provider di Trocador selezionato",
682 "select_hw_account_below": "Seleziona quale account ripristinare:",
683 "select_sell_provider_notice": "Seleziona un provider di vendita sopra. Puoi saltare questa schermata impostando il tuo provider di vendita predefinito nelle impostazioni dell'app.",
684 "select_your_country": "Seleziona il tuo paese",
685 + "selected_trocador_provider": "Provider di Trocador selezionato",
686 "sell": "Vendi",
687 "sell_alert_content": "Al momento supportiamo solo la vendita di Bitcoin, Ethereum e Litecoin. Crea o passa al tuo portafoglio Bitcoin, Ethereum o Litecoin.",
688 "sell_monero_com_alert_content": "La vendita di Monero non è ancora supportata",
res/values/strings_ja.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "近い",
149 "coin_control": "コインコントロール(オプション)",
150 "cold_or_recover_wallet": "Cupcakeまたはコールドウォレットから読み取り専用ウォレットを追加するか、紙の財布を回収する",
151 + "collection_address": "コレクションアドレス",
152 + "collection_description": "コレクションの説明",
153 + "collection_name": "コレクション名",
154 "color_theme": "カラーテーマ",
155 "commit_transaction_amount_fee": "トランザクションをコミット\n量: ${amount}\n費用: ${fee}",
156 "confirm": "確認する",
@@ -431,6 +434,7 @@
434 "methods": "メソッド",
435 "min_amount": "最小: ${value}",
436 "min_value": "分: ${value} ${currency}",
437 + "mint_address": "ミントアドレス",
438 "minutes_to_pin_code": "${minute} 分",
439 "mm": "んん",
440 "modify_2fa": "ケーキの 2FA を変更する",
@@ -458,6 +462,7 @@
462 "new_wallet": "新しいウォレット",
463 "newConnection": "新しい接続",
464 "no_cards_found": "カードは見つかりません",
465 + "no_extra_detail": "追加の詳細はありません",
466 "no_id_needed": "IDは必要ありません!",
467 "no_id_required": "IDは必要ありません。どこにでも補充して使用できます",
468 "no_providers_available": "プロバイダーは利用できません",
@@ -676,8 +681,8 @@
681 "select_destination": "バックアップファイルの保存先を選択してください。",
682 "select_hw_account_below": "以下に復元するアカウントを選択してください。",
683 "select_sell_provider_notice": "上記の販売プロバイダーを選択してください。アプリ設定でデフォルトの販売プロバイダーを設定することで、この画面をスキップできます。",
679 - "selected_trocador_provider": "選択したTrocadorプロバイダー",
684 "select_your_country": "あなたの国を選択してください",
685 + "selected_trocador_provider": "選択したTrocadorプロバイダー",
686 "sell": "売る",
687 "sell_alert_content": "現在、ビットコイン、イーサリアム、ライトコインの販売のみをサポートしています。ビットコイン、イーサリアム、またはライトコインのウォレットを作成するか、これらのウォレットに切り替えてください。",
688 "sell_monero_com_alert_content": "モネロの販売はまだサポートされていません",
res/values/strings_ko.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "닫다",
149 "coin_control": "코인 제어 (옵션)",
150 "cold_or_recover_wallet": "Cupcake 또는 차가운 지갑에서 읽기 전용 지갑을 추가하거나 종이 지갑을 복구하십시오.",
151 + "collection_address": "수집 주소",
152 + "collection_description": "컬렉션 설명",
153 + "collection_name": "수집 이름",
154 "color_theme": "색상 테마",
155 "commit_transaction_amount_fee": "커밋 거래\n양: ${amount}\n보수: ${fee}",
156 "confirm": "확인",
@@ -430,6 +433,7 @@
433 "methods": "행동 양식",
434 "min_amount": "최소: ${value}",
435 "min_value": "최소: ${value} ${currency}",
436 + "mint_address": "민트 주소",
437 "minutes_to_pin_code": "${minute}분",
438 "mm": "mm",
439 "modify_2fa": "수정 케이크 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "새 월렛",
462 "newConnection": "새로운 연결",
463 "no_cards_found": "카드를 찾지 못했습니다",
464 + "no_extra_detail": "추가 세부 정보가 없습니다",
465 "no_id_needed": "ID가 필요하지 않습니다!",
466 "no_id_required": "신분증이 필요하지 않습니다. 충전하고 어디에서나 사용하세요",
467 "no_providers_available": "제공되는 제공자가 없습니다",
@@ -675,8 +680,8 @@
680 "select_destination": "백업 파일의 대상을 선택하십시오.",
681 "select_hw_account_below": "아래를 복원 할 계정을 선택하십시오.",
682 "select_sell_provider_notice": "위에서 판매 공급자를 선택하세요. 앱 설정에서 기본 판매 공급자를 설정하면 이 화면을 건너뛸 수 있습니다.",
678 - "selected_trocador_provider": "선정 된 트로 코더 제공 업체",
683 "select_your_country": "국가를 선택하십시오",
684 + "selected_trocador_provider": "선정 된 트로 코더 제공 업체",
685 "sell": "팔다",
686 "sell_alert_content": "현재 Bitcoin, Ethereum 및 Litecoin의 판매만 지원합니다. Bitcoin, Ethereum 또는 Litecoin 지갑을 생성하거나 전환하십시오.",
687 "sell_monero_com_alert_content": "지원되지 않습니다.",
res/values/strings_my.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "အနီးကပ်",
149 "coin_control": "အကြွေစေ့ထိန်းချုပ်မှု (ချန်လှပ်ထားနိုင်သည်)",
150 "cold_or_recover_wallet": "Cupcake သို့မဟုတ်အအေးပိုက်ဆံအိတ်မှဖတ်ရန်သာပိုက်ဆံအိတ်တစ်ခုထည့်ပါသို့မဟုတ်စက္ကူပိုက်ဆံအိတ်ကိုပြန်လည်ရယူပါ",
151 + "collection_address": "စုဆောင်းမှုလိပ်စာ",
152 + "collection_description": "စုဆောင်းခြင်းဖော်ပြချက်",
153 + "collection_name": "စုဆောင်းခြင်းအမည်",
154 "color_theme": "အရောင်အပြင်အဆင်",
155 "commit_transaction_amount_fee": "ငွေလွှဲခြင်း\nပမာဏ- ${amount}\nအခကြေးငွေ- ${fee}",
156 "confirm": "အတည်ပြုပါ။",
@@ -430,6 +433,7 @@
433 "methods": "နည်းလမ်းများ",
434 "min_amount": "အနည်းဆုံး- ${value}",
435 "min_value": "အနည်းဆုံး- ${value} ${currency}",
436 + "mint_address": "Mint လိပ်စာ",
437 "minutes_to_pin_code": "${minute} မိနစ်",
438 "mm": "MM",
439 "modify_2fa": "ကိတ်မုန့် 2FA ကို ပြင်ဆင်ပါ။",
@@ -457,6 +461,7 @@
461 "new_wallet": "ပိုက်ဆံအိတ်အသစ်",
462 "newConnection": "ချိတ်ဆက်မှုအသစ်",
463 "no_cards_found": "ကဒ်များမရှိပါ",
464 + "no_extra_detail": "အဘယ်သူမျှမအပိုအသေးစိတ်ကိုရရှိနိုင်",
465 "no_id_needed": "ID မလိုအပ်ပါ။",
466 "no_id_required": "ID မလိုအပ်ပါ။ ငွေဖြည့်ပြီး ဘယ်နေရာမဆို သုံးစွဲပါ။",
467 "no_providers_available": "မရရှိနိုင်ပါ",
@@ -675,8 +680,8 @@
680 "select_destination": "အရန်ဖိုင်အတွက် ဦးတည်ရာကို ရွေးပါ။",
681 "select_hw_account_below": "အောက်ဖော်ပြပါမည်သည့်အကောင့်ကိုရွေးပါ။",
682 "select_sell_provider_notice": "အထက်ဖော်ပြပါ အရောင်းဝန်ဆောင်မှုပေးသူကို ရွေးပါ။ အက်ပ်ဆက်တင်များတွင် သင်၏မူလရောင်းချပေးသူကို သတ်မှတ်ခြင်းဖြင့် ဤစခရင်ကို ကျော်နိုင်သည်။",
678 - "selected_trocador_provider": "ရွေးချယ်ထား Tracador ပံ့ပိုးပေး",
683 "select_your_country": "ကျေးဇူးပြု. သင့်နိုင်ငံကိုရွေးချယ်ပါ",
684 + "selected_trocador_provider": "ရွေးချယ်ထား Tracador ပံ့ပိုးပေး",
685 "sell": "ရောင်း",
686 "sell_alert_content": "ကျွန်ုပ်တို့သည် လက်ရှိတွင် Bitcoin၊ Ethereum နှင့် Litecoin ရောင်းချခြင်းကိုသာ ပံ့ပိုးပေးပါသည်။ သင်၏ Bitcoin၊ Ethereum သို့မဟုတ် Litecoin ပိုက်ဆံအိတ်ကို ဖန်တီးပါ သို့မဟုတ် ပြောင်းပါ။",
687 "sell_monero_com_alert_content": "Monero ရောင်းချခြင်းကို မပံ့ပိုးရသေးပါ။",
res/values/strings_nl.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Dichtbij",
149 "coin_control": "Muntcontrole (optioneel)",
150 "cold_or_recover_wallet": "Voeg een alleen-lezen portemonnee toe van Cupcake of een koude portemonnee of herstel een papieren portemonnee",
151 + "collection_address": "Verzameladres",
152 + "collection_description": "Verzamelingsbeschrijving",
153 + "collection_name": "Verzamelnaam",
154 "color_theme": "Kleur thema",
155 "commit_transaction_amount_fee": "Verricht transactie\nBedrag: ${amount}\nhonorarium: ${fee}",
156 "confirm": "Bevestigen",
@@ -430,6 +433,7 @@
433 "methods": "Methoden",
434 "min_amount": "Min: ${value}",
435 "min_value": "Min: ${value} ${currency}",
436 + "mint_address": "Muntadres",
437 "minutes_to_pin_code": "${minute} minuten",
438 "mm": "MM",
439 "modify_2fa": "Wijzig Cake 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Nieuwe portemonnee",
462 "newConnection": "Nieuwe verbinding",
463 "no_cards_found": "Geen kaarten gevonden",
464 + "no_extra_detail": "Geen extra details beschikbaar",
465 "no_id_needed": "Geen ID nodig!",
466 "no_id_required": "Geen ID vereist. Opwaarderen en overal uitgeven",
467 "no_providers_available": "Geen providers beschikbaar",
@@ -675,8 +680,8 @@
680 "select_destination": "Selecteer de bestemming voor het back-upbestand.",
681 "select_hw_account_below": "Selecteer welk account u hieronder moet herstellen:",
682 "select_sell_provider_notice": "Selecteer hierboven een verkoopaanbieder. U kunt dit scherm overslaan door uw standaardverkoopprovider in te stellen in de app-instellingen.",
678 - "selected_trocador_provider": "Geselecteerde Trocador -provider",
683 "select_your_country": "Selecteer uw land",
684 + "selected_trocador_provider": "Geselecteerde Trocador -provider",
685 "sell": "Verkopen",
686 "sell_alert_content": "We ondersteunen momenteel alleen de verkoop van Bitcoin, Ethereum en Litecoin. Maak of schakel over naar uw Bitcoin-, Ethereum- of Litecoin-portemonnee.",
687 "sell_monero_com_alert_content": "Het verkopen van Monero wordt nog niet ondersteund",
res/values/strings_pl.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Zamknąć",
149 "coin_control": "Kontrola monet (opcjonalnie)",
150 "cold_or_recover_wallet": "Dodaj portfel tylko do odczytu od Cupcake lub zimnego portfela lub odzyskaj papierowy portfel",
151 + "collection_address": "Adres kolekcji",
152 + "collection_description": "Opis kolekcji",
153 + "collection_name": "Nazwa kolekcji",
154 "color_theme": "Motyw kolorystyczny",
155 "commit_transaction_amount_fee": "Zatwierdź transakcję\nIlość: ${amount}\nOpłata: ${fee}",
156 "confirm": "Potwierdzać",
@@ -430,6 +433,7 @@
433 "methods": "Metody",
434 "min_amount": "Min: ${value}",
435 "min_value": "Min: ${value} ${currency}",
436 + "mint_address": "Adres mięty",
437 "minutes_to_pin_code": "${minute} minut",
438 "mm": "MM",
439 "modify_2fa": "Zmodyfikuj ciasto 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Nowy portfel",
462 "newConnection": "Nowe połączenie",
463 "no_cards_found": "Nie znaleziono żadnych kart",
464 + "no_extra_detail": "Brak dodatkowych szczegółów",
465 "no_id_needed": "Nie potrzeba Dowodu!",
466 "no_id_required": "Nie wymagamy Dowodu. Doładuj i wydawaj gdziekolwiek",
467 "no_providers_available": "Brak dostępnych dostawców",
@@ -675,8 +680,8 @@
680 "select_destination": "Wybierz miejsce docelowe dla pliku kopii zapasowej.",
681 "select_hw_account_below": "Wybierz, które konto przywrócić poniżej:",
682 "select_sell_provider_notice": "Wybierz dostawcę sprzedaży powyżej. Możesz pominąć ten ekran, ustawiając domyślnego dostawcę sprzedaży w ustawieniach aplikacji.",
678 - "selected_trocador_provider": "Wybrany dostawca Trocador",
683 "select_your_country": "Wybierz swój kraj",
684 + "selected_trocador_provider": "Wybrany dostawca Trocador",
685 "sell": "Sprzedać",
686 "sell_alert_content": "Obecnie obsługujemy tylko sprzedaż Bitcoin, Ethereum i Litecoin. Utwórz lub przełącz się na swój portfel Bitcoin, Ethereum lub Litecoin.",
687 "sell_monero_com_alert_content": "Sprzedaż Monero nie jest jeszcze obsługiwana",
res/values/strings_pt.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Fechar",
149 "coin_control": "Controle de moedas (opcional)",
150 "cold_or_recover_wallet": "Adicione uma carteira somente leitura de Cupcake ou uma carteira fria ou recupere uma carteira de papel",
151 + "collection_address": "Endereço de coleção",
152 + "collection_description": "Descrição da coleção",
153 + "collection_name": "Nome da coleção",
154 "color_theme": "Tema de cor",
155 "commit_transaction_amount_fee": "Confirmar transação\nQuantia: ${amount}\nTaxa: ${fee}",
156 "confirm": "Confirmar",
@@ -431,6 +434,7 @@
434 "methods": "Métodos",
435 "min_amount": "Mínimo: ${valor}",
436 "min_value": "Mín: ${value} ${currency}",
437 + "mint_address": "Endereço da hortelã",
438 "minutes_to_pin_code": "${minute} minutos",
439 "mm": "MM",
440 "modify_2fa": "Modificar o Cake 2FA",
@@ -458,6 +462,7 @@
462 "new_wallet": "Nova carteira",
463 "newConnection": "Nova conexão",
464 "no_cards_found": "Nenhum cartão encontrado",
465 + "no_extra_detail": "Sem detalhes extras disponíveis",
466 "no_id_needed": "Nenhum ID necessário!",
467 "no_id_required": "Não é necessário ID. Recarregue e gaste em qualquer lugar",
468 "no_providers_available": "Nenhum fornecedor disponível",
@@ -677,8 +682,8 @@
682 "select_destination": "Selecione o destino para o arquivo de backup.",
683 "select_hw_account_below": "Selecione qual conta para restaurar abaixo:",
684 "select_sell_provider_notice": "Selecione um fornecedor de venda acima. Você pode pular esta tela definindo seu provedor de venda padrão nas configurações do aplicativo.",
680 - "selected_trocador_provider": "Provedor de Trocador selecionado",
685 "select_your_country": "Selecione seu país",
686 + "selected_trocador_provider": "Provedor de Trocador selecionado",
687 "sell": "Vender",
688 "sell_alert_content": "Atualmente, oferecemos suporte apenas à venda de Bitcoin, Ethereum e Litecoin. Crie ou troque para sua carteira Bitcoin, Ethereum ou Litecoin.",
689 "sell_monero_com_alert_content": "A venda de Monero ainda não é suportada",
res/values/strings_ru.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Закрывать",
149 "coin_control": "Контроль монет (необязательно)",
150 "cold_or_recover_wallet": "Добавить кошелек только для чтения из Cupcake или холодный кошелек или восстановить бумажный кошелек",
151 + "collection_address": "Адрес сбора",
152 + "collection_description": "Описание коллекции",
153 + "collection_name": "Название коллекции",
154 "color_theme": "Цветовая тема",
155 "commit_transaction_amount_fee": "Подтвердить транзакцию \nСумма: ${amount}\nКомиссия: ${fee}",
156 "confirm": "Подтвердить",
@@ -430,6 +433,7 @@
433 "methods": "Методы",
434 "min_amount": "Минимум: ${value}",
435 "min_value": "Мин: ${value} ${currency}",
436 + "mint_address": "Мятный адрес",
437 "minutes_to_pin_code": "${minute} минут",
438 "mm": "ММ",
439 "modify_2fa": "Изменить торт 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Новый кошелёк",
462 "newConnection": "Новое соединение",
463 "no_cards_found": "Карт не найдено",
464 + "no_extra_detail": "Нет дополнительных деталей",
465 "no_id_needed": "Идентификатор не нужен!",
466 "no_id_required": "Идентификатор не требуется. Пополняйте и тратьте где угодно",
467 "no_providers_available": "Нет доступных поставщиков",
@@ -676,8 +681,8 @@
681 "select_destination": "Пожалуйста, выберите место для файла резервной копии.",
682 "select_hw_account_below": "Пожалуйста, выберите, какую учетную запись восстановить ниже:",
683 "select_sell_provider_notice": "Выберите поставщика услуг продажи выше. Вы можете пропустить этот экран, установив поставщика услуг продаж по умолчанию в настройках приложения.",
679 - "selected_trocador_provider": "Выбранный провайдер Трокадора",
684 "select_your_country": "Пожалуйста, выберите свою страну",
685 + "selected_trocador_provider": "Выбранный провайдер Трокадора",
686 "sell": "Продавать",
687 "sell_alert_content": "В настоящее время мы поддерживаем только продажу биткойнов, эфириума и лайткойна. Пожалуйста, создайте или переключитесь на свой кошелек Bitcoin, Ethereum или Litecoin.",
688 "sell_monero_com_alert_content": "Продажа Monero пока не поддерживается",
res/values/strings_th.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "ปิด",
149 "coin_control": "การควบคุมเหรียญ (ตัวเลือก)",
150 "cold_or_recover_wallet": "เพิ่มกระเป๋าเงินแบบอ่านอย่างเดียวจาก Cupcake หรือกระเป๋าเงินเย็นหรือกู้คืนกระเป๋ากระดาษ",
151 + "collection_address": "ที่อยู่คอลเลกชัน",
152 + "collection_description": "คำอธิบายการรวบรวม",
153 + "collection_name": "ชื่อคอลเลกชัน",
154 "color_theme": "ธีมสี",
155 "commit_transaction_amount_fee": "ยืนยันธุรกรรม\nจำนวน: ${amount}\nค่าธรรมเนียม: ${fee}",
156 "confirm": "ยืนยัน",
@@ -430,6 +433,7 @@
433 "methods": "วิธีการ",
434 "min_amount": "จำนวนขั้นต่ำ: ${value}",
435 "min_value": "ขั้นต่ำ: ${value} ${currency}",
436 + "mint_address": "ที่อยู่มินต์",
437 "minutes_to_pin_code": "${minute} นาที",
438 "mm": "เดือน",
439 "modify_2fa": "แก้ไขเค้ก 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "กระเป๋าใหม่",
462 "newConnection": "การเชื่อมต่อใหม่",
463 "no_cards_found": "ไม่พบการ์ด",
464 + "no_extra_detail": "ไม่มีรายละเอียดเพิ่มเติม",
465 "no_id_needed": "ไม่จำเป็นต้องใช้บัตรประชาชน!",
466 "no_id_required": "ไม่จำเป็นต้องใช้บัตรประจำตัว ฝากเงินและใช้งานได้ทุกที่",
467 "no_providers_available": "ไม่มีผู้ให้บริการ",
@@ -675,8 +680,8 @@
680 "select_destination": "โปรดเลือกปลายทางสำหรับไฟล์สำรอง",
681 "select_hw_account_below": "กรุณาเลือกบัญชีที่จะกู้คืนด้านล่าง:",
682 "select_sell_provider_notice": "เลือกผู้ให้บริการการขายด้านบน คุณสามารถข้ามหน้าจอนี้ได้โดยการตั้งค่าผู้ให้บริการการขายเริ่มต้นในการตั้งค่าแอป",
678 - "selected_trocador_provider": "ผู้ให้บริการ Trocador ที่เลือก",
683 "select_your_country": "กรุณาเลือกประเทศของคุณ",
684 + "selected_trocador_provider": "ผู้ให้บริการ Trocador ที่เลือก",
685 "sell": "ขาย",
686 "sell_alert_content": "ขณะนี้เรารองรับการขาย Bitcoin, Ethereum และ Litecoin เท่านั้น โปรดสร้างหรือเปลี่ยนเป็นกระเป๋าเงิน Bitcoin, Ethereum หรือ Litecoin ของคุณ",
687 "sell_monero_com_alert_content": "ยังไม่รองรับการขาย Monero",
res/values/strings_tl.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Isara",
149 "coin_control": "Coin control (opsyonal)",
150 "cold_or_recover_wallet": "Magdagdag ng isang basahin lamang na pitaka mula sa Cupcake o isang malamig na pitaka o mabawi ang isang wallet ng papel",
151 + "collection_address": "Address ng koleksyon",
152 + "collection_description": "Paglalarawan ng Koleksyon",
153 + "collection_name": "Pangalan ng Koleksyon",
154 "color_theme": "Color theme",
155 "commit_transaction_amount_fee": "Gumawa ng transaksyon\nHalaga: ${amount}\nFee: ${fee}",
156 "confirm": "Kumpirmahin",
@@ -430,6 +433,7 @@
433 "methods": "Mga Paraan",
434 "min_amount": "Min: ${value}",
435 "min_value": "Min: ${value} ${currency}",
436 + "mint_address": "Mint Address",
437 "minutes_to_pin_code": "${minute} minuto",
438 "mm": "MM",
439 "modify_2fa": "Baguhin ang Cake 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Bagong Wallet",
462 "newConnection": "Bagong Koneksyon",
463 "no_cards_found": "Walang nahanap na mga card",
464 + "no_extra_detail": "Walang magagamit na mga dagdag na detalye",
465 "no_id_needed": "Hindi kailangan ng ID!",
466 "no_id_required": "Hindi kailangan ng ID. I-top up at gumastos kahit saan",
467 "no_providers_available": "Walang magagamit na mga nagbibigay",
@@ -675,8 +680,8 @@
680 "select_destination": "Mangyaring piliin ang patutunguhan para sa backup na file.",
681 "select_hw_account_below": "Mangyaring piliin kung aling account ang ibabalik sa ibaba:",
682 "select_sell_provider_notice": "Pumili ng provider ng nagbebenta sa itaas. Maaari mong laktawan ang screen na ito sa pamamagitan ng pagtatakda ng iyong default na sell provider sa mga setting ng app.",
678 - "selected_trocador_provider": "Napiling Trocador Provider",
683 "select_your_country": "Mangyaring piliin ang iyong bansa",
684 + "selected_trocador_provider": "Napiling Trocador Provider",
685 "sell": "Ibenta",
686 "sell_alert_content": "Kasalukuyan lamang naming sinusuportahan ang pagbebenta ng Bitcoin, Ethereum at Litecoin. Mangyaring lumikha o lumipat sa iyong Bitcoin, Ethereum o Litecoin wallet.",
687 "sell_monero_com_alert_content": "Ang pagbebenta ng Monero ay hindi pa suportado",
res/values/strings_tr.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Kapalı",
149 "coin_control": "Koin kontrolü (isteğe bağlı)",
150 "cold_or_recover_wallet": "Cupcake veya soğuk bir cüzdandan salt okunur bir cüzdan ekleyin veya bir kağıt cüzdanı kurtar",
151 + "collection_address": "Toplama adresi",
152 + "collection_description": "Koleksiyon Açıklama",
153 + "collection_name": "Toplama adı",
154 "color_theme": "Renk teması",
155 "commit_transaction_amount_fee": "Transferi gerçekleştir\nMiktar: ${amount}\nKomisyon: ${fee}",
156 "confirm": "Onayla",
@@ -430,6 +433,7 @@
433 "methods": "Yöntemler",
434 "min_amount": "Min: ${value}",
435 "min_value": "En az: ${value} ${currency}",
436 + "mint_address": "Nane adresi",
437 "minutes_to_pin_code": "${minute} dakika",
438 "mm": "AA",
439 "modify_2fa": "Cake 2FA'yı Değiştirin",
@@ -457,6 +461,7 @@
461 "new_wallet": "Yeni Cüzdan",
462 "newConnection": "Yeni bağlantı",
463 "no_cards_found": "Kart bulunamadı",
464 + "no_extra_detail": "Ekstra ayrıntı yok",
465 "no_id_needed": "Kimlik gerekmez!",
466 "no_id_required": "Kimlik gerekmez. Para yükleyin ve istediğiniz yerde harcayın",
467 "no_providers_available": "Sağlayıcı yok",
@@ -675,8 +680,8 @@
680 "select_destination": "Lütfen yedekleme dosyası için hedef seçin.",
681 "select_hw_account_below": "Lütfen aşağıda hangi hesabı geri yükleyeceğinizi seçin:",
682 "select_sell_provider_notice": "Yukarıdan bir satış sağlayıcısı seçin. Uygulama ayarlarında varsayılan satış sağlayıcınızı ayarlayarak bu ekranı atlayabilirsiniz.",
678 - "selected_trocador_provider": "Seçilmiş Trocador Sağlayıcı",
683 "select_your_country": "Lütfen ülkenizi seçin",
684 + "selected_trocador_provider": "Seçilmiş Trocador Sağlayıcı",
685 "sell": "Satış",
686 "sell_alert_content": "Şu anda yalnızca Bitcoin, Ethereum ve Litecoin satışını destekliyoruz. Lütfen Bitcoin, Ethereum veya Litecoin cüzdanınızı oluşturun veya cüzdanınıza geçin.",
687 "sell_monero_com_alert_content": "Monero satışı henüz desteklenmiyor",
res/values/strings_uk.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "Закрити",
149 "coin_control": "Контроль монет (необов’язково)",
150 "cold_or_recover_wallet": "Додайте гаманець лише для читання від Cupcake або холодного гаманця або відновіть паперовий гаманець",
151 + "collection_address": "Адреса колекції",
152 + "collection_description": "Опис колекції",
153 + "collection_name": "Назва колекції",
154 "color_theme": "Кольорова тема",
155 "commit_transaction_amount_fee": "Підтвердити транзакцію \nСума: ${amount}\nКомісія: ${fee}",
156 "confirm": "Підтвердити",
@@ -430,6 +433,7 @@
433 "methods": "методи",
434 "min_amount": "Мінімум: ${value}",
435 "min_value": "Мін: ${value} ${currency}",
436 + "mint_address": "Адреса м'яти",
437 "minutes_to_pin_code": "${minute} хвилин",
438 "mm": "MM",
439 "modify_2fa": "Змінити торт 2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "Новий гаманець",
462 "newConnection": "Нове підключення",
463 "no_cards_found": "Карт не знайдено",
464 + "no_extra_detail": "Немає додаткових деталей",
465 "no_id_needed": "Ідентифікатор не потрібен!",
466 "no_id_required": "Ідентифікатор не потрібен. Поповнюйте та витрачайте будь-де",
467 "no_providers_available": "Немає постачальників",
@@ -676,8 +681,8 @@
681 "select_destination": "Виберіть місце призначення для файлу резервної копії.",
682 "select_hw_account_below": "Виберіть, який рахунок відновити нижче:",
683 "select_sell_provider_notice": "Виберіть вище постачальника послуг продажу. Ви можете пропустити цей екран, встановивши постачальника послуг продажу за умовчанням у налаштуваннях програми.",
679 - "selected_trocador_provider": "Вибраний постачальник Trocador",
684 "select_your_country": "Будь ласка, виберіть свою країну",
685 + "selected_trocador_provider": "Вибраний постачальник Trocador",
686 "sell": "Продати",
687 "sell_alert_content": "Наразі ми підтримуємо лише продаж Bitcoin, Ethereum і Litecoin. Створіть або перейдіть на свій гаманець Bitcoin, Ethereum або Litecoin.",
688 "sell_monero_com_alert_content": "Продаж Monero ще не підтримується",
res/values/strings_ur.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "بند کریں",
149 "coin_control": "سکے کنٹرول (اختیاری)",
150 "cold_or_recover_wallet": "Cupcake یا سرد بٹوے سے صرف ایک پڑھنے والا پرس شامل کریں یا کاغذ کا پرس بازیافت کریں",
151 + "collection_address": "جمع کرنے کا پتہ",
152 + "collection_description": "جمع کرنے کی تفصیل",
153 + "collection_name": "جمع کرنے کا نام",
154 "color_theme": "رنگین تھیم",
155 "commit_transaction_amount_fee": "لین دین کا ارتکاب کریں\\nرقم: ${amount}\\nفیس: ${fee}",
156 "confirm": "تصدیق کریں۔",
@@ -430,6 +433,7 @@
433 "methods": "ﮯﻘﯾﺮﻃ",
434 "min_amount": "کم سے کم: ${value}",
435 "min_value": "کم سے کم: ${value} ${currency}",
436 + "mint_address": "ٹکسال کا پتہ",
437 "minutes_to_pin_code": "${minute} منٹ",
438 "mm": "MM",
439 "modify_2fa": "کیک 2FA میں ترمیم کریں۔",
@@ -457,6 +461,7 @@
461 "new_wallet": "نیا پرس",
462 "newConnection": "ﻦﺸﮑﻨﮐ ﺎﯿﻧ",
463 "no_cards_found": "کوئی کارڈ نہیں ملا",
464 + "no_extra_detail": "کوئی اضافی تفصیلات دستیاب نہیں ہیں",
465 "no_id_needed": "شناخت کی ضرورت نہیں!",
466 "no_id_required": "کوئی ID درکار نہیں۔ ٹاپ اپ اور کہیں بھی خرچ کریں۔",
467 "no_providers_available": "کوئی فراہم کنندہ دستیاب نہیں ہے",
@@ -677,8 +682,8 @@
682 "select_destination": "۔ﮟﯾﺮﮐ ﺏﺎﺨﺘﻧﺍ ﺎﮐ ﻝﺰﻨﻣ ﮯﯿﻟ ﮯﮐ ﻞﺋﺎﻓ ﭖﺍ ﮏﯿﺑ ﻡﺮﮐ ﮦﺍﺮﺑ",
683 "select_hw_account_below": "براہ کرم ذیل میں کون سا اکاؤنٹ بحال کرنا ہے منتخب کریں:",
684 "select_sell_provider_notice": "۔ﮟﯿﮨ ﮯﺘﮑﺳ ﮌﻮﮭﭼ ﻮﮐ ﻦﯾﺮﮑﺳﺍ ﺱﺍ ﺮﮐ ﮮﺩ ﺐﯿﺗﺮﺗ ﻮﮐ ﮦﺪﻨﻨﮐ ﻢﮨﺍﺮﻓ ﻞﯿﺳ ﭧﻟﺎﻔﯾﮈ ﮯﻨﭘﺍ ﮟﯿﻣ ﺕﺎﺒ",
680 - "selected_trocador_provider": "منتخب کردہ ٹروکاڈور فراہم کنندہ",
685 "select_your_country": "براہ کرم اپنے ملک کو منتخب کریں",
686 + "selected_trocador_provider": "منتخب کردہ ٹروکاڈور فراہم کنندہ",
687 "sell": "بیچنا",
688 "sell_alert_content": "۔ﮟﯾﺮﮐ ﭻﺋﻮﺳ ﺮﭘ ﺱﺍ ﺎﯾ ﮟﯿﺋﺎﻨﺑ ﭧﯿﻟﺍﻭ Litecoin ﺎﯾ Bitcoin، Ethereum ﺎﻨﭘﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ۔",
689 "sell_monero_com_alert_content": "Monero فروخت کرنا ابھی تک تعاون یافتہ نہیں ہے۔",
res/values/strings_vi.arb
+5
@@ -146,6 +146,9 @@
146 "close": "Đóng",
147 "coin_control": "Kiểm soát đồng xu (tùy chọn)",
148 "cold_or_recover_wallet": "Thêm ví chỉ đọc từ Cupcake hoặc ví lạnh hoặc thu hồi ví giấy",
149 + "collection_address": "Địa chỉ bộ sưu tập",
150 + "collection_description": "Mô tả bộ sưu tập",
151 + "collection_name": "Tên bộ sưu tập",
152 "color_theme": "Chủ đề màu sắc",
153 "commit_transaction_amount_fee": "Cam kết giao dịch\nSố tiền: ${amount}\nPhí: ${fee}",
154 "confirm": "Xác nhận",
@@ -429,6 +432,7 @@
432 "methods": "Phương pháp",
433 "min_amount": "Tối thiểu: ${value}",
434 "min_value": "Tối thiểu: ${value} ${currency}",
435 + "mint_address": "Địa chỉ bạc hà",
436 "minutes_to_pin_code": "${minute} phút",
437 "mm": "MM",
438 "modify_2fa": "Chỉnh sửa Cake 2FA",
@@ -456,6 +460,7 @@
460 "new_wallet": "Ví mới",
461 "newConnection": "Kết nối mới",
462 "no_cards_found": "Không tìm thấy thẻ",
463 + "no_extra_detail": "Không có thêm chi tiết có sẵn",
464 "no_id_needed": "Không cần ID!",
465 "no_id_required": "Không yêu cầu ID. Nạp tiền và chi tiêu ở bất kỳ đâu",
466 "no_relay_on_domain": "Không có relay cho miền của người dùng hoặc relay không khả dụng. Vui lòng chọn một relay để sử dụng.",
res/values/strings_yo.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "sunmo",
149 "coin_control": "Ìdarí owó ẹyọ (ìyàn nìyí)",
150 "cold_or_recover_wallet": "Ṣafikun apamọwọ kika-nikan lati Cupcake tabi apamọwọ tutu tabi gba owo apamọwọ iwe kan",
151 + "collection_address": "Adirẹsi",
152 + "collection_description": "Ijuwe akopọ",
153 + "collection_name": "Orukọ ikojọpọ",
154 "color_theme": "Àwọn ààtò àwọ̀",
155 "commit_transaction_amount_fee": "Jẹ́rìí sí àránṣẹ́\nOwó: ${amount}\nIye àfikún: ${fee}",
156 "confirm": "Jẹ́rìísí",
@@ -431,6 +434,7 @@
434 "methods": "Awọn ọna",
435 "min_amount": "kò kéré ju: ${value}",
436 "min_value": "kò gbọ́dọ̀ kéré ju ${value} ${currency}",
437 + "mint_address": "Adirẹsi Mint",
438 "minutes_to_pin_code": "${minute} ìṣẹ́jú",
439 "mm": "Os",
440 "modify_2fa": "Fi iṣiro 2FA sii Cake",
@@ -458,6 +462,7 @@
462 "new_wallet": "Àpamọ́wọ́ títun",
463 "newConnection": "Tuntun Asopọ",
464 "no_cards_found": "Ko si awọn kaadi ti a rii",
465 + "no_extra_detail": "Ko si awọn alaye afikun ti o wa",
466 "no_id_needed": "Ẹ kò nílò àmì ìdánimọ̀!",
467 "no_id_required": "Ẹ kò nílò àmì ìdánimọ̀. Ẹ lè fikún owó àti san níbikíbi",
468 "no_providers_available": "Ko si awọn olupese ti o wa",
@@ -676,8 +681,8 @@
681 "select_destination": "Jọwọ yan ibi ti o nlo fun faili afẹyinti.",
682 "select_hw_account_below": "Jọwọ yan iru iroyin lati mu pada ni isalẹ:",
683 "select_sell_provider_notice": "Yan olupese ti o ta loke. O le foju iboju yii nipa tito olupese iṣẹ tita aiyipada rẹ ni awọn eto app.",
679 - "selected_trocador_provider": "olupese trocador ti a yan",
684 "select_your_country": "Jọwọ yan orilẹ-ede rẹ",
685 + "selected_trocador_provider": "olupese trocador ti a yan",
686 "sell": "Tà",
687 "sell_alert_content": "Lọwọlọwọ a ṣe atilẹyin tita Bitcoin, Ethereum ati Litecoin nikan. Jọwọ ṣẹda tabi yipada si Bitcoin, Ethereum tabi apamọwọ Litecoin rẹ.",
688 "sell_monero_com_alert_content": "Kọ ju lọwọ Monero ko ṣe ni ibamu",
res/values/strings_zh.arb
+6 -1
@@ -148,6 +148,9 @@
148 "close": "关闭",
149 "coin_control": "硬幣控制(可選)",
150 "cold_or_recover_wallet": "从Cupcake或冷钱包中添加只读的钱包或恢复纸钱包",
151 + "collection_address": "收集地址",
152 + "collection_description": "集合描述",
153 + "collection_name": "收集名称",
154 "color_theme": "主题",
155 "commit_transaction_amount_fee": "提交交易\n金额: ${amount}\n手续费: ${fee}",
156 "confirm": "确认",
@@ -430,6 +433,7 @@
433 "methods": "方法",
434 "min_amount": "最小值: ${value}",
435 "min_value": "最小: ${value} ${currency}",
436 + "mint_address": "薄荷地址",
437 "minutes_to_pin_code": "${minute} 分钟",
438 "mm": "毫米",
439 "modify_2fa": "修改蛋糕2FA",
@@ -457,6 +461,7 @@
461 "new_wallet": "新钱包",
462 "newConnection": "新连接",
463 "no_cards_found": "找不到卡",
464 + "no_extra_detail": "没有其他详细信息",
465 "no_id_needed": "不需要 ID!",
466 "no_id_required": "不需要身份证。充值并在任何地方消费",
467 "no_providers_available": "没有提供商可用",
@@ -675,8 +680,8 @@
680 "select_destination": "请选择备份文件的目的地。",
681 "select_hw_account_below": "请在下面选择要还原的帐户:",
682 "select_sell_provider_notice": "选择上面的销售提供商。您可以通过在应用程序设置中设置默认销售提供商来跳过此屏幕。",
678 - "selected_trocador_provider": "选定的trocador提供商",
683 "select_your_country": "请选择你的国家",
684 + "selected_trocador_provider": "选定的trocador提供商",
685 "sell": "卖",
686 "sell_alert_content": "我们目前仅支持比特币、以太坊和莱特币的销售。请创建或切换到您的比特币、以太坊或莱特币钱包。",
687 "sell_monero_com_alert_content": "尚不支持出售门罗币",