diff --git a/assets/images/main_actions/apps.svg b/assets/images/main_actions/apps.svg new file mode 100644 index 000000000..320acc572 --- /dev/null +++ b/assets/images/main_actions/apps.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/main_actions/charts.svg b/assets/images/main_actions/charts.svg new file mode 100644 index 000000000..8bcb206fe --- /dev/null +++ b/assets/images/main_actions/charts.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/main_actions/contacts.svg b/assets/images/main_actions/contacts.svg new file mode 100644 index 000000000..0a0a0e654 --- /dev/null +++ b/assets/images/main_actions/contacts.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/main_actions/history.svg b/assets/images/main_actions/history.svg new file mode 100644 index 000000000..7044ec6a9 --- /dev/null +++ b/assets/images/main_actions/history.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/main_actions/home.svg b/assets/images/main_actions/home.svg new file mode 100644 index 000000000..ac1b1d4af --- /dev/null +++ b/assets/images/main_actions/home.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/assets/images/main_actions/wallets.svg b/assets/images/main_actions/wallets.svg new file mode 100644 index 000000000..8ed9319c8 --- /dev/null +++ b/assets/images/main_actions/wallets.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/entities/page_indicator_actions.dart b/lib/entities/page_indicator_actions.dart new file mode 100644 index 000000000..476264a02 --- /dev/null +++ b/lib/entities/page_indicator_actions.dart @@ -0,0 +1,43 @@ +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/routes.dart'; +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:flutter/material.dart'; + +class PageIndicatorActions { + final String Function(BuildContext context) name; + final String image; + final Key key; + final bool Function(DashboardViewModel viewModel)? isEnabled; + + PageIndicatorActions._({ + required this.name, + required this.image, + required this.key, + this.isEnabled, + }); + + static List all = [ + appsAction, + homeAction, + historyAction, + ]; + + static PageIndicatorActions appsAction = PageIndicatorActions._( + name: (context) => S.of(context).apps, + image: 'assets/images/main_actions/apps.svg', + key: ValueKey('dashboard_page_indicator_apps_action_button_key'), + isEnabled: (viewModel) => viewModel.shouldShowMarketPlaceInDashboard, + ); + + static PageIndicatorActions homeAction = PageIndicatorActions._( + name: (context) => S.of(context).home, + image: 'assets/images/main_actions/home.svg', + key: ValueKey('dashboard_page_indicator_home_action_button_key'), + ); + + static PageIndicatorActions historyAction = PageIndicatorActions._( + name: (context) => S.of(context).history, + image: 'assets/images/main_actions/history.svg', + key: ValueKey('dashboard_page_indicator_history_action_button_key'), + ); +} diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart index 107024a77..15e0697b1 100644 --- a/lib/src/screens/dashboard/dashboard_page.dart +++ b/lib/src/screens/dashboard/dashboard_page.dart @@ -3,6 +3,7 @@ import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart'; import 'package:cake_wallet/src/screens/dashboard/pages/cake_features_page.dart'; +import 'package:cake_wallet/src/screens/dashboard/widgets/page_indicator.dart'; import 'package:cake_wallet/src/screens/wallet_connect/widgets/bottom_sheet/bottom_sheet_listener_widget.dart'; import 'package:cake_wallet/src/screens/wallet_connect/services/bottom_sheet_service.dart'; import 'package:cake_wallet/src/widgets/gradient_background.dart'; @@ -220,45 +221,34 @@ class _DashboardPageView extends BasePage { child: Stack( alignment: Alignment.bottomCenter, children: [ - //new Expanded( Observer( builder: (context) { return PageView.builder( - key: ValueKey('dashboard_page_view_key'), + key: const ValueKey('dashboard_page_view_key'), controller: controller, + physics: const BouncingScrollPhysics(), itemCount: pages.length, itemBuilder: (context, index) => pages[index], ); }, ), - //), Positioned( child: Container( alignment: Alignment.bottomCenter, margin: EdgeInsets.only(bottom: 110), - child: Observer( - builder: (context) { - return Semantics( - button: false, - label: 'Page Indicator', - hint: 'Swipe to change page', - excludeSemantics: true, - child: SmoothPageIndicator( - controller: controller, - count: pages.length, - effect: ColorTransitionEffect( - spacing: 6.0, - radius: 6.0, - dotWidth: 6.0, - dotHeight: 6.0, - dotColor: Theme.of(context).colorScheme.primary.withOpacity(0.4), - activeDotColor: Theme.of(context).colorScheme.primary, - ), - ), - ); - }, + child: Semantics( + container: true, + label: 'Page indicator', + hint: 'Swipe left or right to change page, or double tap buttons below to navigate directly.', + child: ExcludeSemantics( + excluding: false, + child: PageIndicator( + controller: controller, + dashboardViewModel: dashboardViewModel, + ), ), ), + ), ), NavigationDock( dashboardViewModel: dashboardViewModel, @@ -277,7 +267,7 @@ class _DashboardPageView extends BasePage { if (dashboardViewModel.shouldShowMarketPlaceInDashboard) { pages.add( Semantics( - label: 'Cake ${S.of(context).features}', + label: S.of(context).apps, child: CakeFeaturesPage( dashboardViewModel: dashboardViewModel, cakeFeaturesViewModel: getIt.get(), @@ -288,7 +278,7 @@ class _DashboardPageView extends BasePage { pages.add(Semantics(label: S.of(context).balance_page, child: balancePage)); pages.add( Semantics( - label: S.of(context).settings_transactions, + label: S.of(context).history, child: TransactionsPage(dashboardViewModel: dashboardViewModel), ), ); diff --git a/lib/src/screens/dashboard/pages/cake_features_page.dart b/lib/src/screens/dashboard/pages/cake_features_page.dart index b2b361d1e..bd381a968 100644 --- a/lib/src/screens/dashboard/pages/cake_features_page.dart +++ b/lib/src/screens/dashboard/pages/cake_features_page.dart @@ -28,7 +28,7 @@ class CakeFeaturesPage extends StatelessWidget { Padding( padding: EdgeInsets.only(left: 24, top: 16), child: Text( - 'Cake ${S.of(context).features}', + S.of(context).apps, style: Theme.of(context).textTheme.headlineSmall?.copyWith( fontWeight: FontWeight.w500, color: Theme.of(context).colorScheme.onSurface, diff --git a/lib/src/screens/dashboard/pages/navigation_dock.dart b/lib/src/screens/dashboard/pages/navigation_dock.dart index d3afd4e0c..c4ee6b09b 100644 --- a/lib/src/screens/dashboard/pages/navigation_dock.dart +++ b/lib/src/screens/dashboard/pages/navigation_dock.dart @@ -19,7 +19,7 @@ class NavigationDock extends StatelessWidget { child: Observer( builder: (_) { return Container( - height: 150, + height: 84, alignment: Alignment.bottomCenter, decoration: dashboardViewModel.settingsStore.backgroundImage.isEmpty ? BoxDecoration( @@ -30,7 +30,6 @@ class NavigationDock extends StatelessWidget { ), ) : null, - //color: Colors.transparent, child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(50), @@ -50,38 +49,51 @@ class NavigationDock extends StatelessWidget { borderRadius: BorderRadius.circular(50.0), color: Theme.of(context).colorScheme.surfaceContainer, ), - child: Container( - padding: EdgeInsets.symmetric(horizontal: 8), - child: IntrinsicHeight( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: MainActions.all - .where((element) => element.canShow?.call(dashboardViewModel) ?? true) - .map( - (action) => Expanded( - child: Semantics( - button: true, - enabled: (action.isEnabled?.call(dashboardViewModel) ?? true), - child: ActionButton( - key: action.key, - image: Image.asset(action.image, - height: 24, - width: 24, - color: Theme.of(context).colorScheme.primary), - title: action.name(context), - onClick: (action.isEnabled?.call(dashboardViewModel) ?? true) - ? () async => - await action.onTap(context, dashboardViewModel) - : null, - textColor: action.isEnabled?.call(dashboardViewModel) ?? true - ? null - : Theme.of(context).colorScheme.onSurface, + padding: const EdgeInsets.symmetric(horizontal: 8), + child: ClipRect( + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: MainActions.all + .where((element) => + element.canShow?.call(dashboardViewModel) ?? + true) + .map( + (action) => Expanded( + child: Semantics( + button: true, + enabled: (action.isEnabled + ?.call(dashboardViewModel) ?? + true), + child: ActionButton( + key: action.key, + image: Image.asset( + action.image, + height: 24, + width: 24, + color: + Theme.of(context).colorScheme.primary, ), + title: action.name(context), + onClick: (action.isEnabled + ?.call(dashboardViewModel) ?? + true) + ? () async => await action.onTap( + context, dashboardViewModel) + : null, + textColor: action.isEnabled + ?.call(dashboardViewModel) ?? + true + ? null + : Theme.of(context) + .colorScheme + .onSurface, ), ), - ) - .toList(), - ), + ), + ) + .toList(), ), ), ), diff --git a/lib/src/screens/dashboard/widgets/action_button.dart b/lib/src/screens/dashboard/widgets/action_button.dart index 535181da8..4569393a4 100644 --- a/lib/src/screens/dashboard/widgets/action_button.dart +++ b/lib/src/screens/dashboard/widgets/action_button.dart @@ -21,6 +21,11 @@ class ActionButton extends StatelessWidget { @override Widget build(BuildContext context) { return TextButton( + style: TextButton.styleFrom( + padding: EdgeInsets.zero, + minimumSize: Size.zero, + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), onPressed: () { if (route?.isNotEmpty ?? false) { Navigator.of(context, rootNavigator: true).pushNamed(route!); @@ -28,31 +33,32 @@ class ActionButton extends StatelessWidget { onClick?.call(); } }, - child: Container( - color: Colors.transparent, - padding: EdgeInsets.only(top: 5, bottom: 4, left: 0, right: 0), - alignment: alignment, - child: Column( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - //mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - alignment: Alignment.center, - decoration: BoxDecoration( - shape: BoxShape.circle), - child: image, - ), - SizedBox(height: 4), - Text( - title, - maxLines: 1, - overflow: TextOverflow.visible, - style: Theme.of(context).textTheme.labelSmall?.copyWith( - color: textColor ?? Theme.of(context).colorScheme.onSurface), - textAlign: TextAlign.center, - ) - ], + child: SizedBox.expand( + child: Container( + color: Colors.transparent, + alignment: alignment, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + image, + const SizedBox(height: 4), + Flexible( + child: Text( + title, + maxLines: 1, + overflow: TextOverflow.fade, + softWrap: false, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.labelSmall?.copyWith( + color: textColor ?? + Theme.of(context).colorScheme.onSurface, + ), + ), + ), + ], + ), ), ), ); diff --git a/lib/src/screens/dashboard/widgets/header_row.dart b/lib/src/screens/dashboard/widgets/header_row.dart index c501ef00a..f85a2cf6f 100644 --- a/lib/src/screens/dashboard/widgets/header_row.dart +++ b/lib/src/screens/dashboard/widgets/header_row.dart @@ -23,7 +23,7 @@ class HeaderRow extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - S.of(context).transactions, + S.of(context).history, style: Theme.of(context).textTheme.titleLarge?.copyWith( fontWeight: FontWeight.w500, color: Theme.of(context).colorScheme.onSurface), diff --git a/lib/src/screens/dashboard/widgets/page_indicator.dart b/lib/src/screens/dashboard/widgets/page_indicator.dart new file mode 100644 index 000000000..a894c4002 --- /dev/null +++ b/lib/src/screens/dashboard/widgets/page_indicator.dart @@ -0,0 +1,326 @@ +import 'dart:math' as math; +import 'dart:ui'; +import 'package:cake_wallet/entities/page_indicator_actions.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; + +class PageIndicator extends StatefulWidget { + const PageIndicator({ + super.key, + required this.controller, + required this.dashboardViewModel, + }); + + final PageController controller; + final DashboardViewModel dashboardViewModel; + + @override + State createState() => _PageIndicatorState(); +} + +class _PageIndicatorState extends State { + static const barHeight = 37.0; + static const iconWidth = 16.0; + static const iconHeight = 16.0; + static const iconSpacing = 5.0; + static const barHorizontalPadding = 4.0; + static const pillHorizontalPadding = 8.0; + static const edgePadding = 5.0; + static const barBorderRadius = 50.0; + static const pillBorderRadius = 50.0; + static const pageSwitchDuration = Duration(milliseconds: 300); + static const pillMoveDuration = Duration(milliseconds: 300); + static const pillResizeDuration = Duration(milliseconds: 200); + static const textStyle = TextStyle( + fontSize: 12, + fontWeight: FontWeight.w400, + ); + + late int selectedIndex; + late final VoidCallback _pageListener; + + @override + void initState() { + super.initState(); + + selectedIndex = widget.controller.initialPage; + + _pageListener = () { + final page = widget.controller.page; + if (page == null) return; + + final rounded = page.round(); + if (rounded != selectedIndex && mounted) { + setState(() { + selectedIndex = rounded; + }); + } + }; + + widget.controller.addListener(_pageListener); + } + + @override + void dispose() { + widget.controller.removeListener(_pageListener); + super.dispose(); + } + + void _onItemTap(int index) { + if (index == selectedIndex) return; + widget.controller.animateToPage( + index, + duration: pageSwitchDuration, + curve: Curves.easeOutCubic, + ); + } + + double _estimateItemWidthForAction( + BuildContext context, PageIndicatorActions action, + {Color? color}) { + final text = action.name(context); + final textPainter = TextPainter( + text: TextSpan(text: text, style: textStyle.copyWith(color: color)), + maxLines: 1, + textDirection: Directionality.of(context), + textScaler: MediaQuery.of(context).textScaler, + )..layout(); + return iconWidth + + iconSpacing + + textPainter.width + + pillHorizontalPadding * 2; + } + + @override + Widget build(BuildContext context) { + + final visibleActions = PageIndicatorActions.all.where((action) { + return action.isEnabled?.call(widget.dashboardViewModel) ?? true; + }).toList(); + + // Don't show indicator if less than 2 actions + if (visibleActions.length < 2) return const SizedBox.shrink(); + + selectedIndex = selectedIndex.clamp(0, visibleActions.length - 1); + + // Theme setup + final theme = Theme.of(context); + final backgroundColor = theme.colorScheme.surfaceContainer.withAlpha(122); + final pillColor = theme.colorScheme.onSurface.withAlpha(30); + final activeColor = theme.colorScheme.onSurface; + final inactiveColor = theme.colorScheme.primary; + + // Size calculations + final screenWidth = MediaQuery.of(context).size.width; + final isRTL = Directionality.of(context) == TextDirection.rtl; + + final pillWidth = _estimateItemWidthForAction( + context, + visibleActions[selectedIndex], + color: activeColor, + ); + + final actionWidths = [ + for (final action in visibleActions) + _estimateItemWidthForAction(context, action, color: inactiveColor) + ]; + + final totalItemsWidth = + actionWidths.fold(0.0, (sum, width) => sum + width) + + barHorizontalPadding * 2; + + final barWidth = math.min(totalItemsWidth, screenWidth * 0.95); + + final count = visibleActions.length; + final firstLeft = edgePadding; + final secondLeft = + barWidth - (isRTL ? actionWidths.first : actionWidths[1]) - edgePadding; + + final List positions; + + if (count == 2) { + positions = [firstLeft, secondLeft]; + } else { + final lastLeft = barWidth - + (isRTL ? actionWidths.first : actionWidths.last) - + edgePadding; + + final centerLeft = (isRTL + ? actionWidths.last + edgePadding + : actionWidths.first + edgePadding); + + positions = [firstLeft, centerLeft, lastLeft]; + } + + final left = + (isRTL ? positions.reversed.toList() : positions)[selectedIndex]; + final currentAction = visibleActions[selectedIndex]; + + return Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: EdgeInsets.only(top: 10), + child: Container( + width: barWidth, + child: ClipRRect( + borderRadius: BorderRadius.circular(barBorderRadius), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 30, sigmaY: 30), + child: Container( + height: barHeight, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(barBorderRadius), + ), + child: Stack( + alignment: Alignment.center, + children: [ + AnimatedPill( + left: left, + pillColor: pillColor, + currentAction: currentAction, + pillIconHeight: iconHeight, + pillIconWidth: iconWidth, + pillIconSpacing: iconSpacing, + pillBorderRadius: pillBorderRadius, + contentColor: activeColor, + estimateWidthForAction: pillWidth, + pillTextStyle: textStyle, + pillMoveDuration: pillMoveDuration, + pillResizeDuration: pillResizeDuration, + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: barHorizontalPadding), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + for (int i = 0; i < visibleActions.length; i++) + Semantics( + button: true, + label: visibleActions[i].name(context), + value: i == selectedIndex ? 'Selected' : null, + hint: 'Double tap to open ${visibleActions[i].name(context)} page', + onTap: () => _onItemTap(i), + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () => _onItemTap(i), + child: Container( + height: barHeight, + width: i == selectedIndex + ? pillWidth + : _estimateItemWidthForAction( + context, visibleActions[i]), + alignment: Alignment.center, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + TweenAnimationBuilder( + duration: const Duration( + milliseconds: 300), + curve: Curves.easeOutCubic, + tween: ColorTween( + begin: inactiveColor, + end: i == selectedIndex + ? activeColor + : inactiveColor, + ), + builder: (context, color, _) => + SvgPicture.asset( + visibleActions[i].image, + width: iconWidth, + height: iconHeight, + colorFilter: ColorFilter.mode( + color!, BlendMode.srcIn), + ), + ), + SizedBox(width: iconSpacing), + TweenAnimationBuilder( + duration: const Duration( + milliseconds: 300), + curve: Curves.easeOutCubic, + tween: ColorTween( + begin: inactiveColor, + end: i == selectedIndex + ? activeColor + : inactiveColor, + ), + builder: (context, color, _) => + Text( + visibleActions[i].name(context), + style: textStyle.copyWith( + color: color), + overflow: TextOverflow.fade, + softWrap: false, + ), + ), + ], + ), + ), + ), + ), + ], + ), + ) + ], + )), + ), + ), + ), + ), + ); + } +} + +class AnimatedPill extends StatelessWidget { + const AnimatedPill({ + super.key, + required this.left, + required this.pillColor, + required this.contentColor, + required this.pillIconHeight, + required this.pillIconWidth, + required this.pillBorderRadius, + required this.currentAction, + required this.estimateWidthForAction, + required this.pillIconSpacing, + required this.pillTextStyle, + required this.pillMoveDuration, + required this.pillResizeDuration, + }); + + final double left; + final Color pillColor; + final Color contentColor; + final double pillIconHeight; + final double pillIconWidth; + final double pillBorderRadius; + final PageIndicatorActions currentAction; + final double estimateWidthForAction; + final double pillIconSpacing; + final TextStyle pillTextStyle; + final Duration pillMoveDuration; + final Duration pillResizeDuration; + + @override + Widget build(BuildContext context) { + return AnimatedPositioned( + duration: pillMoveDuration, + curve: Curves.easeOutCubic, + left: left, + top: 4, + bottom: 4, + child: AnimatedContainer( + duration: pillResizeDuration, + curve: Curves.easeOutCubic, + width: estimateWidthForAction, + decoration: BoxDecoration( + color: pillColor, + borderRadius: BorderRadius.circular(pillBorderRadius)), + clipBehavior: Clip.hardEdge, + alignment: Alignment.center, + ), + ); + } +} diff --git a/lib/src/screens/settings/display_settings_page.dart b/lib/src/screens/settings/display_settings_page.dart index 003e64d90..c28db5855 100644 --- a/lib/src/screens/settings/display_settings_page.dart +++ b/lib/src/screens/settings/display_settings_page.dart @@ -37,7 +37,7 @@ class DisplaySettingsPage extends BasePage { crossAxisAlignment: CrossAxisAlignment.start, children: [ SettingsSwitcherCell( - title: S.of(context).show_market_place, + title: S.of(context).apps, value: _displaySettingsViewModel.shouldShowMarketPlaceInDashboard, onValueChange: (_, bool value) { _displaySettingsViewModel.setShouldShowMarketPlaceInDashbaord(value); diff --git a/pubspec_base.yaml b/pubspec_base.yaml index dda4bea3d..274a97201 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -221,6 +221,7 @@ flutter: - assets/images/hardware_wallet/ - assets/images/crypto/ - assets/images/stocks/ + - assets/images/main_actions/ - assets/node_list.yml - assets/haven_node_list.yml - assets/bitcoin_electrum_server_list.yml diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 22dec1012..33709eb3e 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -60,6 +60,7 @@ "approve": "ﺪﻤﺘﻌﻳ", "approve_request": "الموافقة على الطلب", "approve_tokens": "الموافقة على الرموز", + "apps": "تطبيقات", "arbiscan_history": "تاريخ أربيسكان", "arrive_in_this_address": "سيصل ${currency} ${tag}إلى هذا العنوان", "ascending": "تصاعدي", @@ -440,6 +441,8 @@ "hide": "يخفي", "hide_details": "أخف التفاصيل", "high_contrast_theme": "موضوع عالي التباين", + "history": "تاريخ", + "home": "بيت", "home_screen_settings": "إعدادات الشاشة الرئيسية", "how_to_connect": "كيفية الاتصال", "how_to_use": " ﻞﻤﻌﺘﺴﺗ ﻒﻴﻛ", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 5ccf69bd9..0484cc66f 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -60,6 +60,7 @@ "approve": "Одобряване", "approve_request": "Одобрете искане", "approve_tokens": "Одобрете жетоните", + "apps": "Приложения", "arbiscan_history": "Арбисканска история", "arrive_in_this_address": "${currency} ${tag}ще отидат на този адрес", "ascending": "Възходящ", @@ -440,6 +441,8 @@ "hide": "Скрий", "hide_details": "Скриване на подробностите", "high_contrast_theme": "Тема с висок контраст", + "history": "История", + "home": "Начало", "home_screen_settings": "Настройки на началния екран", "how_to_connect": "Как да се свържа", "how_to_use": "Как да използвам", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index d34969614..e73b1f4bc 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -60,6 +60,7 @@ "approve": "Schvalovat", "approve_request": "Schválit žádost", "approve_tokens": "Schválit tokeny", + "apps": "Aplikace", "arbiscan_history": "Arbiscan History", "arrive_in_this_address": "${currency} ${tag}přijde na tuto adresu", "ascending": "Vzestupné", @@ -440,6 +441,8 @@ "hide": "Skrýt", "hide_details": "Skrýt detaily", "high_contrast_theme": "Téma s vysokým kontrastem", + "history": "Dějiny", + "home": "Domov", "home_screen_settings": "Nastavení domovské obrazovky", "how_to_connect": "Jak se připojit", "how_to_use": "Jak používat", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index b23850445..5ed7982cd 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -60,6 +60,7 @@ "approve": "Genehmigen", "approve_request": "Anfrage genehmigen", "approve_tokens": "Token genehmigen", + "apps": "Apps", "arbiscan_history": "ArbiScan-Geschichte", "arrive_in_this_address": "${currency} ${tag} wird an dieser Adresse ankommen", "ascending": "Aufsteigend", @@ -440,6 +441,8 @@ "hide": "Verstecken", "hide_details": "Details ausblenden", "high_contrast_theme": "Kontrastreiches Thema", + "history": "Geschichte", + "home": "Heim", "home_screen_settings": "Einstellungen für den Startbildschirm", "how_to_connect": "Anleitung", "how_to_use": "Wie benutzt man", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index f436f41ac..bd6d22559 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -60,6 +60,7 @@ "approve": "Approve", "approve_request": "Approve Request", "approve_tokens": "Approve tokens", + "apps": "Apps", "arbiscan_history": "ArbiScan History", "arrive_in_this_address": "${currency} ${tag}will arrive in this address", "ascending": "Ascending", @@ -440,6 +441,8 @@ "hide": "Hide", "hide_details": "Hide Details", "high_contrast_theme": "High Contrast Theme", + "history": "History", + "home": "Home", "home_screen_settings": "Home screen settings", "how_to_connect": "How to Connect", "how_to_use": "How to use", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index f3fd8c57d..0c28290b8 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -60,6 +60,7 @@ "approve": "Aprobar", "approve_request": "Aprobar la solicitud", "approve_tokens": "Aprobar tokens", + "apps": "Apps", "arbiscan_history": "Historia de ArbiScan", "arrive_in_this_address": "${currency} ${tag}llegará a esta dirección", "ascending": "Ascendente", @@ -440,6 +441,8 @@ "hide": "Ocultar", "hide_details": "Ocultar detalles", "high_contrast_theme": "Tema De Alto Contraste", + "history": "Historial", + "home": "Inicio", "home_screen_settings": "Configuración de Pantalla de Inicio", "how_to_connect": "Cómo conectar", "how_to_use": "Cómo usar", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 67c62b7a4..94103b0e0 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -60,6 +60,7 @@ "approve": "Approuver", "approve_request": "Approuver la demande", "approve_tokens": "Approuver les jetons", + "apps": "Applications", "arbiscan_history": "Historique d'ArbiScan", "arrive_in_this_address": "${currency} ${tag}arrivera à cette adresse", "ascending": "Ascendant", @@ -440,6 +441,8 @@ "hide": "Cacher", "hide_details": "Masquer les détails", "high_contrast_theme": "Thème à contraste élevé", + "history": "Histoire", + "home": "Maison", "home_screen_settings": "Paramètres de l'écran d'accueil", "how_to_connect": "Comment se connecter", "how_to_use": "Comment utiliser", diff --git a/res/values/strings_gn.arb b/res/values/strings_gn.arb index 583ce01f7..3b204e874 100644 --- a/res/values/strings_gn.arb +++ b/res/values/strings_gn.arb @@ -50,6 +50,7 @@ "anonpay_description": "Ojapo ${type}. Pe ojapyhytava ikatu ${method} oipurukuaa oimeraẽva criptomoneda oipytyvõva, ha ojejapyhyta viru ko billetera-pe.", "apk_update": "APK ñembopyahu", "approve": "Ñemoneĩ", + "apps": "Apps rehegua .", "arrive_in_this_address": "${currency} ${tag} Og̃uahẽta ko dirección-pe", "ascending": "yvateve", "ask_each_time": "Eporandu opa jave", @@ -331,6 +332,8 @@ "hidden_balance": "Mba’erepy ñemi", "hide_details": "mba’e peteíteî ñemokañy", "high_contrast_theme": "Mba’e hesakangue yvateva", + "history": "Tembiasakue", + "home": "Óga", "home_screen_settings": "Ñemohenda pe jehechaha ñepyrũme", "how_to_use": "Mba’éichapa ojeIpuru", "how_to_use_card": "Mba’éichapa ojeiporu ko karjeta", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 5058e465a..bb26fed0e 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -60,6 +60,7 @@ "approve": "Amincewa", "approve_request": "Amince da bukata", "approve_tokens": "Amince da Alamu", + "apps": "Apps", "arbiscan_history": "Tarihin Arbiscan", "arrive_in_this_address": "${currency} ${tag} zai je wurin wannan adireshi", "ascending": "Hau", @@ -440,6 +441,8 @@ "hide": "Ɓoye", "hide_details": "Ɓoye cikakkun bayanai", "high_contrast_theme": "Babban Jigon Kwatance", + "history": "Tarihi", + "home": "Gida", "home_screen_settings": "Saitunan allo na gida", "how_to_connect": "Yadda ake haɗa", "how_to_use": "Yadda ake amfani da shi", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 625b8e1b5..4c83c23a5 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -60,6 +60,7 @@ "approve": "मंज़ूरी देना", "approve_request": "अनुरोध को स्वीकृत करें", "approve_tokens": "टोकन को मंजूरी देना", + "apps": "ऐप्स", "arbiscan_history": "अरबीस्कैन इतिहास", "arrive_in_this_address": "${currency} ${tag}इस पते पर पहुंचेंगे", "ascending": "आरोही", @@ -440,6 +441,8 @@ "hide": "छिपाना", "hide_details": "विवरण छुपाएं", "high_contrast_theme": "उच्च कंट्रास्ट थीम", + "history": "इतिहास", + "home": "घर", "home_screen_settings": "होम स्क्रीन सेटिंग्स", "how_to_connect": "कनेक्ट कैसे करें", "how_to_use": "का उपयोग कैसे करें", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 726e00bad..db714439e 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -60,6 +60,7 @@ "approve": "Odobriti", "approve_request": "Odobriti zahtjev", "approve_tokens": "Odobriti tokene", + "apps": "aplikacije", "arbiscan_history": "Arbiskanska povijest", "arrive_in_this_address": "${currency} ${tag}će stići na ovu adresu", "ascending": "Uzlazni", @@ -440,6 +441,8 @@ "hide": "Sakriti", "hide_details": "Sakrij pojedinosti", "high_contrast_theme": "Tema visokog kontrasta", + "history": "Povijest", + "home": "Dom", "home_screen_settings": "Postavke početnog zaslona", "how_to_connect": "Kako se povezati", "how_to_use": "Kako koristiti", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index b750b1e61..694a01ddf 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -60,6 +60,7 @@ "approve": "Հաստատել", "approve_request": "Հաստատում է հայցը", "approve_tokens": "Հաստատում է նշանները", + "apps": "Հավելվածներ", "arbiscan_history": "Արբիսկանի պատմություն", "arrive_in_this_address": "${currency} ${tag}կժամանի այս հասցեում", "ascending": "Աճող", @@ -440,6 +441,8 @@ "hide": "Թաքցնել", "hide_details": "Թաքցնել մանրամասները", "high_contrast_theme": "Բարձր հակադրության տեսք", + "history": "Պատմություն", + "home": "Տուն", "home_screen_settings": "Գլխավոր էկրանի կարգավորումներ", "how_to_connect": "Ինչպես միացնել", "how_to_use": "Ինչպես օգտագործել", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 12489e80a..c6e197261 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -60,6 +60,7 @@ "approve": "Menyetujui", "approve_request": "Menyetujui permintaan", "approve_tokens": "Menyetujui token", + "apps": "Aplikasi", "arbiscan_history": "Sejarah ArbiScan", "arrive_in_this_address": "${currency} ${tag} akan tiba di alamat ini", "ascending": "Naik", @@ -440,6 +441,8 @@ "hide": "Bersembunyi", "hide_details": "Sembunyikan Rincian", "high_contrast_theme": "Tema Kontras Tinggi", + "history": "Sejarah", + "home": "Rumah", "home_screen_settings": "Pengaturan layar awal", "how_to_connect": "Cara terhubung", "how_to_use": "Cara Penggunaan", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 55f676cf3..603c862a0 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -60,6 +60,7 @@ "approve": "Approvare", "approve_request": "Approvare la richiesta", "approve_tokens": "Approvare i token", + "apps": "App", "arbiscan_history": "Storia dell'ArbiScan", "arrive_in_this_address": "${currency} ${tag}arriverà a questo indirizzo", "ascending": "Ascendente", @@ -440,6 +441,8 @@ "hide": "Nascondi", "hide_details": "Nascondi dettagli", "high_contrast_theme": "Tema ad alto contrasto", + "history": "Storia", + "home": "Casa", "home_screen_settings": "Impostazioni della schermata iniziale", "how_to_connect": "Come connettersi", "how_to_use": "Come usare", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 261943d25..9b47ef5f6 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -60,6 +60,7 @@ "approve": "承認する", "approve_request": "リクエストを承認します", "approve_tokens": "トークンを承認します", + "apps": "アプリ", "arbiscan_history": "ArbiScan の歴史", "arrive_in_this_address": "${currency} ${tag}はこの住所に到着します", "ascending": "上昇", @@ -441,6 +442,8 @@ "hide": "隠れる", "hide_details": "詳細を非表示", "high_contrast_theme": "ハイコントラストテーマ", + "history": "歴史", + "home": "家", "home_screen_settings": "ホーム画面の設定", "how_to_connect": "接続方法", "how_to_use": "使い方", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index f2f4cd597..be7f2106b 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -60,6 +60,7 @@ "approve": "승인", "approve_request": "요청 승인", "approve_tokens": "토큰을 승인합니다", + "apps": "앱", "arbiscan_history": "ArbiScan 역사", "arrive_in_this_address": "${currency} ${tag}이(가) 이 주소로 도착합니다", "ascending": "오름차순", @@ -440,6 +441,8 @@ "hide": "숨기기", "hide_details": "세부 정보 숨기기", "high_contrast_theme": "고대비 테마", + "history": "역사", + "home": "집", "home_screen_settings": "홈 화면 설정", "how_to_connect": "연결 방법", "how_to_use": "사용 방법", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 39eabdfbc..2507dda1d 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -60,6 +60,7 @@ "approve": "လက်မခံပါ။", "approve_request": "တောင်းဆိုမှုကိုအတည်ပြု", "approve_tokens": "တိုကင်အတည်ပြု", + "apps": "အက်ပလီကေးများ", "arbiscan_history": "arbiscan သမိုင်း", "arrive_in_this_address": "${currency} ${tag}ဤလိပ်စာသို့ ရောက်ရှိပါမည်။", "ascending": "တက်", @@ -440,6 +441,8 @@ "hide": "သားရေ", "hide_details": "အသေးစိတ်ကို ဝှက်ပါ။", "high_contrast_theme": "အလင်းအမှောင် မြင့်မားသော အပြင်အဆင်", + "history": "သမိုင်း", + "home": "နေအိမ်", "home_screen_settings": "ပင်မစခရင် ဆက်တင်များ", "how_to_connect": "ဘယ်လိုချိတ်ဆက်ရမလဲ", "how_to_use": "အသုံးပြုနည်း", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index dd9ad4e3c..056908f1b 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -60,6 +60,7 @@ "approve": "Goedkeuren", "approve_request": "Het verzoek goedkeuren", "approve_tokens": "Tokens goedkeuren", + "apps": "Apps", "arbiscan_history": "ArbiScan-geschiedenis", "arrive_in_this_address": "${currency} ${tag}komt aan op dit adres", "ascending": "Stijgend", @@ -440,6 +441,8 @@ "hide": "Verbergen", "hide_details": "Details verbergen", "high_contrast_theme": "Thema met hoog contrast", + "history": "Geschiedenis", + "home": "Thuis", "home_screen_settings": "Instellingen voor het startscherm", "how_to_connect": "Hoe verbinding te maken", "how_to_use": "Hoe te gebruiken", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 5b27af510..c2509f821 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -60,6 +60,7 @@ "approve": "Zatwierdzić", "approve_request": "Zatwierdzić żądanie", "approve_tokens": "Zatwierdzić tokeny", + "apps": "Aplikacje", "arbiscan_history": "Historia ArbiScanu", "arrive_in_this_address": "${currency} ${tag}dotrze na ten adres", "ascending": "Wznoszący się", @@ -439,6 +440,8 @@ "hide": "Ukryj", "hide_details": "Ukryj szczegóły", "high_contrast_theme": "Motyw wysokiego kontrastu", + "history": "Historia", + "home": "Dom", "home_screen_settings": "Ustawienia ekranu głównego", "how_to_connect": "Jak połączyć się", "how_to_use": "Jak korzystać", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index f8831534e..e1b7d4c5a 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -60,6 +60,7 @@ "approve": "Aprovar", "approve_request": "Aprovar solicitação", "approve_tokens": "Aprovar tokens", + "apps": "Aplicativos", "arbiscan_history": "História do ArbiScan", "arrive_in_this_address": "${currency} ${tag}chegará neste endereço", "ascending": "Ascendente", @@ -440,6 +441,8 @@ "hide": "Esconder", "hide_details": "Ocultar detalhes", "high_contrast_theme": "Tema de alto contraste", + "history": "História", + "home": "Lar", "home_screen_settings": "Configurações da tela inicial", "how_to_connect": "Como conectar", "how_to_use": "Como usar", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index de31f95f4..5993fd530 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -60,6 +60,7 @@ "approve": "Утвердить", "approve_request": "Утвердить запрос", "approve_tokens": "Одобрить токены", + "apps": "Приложения", "arbiscan_history": "История АрбиСкан", "arrive_in_this_address": "${currency} ${tag}придет на этот адрес", "ascending": "Восходящий", @@ -440,6 +441,8 @@ "hide": "Скрывать", "hide_details": "Скрыть детали", "high_contrast_theme": "Высококонтрастная тема", + "history": "История", + "home": "Дом", "home_screen_settings": "Настройки главного экрана", "how_to_connect": "Как подключиться", "how_to_use": "Как использовать", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 6b4fcbd55..d5887fd73 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -60,6 +60,7 @@ "approve": "อนุมัติ", "approve_request": "อนุมัติคำขอ", "approve_tokens": "อนุมัติโทเค็น", + "apps": "แอพ", "arbiscan_history": "ประวัติ ArbiScan", "arrive_in_this_address": "${currency} ${tag}จะมาถึงที่อยู่นี้", "ascending": "จากน้อยไปมาก", @@ -440,6 +441,8 @@ "hide": "ซ่อน", "hide_details": "ซ่อนรายละเอียด", "high_contrast_theme": "ธีมความคมชัดสูง", + "history": "ประวัติศาสตร์", + "home": "บ้าน", "home_screen_settings": "การตั้งค่าหน้าจอหลัก", "how_to_connect": "วิธีการเชื่อมต่อ", "how_to_use": "วิธีใช้", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 31f530b52..97712fdba 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -60,6 +60,7 @@ "approve": "Aprubahan", "approve_request": "Aprubahan ang kahilingan", "approve_tokens": "Aprubahan ang mga token", + "apps": "Apps", "arbiscan_history": "Kasaysayan ng Arbiscan", "arrive_in_this_address": "Ang ${currency} ${tag} ay darating sa address na ito", "ascending": "Umakyat", @@ -440,6 +441,8 @@ "hide": "Itago", "hide_details": "Itago ang mga detalye", "high_contrast_theme": "High Contrast Theme", + "history": "Kasaysayan", + "home": "Home", "home_screen_settings": "Mga setting ng home screen", "how_to_connect": "Paano kumonekta", "how_to_use": "Paano gamitin", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 1236c3c83..be2dd8fd7 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -60,6 +60,7 @@ "approve": "Onaylamak", "approve_request": "Talebi Onaylama", "approve_tokens": "Jetonları onaylayın", + "apps": "Uygulamalar", "arbiscan_history": "ArbiScan Geçmişi", "arrive_in_this_address": "${currency} ${tag}bu adrese ulaşacak", "ascending": "Yükselen", @@ -440,6 +441,8 @@ "hide": "Saklamak", "hide_details": "Detayları Gizle", "high_contrast_theme": "Yüksek Kontrastlı Tema", + "history": "Tarih", + "home": "Ev", "home_screen_settings": "Ana ekran ayarları", "how_to_connect": "Nasıl bağlanır", "how_to_use": "Nasıl kullanılır", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index cabc4a937..e64086e27 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -60,6 +60,7 @@ "approve": "Затвердити", "approve_request": "Запитайте запит", "approve_tokens": "Затвердити токени", + "apps": "Застосунки", "arbiscan_history": "Арбісканська історія", "arrive_in_this_address": "${currency} ${tag}надійде на цю адресу", "ascending": "Висхід", @@ -440,6 +441,8 @@ "hide": "Сховати", "hide_details": "Приховати деталі", "high_contrast_theme": "Тема високої контрастності", + "history": "Історія", + "home": "Дім", "home_screen_settings": "Налаштування головного екрана", "how_to_connect": "Як підключитися", "how_to_use": "Як використовувати", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 8f361ae6a..5190195d1 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -60,6 +60,7 @@ "approve": "ﻭﺮﮐ ﺭﻮﻈﻨﻣ", "approve_request": "درخواست کو منظور کریں", "approve_tokens": "ٹوکن کو منظور کریں", + "apps": "ایپس", "arbiscan_history": "اربیسکن تاریخ", "arrive_in_this_address": "${currency} ${tag}اس پتے پر پہنچے گا۔", "ascending": "چڑھنے", @@ -440,6 +441,8 @@ "hide": "چھپائیں", "hide_details": "تفصیلات چھپائیں۔", "high_contrast_theme": "ہائی کنٹراسٹ تھیم", + "history": "تاریخ", + "home": "گھر", "home_screen_settings": "ہوم اسکرین کی ترتیبات", "how_to_connect": "کیسے مربوط ہوں", "how_to_use": " ﮧﻘﯾﺮﻃ ﺎﮐ ﮯﻧﺮﮐ ﻝﺎﻤﻌﺘﺳﺍ", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index be4d2a401..4f3abc8de 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -60,6 +60,7 @@ "approve": "Phê duyệt", "approve_request": "Phê duyệt yêu cầu", "approve_tokens": "Phê duyệt mã thông báo", + "apps": "Ứng dụng", "arbiscan_history": "Lịch sử quét Arbi", "arrive_in_this_address": "${currency} ${tag} sẽ đến địa chỉ này", "ascending": "Tăng dần", @@ -439,6 +440,8 @@ "hide": "Trốn", "hide_details": "Ẩn chi tiết", "high_contrast_theme": "Chủ đề độ tương phản cao", + "history": "Lịch sử", + "home": "Trang chủ", "home_screen_settings": "Cài đặt màn hình chính", "how_to_connect": "Cách kết nối", "how_to_use": "Cách sử dụng", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 7f2a60347..ef80e77a0 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -60,6 +60,7 @@ "approve": "Fi ọwọ si", "approve_request": "IKILỌ RẸ", "approve_tokens": "Ṣe fọwọsi awọn àmi", + "apps": "Lw", "arbiscan_history": "Itan Arbiscan", "arrive_in_this_address": "${currency} ${tag} máa dé sí àdírẹ́sì yìí", "ascending": "Goke", @@ -441,6 +442,8 @@ "hide": "Pamọ", "hide_details": "Dé ìsọfúnni kékeré", "high_contrast_theme": "Akori Iyatọ giga", + "history": "Itan", + "home": "Ile", "home_screen_settings": "Awọn eto iboju ile", "how_to_connect": "Bi o ṣe le sopọ", "how_to_use": "Bawo ni lati lo", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index cee2aa801..ba602b024 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -60,6 +60,7 @@ "approve": "批准", "approve_request": "批准请求", "approve_tokens": "批准令牌", + "apps": "应用程序", "arbiscan_history": "ArbiScan 历史", "arrive_in_this_address": "${currency} ${tag}将到达此地址", "ascending": "上升", @@ -440,6 +441,8 @@ "hide": "隐藏", "hide_details": "隐藏细节", "high_contrast_theme": "高对比度主题", + "history": "历史", + "home": "家", "home_screen_settings": "主屏幕设置", "how_to_connect": "如何连接", "how_to_use": "如何使用",