Cw 865 create new seed UI for show seed keys page to match onboarding seed verification UI (#1961)

* update wallet keys page UI * localisation * hide keys tab for electrum wallets * Fix padding for tab view * Fix more padding * add height box for isLegacySeedOnly * revert adding tar.gz files [skip ci] --------- Co-authored-by: tuxpizza <tuxsudo@tux.pizza>

Serhii committed Jan 24, 2025 at 20:08 UTC 9673b7c026aa64f324193dc2547ee301300d6f18
34 files changed +648 -312
lib/src/screens/seed/wallet_seed_page.dart
+13 -101
@@ -1,13 +1,13 @@
1 import 'package:cake_wallet/routes.dart';
2 +import 'package:cake_wallet/src/widgets/seedphrase_grid_widget.dart';
3 +import 'package:cake_wallet/src/widgets/warning_box_widget.dart';
4 import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
5 import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
6 import 'package:cake_wallet/themes/theme_base.dart';
5 -import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
7 import 'package:cake_wallet/utils/clipboard_util.dart';
8 import 'package:cake_wallet/utils/share_util.dart';
9 import 'package:cake_wallet/utils/responsive_layout_util.dart';
10 import 'package:cake_wallet/utils/show_bar.dart';
10 -import 'package:cake_wallet/utils/show_pop_up.dart';
11 import 'package:flutter/material.dart';
12 import 'package:flutter/services.dart';
13 import 'package:flutter_mobx/flutter_mobx.dart';
@@ -16,14 +16,9 @@ import 'package:cake_wallet/src/widgets/primary_button.dart';
16 import 'package:cake_wallet/src/screens/base_page.dart';
17 import 'package:cake_wallet/view_model/wallet_seed_view_model.dart';
18
19 -import '../../../themes/extensions/send_page_theme.dart';
20 -
19 class WalletSeedPage extends BasePage {
20 WalletSeedPage(this.walletSeedViewModel, {required this.isNewWalletCreated});
21
24 - final imageLight = Image.asset('assets/images/crypto_lock_light.png');
25 - final imageDark = Image.asset('assets/images/crypto_lock.png');
26 -
22 @override
23 String get title => S.current.seed_title;
24
@@ -68,7 +63,6 @@ class WalletSeedPage extends BasePage {
63 return WillPopScope(
64 onWillPop: () async => false,
65 child: Container(
71 - padding: EdgeInsets.symmetric(horizontal: 14, vertical: 8),
66 alignment: Alignment.center,
67 child: ConstrainedBox(
68 constraints:
@@ -79,46 +73,14 @@ class WalletSeedPage extends BasePage {
73 Observer(
74 builder: (_) {
75 return Expanded(
76 + child: Padding(
77 + padding: const EdgeInsets.only(left: 22, right: 22),
78 child: Column(
79 crossAxisAlignment: CrossAxisAlignment.center,
80 children: <Widget>[
85 - Container(
86 - padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8),
87 - decoration: BoxDecoration(
88 - color: currentTheme.type == ThemeType.dark
89 - ? Color.fromRGBO(132, 110, 64, 1)
90 - : Color.fromRGBO(194, 165, 94, 1),
91 - borderRadius: BorderRadius.all(Radius.circular(12)),
92 - border: Border.all(
93 - color: currentTheme.type == ThemeType.dark
94 - ? Color.fromRGBO(177, 147, 41, 1)
95 - : Color.fromRGBO(125, 122, 15, 1),
96 - width: 2.0,
97 - )),
98 - child: Row(
99 - children: [
100 - Icon(
101 - Icons.warning_amber_rounded,
102 - size: 64,
103 - color: Colors.white.withOpacity(0.75),
104 - ),
105 - SizedBox(width: 6),
106 - Expanded(
107 - child: Text(
108 - S.current.cake_seeds_save_disclaimer,
109 - textAlign: TextAlign.center,
110 - style: TextStyle(
111 - fontSize: 12,
112 - fontWeight: FontWeight.w800,
113 - color: currentTheme.type == ThemeType.dark
114 - ? Colors.white.withOpacity(0.75)
115 - : Colors.white.withOpacity(0.85),
116 - ),
117 - ),
118 - ),
119 - ],
120 - ),
121 - ),
81 + WarningBox(
82 + content: S.current.cake_seeds_save_disclaimer,
83 + currentTheme: currentTheme),
84 SizedBox(height: 20),
85 Text(
86 key: ValueKey('wallet_seed_page_wallet_name_text_key'),
@@ -131,70 +93,19 @@ class WalletSeedPage extends BasePage {
93 ),
94 SizedBox(height: 20),
95 Expanded(
134 - child: GridView.builder(
135 - itemCount: walletSeedViewModel.seedSplit.length,
136 - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
137 - crossAxisCount: 3,
138 - childAspectRatio: 2.8,
139 - mainAxisSpacing: 8.0,
140 - crossAxisSpacing: 8.0,
141 - ),
142 - itemBuilder: (context, index) {
143 - final item = walletSeedViewModel.seedSplit[index];
144 - final numberCount = index + 1;
145 -
146 - return Container(
147 - padding: const EdgeInsets.symmetric(horizontal: 8),
148 - alignment: Alignment.center,
149 - decoration: BoxDecoration(
150 - borderRadius: BorderRadius.circular(8),
151 - color: Theme.of(context).cardColor,
152 - ),
153 - child: Row(
154 - crossAxisAlignment: CrossAxisAlignment.center,
155 - children: [
156 - SizedBox(
157 - child: Text(
158 - //maxLines: 1,
159 - numberCount.toString(),
160 - textAlign: TextAlign.center,
161 - style: TextStyle(
162 - fontSize: 12,
163 - height: 1,
164 - fontWeight: FontWeight.w800,
165 - color: Theme.of(context)
166 - .extension<CakeTextTheme>()!
167 - .buttonTextColor
168 - .withOpacity(0.5)),
169 - ),
170 - ),
171 - const SizedBox(width: 6),
172 - Expanded(
173 - child: Text(
174 - '${item[0].toLowerCase()}${item.substring(1)}',
175 - style: TextStyle(
176 - fontSize: 14,
177 - height: 0.8,
178 - fontWeight: FontWeight.w700,
179 - color: Theme.of(context)
180 - .extension<CakeTextTheme>()!
181 - .buttonTextColor),
182 - ),
183 - ),
184 - ],
185 - ),
186 - );
187 - },
188 - ),
96 + child: SeedPhraseGridWidget(list: walletSeedViewModel.seedSplit),
97 ),
98 ],
99 ),
100 + ),
101 );
102 },
103 ),
104 Column(
105 children: <Widget>[
197 - Row(
106 + Padding(
107 + padding: EdgeInsets.symmetric(horizontal: 14, vertical: 8),
108 + child: Row(
109 mainAxisSize: MainAxisSize.max,
110 children: <Widget>[
111 Flexible(
@@ -233,6 +144,7 @@ class WalletSeedPage extends BasePage {
144 )
145 ],
146 ),
147 + ),
148 SizedBox(height: 12),
149 ],
150 )
lib/src/screens/wallet_keys/wallet_keys_page.dart
+277 -80
@@ -1,19 +1,21 @@
1 -import 'package:auto_size_text/auto_size_text.dart';
1 import 'package:cake_wallet/entities/qr_view_data.dart';
3 -import 'package:cake_wallet/src/screens/base_page.dart';
4 -import 'package:cake_wallet/src/widgets/list_row.dart';
5 -import 'package:cake_wallet/src/widgets/section_divider.dart';
2 import 'package:cake_wallet/generated/i18n.dart';
3 import 'package:cake_wallet/routes.dart';
4 +import 'package:cake_wallet/src/screens/base_page.dart';
5 +import 'package:cake_wallet/src/widgets/primary_button.dart';
6 +import 'package:cake_wallet/src/widgets/seedphrase_grid_widget.dart';
7 +import 'package:cake_wallet/src/widgets/text_info_box.dart';
8 +import 'package:cake_wallet/src/widgets/warning_box_widget.dart';
9 +import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
10 +import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
11 +import 'package:cake_wallet/themes/theme_base.dart';
12 import 'package:cake_wallet/utils/brightness_util.dart';
13 import 'package:cake_wallet/utils/clipboard_util.dart';
14 import 'package:cake_wallet/utils/show_bar.dart';
15 import 'package:cake_wallet/view_model/wallet_keys_view_model.dart';
16 import 'package:flutter/material.dart';
17 import 'package:flutter/services.dart';
14 -import 'package:flutter_mobx/flutter_mobx.dart';
18 import 'package:qr_flutter/qr_flutter.dart';
16 -import 'package:cake_wallet/themes/extensions/picker_theme.dart';
19
20 class WalletKeysPage extends BasePage {
21 WalletKeysPage(this.walletKeysViewModel);
@@ -24,95 +26,290 @@ class WalletKeysPage extends BasePage {
26 final WalletKeysViewModel walletKeysViewModel;
27
28 @override
27 - Widget trailing(BuildContext context) => IconButton(
28 - key: ValueKey('wallet_keys_page_fullscreen_qr_button_key'),
29 - onPressed: () async {
30 - final url = await walletKeysViewModel.url;
31 -
32 - BrightnessUtil.changeBrightnessForFunction(() async {
33 - await Navigator.pushNamed(
34 - context,
35 - Routes.fullscreenQR,
36 - arguments: QrViewData(data: url.toString(), version: QrVersions.auto),
37 - );
38 - });
39 - },
40 - splashColor: Colors.transparent,
41 - highlightColor: Colors.transparent,
42 - hoverColor: Colors.transparent,
43 - icon: Image.asset(
44 - 'assets/images/qr_code_icon.png',
45 - ),
46 - );
29 + Widget body(BuildContext context) {
30 + return Container(
31 + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 0),
32 + child: Column(
33 + children: [
34 + Padding(
35 + padding: EdgeInsets.only(left: 14, right: 14, bottom: 8),
36 + child: WarningBox(
37 + key: const ValueKey('wallet_keys_page_share_warning_text_key'),
38 + content: S.of(context).do_not_share_warning_text.toUpperCase(),
39 + currentTheme: currentTheme,
40 + ),
41 + ),
42 + Expanded(
43 + child: WalletKeysPageBody(
44 + walletKeysViewModel: walletKeysViewModel,
45 + currentTheme: currentTheme,
46 + ),
47 + ),
48 + ],
49 + ),
50 + );
51 + }
52 +}
53 +
54 +class WalletKeysPageBody extends StatefulWidget {
55 + WalletKeysPageBody({
56 + required this.walletKeysViewModel,
57 + required this.currentTheme,
58 + });
59 +
60 + final WalletKeysViewModel walletKeysViewModel;
61 + final ThemeBase currentTheme;
62
63 @override
49 - Widget body(BuildContext context) {
64 + State<StatefulWidget> createState() => _WalletKeysPageBodyState();
65 +}
66 +
67 +class _WalletKeysPageBodyState extends State<WalletKeysPageBody>
68 + with SingleTickerProviderStateMixin {
69 + late TabController _tabController;
70 + late bool showKeyTab;
71 + late bool showLegacySeedTab;
72 + late bool isLegacySeedOnly;
73 +
74 + @override
75 + void initState() {
76 + super.initState();
77 +
78 + showKeyTab = widget.walletKeysViewModel.items.isNotEmpty;
79 + showLegacySeedTab = widget.walletKeysViewModel.legacySeedSplit.isNotEmpty;
80 + isLegacySeedOnly = widget.walletKeysViewModel.isLegacySeedOnly;
81 +
82 + final totalTabs = 1 + (showKeyTab ? 1 : 0) + (showLegacySeedTab ? 1 : 0);
83 +
84 + _tabController = TabController(length: totalTabs, vsync: this);
85 + }
86 +
87 + @override
88 + void dispose() {
89 + _tabController.dispose();
90 + super.dispose();
91 + }
92 +
93 + @override
94 + Widget build(BuildContext context) {
95 + return Container(
96 + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 0),
97 + child: Column(
98 + children: [
99 + Padding(
100 + padding: const EdgeInsets.only(left: 22, right: 22, top: 0),
101 + child: TabBar(
102 + controller: _tabController,
103 + splashFactory: NoSplash.splashFactory,
104 + indicatorSize: TabBarIndicatorSize.label,
105 + isScrollable: true,
106 + labelStyle: TextStyle(
107 + fontSize: 18,
108 + fontFamily: 'Lato',
109 + fontWeight: FontWeight.w600,
110 + color: Theme.of(context).appBarTheme.titleTextStyle!.color,
111 + ),
112 + unselectedLabelStyle: TextStyle(
113 + fontSize: 18,
114 + fontFamily: 'Lato',
115 + fontWeight: FontWeight.w600,
116 + color: Theme.of(context).appBarTheme.titleTextStyle!.color?.withOpacity(0.5),
117 + ),
118 + labelColor: Theme.of(context).appBarTheme.titleTextStyle!.color,
119 + indicatorColor: Theme.of(context).appBarTheme.titleTextStyle!.color,
120 + indicatorPadding: EdgeInsets.zero,
121 + labelPadding: const EdgeInsets.only(right: 24),
122 + tabAlignment: TabAlignment.start,
123 + dividerColor: Colors.transparent,
124 + padding: EdgeInsets.zero,
125 + tabs: [
126 + Tab(text: S.of(context).widgets_seed),
127 + if (showKeyTab) Tab(text: S.of(context).keys),
128 + if (showLegacySeedTab) Tab(text: S.of(context).legacy),
129 + ],
130 + ),
131 + ),
132 + const SizedBox(height: 20),
133 + Expanded(
134 + child: TabBarView(
135 + controller: _tabController,
136 + children: [
137 + Padding(
138 + padding: const EdgeInsets.only(left: 22, right: 22,),
139 + child: _buildSeedTab(context, false),
140 + ),
141 + if (showKeyTab)
142 + Padding(
143 + padding: const EdgeInsets.only(left: 22, right: 22),
144 + child: _buildKeysTab(context),
145 + ),
146 + if (showLegacySeedTab)
147 + Padding(
148 + padding: const EdgeInsets.only(left: 22, right: 22),
149 + child: _buildSeedTab(context, showLegacySeedTab),
150 + ),
151 + ],
152 + ),
153 + ),
154 +
155 + ],
156 + ),
157 + );
158 + }
159 +
160 + Widget _buildSeedTab(BuildContext context, bool isLegacySeed) {
161 return Column(
162 children: [
163 + if (isLegacySeedOnly || isLegacySeed) _buildHeightBox(),
164 + const SizedBox(height: 20),
165 Expanded(
53 - child: Padding(
54 - padding: const EdgeInsets.symmetric(horizontal: 24.0),
55 - child: Container(
56 - width: double.infinity,
57 - decoration: BoxDecoration(
58 - borderRadius: BorderRadius.circular(12.0),
59 - color: Theme.of(context).cardColor,
60 - ),
61 - child: Center(
62 - child: Padding(
63 - padding: const EdgeInsets.all(8.0),
64 - child: AutoSizeText(
65 - key: ValueKey('wallet_keys_page_share_warning_text_key'),
66 - S.of(context).do_not_share_warning_text.toUpperCase(),
67 - textAlign: TextAlign.center,
68 - maxLines: 4,
69 - style: TextStyle(
70 - fontSize: 16,
71 - fontWeight: FontWeight.w500,
72 - color: Colors.red,
73 - ),
74 - ),
75 - ),
76 - ),
77 - ),
166 + child: SeedPhraseGridWidget(
167 + list: isLegacySeed
168 + ? widget.walletKeysViewModel.legacySeedSplit
169 + : widget.walletKeysViewModel.seedSplit,
170 ),
171 ),
172 + const SizedBox(height: 10),
173 + _buildBottomActionPanel(
174 + titleForClipboard: S.of(context).wallet_seed.toLowerCase(),
175 + dataToCopy: isLegacySeed
176 + ? widget.walletKeysViewModel.legacySeed
177 + : widget.walletKeysViewModel.seed,
178 + onShowQR: () async => _showQR(context, false),
179 + ),
180 + ],
181 + );
182 + }
183 +
184 + Widget _buildKeysTab(BuildContext context) {
185 + return Column(
186 + children: [
187 Expanded(
81 - flex: 7,
82 - child: Container(
83 - padding: EdgeInsets.only(top: 20.0, bottom: 20.0),
84 - child: Observer(
85 - builder: (_) {
86 - return ListView.separated(
87 - key: ValueKey('wallet_keys_page_credentials_list_view_key'),
88 - separatorBuilder: (context, index) => Container(
89 - height: 1,
90 - padding: EdgeInsets.only(left: 24),
91 - color: Theme.of(context).extension<PickerTheme>()!.dividerColor,
92 - child: const HorizontalSectionDivider(),
188 + child: ListView.separated(
189 + shrinkWrap: true,
190 + itemCount: widget.walletKeysViewModel.items.length,
191 + itemBuilder: (context, index) {
192 + final item = widget.walletKeysViewModel.items[index];
193 + return TextInfoBox(
194 + key: item.key,
195 + title: item.title,
196 + value: item.value,
197 + onCopy: (context) => _onCopy(item.title, item.value, context),
198 + );
199 + },
200 + separatorBuilder: (context, index) => const SizedBox(height: 20),
201 + ),
202 + ),
203 + SizedBox(height: 20),
204 + ],
205 + );
206 + }
207 +
208 + Widget _buildHeightBox() {
209 + return Container(
210 + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 14),
211 + decoration: BoxDecoration(
212 + borderRadius: BorderRadius.circular(8),
213 + color: Theme.of(context).cardColor,
214 + ),
215 + child: Row(
216 + mainAxisAlignment: MainAxisAlignment.center,
217 + children: [
218 + Text(
219 + S.of(context).block_height,
220 + textAlign: TextAlign.center,
221 + style: TextStyle(
222 + fontSize: 14,
223 + fontWeight: FontWeight.w500,
224 + color: Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor.withOpacity(0.5),
225 + ),
226 + ),
227 + const SizedBox(width: 6),
228 + Expanded(
229 + child: FutureBuilder<String?>(
230 + future: widget.walletKeysViewModel.restoreHeight,
231 + builder: (context, snapshot) {
232 + final textToDisplay = snapshot.connectionState == ConnectionState.waiting
233 + ? 'Fetching...'
234 + : (snapshot.data ?? '---');
235 +
236 + return Text(
237 + textToDisplay,
238 + style: TextStyle(
239 + fontSize: 14,
240 + fontWeight: FontWeight.w500,
241 + color: Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor,
242 ),
94 - itemCount: walletKeysViewModel.items.length,
95 - itemBuilder: (BuildContext context, int index) {
96 - final item = walletKeysViewModel.items[index];
97 -
98 - return GestureDetector(
99 - key: item.key,
100 - onTap: () {
101 - ClipboardUtil.setSensitiveDataToClipboard(ClipboardData(text: item.value));
102 - showBar<void>(context, S.of(context).copied_key_to_clipboard(item.title));
103 - },
104 - child: ListRow(
105 - title: item.title + ':',
106 - value: item.value,
107 - ),
108 - );
109 - },
243 );
244 },
245 ),
246 ),
247 + ],
248 + ),
249 + );
250 + }
251 +
252 +
253 + Widget _buildBottomActionPanel({
254 + required String titleForClipboard,
255 + required String dataToCopy,
256 + required VoidCallback onShowQR,
257 + }) {
258 + return Column(
259 + children: [
260 + Padding(
261 + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8),
262 + child: Row(
263 + mainAxisSize: MainAxisSize.max,
264 + children: [
265 + Flexible(
266 + child: Container(
267 + padding: const EdgeInsets.only(right: 8.0, top: 8.0),
268 + child: PrimaryButton(
269 + key: const ValueKey('wallet_keys_page_copy_seeds_button_key'),
270 + onPressed: () => _onCopy(titleForClipboard, dataToCopy, context),
271 + text: S.of(context).copy,
272 + color: Theme.of(context).cardColor,
273 + textColor: widget.currentTheme.type == ThemeType.dark
274 + ? Theme.of(context).extension<DashboardPageTheme>()!.textColor
275 + : Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor,
276 + ),
277 + ),
278 + ),
279 + Flexible(
280 + child: Container(
281 + padding: const EdgeInsets.only(left: 8.0, top: 8.0),
282 + child: PrimaryButton(
283 + key: const ValueKey('wallet_keys_page_show_qr_seeds_button_key'),
284 + onPressed: onShowQR,
285 + text: S.current.show + ' QR',
286 + color: Theme.of(context).primaryColor,
287 + textColor: Colors.white,
288 + ),
289 + ),
290 + ),
291 + ],
292 ),
293 + ),
294 + const SizedBox(height: 12),
295 ],
296 );
297 }
298 +
299 + Future<void> _onCopy(String title, String text, BuildContext context) async {
300 + await ClipboardUtil.setSensitiveDataToClipboard(ClipboardData(text: text));
301 + showBar<void>(context, S.of(context).copied_key_to_clipboard(title));
302 + }
303 +
304 + Future<void> _showQR(BuildContext context, bool isLegacySeed) async {
305 + final url = await widget.walletKeysViewModel.getUrl(isLegacySeed);
306 +
307 + BrightnessUtil.changeBrightnessForFunction(() async {
308 + await Navigator.pushNamed(
309 + context,
310 + Routes.fullscreenQR,
311 + arguments: QrViewData(data: url.toString(), version: QrVersions.auto),
312 + );
313 + });
314 + }
315 }
lib/src/widgets/seedphrase_grid_widget.dart new
+68
@@ -0,0 +1,68 @@
1 +import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
2 +import 'package:flutter/material.dart';
3 +
4 +class SeedPhraseGridWidget extends StatelessWidget {
5 + const SeedPhraseGridWidget({
6 + super.key,
7 + required this.list,
8 + });
9 +
10 + final List<String> list;
11 +
12 + @override
13 + Widget build(BuildContext context) {
14 + return GridView.builder(
15 + itemCount: list.length,
16 + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
17 + crossAxisCount: 3,
18 + childAspectRatio: 2.8,
19 + mainAxisSpacing: 8.0,
20 + crossAxisSpacing: 8.0,
21 + ),
22 + itemBuilder: (context, index) {
23 + final item = list[index];
24 + final numberCount = index + 1;
25 +
26 + return Container(
27 + padding: const EdgeInsets.symmetric(horizontal: 8),
28 + alignment: Alignment.center,
29 + decoration: BoxDecoration(
30 + borderRadius: BorderRadius.circular(8),
31 + color: Theme.of(context).cardColor,
32 + ),
33 + child: Row(
34 + crossAxisAlignment: CrossAxisAlignment.center,
35 + children: [
36 + SizedBox(
37 + child: Text(
38 + //maxLines: 1,
39 + numberCount.toString(),
40 + textAlign: TextAlign.center,
41 + style: TextStyle(
42 + fontSize: 12,
43 + height: 1,
44 + fontWeight: FontWeight.w800,
45 + color: Theme.of(context)
46 + .extension<CakeTextTheme>()!
47 + .buttonTextColor
48 + .withOpacity(0.5)),
49 + ),
50 + ),
51 + const SizedBox(width: 6),
52 + Expanded(
53 + child: Text(
54 + '${item[0].toLowerCase()}${item.substring(1)}',
55 + style: TextStyle(
56 + fontSize: 14,
57 + height: 0.8,
58 + fontWeight: FontWeight.w700,
59 + color: Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor),
60 + ),
61 + ),
62 + ],
63 + ),
64 + );
65 + },
66 + );
67 + }
68 +}
lib/src/widgets/text_info_box.dart new
+51
@@ -0,0 +1,51 @@
1 +import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
2 +import 'package:flutter/material.dart';
3 +
4 +class TextInfoBox extends StatelessWidget {
5 + const TextInfoBox({Key? key, required this.title, required this.value, this.onCopy})
6 + : super(key: key);
7 +
8 + final String title;
9 + final String value;
10 + final void Function(BuildContext context)? onCopy;
11 +
12 + @override
13 + Widget build(BuildContext context) {
14 + return Container(
15 + padding: const EdgeInsets.all(12),
16 + decoration: BoxDecoration(
17 + borderRadius: BorderRadius.circular(8),
18 + color: Theme.of(context).cardColor,
19 + ),
20 + child: Column(
21 + crossAxisAlignment: CrossAxisAlignment.start,
22 + children: [
23 + Row(
24 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
25 + children: [
26 + Text(title,
27 + style: TextStyle(
28 + fontSize: 14,
29 + fontWeight: FontWeight.w500,
30 + color: Theme.of(context)
31 + .extension<CakeTextTheme>()!
32 + .buttonTextColor
33 + .withOpacity(0.5))),
34 + GestureDetector(
35 + onTap: onCopy != null ? () => onCopy!(context) : null,
36 + child: Icon(Icons.copy,
37 + size: 13,
38 + color: Theme.of(context).textTheme.bodyLarge?.color?.withOpacity(0.7))),
39 + ],
40 + ),
41 + const SizedBox(height: 4),
42 + Text(value,
43 + style: TextStyle(
44 + fontSize: 16,
45 + fontWeight: FontWeight.w500,
46 + color: Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor)),
47 + ],
48 + ),
49 + );
50 + }
51 +}
lib/src/widgets/warning_box_widget.dart new
+51
@@ -0,0 +1,51 @@
1 +import 'package:cake_wallet/themes/theme_base.dart';
2 +import 'package:flutter/material.dart';
3 +
4 +class WarningBox extends StatelessWidget {
5 + const WarningBox({required this.content, required this.currentTheme, Key? key})
6 + : super(key: key);
7 +
8 + final String content;
9 + final ThemeBase currentTheme;
10 +
11 + @override
12 + Widget build(BuildContext context) {
13 + return Container(
14 + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 8),
15 + decoration: BoxDecoration(
16 + color: currentTheme.type == ThemeType.dark
17 + ? Color.fromRGBO(132, 110, 64, 1)
18 + : Color.fromRGBO(194, 165, 94, 1),
19 + borderRadius: BorderRadius.all(Radius.circular(12)),
20 + border: Border.all(
21 + color: currentTheme.type == ThemeType.dark
22 + ? Color.fromRGBO(177, 147, 41, 1)
23 + : Color.fromRGBO(125, 122, 15, 1),
24 + width: 2.0,
25 + )),
26 + child: Row(
27 + children: [
28 + Icon(
29 + Icons.warning_amber_rounded,
30 + size: 64,
31 + color: Colors.white.withOpacity(0.75),
32 + ),
33 + SizedBox(width: 6),
34 + Expanded(
35 + child: Text(
36 + content,
37 + textAlign: TextAlign.center,
38 + style: TextStyle(
39 + fontSize: 12,
40 + fontWeight: FontWeight.w800,
41 + color: currentTheme.type == ThemeType.dark
42 + ? Colors.white.withOpacity(0.75)
43 + : Colors.white.withOpacity(0.85),
44 + ),
45 + ),
46 + ),
47 + ],
48 + ),
49 + );
50 + }
51 +}
lib/view_model/wallet_keys_view_model.dart
+104 -131
@@ -3,6 +3,7 @@ import 'package:cake_wallet/haven/haven.dart';
3 import 'package:cake_wallet/monero/monero.dart';
4 import 'package:cake_wallet/reactions/wallet_connect.dart';
5 import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart';
6 +import 'package:cake_wallet/src/widgets/text_info_box.dart';
7 import 'package:cake_wallet/store/app_store.dart';
8 import 'package:cake_wallet/wownero/wownero.dart';
9 import 'package:cw_core/transaction_direction.dart';
@@ -20,32 +21,29 @@ class WalletKeysViewModel = WalletKeysViewModelBase with _$WalletKeysViewModel;
21
22 abstract class WalletKeysViewModelBase with Store {
23 WalletKeysViewModelBase(this._appStore)
23 - : title = _appStore.wallet!.type == WalletType.bitcoin ||
24 - _appStore.wallet!.type == WalletType.litecoin ||
25 - _appStore.wallet!.type == WalletType.bitcoinCash
26 - ? S.current.wallet_seed
27 - : S.current.wallet_keys,
24 + : title = S.current.wallet_keys,
25 + _wallet = _appStore.wallet!,
26 _walletName = _appStore.wallet!.type.name,
27 _restoreHeight = _appStore.wallet!.walletInfo.restoreHeight,
28 _restoreHeightByTransactions = 0,
29 items = ObservableList<StandartListItem>() {
32 - _populateItems();
30 + _populateKeysItems();
31
32 reaction((_) => _appStore.wallet, (WalletBase? _wallet) {
35 - _populateItems();
33 + _populateKeysItems();
34 });
35
38 - if (_appStore.wallet!.type == WalletType.monero ||
39 - _appStore.wallet!.type == WalletType.haven ||
40 - _appStore.wallet!.type == WalletType.wownero) {
41 - final accountTransactions = _getWalletTransactions(_appStore.wallet!);
36 + if (_wallet.type == WalletType.monero ||
37 + _wallet.type == WalletType.haven ||
38 + _wallet.type == WalletType.wownero) {
39 + final accountTransactions = _getWalletTransactions(_wallet);
40 if (accountTransactions.isNotEmpty) {
41 final incomingAccountTransactions =
42 accountTransactions.where((tx) => tx.direction == TransactionDirection.incoming);
43 if (incomingAccountTransactions.isNotEmpty) {
44 incomingAccountTransactions.toList().sort((a, b) => a.date.compareTo(b.date));
47 - _restoreHeightByTransactions = _getRestoreHeightByTransactions(
48 - _appStore.wallet!.type, incomingAccountTransactions.first.date);
45 + _restoreHeightByTransactions =
46 + _getRestoreHeightByTransactions(_wallet.type, incomingAccountTransactions.first.date);
47 }
48 }
49 }
@@ -54,26 +52,61 @@ abstract class WalletKeysViewModelBase with Store {
52 final ObservableList<StandartListItem> items;
53
54 final String title;
57 -
55 + final WalletBase _wallet;
56 final String _walletName;
57 + final AppStore _appStore;
58 + final int _restoreHeight;
59 +
60 + int _restoreHeightByTransactions;
61
62 AppStore get appStore => _appStore;
63
62 - final AppStore _appStore;
64 + String get seed => _wallet.seed != null ? _wallet.seed! : '';
65
64 - final int _restoreHeight;
66 + bool get isLegacySeedOnly =>
67 + (_wallet.type == WalletType.monero || _wallet.type == WalletType.wownero) &&
68 + _wallet.seed != null &&
69 + !Polyseed.isValidSeed(_wallet.seed!);
70
66 - int _restoreHeightByTransactions;
71 + String get legacySeed {
72 + if ((_wallet.type == WalletType.monero || _wallet.type == WalletType.wownero) &&
73 + _wallet.seed != null &&
74 + Polyseed.isValidSeed(_wallet.seed!)) {
75 + final langName = PolyseedLang.getByPhrase(_wallet.seed!).nameEnglish;
76 +
77 + if (_wallet.type == WalletType.monero) {
78 + return (_wallet as MoneroWalletBase).seedLegacy(langName);
79 + } else if (_wallet.type == WalletType.wownero) {
80 + return wownero!.getLegacySeed(_wallet, langName);
81 + }
82 + }
83 + return '';
84 + }
85
68 - void _populateItems() {
86 + String get legacyRestoreHeight {
87 + if (_wallet.type == WalletType.monero) {
88 + return monero!.getRestoreHeight(_wallet)?.toString() ?? '';
89 + }
90 + return '';
91 + }
92 +
93 + /// The Regex split the words based on any whitespace character.
94 + ///
95 + /// Either standard ASCII space (U+0020) or the full-width space character (U+3000) used by the Japanese.
96 + List<String> get seedSplit => seed.isNotEmpty ? seed.split(RegExp(r'\s+')) : [];
97 +
98 + List<String> get legacySeedSplit => legacySeed.isNotEmpty ? legacySeed.split(RegExp(r'\s+')) : [];
99 +
100 + void _populateKeysItems() {
101 items.clear();
102
71 - if (_appStore.wallet!.type == WalletType.monero) {
72 - final keys = monero!.getKeys(_appStore.wallet!);
103 + if (_wallet.type == WalletType.monero) {
104 + final keys = monero!.getKeys(_wallet);
105
106 items.addAll([
107 if (keys['primaryAddress'] != null)
108 StandartListItem(
109 + key: ValueKey('${_walletName}_wallet_primary_address_item_key'),
110 title: S.current.primary_address,
111 value: keys['primaryAddress']!),
112 if (keys['publicSpendKey'] != null)
@@ -100,43 +133,16 @@ abstract class WalletKeysViewModelBase with Store {
133 title: S.current.view_key_private,
134 value: keys['privateViewKey']!,
135 ),
103 - if (_appStore.wallet!.seed!.isNotEmpty)
104 - StandartListItem(
105 - key: ValueKey('${_walletName}_wallet_seed_item_key'),
106 - title: S.current.wallet_seed,
107 - value: _appStore.wallet!.seed!,
108 - ),
136 ]);
110 -
111 - if (_appStore.wallet?.seed != null && Polyseed.isValidSeed(_appStore.wallet!.seed!)) {
112 - final lang = PolyseedLang.getByPhrase(_appStore.wallet!.seed!);
113 - items.add(
114 - StandartListItem(
115 - key: ValueKey('${_walletName}_wallet_seed_legacy_item_key'),
116 - title: S.current.wallet_seed_legacy,
117 - value: (_appStore.wallet as MoneroWalletBase).seedLegacy(lang.nameEnglish),
118 - ),
119 - );
120 - }
121 -
122 - final restoreHeight = monero!.getRestoreHeight(_appStore.wallet!);
123 - if (restoreHeight != null) {
124 - items.add(
125 - StandartListItem(
126 - key: ValueKey('${_walletName}_wallet_restore_height_item_key'),
127 - title: S.current.wallet_recovery_height,
128 - value: restoreHeight.toString(),
129 - ),
130 - );
131 - }
137 }
138
134 - if (_appStore.wallet!.type == WalletType.haven) {
135 - final keys = haven!.getKeys(_appStore.wallet!);
139 + if (_wallet.type == WalletType.haven) {
140 + final keys = haven!.getKeys(_wallet);
141
142 items.addAll([
143 if (keys['primaryAddress'] != null)
144 StandartListItem(
145 + key: ValueKey('${_walletName}_wallet_primary_address_item_key'),
146 title: S.current.primary_address,
147 value: keys['primaryAddress']!),
148 if (keys['publicSpendKey'] != null)
@@ -163,21 +169,16 @@ abstract class WalletKeysViewModelBase with Store {
169 title: S.current.view_key_private,
170 value: keys['privateViewKey']!,
171 ),
166 - if (_appStore.wallet!.seed!.isNotEmpty)
167 - StandartListItem(
168 - key: ValueKey('${_walletName}_wallet_seed_item_key'),
169 - title: S.current.wallet_seed,
170 - value: _appStore.wallet!.seed!,
171 - ),
172 ]);
173 }
174
175 - if (_appStore.wallet!.type == WalletType.wownero) {
176 - final keys = wownero!.getKeys(_appStore.wallet!);
175 + if (_wallet.type == WalletType.wownero) {
176 + final keys = wownero!.getKeys(_wallet);
177
178 items.addAll([
179 if (keys['primaryAddress'] != null)
180 StandartListItem(
181 + key: ValueKey('${_walletName}_wallet_primary_address_item_key'),
182 title: S.current.primary_address,
183 value: keys['primaryAddress']!),
184 if (keys['publicSpendKey'] != null)
@@ -204,108 +205,73 @@ abstract class WalletKeysViewModelBase with Store {
205 title: S.current.view_key_private,
206 value: keys['privateViewKey']!,
207 ),
207 - if (_appStore.wallet!.seed!.isNotEmpty)
208 - StandartListItem(
209 - key: ValueKey('${_walletName}_wallet_seed_item_key'),
210 - title: S.current.wallet_seed,
211 - value: _appStore.wallet!.seed!,
212 - ),
208 ]);
214 -
215 - if (_appStore.wallet?.seed != null && Polyseed.isValidSeed(_appStore.wallet!.seed!)) {
216 - final lang = PolyseedLang.getByPhrase(_appStore.wallet!.seed!);
217 - items.add(
218 - StandartListItem(
219 - key: ValueKey('${_walletName}_wallet_seed_legacy_item_key'),
220 - title: S.current.wallet_seed_legacy,
221 - value: wownero!.getLegacySeed(_appStore.wallet!, lang.nameEnglish),
222 - ),
223 - );
224 - }
209 }
210
227 - if (_appStore.wallet!.type == WalletType.bitcoin ||
228 - _appStore.wallet!.type == WalletType.litecoin ||
229 - _appStore.wallet!.type == WalletType.bitcoinCash) {
230 - // final keys = bitcoin!.getWalletKeys(_appStore.wallet!);
231 -
211 + // if (_wallet.type == WalletType.bitcoin ||
212 + // _wallet.type == WalletType.litecoin ||
213 + // _wallet.type == WalletType.bitcoinCash) {
214 + // final keys = bitcoin!.getWalletKeys(_appStore.wallet!);
215 + //
216 + // items.addAll([
217 + // if (keys['wif'] != null)
218 + // StandartListItem(title: "WIF", value: keys['wif']!),
219 + // if (keys['privateKey'] != null)
220 + // StandartListItem(title: S.current.private_key, value: keys['privateKey']!),
221 + // if (keys['publicKey'] != null)
222 + // StandartListItem(title: S.current.public_key, value: keys['publicKey']!),
223 + // ]);
224 + // }
225 +
226 + if (isEVMCompatibleChain(_wallet.type) ||
227 + _wallet.type == WalletType.solana ||
228 + _wallet.type == WalletType.tron) {
229 items.addAll([
233 - // if (keys['wif'] != null)
234 - // StandartListItem(title: "WIF", value: keys['wif']!),
235 - // if (keys['privateKey'] != null)
236 - // StandartListItem(title: S.current.private_key, value: keys['privateKey']!),
237 - // if (keys['publicKey'] != null)
238 - // StandartListItem(title: S.current.public_key, value: keys['publicKey']!),
239 - StandartListItem(
240 - key: ValueKey('${_walletName}_wallet_seed_item_key'),
241 - title: S.current.wallet_seed,
242 - value: _appStore.wallet!.seed!,
243 - ),
244 - ]);
245 - }
246 -
247 - if (isEVMCompatibleChain(_appStore.wallet!.type) ||
248 - _appStore.wallet!.type == WalletType.solana ||
249 - _appStore.wallet!.type == WalletType.tron) {
250 - items.addAll([
251 - if (_appStore.wallet!.privateKey != null)
230 + if (_wallet.privateKey != null)
231 StandartListItem(
232 key: ValueKey('${_walletName}_wallet_private_key_item_key'),
233 title: S.current.private_key,
255 - value: _appStore.wallet!.privateKey!,
256 - ),
257 - if (_appStore.wallet!.seed != null)
258 - StandartListItem(
259 - key: ValueKey('${_walletName}_wallet_seed_item_key'),
260 - title: S.current.wallet_seed,
261 - value: _appStore.wallet!.seed!,
234 + value: _wallet.privateKey!,
235 ),
236 ]);
237 }
238
266 - bool nanoBased =
267 - _appStore.wallet!.type == WalletType.nano || _appStore.wallet!.type == WalletType.banano;
239 + bool nanoBased = _wallet.type == WalletType.nano || _wallet.type == WalletType.banano;
240
241 if (nanoBased) {
242 // we always have the hex version of the seed and private key:
243 items.addAll([
272 - if (_appStore.wallet!.seed != null)
273 - StandartListItem(
274 - key: ValueKey('${_walletName}_wallet_seed_item_key'),
275 - title: S.current.wallet_seed,
276 - value: _appStore.wallet!.seed!,
277 - ),
278 - if (_appStore.wallet!.hexSeed != null)
244 + if (_wallet.hexSeed != null)
245 StandartListItem(
246 key: ValueKey('${_walletName}_wallet_hex_seed_key'),
247 title: S.current.seed_hex_form,
282 - value: _appStore.wallet!.hexSeed!,
248 + value: _wallet.hexSeed!,
249 ),
284 - if (_appStore.wallet!.privateKey != null)
250 + if (_wallet.privateKey != null)
251 StandartListItem(
252 key: ValueKey('${_walletName}_wallet_private_key_item_key'),
253 title: S.current.private_key,
288 - value: _appStore.wallet!.privateKey!,
254 + value: _wallet.privateKey!,
255 ),
256 ]);
257 }
258 }
259
260 Future<int?> _currentHeight() async {
295 - if (_appStore.wallet!.type == WalletType.haven) {
261 + if (_wallet.type == WalletType.haven) {
262 return await haven!.getCurrentHeight();
263 }
298 - if (_appStore.wallet!.type == WalletType.monero) {
264 + if (_wallet.type == WalletType.monero) {
265 return await monero!.getCurrentHeight();
266 }
301 - if (_appStore.wallet!.type == WalletType.wownero) {
267 + if (_wallet.type == WalletType.wownero) {
268 return await wownero!.getCurrentHeight();
269 }
270 return null;
271 }
272
273 String get _scheme {
308 - switch (_appStore.wallet!.type) {
274 + switch (_wallet.type) {
275 case WalletType.monero:
276 return 'monero-wallet';
277 case WalletType.bitcoin:
@@ -331,7 +297,7 @@ abstract class WalletKeysViewModelBase with Store {
297 case WalletType.wownero:
298 return 'wownero-wallet';
299 default:
334 - throw Exception('Unexpected wallet type: ${_appStore.wallet!.type.toString()}');
300 + throw Exception('Unexpected wallet type: ${_wallet.type.toString()}');
301 }
302 }
303
@@ -349,19 +315,26 @@ abstract class WalletKeysViewModelBase with Store {
315 Future<Map<String, String>> get _queryParams async {
316 final restoreHeightResult = await restoreHeight;
317 return {
352 - if (_appStore.wallet!.seed != null) 'seed': _appStore.wallet!.seed!,
353 - if (_appStore.wallet!.seed == null && _appStore.wallet!.hexSeed != null)
354 - 'hexSeed': _appStore.wallet!.hexSeed!,
355 - if (_appStore.wallet!.seed == null && _appStore.wallet!.privateKey != null)
356 - 'private_key': _appStore.wallet!.privateKey!,
318 + if (_wallet.seed != null) 'seed': _wallet.seed!,
319 + if (_wallet.seed == null && _wallet.hexSeed != null) 'hexSeed': _wallet.hexSeed!,
320 + if (_wallet.seed == null && _wallet.privateKey != null) 'private_key': _wallet.privateKey!,
321 + if (restoreHeightResult != null) ...{'height': restoreHeightResult},
322 + if (_wallet.passphrase != null) 'passphrase': _wallet.passphrase!
323 + };
324 + }
325 +
326 + Future<Map<String, String>> get _queryParamsForLegacy async {
327 + final restoreHeightResult = await restoreHeight;
328 + return {
329 + if (legacySeed.isNotEmpty) 'seed': legacySeed,
330 if (restoreHeightResult != null) ...{'height': restoreHeightResult},
358 - if (_appStore.wallet!.passphrase != null) 'passphrase': _appStore.wallet!.passphrase!
331 + if (_wallet.passphrase != null) 'passphrase': _wallet.passphrase!
332 };
333 }
334
362 - Future<Uri> get url async => Uri(
335 + Future<Uri> getUrl(bool isLegacySeed) async => Uri(
336 scheme: _scheme,
364 - queryParameters: await _queryParams,
337 + queryParameters: isLegacySeed ? await _queryParamsForLegacy : await _queryParams,
338 );
339
340 List<TransactionInfo> _getWalletTransactions(WalletBase wallet) {
res/values/strings_ar.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "موضوع البيتكوين الظلام",
82 "bitcoin_light_theme": "موضوع البيتكوين الخفيفة",
83 "bitcoin_payments_require_1_confirmation": "تتطلب مدفوعات Bitcoin تأكيدًا واحدًا ، والذي قد يستغرق 20 دقيقة أو أكثر. شكرا لصبرك! سيتم إرسال بريد إلكتروني إليك عند تأكيد الدفع.",
84 + "block_height": "ارتفاع كتلة",
85 "block_remaining": "1 كتلة متبقية",
86 "Blocks_remaining": "بلوك متبقي ${status}",
87 "bluetooth": "بلوتوث",
@@ -379,6 +380,7 @@
380 "invalid_password": "رمز مرور خاطئ",
381 "invoice_details": "تفاصيل الفاتورة",
382 "is_percentage": "يكون",
383 + "keys": "مفاتيح",
384 "last_30_days": "آخر 30 يومًا",
385 "learn_more": "اعرف المزيد",
386 "ledger_connection_error": "فشل في الاتصال بك دفتر الأستاذ. حاول مرة اخرى.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "تم رفض المعاملة على الجهاز",
389 "ledger_error_wrong_app": "يرجى التأكد",
390 "ledger_please_enable_bluetooth": "يرجى تمكين البلوتوث للكشف عن دفتر الأستاذ الخاص بك",
391 + "legacy": "إرث",
392 "light_theme": "فاتح",
393 "litecoin_enable_mweb_sync": "تمكين MWEB المسح الضوئي",
394 "litecoin_mweb": "mweb",
res/values/strings_bg.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Тъмна тема за биткойн",
82 "bitcoin_light_theme": "Лека биткойн тема",
83 "bitcoin_payments_require_1_confirmation": "Плащанията с Bitcoin изискват потвърждение, което може да отнеме 20 минути или повече. Благодарим за търпението! Ще получите имейл, когато плащането е потвърдено.",
84 + "block_height": "Височина на блока",
85 "block_remaining": "1 блок останал",
86 "Blocks_remaining": "${status} оставащи блока",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Невалидна парола",
381 "invoice_details": "IДанни за фактура",
382 "is_percentage": "е",
383 + "keys": "Клавиши",
384 "last_30_days": "Последните 30 дни",
385 "learn_more": "Научете още",
386 "ledger_connection_error": "Не успя да се свърже с вашата книга. Моля, опитайте отново.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Транзакция, отхвърлена на устройство",
389 "ledger_error_wrong_app": "Моля, уверете се, че сте отворили правилното приложение на вашата книга",
390 "ledger_please_enable_bluetooth": "Моля, активирайте Bluetooth да открие вашата книга",
391 + "legacy": "Наследство",
392 "light_theme": "Светло",
393 "litecoin_enable_mweb_sync": "Активирайте сканирането на MWeb",
394 "litecoin_mweb": "Mweb",
res/values/strings_cs.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Tmavé téma bitcoinů",
82 "bitcoin_light_theme": "Světlé téma bitcoinů",
83 "bitcoin_payments_require_1_confirmation": "U plateb Bitcoinem je vyžadováno alespoň 1 potvrzení, což může trvat 20 minut i déle. Děkujeme za vaši trpělivost! Až bude platba potvrzena, budete informováni e-mailem.",
84 + "block_height": "Výška bloku",
85 "block_remaining": "1 blok zbývající",
86 "Blocks_remaining": "Zbývá ${status} bloků",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Neplatné heslo",
381 "invoice_details": "detaily faktury",
382 "is_percentage": "je",
383 + "keys": "Klíče",
384 "last_30_days": "Posledních 30 dnů",
385 "learn_more": "Zjistit více",
386 "ledger_connection_error": "Nepodařilo se připojit k vaší knize. Prosím zkuste to znovu.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Transakce zamítnuta na zařízení",
389 "ledger_error_wrong_app": "Ujistěte se, že se na své knize otevřete správnou aplikaci",
390 "ledger_please_enable_bluetooth": "Umožněte prosím Bluetooth detekovat vaši knihu",
391 + "legacy": "Dědictví",
392 "light_theme": "Světlý",
393 "litecoin_enable_mweb_sync": "Povolit skenování MWeb",
394 "litecoin_mweb": "MWeb",
res/values/strings_de.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Dunkles Bitcoin-Thema",
82 "bitcoin_light_theme": "Bitcoin Light-Thema",
83 "bitcoin_payments_require_1_confirmation": "Bitcoin-Zahlungen erfordern 1 Bestätigung, was 20 Minuten oder länger dauern kann. Danke für Ihre Geduld! Sie erhalten eine E-Mail, wenn die Zahlung bestätigt ist.",
84 + "block_height": "Blockhöhe",
85 "block_remaining": "1 Block verbleibend",
86 "Blocks_remaining": "${status} verbleibende Blöcke",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Ungültiges Passwort",
381 "invoice_details": "Rechnungs-Details",
382 "is_percentage": "ist",
383 + "keys": "Schlüssel",
384 "last_30_days": "Letzte 30 Tage",
385 "learn_more": "Erfahren Sie mehr",
386 "ledger_connection_error": "Verbindung zum Ledger gescheitert. Bitte versuche es erneut.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Transaktion auf dem Gerät abgelehnt",
389 "ledger_error_wrong_app": "Bitte stellen Sie sicher, dass Sie die richtige App auf Ihrem Ledger geöffnet haben",
390 "ledger_please_enable_bluetooth": "Bitte aktivieren Sie Bluetooth um sich mit Ihren Ledger zu verbinden.",
391 + "legacy": "Vermächtnis",
392 "light_theme": "Hell",
393 "litecoin_enable_mweb_sync": "Aktivieren Sie das MWEB-Scannen",
394 "litecoin_mweb": "MWeb",
res/values/strings_en.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Bitcoin Dark Theme",
82 "bitcoin_light_theme": "Bitcoin Light Theme",
83 "bitcoin_payments_require_1_confirmation": "Bitcoin payments require 1 confirmation, which can take 20 minutes or longer. Thanks for your patience! You will be emailed when the payment is confirmed.",
84 + "block_height": "Block height",
85 "block_remaining": "1 Block Remaining",
86 "Blocks_remaining": "${status} Blocks Remaining",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Invalid password",
381 "invoice_details": "Invoice details",
382 "is_percentage": "is",
383 + "keys": "Keys",
384 "last_30_days": "Last 30 days",
385 "learn_more": "Learn More",
386 "ledger_connection_error": "Failed to connect to you Ledger. Please try again.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Transaction rejected on device",
389 "ledger_error_wrong_app": "Please make sure you opend the right app on your ledger",
390 "ledger_please_enable_bluetooth": "Please enable Bluetooth to detect your Ledger",
391 + "legacy": "Legacy",
392 "light_theme": "Light",
393 "litecoin_enable_mweb_sync": "Enable MWEB scanning",
394 "litecoin_mweb": "MWEB",
res/values/strings_es.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Tema oscuro de Bitcoin",
82 "bitcoin_light_theme": "Tema claro de Bitcoin",
83 "bitcoin_payments_require_1_confirmation": "Los pagos de Bitcoin requieren 1 confirmación, que puede demorar 20 minutos o más. ¡Gracias por tu paciencia! Se te enviará un correo electrónico cuando se confirme el pago.",
84 + "block_height": "Altura de bloque",
85 "block_remaining": "1 bloqueo restante",
86 "Blocks_remaining": "${status} Bloques restantes",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Contraseña invalida",
381 "invoice_details": "Detalles de la factura",
382 "is_percentage": "es",
383 + "keys": "Llaves",
384 "last_30_days": "Últimos 30 días",
385 "learn_more": "Aprende más",
386 "ledger_connection_error": "No se pudo conectar con ledger. Inténtalo de nuevo.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Transacción rechazada en el dispositivo",
389 "ledger_error_wrong_app": "Por favor, asegúrate de abrir la aplicación correcta en su libro mayor.",
390 "ledger_please_enable_bluetooth": "Habilita tu Bluetooth para detectar tu ledger",
391 + "legacy": "Legado",
392 "light_theme": "Ligero",
393 "litecoin_enable_mweb_sync": "Habilitar el escaneo mweb",
394 "litecoin_mweb": "Mweb",
res/values/strings_fr.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Thème sombre Bitcoin",
82 "bitcoin_light_theme": "Thème léger Bitcoin",
83 "bitcoin_payments_require_1_confirmation": "Les paiements Bitcoin nécessitent 1 confirmation, ce qui peut prendre 20 minutes ou plus. Merci pour votre patience ! Vous serez averti par e-mail lorsque le paiement sera confirmé.",
84 + "block_height": "Hauteur de blocage",
85 "block_remaining": "1 bloc restant",
86 "Blocks_remaining": "Blocs Restants : ${status}",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Mot de passe incorrect",
381 "invoice_details": "Détails de la facture",
382 "is_percentage": "est",
383 + "keys": "Clés",
384 "last_30_days": "30 derniers jours",
385 "learn_more": "En savoir plus",
386 "ledger_connection_error": "Impossible de se connecter à votre Ledger. Veuillez réessayer.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Transaction rejetée sur l'appareil",
389 "ledger_error_wrong_app": "Veuillez vous assurer d'ouvrir la bonne application sur votre Ledger",
390 "ledger_please_enable_bluetooth": "Veuillez activer le Bluetooth pour détecter votre Ledger",
391 + "legacy": "Héritage",
392 "light_theme": "Clair",
393 "litecoin_enable_mweb_sync": "Activer la numérisation MWEB",
394 "litecoin_mweb": "Mweb",
res/values/strings_ha.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Bitcoin Dark Jigo",
82 "bitcoin_light_theme": "Jigon Hasken Bitcoin",
83 "bitcoin_payments_require_1_confirmation": "Akwatin Bitcoin na buɗe 1 sambumbu, da yake za ta samu mintuna 20 ko yawa. Ina kira ga sabuwar lafiya! Zaka sanarwa ta email lokacin da aka samu akwatin samun lambar waya.",
84 + "block_height": "Toshe tsawo",
85 "block_remaining": "1 toshe ragowar",
86 "Blocks_remaining": "${status} Katanga ya rage",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Kalmar sirri mara inganci",
381 "invoice_details": "Bayanin wadannan",
382 "is_percentage": "shine",
383 + "keys": "Makullin",
384 "last_30_days": "Kwanaki 30 na ƙarshe",
385 "learn_more": "Ƙara Koyi",
386 "ledger_connection_error": "Ba a yi nasarar haɗawa da ku ba. Da fatan za a sake gwadawa.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Ma'amala da aka ƙi akan na'urar",
389 "ledger_error_wrong_app": "Da fatan za a tabbata kun yi amfani da app ɗin dama akan dillalarku",
390 "ledger_please_enable_bluetooth": "Da fatan za a kunna Bluetooth don gano Ledger ɗinku",
391 + "legacy": "Gado",
392 "light_theme": "Haske",
393 "litecoin_enable_mweb_sync": "Kunna binciken Mweb",
394 "litecoin_mweb": "Mweb",
res/values/strings_hi.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "बिटकॉइन डार्क थीम",
82 "bitcoin_light_theme": "बिटकॉइन लाइट थीम",
83 "bitcoin_payments_require_1_confirmation": "बिटकॉइन भुगतान के लिए 1 पुष्टिकरण की आवश्यकता होती है, जिसमें 20 मिनट या अधिक समय लग सकता है। आपके धैर्य के लिए धन्यवाद! भुगतान की पुष्टि होने पर आपको ईमेल किया जाएगा।",
84 + "block_height": "ब्लॉक ऊंचाई",
85 "block_remaining": "1 ब्लॉक शेष",
86 "Blocks_remaining": "${status} शेष रहते हैं",
87 "bluetooth": "ब्लूटूथ",
@@ -379,6 +380,7 @@
380 "invalid_password": "अवैध पासवर्ड",
381 "invoice_details": "चालान विवरण",
382 "is_percentage": "है",
383 + "keys": "चाबी",
384 "last_30_days": "पिछले 30 दिन",
385 "learn_more": "और अधिक जानें",
386 "ledger_connection_error": "आप लेजर से जुड़ने में विफल रहे। कृपया पुन: प्रयास करें।",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "डिवाइस पर लेनदेन खारिज कर दिया गया",
389 "ledger_error_wrong_app": "कृपया सुनिश्चित करें कि आप अपने लेजर पर सही ऐप को खोलते हैं",
390 "ledger_please_enable_bluetooth": "कृपया अपने बहीखाने का पता लगाने के लिए ब्लूटूथ को सक्षम करें",
391 + "legacy": "परंपरा",
392 "light_theme": "रोशनी",
393 "litecoin_enable_mweb_sync": "MWEB स्कैनिंग सक्षम करें",
394 "litecoin_mweb": "मावली",
res/values/strings_hr.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Bitcoin Tamna tema",
82 "bitcoin_light_theme": "Bitcoin Light Theme",
83 "bitcoin_payments_require_1_confirmation": "Bitcoin plaćanja zahtijevaju 1 potvrdu, što može potrajati 20 minuta ili dulje. Hvala na Vašem strpljenju! Dobit ćete e-poruku kada plaćanje bude potvrđeno.",
84 + "block_height": "Visina bloka",
85 "block_remaining": "Preostalo 1 blok",
86 "Blocks_remaining": "${status} preostalih blokova",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Netočna zaporka",
381 "invoice_details": "Podaci o fakturi",
382 "is_percentage": "je",
383 + "keys": "Ključ",
384 "last_30_days": "Zadnjih 30 dana",
385 "learn_more": "Saznajte više",
386 "ledger_connection_error": "Nije uspio povezati se s knjigom. Molim te pokušaj ponovno.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Transakcija odbijena na uređaju",
389 "ledger_error_wrong_app": "Obavezno obavezno otvorite pravu aplikaciju na knjizi",
390 "ledger_please_enable_bluetooth": "Omogućite Bluetooth da otkrije svoju knjigu",
391 + "legacy": "Nasljeđe",
392 "light_theme": "Svijetla",
393 "litecoin_enable_mweb_sync": "Omogućite MWEB skeniranje",
394 "litecoin_mweb": "MWeb",
res/values/strings_hy.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Bitcoin մութ տեսք",
82 "bitcoin_light_theme": "Bitcoin պայծառ տեսք",
83 "bitcoin_payments_require_1_confirmation": "Bitcoin վճարումները պահանջում են 1 հաստատում, որը կարող է տևել 20 րոպե կամ ավելի: Շնորհակալություն ձեր համբերության համար: Դուք էլ. նամակ կստանաք, երբ վճարումը հաստատվի։",
84 + "block_height": "Բլոկի բարձրությունը",
85 "block_remaining": "1 Բլոկ է մնացել",
86 "Blocks_remaining": "${status} Բլոկ է մնացել",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Սխալ գաղտնաբառ",
381 "invoice_details": "Հաշիվ-ապրանքագրի մանրամասներ",
382 "is_percentage": "կազմում է",
383 + "keys": "Ստեղներ",
384 "last_30_days": "Վերջին 30 օրը",
385 "learn_more": "Տեղեկանալ ավելին",
386 "ledger_connection_error": "Չկարողացանք կապ հաստատել Ledger-ի հետ: Խնդրում ենք փորձել նորից",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Գործարքը մերժված է օգտատերի կողմից",
389 "ledger_error_wrong_app": "Խնդրում ենք համոզվել, որ դուք բացել եք ճիշտ ծրագիրը ձեր Ledger-ում",
390 "ledger_please_enable_bluetooth": "Խնդրում ենք միացնել Bluetooth-ը ձեր Ledger-ը հայտնաբերելու համար",
391 + "legacy": "Ժառանգություն",
392 "light_theme": "Լուսավոր",
393 "litecoin_enable_mweb_sync": "Միացնել MWEB սկան",
394 "litecoin_mweb": "Մուեբ",
res/values/strings_id.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Tema Gelap Bitcoin",
82 "bitcoin_light_theme": "Tema Cahaya Bitcoin",
83 "bitcoin_payments_require_1_confirmation": "Pembayaran Bitcoin memerlukan 1 konfirmasi, yang bisa memakan waktu 20 menit atau lebih. Terima kasih atas kesabaran Anda! Anda akan diemail saat pembayaran dikonfirmasi.",
84 + "block_height": "Tinggi blok",
85 "block_remaining": "1 blok tersisa",
86 "Blocks_remaining": "${status} Blok Tersisa",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Kata sandi salah",
381 "invoice_details": "Detail faktur",
382 "is_percentage": "adalah",
383 + "keys": "Kunci",
384 "last_30_days": "30 hari terakhir",
385 "learn_more": "Pelajari Lebih Lanjut",
386 "ledger_connection_error": "Gagal terhubung ke buku besar Anda. Tolong coba lagi.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Transaksi ditolak pada perangkat",
389 "ledger_error_wrong_app": "Pastikan Anda membuka aplikasi yang tepat di buku besar Anda",
390 "ledger_please_enable_bluetooth": "Harap aktifkan Bluetooth untuk mendeteksi buku besar Anda",
391 + "legacy": "Warisan",
392 "light_theme": "Terang",
393 "litecoin_enable_mweb_sync": "Aktifkan pemindaian MWEB",
394 "litecoin_mweb": "Mweb",
res/values/strings_it.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Tema oscuro di Bitcoin",
82 "bitcoin_light_theme": "Tema luce Bitcoin",
83 "bitcoin_payments_require_1_confirmation": "I pagamenti in bitcoin richiedono 1 conferma, che può richiedere 20 minuti o più. Grazie per la vostra pazienza! Riceverai un'e-mail quando il pagamento sarà confermato.",
84 + "block_height": "Altezza del blocco",
85 "block_remaining": "1 blocco rimanente",
86 "Blocks_remaining": "${status} Blocchi Rimanenti",
87 "bluetooth": "Bluetooth",
@@ -380,6 +381,7 @@
381 "invalid_password": "Password non valida",
382 "invoice_details": "Dettagli della fattura",
383 "is_percentage": "è",
384 + "keys": "Tasti",
385 "last_30_days": "Ultimi 30 giorni",
386 "learn_more": "Impara di più",
387 "ledger_connection_error": "Impossibile connettersi al libro mastro. Per favore riprova.",
@@ -387,6 +389,7 @@
389 "ledger_error_tx_rejected_by_user": "Transazione rifiutata sul dispositivo",
390 "ledger_error_wrong_app": "Assicurati di aprire l'app giusta sul libro mastro",
391 "ledger_please_enable_bluetooth": "Si prega di consentire al Bluetooth di rilevare il libro mastro",
392 + "legacy": "Eredità",
393 "light_theme": "Bianco",
394 "litecoin_enable_mweb_sync": "Abilita la scansione MWeb",
395 "litecoin_mweb": "MWeb",
res/values/strings_ja.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "ビットコインダークテーマ",
82 "bitcoin_light_theme": "ビットコインライトテーマ",
83 "bitcoin_payments_require_1_confirmation": "ビットコインの支払いには 1 回の確認が必要で、これには 20 分以上かかる場合があります。お待ち頂きまして、ありがとうございます!支払いが確認されると、メールが送信されます。",
84 + "block_height": "ブロックの高さ",
85 "block_remaining": "残り1ブロック",
86 "Blocks_remaining": "${status} 残りのブロック",
87 "bluetooth": "ブルートゥース",
@@ -380,6 +381,7 @@
381 "invalid_password": "無効なパスワード",
382 "invoice_details": "請求の詳細",
383 "is_percentage": "is",
384 + "keys": "キー",
385 "last_30_days": "過去30日",
386 "learn_more": "もっと詳しく知る",
387 "ledger_connection_error": "元帳に接続できませんでした。もう一度やり直してください。",
@@ -387,6 +389,7 @@
389 "ledger_error_tx_rejected_by_user": "トランザクションはデバイスで拒否されました",
390 "ledger_error_wrong_app": "元帳に適切なアプリを開始するようにしてください",
391 "ledger_please_enable_bluetooth": "Bluetoothが元帳を検出できるようにしてください",
392 + "legacy": "遺産",
393 "light_theme": "光",
394 "litecoin_enable_mweb_sync": "MWEBスキャンを有効にします",
395 "litecoin_mweb": "mweb",
res/values/strings_ko.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "비트코인 다크 테마",
82 "bitcoin_light_theme": "비트코인 라이트 테마",
83 "bitcoin_payments_require_1_confirmation": "비트코인 결제는 1번의 확인이 필요하며 20분 이상이 소요될 수 있습니다. 기다려 주셔서 감사합니다! 결제가 확인되면 이메일이 전송됩니다.",
84 + "block_height": "블록 높이",
85 "block_remaining": "남은 블록 1 개",
86 "Blocks_remaining": "${status} 남은 블록",
87 "bluetooth": "블루투스",
@@ -379,6 +380,7 @@
380 "invalid_password": "유효하지 않은 비밀번호",
381 "invoice_details": "인보이스 세부정보",
382 "is_percentage": "이다",
383 + "keys": "키",
384 "last_30_days": "지난 30일",
385 "learn_more": "더 알아보기",
386 "ledger_connection_error": "원장에 연결하지 못했습니다. 다시 시도하십시오.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "장치에서 거래가 거부되었습니다",
389 "ledger_error_wrong_app": "원장에서 올바른 앱을 반대하는지 확인하십시오.",
390 "ledger_please_enable_bluetooth": "Bluetooth가 원장을 감지 할 수 있도록하십시오",
391 + "legacy": "유산",
392 "light_theme": "빛",
393 "litecoin_enable_mweb_sync": "mweb 스캔을 활성화합니다",
394 "litecoin_mweb": "mweb",
res/values/strings_my.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Bitcoin Dark Theme",
82 "bitcoin_light_theme": "Bitcoin Light အပြင်အဆင်",
83 "bitcoin_payments_require_1_confirmation": "Bitcoin ငွေပေးချေမှုများသည် မိနစ် 20 သို့မဟုတ် ထို့ထက်ပိုကြာနိုင်သည် 1 အတည်ပြုချက် လိုအပ်သည်။ မင်းရဲ့စိတ်ရှည်မှုအတွက် ကျေးဇူးတင်ပါတယ်။ ငွေပေးချေမှုကို အတည်ပြုပြီးသောအခါ သင့်ထံ အီးမေးလ်ပို့ပါမည်။",
84 + "block_height": "ပိတ်ပင်တားဆီးမှုအမြင့်",
85 "block_remaining": "ကျန်ရှိနေသေးသော block",
86 "Blocks_remaining": "${status} ဘလောက်များ ကျန်နေပါသည်။",
87 "bluetooth": "ဘလူးတုသ်",
@@ -379,6 +380,7 @@
380 "invalid_password": "မမှန်ကန်သောစကားဝှက်",
381 "invoice_details": "ပြေစာအသေးစိတ်",
382 "is_percentage": "သည်",
383 + "keys": "သော့များ",
384 "last_30_days": "လွန်ခဲ့သော ရက် 30",
385 "learn_more": "ပိုမိုသိရှိရန်",
386 "ledger_connection_error": "သငျသညျ Ledger နှင့်ချိတ်ဆက်ရန်မအောင်မြင်ပါ။ ကျေးဇူးပြုပြီးထပ်ကြိုးစားပါ",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "ငွေပေးငွေယူ device ကိုအပေါ်ငြင်းပယ်ခဲ့သည်",
389 "ledger_error_wrong_app": "ကျေးဇူးပြု. သင့်လက်ျာအက်ပ်ကိုသင်၏ Ledger တွင်ဖွင့်ရန်သေချာစေပါ",
390 "ledger_please_enable_bluetooth": "သင်၏ Ledger ကိုရှာဖွေရန် Bluetooth ကိုဖွင့်ပါ",
391 + "legacy": "အနေှးမနေသော",
392 "light_theme": "အလင်း",
393 "litecoin_enable_mweb_sync": "mweb scanning ဖွင့်ပါ",
394 "litecoin_mweb": "မင်္ဂလာပါ",
res/values/strings_nl.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Bitcoin donker thema",
82 "bitcoin_light_theme": "Bitcoin Light-thema",
83 "bitcoin_payments_require_1_confirmation": "Bitcoin-betalingen vereisen 1 bevestiging, wat 20 minuten of langer kan duren. Dank voor uw geduld! U ontvangt een e-mail wanneer de betaling is bevestigd.",
84 + "block_height": "Blokhoogte",
85 "block_remaining": "1 blok resterend",
86 "Blocks_remaining": "${status} Resterende blokken",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Ongeldig wachtwoord",
381 "invoice_details": "Factuurgegevens",
382 "is_percentage": "is",
383 + "keys": "Sleutels",
384 "last_30_days": "Laatste 30 dagen",
385 "learn_more": "Kom meer te weten",
386 "ledger_connection_error": "Kan geen verbinding maken met u grootboek. Probeer het opnieuw.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Transactie afgewezen op apparaat",
389 "ledger_error_wrong_app": "Zorg ervoor dat u de juiste app op uw grootboek opent",
390 "ledger_please_enable_bluetooth": "Schakel Bluetooth in staat om uw grootboek te detecteren",
391 + "legacy": "Nalatenschap",
392 "light_theme": "Licht",
393 "litecoin_enable_mweb_sync": "MWEB -scanning inschakelen",
394 "litecoin_mweb": "Mweb",
res/values/strings_pl.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Ciemny motyw Bitcoina",
82 "bitcoin_light_theme": "Lekki motyw Bitcoin",
83 "bitcoin_payments_require_1_confirmation": "Płatności Bitcoin wymagają 1 potwierdzenia, co może zająć 20 minut lub dłużej. Dziękuję za cierpliwość! Otrzymasz wiadomość e-mail, gdy płatność zostanie potwierdzona.",
84 + "block_height": "Wysokość bloku",
85 "block_remaining": "1 blok pozostałym",
86 "Blocks_remaining": "Pozostało ${status} bloków",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Nieprawidłowe hasło",
381 "invoice_details": "Dane do faktury",
382 "is_percentage": "jest",
383 + "keys": "Klawiatura",
384 "last_30_days": "Ostatnie 30 dni",
385 "learn_more": "Dowiedz się więcej",
386 "ledger_connection_error": "Nie udało się połączyć z twoją księgą. Proszę spróbuj ponownie.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Transakcja odrzucona na urządzeniu",
389 "ledger_error_wrong_app": "Upewnij się, że opisz odpowiednią aplikację na swojej księdze",
390 "ledger_please_enable_bluetooth": "Włącz Bluetooth wykrywanie księgi",
391 + "legacy": "Dziedzictwo",
392 "light_theme": "Jasny",
393 "litecoin_enable_mweb_sync": "Włącz skanowanie MWEB",
394 "litecoin_mweb": "MWEB",
res/values/strings_pt.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Tema escuro Bitcoin",
82 "bitcoin_light_theme": "Tema claro de bitcoin",
83 "bitcoin_payments_require_1_confirmation": "Os pagamentos em Bitcoin exigem 1 confirmação, o que pode levar 20 minutos ou mais. Obrigado pela sua paciência! Você receberá um e-mail quando o pagamento for confirmado.",
84 + "block_height": "Altura do bloco",
85 "block_remaining": "1 bloco restante",
86 "Blocks_remaining": "${status} blocos restantes",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Senha inválida",
381 "invoice_details": "Detalhes da fatura",
382 "is_percentage": "é",
383 + "keys": "Chaves",
384 "last_30_days": "Últimos 30 dias",
385 "learn_more": "Saber mais",
386 "ledger_connection_error": "Falha ao se conectar ao seu livro. Por favor, tente novamente.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Transação rejeitada no dispositivo",
389 "ledger_error_wrong_app": "Por favor, certifique -se de optar pelo aplicativo certo no seu livro",
390 "ledger_please_enable_bluetooth": "Ative o Bluetooth para detectar seu livro",
391 + "legacy": "Legado",
392 "light_theme": "Luz",
393 "litecoin_enable_mweb_sync": "Ativar digitalização do MWEB",
394 "litecoin_mweb": "Mweb",
res/values/strings_ru.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Биткойн Темная тема",
82 "bitcoin_light_theme": "Светлая биткойн-тема",
83 "bitcoin_payments_require_1_confirmation": "Биткойн-платежи требуют 1 подтверждения, что может занять 20 минут или дольше. Спасибо тебе за твое терпение! Вы получите электронное письмо, когда платеж будет подтвержден.",
84 + "block_height": "Высота блока",
85 "block_remaining": "1 Блок остался",
86 "Blocks_remaining": "${status} Осталось блоков",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Неверный пароль",
381 "invoice_details": "Детали счета",
382 "is_percentage": "есть",
383 + "keys": "Ключи",
384 "last_30_days": "Последние 30 дней",
385 "learn_more": "Узнать больше",
386 "ledger_connection_error": "Не удалось подключиться к вам, книги. Пожалуйста, попробуйте еще раз.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Транзакция отклоняется на устройстве",
389 "ledger_error_wrong_app": "Пожалуйста, убедитесь, что вы предлагаете правильное приложение в своей бухгалтерской книге",
390 "ledger_please_enable_bluetooth": "Пожалуйста, включите Bluetooth обнаружить вашу бухгалтерскую книгу",
391 + "legacy": "Наследие",
392 "light_theme": "Светлая",
393 "litecoin_enable_mweb_sync": "Включить MWEB сканирование",
394 "litecoin_mweb": "Мвеб",
res/values/strings_th.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "ธีมมืด Bitcoin",
82 "bitcoin_light_theme": "ธีมแสง Bitcoin",
83 "bitcoin_payments_require_1_confirmation": "การชำระเงินด้วย Bitcoin ต้องการการยืนยัน 1 ครั้ง ซึ่งอาจใช้เวลา 20 นาทีหรือนานกว่านั้น ขอบคุณสำหรับความอดทนของคุณ! คุณจะได้รับอีเมลเมื่อการชำระเงินได้รับการยืนยัน",
84 + "block_height": "ความสูงของบล็อก",
85 "block_remaining": "เหลือ 1 บล็อก",
86 "Blocks_remaining": "${status} บล็อกที่เหลืออยู่",
87 "bluetooth": "บลูทู ธ",
@@ -379,6 +380,7 @@
380 "invalid_password": "รหัสผ่านไม่ถูกต้อง",
381 "invoice_details": "รายละเอียดใบแจ้งหนี้",
382 "is_percentage": "เป็น",
383 + "keys": "กุญแจ",
384 "last_30_days": "30 วันล่าสุด",
385 "learn_more": "ศึกษาเพิ่มเติม",
386 "ledger_connection_error": "ไม่สามารถเชื่อมต่อกับบัญชีแยกประเภทของคุณได้ กรุณาลองอีกครั้ง.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "ธุรกรรมถูกปฏิเสธบนอุปกรณ์",
389 "ledger_error_wrong_app": "โปรดตรวจสอบให้แน่ใจว่าคุณเปิดแอพที่เหมาะสมในบัญชีแยกประเภทของคุณ",
390 "ledger_please_enable_bluetooth": "โปรดเปิดใช้งานบลูทู ธ ในการตรวจจับบัญชีแยกประเภทของคุณ",
391 + "legacy": "มรดก",
392 "light_theme": "สว่าง",
393 "litecoin_enable_mweb_sync": "เปิดใช้งานการสแกน MWEB",
394 "litecoin_mweb": "mweb",
res/values/strings_tl.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Bitcoin Dark Theme",
82 "bitcoin_light_theme": "Bitcoin Light Theme",
83 "bitcoin_payments_require_1_confirmation": "Ang mga pagbabayad sa Bitcoin ay nangangailangan ng 1 kumpirmasyon, na maaaring tumagal ng 20 minuto o mas mahaba. Salamat sa iyong pasensya! Mag-email ka kapag nakumpirma ang pagbabayad.",
84 + "block_height": "I -block ang taas",
85 "block_remaining": "1 Bloke ang Natitira",
86 "Blocks_remaining": "Ang natitirang ${status} ay natitira",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Di-wastong password",
381 "invoice_details": "Mga detalye ng invoice",
382 "is_percentage": "ay",
383 + "keys": "Mga susi",
384 "last_30_days": "Huling 30 na araw",
385 "learn_more": "Matuto nang higit pa",
386 "ledger_connection_error": "Nabigong kumonekta sa iyong Ledger. Pakisubukang muli.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Ang transaksyon ay tinanggihan sa hardware wallet",
389 "ledger_error_wrong_app": "Mangyaring tiyaking pinipili mo ang tamang app sa iyong Ledger",
390 "ledger_please_enable_bluetooth": "Mangyaring paganahin ang Bluetooth upang makita ang iyong Ledger",
391 + "legacy": "Pamana",
392 "light_theme": "Light",
393 "litecoin_enable_mweb_sync": "Paganahin ang pag -scan ng MWeb",
394 "litecoin_mweb": "Mweb",
res/values/strings_tr.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Bitcoin Karanlık Teması",
82 "bitcoin_light_theme": "Bitcoin Hafif Tema",
83 "bitcoin_payments_require_1_confirmation": "Bitcoin ödemeleri, 20 dakika veya daha uzun sürebilen 1 onay gerektirir. Sabrınız için teşekkürler! Ödeme onaylandığında e-posta ile bilgilendirileceksiniz.",
84 + "block_height": "Blok yüksekliği",
85 "block_remaining": "Kalan 1 blok",
86 "Blocks_remaining": "${status} Blok Kaldı",
87 "bluetooth": "Bluetooth",
@@ -379,6 +380,7 @@
380 "invalid_password": "Geçersiz şifre",
381 "invoice_details": "fatura detayları",
382 "is_percentage": "is",
383 + "keys": "Anahtar",
384 "last_30_days": "Son 30 gün",
385 "learn_more": "Daha fazla öğren",
386 "ledger_connection_error": "Ledger'e bağlanamadı. Lütfen tekrar deneyin.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Cihazda reddedilen işlem",
389 "ledger_error_wrong_app": "Lütfen defterinizde doğru uygulamayı açtığınızdan emin olun",
390 "ledger_please_enable_bluetooth": "Defterinizi algılamak için lütfen Bluetooth'u etkinleştirin",
391 + "legacy": "Miras",
392 "light_theme": "Aydınlık",
393 "litecoin_enable_mweb_sync": "MWEB taramasını etkinleştir",
394 "litecoin_mweb": "Mweb",
res/values/strings_uk.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Темна тема Bitcoin",
82 "bitcoin_light_theme": "Світла тема Bitcoin",
83 "bitcoin_payments_require_1_confirmation": "Платежі Bitcoin потребують 1 підтвердження, яке може зайняти 20 хвилин або більше. Дякую за Ваше терпіння! Ви отримаєте електронний лист, коли платіж буде підтверджено.",
84 + "block_height": "Висота блоку",
85 "block_remaining": "1 блок, що залишився",
86 "Blocks_remaining": "${status} Залишилось блоків",
87 "bluetooth": "Блюдот",
@@ -379,6 +380,7 @@
380 "invalid_password": "Недійсний пароль",
381 "invoice_details": "Реквізити рахунку-фактури",
382 "is_percentage": "є",
383 + "keys": "Ключі",
384 "last_30_days": "Останні 30 днів",
385 "learn_more": "Дізнатися більше",
386 "ledger_connection_error": "Не вдалося підключитися до вас. Будь ласка спробуйте ще раз.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "Транзакція відхилена на пристрої",
389 "ledger_error_wrong_app": "Будь ласка, переконайтеся, що ви відкриваєте потрібну програму на своїй книзі",
390 "ledger_please_enable_bluetooth": "Будь ласка, ввімкніть Bluetooth виявити свою книгу",
391 + "legacy": "Спадщина",
392 "light_theme": "Світла",
393 "litecoin_enable_mweb_sync": "Увімкнути сканування MWEB",
394 "litecoin_mweb": "Мвеб",
res/values/strings_ur.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "بٹ کوائن ڈارک تھیم",
82 "bitcoin_light_theme": "بٹ کوائن لائٹ تھیم",
83 "bitcoin_payments_require_1_confirmation": "بٹ کوائن کی ادائیگی میں 1 تصدیق کی ضرورت ہوتی ہے ، جس میں 20 منٹ یا اس سے زیادہ وقت لگ سکتا ہے۔ آپ کے صبر کا شکریہ! ادائیگی کی تصدیق ہونے پر آپ کو ای میل کیا جائے گا۔",
84 + "block_height": "اونچائی کو بلاک کریں",
85 "block_remaining": "1 بلاک باقی",
86 "Blocks_remaining": "${status} بلاکس باقی ہیں۔",
87 "bluetooth": "بلوٹوتھ",
@@ -379,6 +380,7 @@
380 "invalid_password": "غلط پاسورڈ",
381 "invoice_details": "رسید کی تفصیلات",
382 "is_percentage": "ہے",
383 + "keys": "چابیاں",
384 "last_30_days": "آخری 30 دن",
385 "learn_more": "اورجانیے",
386 "ledger_connection_error": "آپ سے لیجر سے رابطہ قائم کرنے میں ناکام۔ دوبارہ کوشش کریں.",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "آلہ پر لین دین کو مسترد کردیا گیا",
389 "ledger_error_wrong_app": "براہ کرم یقینی بنائیں کہ آپ اپنے لیجر پر صحیح ایپ کو کھولتے ہیں",
390 "ledger_please_enable_bluetooth": "براہ کرم بلوٹوتھ کو اپنے لیجر کا پتہ لگانے کے لئے اہل بنائیں",
391 + "legacy": "میراث",
392 "light_theme": "روشنی",
393 "litecoin_enable_mweb_sync": "MWEB اسکیننگ کو فعال کریں",
394 "litecoin_mweb": "MWEB",
res/values/strings_vi.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Chủ đề Bitcoin tối",
82 "bitcoin_light_theme": "Chủ đề Bitcoin sáng",
83 "bitcoin_payments_require_1_confirmation": "Các khoản thanh toán Bitcoin yêu cầu 1 xác nhận, có thể mất 20 phút hoặc lâu hơn. Cảm ơn bạn đã kiên nhẫn! Bạn sẽ nhận được email khi thanh toán được xác nhận.",
84 + "block_height": "Chiều cao khối",
85 "block_remaining": "1 khối còn lại",
86 "Blocks_remaining": "${status} khối còn lại",
87 "bluetooth": "Bluetooth",
@@ -378,6 +379,7 @@
379 "invalid_password": "Mật khẩu không hợp lệ",
380 "invoice_details": "Chi tiết hóa đơn",
381 "is_percentage": "là",
382 + "keys": "Chìa khóa",
383 "last_30_days": "30 ngày gần nhất",
384 "learn_more": "Tìm hiểu thêm",
385 "ledger_connection_error": "Không thể kết nối với Ledger của bạn. Vui lòng thử lại.",
@@ -385,6 +387,7 @@
387 "ledger_error_tx_rejected_by_user": "Giao dịch bị từ chối trên thiết bị",
388 "ledger_error_wrong_app": "Vui lòng đảm bảo bạn đã mở đúng ứng dụng trên Ledger của mình",
389 "ledger_please_enable_bluetooth": "Vui lòng bật Bluetooth để phát hiện Ledger của bạn",
390 + "legacy": "Di sản",
391 "light_theme": "Chủ đề sáng",
392 "litecoin_enable_mweb_sync": "Bật quét MWEB",
393 "litecoin_mweb": "Mweb",
res/values/strings_yo.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "Bitcoin Dark Akori",
82 "bitcoin_light_theme": "Bitcoin Light Akori",
83 "bitcoin_payments_require_1_confirmation": "Àwọn àránṣẹ́ Bitcoin nílò ìjẹ́rìísí kan. Ó lè lo ìṣéjú ogun tàbí ìṣéjú jù. A dúpẹ́ fún sùúrù yín! Ẹ máa gba ímeèlì t'ó bá jẹ́rìísí àránṣẹ́ náà.",
84 + "block_height": "Dènà giga",
85 "block_remaining": "1 bulọọki to ku",
86 "Blocks_remaining": "Àkójọpọ̀ ${status} kikù",
87 "bluetooth": "Bluetooth",
@@ -380,6 +381,7 @@
381 "invalid_password": "Ọrọ igbaniwọle ti ko wulo",
382 "invoice_details": "Iru awọn ẹya ọrọ",
383 "is_percentage": "jẹ́",
384 + "keys": "Awọn bọtini",
385 "last_30_days": "Ọ̀jọ̀ mọ́gbọ̀n tó kọjà",
386 "learn_more": "Túbọ̀ kọ́",
387 "ledger_connection_error": "O kuna lati sopọ mọ ọ. Jọwọ gbiyanju lẹẹkansi.",
@@ -387,6 +389,7 @@
389 "ledger_error_tx_rejected_by_user": "Idunadura kọ lori ẹrọ",
390 "ledger_error_wrong_app": "Jọwọ rii daju pe iwọ yoo sọ app ti o tọ loju omi rẹ",
391 "ledger_please_enable_bluetooth": "Jọwọ jẹ ki Bluetooth lati rii iṣupọ rẹ",
392 + "legacy": "Agbara",
393 "light_theme": "Funfun bí eérú",
394 "litecoin_enable_mweb_sync": "Mu mweb ọlọjẹ",
395 "litecoin_mweb": "Mweb",
res/values/strings_zh.arb
+3
@@ -81,6 +81,7 @@
81 "bitcoin_dark_theme": "比特币黑暗主题",
82 "bitcoin_light_theme": "比特币浅色主题",
83 "bitcoin_payments_require_1_confirmation": "比特币支付需要 1 次确认,这可能需要 20 分钟或更长时间。谢谢你的耐心!确认付款后,您将收到电子邮件。",
84 + "block_height": "块高度",
85 "block_remaining": "剩下1个块",
86 "Blocks_remaining": "${status} 剩余的块",
87 "bluetooth": "蓝牙",
@@ -379,6 +380,7 @@
380 "invalid_password": "无效的密码",
381 "invoice_details": "发票明细",
382 "is_percentage": "是",
383 + "keys": "钥匙",
384 "last_30_days": "过去 30 天",
385 "learn_more": "了解更多",
386 "ledger_connection_error": "无法连接到您的分类帐。请再试一次。",
@@ -386,6 +388,7 @@
388 "ledger_error_tx_rejected_by_user": "交易在设备上拒绝",
389 "ledger_error_wrong_app": "请确保您在分类帐中操作正确的应用程序",
390 "ledger_please_enable_bluetooth": "请启用蓝牙来检测您的分类帐",
391 + "legacy": "遗产",
392 "light_theme": "艳丽",
393 "litecoin_enable_mweb_sync": "启用MWEB扫描",
394 "litecoin_mweb": "MWEB",