From 970528060c8b1b07a8f9f3538d5c69d6b7e90322 Mon Sep 17 00:00:00 2001 From: Damiano Ferrari <34270884+ferraridamiano@users.noreply.github.com> Date: Sun, 5 May 2024 18:53:16 +0200 Subject: [PATCH] Added app themes (#286) * Initial setup for themes * Greyout palette + change color and save (not yet apply) * Settings page tweaks * Settings sections * Save device accent color * Some renaming * Fix bug * Now the theme is correctly applied * Added translations --- lib/app_router.dart | 1 + lib/main.dart | 66 ++++++----- lib/models/settings.dart | 46 ++++++++ lib/pages/settings_page.dart | 108 ++++++++++++++++- lib/utils/palette.dart | 115 +++++++++++++++++++ packages/translations/lib/l10n/app_ar.arb | 24 ++++ packages/translations/lib/l10n/app_ca.arb | 24 ++++ packages/translations/lib/l10n/app_de.arb | 24 ++++ packages/translations/lib/l10n/app_en.arb | 6 + packages/translations/lib/l10n/app_es.arb | 24 ++++ packages/translations/lib/l10n/app_fr.arb | 24 ++++ packages/translations/lib/l10n/app_hr.arb | 24 ++++ packages/translations/lib/l10n/app_id.arb | 24 ++++ packages/translations/lib/l10n/app_it.arb | 6 + packages/translations/lib/l10n/app_ja.arb | 24 ++++ packages/translations/lib/l10n/app_nb.arb | 24 ++++ packages/translations/lib/l10n/app_nl.arb | 24 ++++ packages/translations/lib/l10n/app_pl.arb | 24 ++++ packages/translations/lib/l10n/app_pt.arb | 24 ++++ packages/translations/lib/l10n/app_ru.arb | 24 ++++ packages/translations/lib/l10n/app_tr.arb | 24 ++++ packages/translations/lib/l10n/app_zh.arb | 24 ++++ packages/translations/lib/l10n/app_zh_TW.arb | 24 ++++ 23 files changed, 704 insertions(+), 28 deletions(-) create mode 100644 lib/utils/palette.dart diff --git a/lib/app_router.dart b/lib/app_router.dart index e249686f..12fa5f05 100644 --- a/lib/app_router.dart +++ b/lib/app_router.dart @@ -20,6 +20,7 @@ final isEverythingLoadedProvider = Provider((ref) => ref.watch(SignificantFigures.provider).hasValue && ref.watch(RemoveTrailingZeros.provider).hasValue && ref.watch(IsDarkAmoled.provider).hasValue && + ref.watch(ThemeColorNotifier.provider).hasValue && ref.watch(RevokeInternetNotifier.provider).hasValue && ref.watch(CurrentThemeMode.provider).hasValue && ref.watch(CurrentLocale.provider).hasValue && diff --git a/lib/main.dart b/lib/main.dart index 8461b33d..254cecca 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -16,38 +16,52 @@ class MyApp extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - const Color fallbackColorSchemeSeed = Colors.blue; - return DynamicColorBuilder( builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) { - ColorScheme lightColorScheme; - ColorScheme darkColorScheme; - if (lightDynamic != null && darkDynamic != null) { - lightColorScheme = lightDynamic.harmonized(); - darkColorScheme = darkDynamic.harmonized(); - } else { - // Otherwise, use fallback schemes. - lightColorScheme = ColorScheme.fromSeed( - seedColor: fallbackColorSchemeSeed, - ); - darkColorScheme = ColorScheme.fromSeed( - seedColor: fallbackColorSchemeSeed, - brightness: Brightness.dark, + if (lightDynamic != null) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => ref.read(deviceAccentColorProvider.notifier).state = + lightDynamic.primary, ); } - ThemeData lightTheme = ThemeData(colorScheme: lightColorScheme); - ThemeData darkTheme = ThemeData( - brightness: Brightness.dark, - colorScheme: darkColorScheme, - ); - ThemeData amoledTheme = darkTheme.copyWith( - scaffoldBackgroundColor: Colors.black, - drawerTheme: const DrawerThemeData(backgroundColor: Colors.black), - ); - return Consumer(builder: (context, ref, child) { - Locale? settingsLocale = ref.watch(CurrentLocale.provider).valueOrNull; + final settingsLocale = ref.watch(CurrentLocale.provider).valueOrNull; + final themeColor = ref.watch(ThemeColorNotifier.provider).valueOrNull ?? + (useDeviceColor: false, colorTheme: Colors.blue); + + final ThemeData lightTheme, darkTheme, amoledTheme; + // Use device accent color + if (ref.watch(deviceAccentColorProvider) != null && + themeColor.useDeviceColor) { + lightTheme = ThemeData(colorScheme: lightDynamic!.harmonized()); + darkTheme = ThemeData( + brightness: Brightness.dark, + colorScheme: darkDynamic!.harmonized(), + ); + amoledTheme = darkTheme.copyWith( + scaffoldBackgroundColor: Colors.black, + drawerTheme: const DrawerThemeData(backgroundColor: Colors.black), + ); + } else { + lightTheme = ThemeData( + colorScheme: ColorScheme.fromSeed( + seedColor: themeColor.colorTheme, + ), + ); + darkTheme = ThemeData( + colorScheme: ColorScheme.fromSeed( + seedColor: themeColor.colorTheme, + brightness: Brightness.dark, + ), + brightness: Brightness.dark, + ); + amoledTheme = darkTheme.copyWith( + scaffoldBackgroundColor: Colors.black, + drawerTheme: const DrawerThemeData(backgroundColor: Colors.black), + ); + } + String deviceLocaleLanguageCode = Platform.localeName.split('_')[0]; Locale appLocale; if (settingsLocale != null) { diff --git a/lib/models/settings.dart b/lib/models/settings.dart index c0716720..4e91c912 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -77,6 +77,52 @@ class IsDarkAmoled extends AsyncNotifier { } } +/// `null` means no accent color +final deviceAccentColorProvider = StateProvider((ref) => null); + +class ThemeColorNotifier + extends AsyncNotifier<({bool useDeviceColor, Color colorTheme})> { + static const _prefKeyDefault = 'useDeviceColor'; + static const _prefKeyColor = 'colorTheme'; + // Here we set default theme to Colors.blue (it is easier to support device + // that does not have a color accent) + static const deafultUseDeviceColor = false; + static const defaultColorTheme = Colors.blue; + + static final provider = AsyncNotifierProvider(ThemeColorNotifier.new); + + @override + Future<({bool useDeviceColor, Color colorTheme})> build() async { + var pref = await ref.watch(sharedPref.future); + return ( + useDeviceColor: pref.getBool(_prefKeyDefault) ?? deafultUseDeviceColor, + colorTheme: Color(pref.getInt(_prefKeyColor) ?? defaultColorTheme.value) + ); + } + + void setDefaultTheme(bool value) { + state = AsyncData(( + useDeviceColor: value, + colorTheme: state.valueOrNull?.colorTheme ?? defaultColorTheme + )); + ref + .read(sharedPref.future) + .then((pref) => pref.setBool(_prefKeyDefault, value)); + } + + void setColorTheme(Color color) { + state = AsyncData(( + useDeviceColor: + state.valueOrNull?.useDeviceColor ?? deafultUseDeviceColor, + colorTheme: color + )); + ref + .read(sharedPref.future) + .then((pref) => pref.setInt(_prefKeyColor, color.value)); + } +} + class RevokeInternetNotifier extends AsyncNotifier { static const _prefKey = 'revokeInternet'; static final provider = AsyncNotifierProvider( diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart index 863f2379..cd042118 100644 --- a/lib/pages/settings_page.dart +++ b/lib/pages/settings_page.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:converterpro/models/currencies.dart'; import 'package:converterpro/models/settings.dart'; import 'package:converterpro/styles/consts.dart'; +import 'package:converterpro/utils/palette.dart'; import 'package:converterpro/utils/utils_widgets.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -36,12 +37,24 @@ class SettingsPage extends ConsumerWidget { updateNavBarColor(Theme.of(context).colorScheme); - Color iconColor = getIconColor(Theme.of(context)); + final themeColor = ref.watch(ThemeColorNotifier.provider).valueOrNull!; + + final iconColor = getIconColor(Theme.of(context)); return CustomScrollView(slivers: [ SliverAppBar.large(title: Text(AppLocalizations.of(context)!.settings)), SliverList( delegate: SliverChildListDelegate([ + Padding( + padding: const EdgeInsetsDirectional.only(start: 16), + child: Text( + AppLocalizations.of(context)!.appearance, + style: Theme.of(context) + .textTheme + .titleSmall + ?.copyWith(color: Theme.of(context).primaryColor), + ), + ), DropdownListTile( key: const ValueKey('language'), leading: Icon(Icons.language, color: iconColor), @@ -63,7 +76,7 @@ class SettingsPage extends ConsumerWidget { }, ), DropdownListTile( - leading: Icon(Icons.palette_outlined, color: iconColor), + leading: Icon(Icons.contrast, color: iconColor), title: AppLocalizations.of(context)!.theme, textStyle: textStyle, items: mapTheme.values.toList(), @@ -87,6 +100,38 @@ class SettingsPage extends ConsumerWidget { }, shape: const RoundedRectangleBorder(borderRadius: borderRadius), ), + ListTile( + title: Text(AppLocalizations.of(context)!.themeColor), + leading: Icon(Icons.palette_outlined, color: iconColor), + shape: const RoundedRectangleBorder(borderRadius: borderRadius), + trailing: Padding( + padding: const EdgeInsets.symmetric(horizontal: 18), + child: Container( + width: 24, + height: 24, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(24 / 2), + color: themeColor.useDeviceColor + ? ref.watch(deviceAccentColorProvider)! + : themeColor.colorTheme, + ), + ), + ), + onTap: () => showDialog( + context: context, + builder: (context) => const ColorPickerDialog(), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.only(start: 16, top: 16), + child: Text( + AppLocalizations.of(context)!.conversions, + style: Theme.of(context) + .textTheme + .titleSmall + ?.copyWith(color: Theme.of(context).primaryColor), + ), + ), if (!kIsWeb) SwitchListTile( secondary: Icon(Icons.public_off, color: iconColor), @@ -210,6 +255,16 @@ class SettingsPage extends ConsumerWidget { onTap: () => context.goNamed('reorder-units'), shape: const RoundedRectangleBorder(borderRadius: borderRadius), ), + Padding( + padding: const EdgeInsetsDirectional.only(start: 16, top: 16), + child: Text( + AppLocalizations.of(context)!.findOutMore, + style: Theme.of(context) + .textTheme + .titleSmall + ?.copyWith(color: Theme.of(context).primaryColor), + ), + ), ListTile( leading: Icon(Icons.computer, color: iconColor), title: Text( @@ -403,3 +458,52 @@ class SettingsPage extends ConsumerWidget { ]); } } + +class ColorPickerDialog extends ConsumerWidget { + const ColorPickerDialog({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final themeColor = ref.watch(ThemeColorNotifier.provider).valueOrNull!; + final deviceAccentColor = ref.watch(deviceAccentColorProvider); + + return AlertDialog( + title: Text(AppLocalizations.of(context)!.themeColor), + content: SizedBox( + width: 300, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (deviceAccentColor != null) ...[ + SwitchListTile( + value: themeColor.useDeviceColor, + onChanged: (val) { + ref + .read(ThemeColorNotifier.provider.notifier) + .setDefaultTheme(val); + }, + title: Text(AppLocalizations.of(context)!.useDeviceColor), + ), + const SizedBox(height: 8), + ], + Text( + !themeColor.useDeviceColor + ? AppLocalizations.of(context)!.pickColor + : '', + style: Theme.of(context).textTheme.titleMedium, + ), + const SizedBox(height: 4), + Palette( + initial: themeColor.colorTheme, + enabled: !themeColor.useDeviceColor, + onSelected: (color) => ref + .read(ThemeColorNotifier.provider.notifier) + .setColorTheme(color), + ) + ], + ), + ), + ); + } +} diff --git a/lib/utils/palette.dart b/lib/utils/palette.dart new file mode 100644 index 00000000..b72fb636 --- /dev/null +++ b/lib/utils/palette.dart @@ -0,0 +1,115 @@ +import 'package:flutter/material.dart'; + +class Palette extends StatefulWidget { + const Palette( + {super.key, + required this.onSelected, + required this.initial, + this.enabled = true}); + + final Function(Color color) onSelected; + final Color initial; + final bool enabled; + + @override + State createState() => _PaletteState(); +} + +class _PaletteState extends State { + Color? hoveredColor; + late Color selectedColor; + + static const double squareSize = 45; + static const double checkSize = 25; + + @override + void initState() { + super.initState(); + selectedColor = widget.initial; + } + + @override + Widget build(BuildContext context) { + final palette = Wrap( + spacing: 5, + runSpacing: 5, + children: [ + Colors.red, + Colors.pink, + Colors.purple, + Colors.deepPurple, + Colors.indigo, + Colors.blue, + Colors.lightBlue, + Colors.cyan, + Colors.teal, + Colors.green, + Colors.lightGreen, + Colors.lime, + Colors.yellow, + Colors.amber, + Colors.orange, + Colors.deepOrange, + Colors.brown, + Colors.blueGrey, + ].map( + (e) { + final isHovered = hoveredColor == e; + return MouseRegion( + onEnter: (_) { + setState(() => hoveredColor = e); + }, + onExit: (_) { + setState(() => hoveredColor = null); + }, + child: InkWell( + onTap: () { + setState(() => selectedColor = e); + widget.onSelected(e); + }, + borderRadius: BorderRadius.circular(squareSize / 2), + child: Stack( + children: [ + AnimatedContainer( + duration: const Duration(milliseconds: 300), + width: squareSize, + height: squareSize, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + isHovered ? squareSize / 2 : squareSize / 4, + ), + color: Color.lerp( + widget.enabled + ? e + : HSVColor.fromColor(e) + .withSaturation(0.02) + .toColor(), + Colors.white, + isHovered ? 0.5 : 0, + ), + ), + ), + if (widget.enabled && selectedColor == e) + Positioned( + top: (squareSize - checkSize) / 2, + left: (squareSize - checkSize) / 2, + child: Icon( + Icons.check, + size: checkSize, + color: e.computeLuminance() < 0.5 + ? Colors.white + : Colors.black, + ), + ) + ], + ), + ), + ); + }, + ).toList(), + ); + return widget.enabled + ? palette + : AbsorbPointer(absorbing: true, child: palette); + } +} diff --git a/packages/translations/lib/l10n/app_ar.arb b/packages/translations/lib/l10n/app_ar.arb index b614031e..8c9d9866 100644 --- a/packages/translations/lib/l10n/app_ar.arb +++ b/packages/translations/lib/l10n/app_ar.arb @@ -65,6 +65,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "الطول", "area": "المساحة", diff --git a/packages/translations/lib/l10n/app_ca.arb b/packages/translations/lib/l10n/app_ca.arb index a6d12881..9484355d 100644 --- a/packages/translations/lib/l10n/app_ca.arb +++ b/packages/translations/lib/l10n/app_ca.arb @@ -56,6 +56,30 @@ "ok": "Accepta", "revokeInternetAccess": "Revoca l'accés a internet", "revokeInternetExplanation": "Aquesta aplicació utilitza internet per actualitzar els tipus de canvi de divises una vegada al dia (quan està oberta). Són només uns quants kilobytes de descàrrega, però si no necessiteu aquesta funció podeu impedir que l'aplicació accedeixi a internet activant aquesta opció.", + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "Longitud", "area": "Àrea", diff --git a/packages/translations/lib/l10n/app_de.arb b/packages/translations/lib/l10n/app_de.arb index fb614c63..2003e25f 100644 --- a/packages/translations/lib/l10n/app_de.arb +++ b/packages/translations/lib/l10n/app_de.arb @@ -65,6 +65,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "Länge", "area": "Fläche", diff --git a/packages/translations/lib/l10n/app_en.arb b/packages/translations/lib/l10n/app_en.arb index df027ad8..2123161a 100644 --- a/packages/translations/lib/l10n/app_en.arb +++ b/packages/translations/lib/l10n/app_en.arb @@ -56,6 +56,12 @@ "ok": "Ok", "revokeInternetAccess": "Revoke internet access", "revokeInternetExplanation": "This app uses the internet to update currency exchange rates once a day upon opening. This download only requires a few kilobytes. However, if you don't need this feature, you can prevent the app from accessing the internet by enabling this option.", + "useDeviceColor": "Use device color", + "pickColor": "Pick a color", + "themeColor": "Theme color", + "appearance": "Appearance", + "conversions": "Conversions", + "findOutMore": "Find out more", "length": "Length", "area": "Area", diff --git a/packages/translations/lib/l10n/app_es.arb b/packages/translations/lib/l10n/app_es.arb index c003eca4..9694b1ae 100644 --- a/packages/translations/lib/l10n/app_es.arb +++ b/packages/translations/lib/l10n/app_es.arb @@ -71,6 +71,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "Longitud", "area": "Área", diff --git a/packages/translations/lib/l10n/app_fr.arb b/packages/translations/lib/l10n/app_fr.arb index c5530829..431a66b7 100644 --- a/packages/translations/lib/l10n/app_fr.arb +++ b/packages/translations/lib/l10n/app_fr.arb @@ -65,6 +65,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "Distance", "area": "Superficie", diff --git a/packages/translations/lib/l10n/app_hr.arb b/packages/translations/lib/l10n/app_hr.arb index 9a3b47ab..207b330a 100644 --- a/packages/translations/lib/l10n/app_hr.arb +++ b/packages/translations/lib/l10n/app_hr.arb @@ -65,6 +65,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "Duljina", "area": "Površina", diff --git a/packages/translations/lib/l10n/app_id.arb b/packages/translations/lib/l10n/app_id.arb index d6f37d62..21733aa4 100644 --- a/packages/translations/lib/l10n/app_id.arb +++ b/packages/translations/lib/l10n/app_id.arb @@ -65,6 +65,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "Panjang", "area": "Luas", diff --git a/packages/translations/lib/l10n/app_it.arb b/packages/translations/lib/l10n/app_it.arb index eb490d18..18994cdf 100644 --- a/packages/translations/lib/l10n/app_it.arb +++ b/packages/translations/lib/l10n/app_it.arb @@ -56,6 +56,12 @@ "ok": "Ok", "revokeInternetAccess": "Revoca l'accesso a internet", "revokeInternetExplanation": "Questa app utilizza internet per aggiornare i tassi di cambio delle valute una volta al giorno (quando viene aperta). Si tratta di pochi chilobyte di download, ma se non hai bisogno di questa funzionalità puoi prevenire che la app acceda ad intenet abilitando questa opzione.", + "useDeviceColor": "Usa il colore del dispositivo", + "pickColor": "Scegli un colore", + "themeColor": "Colore del tema", + "appearance": "Aspetto", + "conversions": "Conversioni", + "findOutMore": "Scopri di più", "length": "Lunghezza", "area": "Superficie", diff --git a/packages/translations/lib/l10n/app_ja.arb b/packages/translations/lib/l10n/app_ja.arb index 30e66c5e..8273c548 100644 --- a/packages/translations/lib/l10n/app_ja.arb +++ b/packages/translations/lib/l10n/app_ja.arb @@ -65,6 +65,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "長さ", "area": "面積", diff --git a/packages/translations/lib/l10n/app_nb.arb b/packages/translations/lib/l10n/app_nb.arb index fef6203b..cd6c08ea 100644 --- a/packages/translations/lib/l10n/app_nb.arb +++ b/packages/translations/lib/l10n/app_nb.arb @@ -65,6 +65,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "Lengde", "area": "Areal", diff --git a/packages/translations/lib/l10n/app_nl.arb b/packages/translations/lib/l10n/app_nl.arb index 5ace4724..d18fc57d 100644 --- a/packages/translations/lib/l10n/app_nl.arb +++ b/packages/translations/lib/l10n/app_nl.arb @@ -65,6 +65,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "Lengte", "area": "Oppervlak", diff --git a/packages/translations/lib/l10n/app_pl.arb b/packages/translations/lib/l10n/app_pl.arb index c14d1fab..a78c6034 100644 --- a/packages/translations/lib/l10n/app_pl.arb +++ b/packages/translations/lib/l10n/app_pl.arb @@ -56,6 +56,30 @@ "ok": "Ok", "revokeInternetAccess": "Odwołanie dostępu do Internetu", "revokeInternetExplanation": "Ta aplikacja korzysta z Internetu, aby aktualizować kursy wymiany walut raz dziennie, po uruchomieniu aplikacji. Pobierane jest wtedy tylko kilka kilobajtów danych. Jeśli jednak nie potrzebujesz tej funkcji, możesz uniemożliwić aplikacji dostęp do Internetu, włączając tę opcję.", + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "Długość", "area": "Powierzchnia", diff --git a/packages/translations/lib/l10n/app_pt.arb b/packages/translations/lib/l10n/app_pt.arb index fe2192e8..d82da95e 100644 --- a/packages/translations/lib/l10n/app_pt.arb +++ b/packages/translations/lib/l10n/app_pt.arb @@ -76,6 +76,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "Comprimento", "area": "Área", diff --git a/packages/translations/lib/l10n/app_ru.arb b/packages/translations/lib/l10n/app_ru.arb index 9a77b324..1c137259 100644 --- a/packages/translations/lib/l10n/app_ru.arb +++ b/packages/translations/lib/l10n/app_ru.arb @@ -67,6 +67,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "Длина", "area": "Площадь", diff --git a/packages/translations/lib/l10n/app_tr.arb b/packages/translations/lib/l10n/app_tr.arb index fc0d34f8..e53746b4 100644 --- a/packages/translations/lib/l10n/app_tr.arb +++ b/packages/translations/lib/l10n/app_tr.arb @@ -65,6 +65,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "Uzunluk", "area": "Alan", diff --git a/packages/translations/lib/l10n/app_zh.arb b/packages/translations/lib/l10n/app_zh.arb index 7fab6346..25306f6d 100644 --- a/packages/translations/lib/l10n/app_zh.arb +++ b/packages/translations/lib/l10n/app_zh.arb @@ -65,6 +65,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "长度", "area": "面积", diff --git a/packages/translations/lib/l10n/app_zh_TW.arb b/packages/translations/lib/l10n/app_zh_TW.arb index 1c90008e..81a8a67d 100644 --- a/packages/translations/lib/l10n/app_zh_TW.arb +++ b/packages/translations/lib/l10n/app_zh_TW.arb @@ -65,6 +65,30 @@ "@revokeInternetExplanation": { "description": "Not yet translated. Once done, remove this comment" }, + "useDeviceColor": "Use device color", + "@useDeviceColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "pickColor": "Pick a color", + "@pickColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "themeColor": "Theme color", + "@themeColor": { + "description": "Not yet translated. Once done, remove this comment" + }, + "appearance": "Appearance", + "@appearance": { + "description": "Not yet translated. Once done, remove this comment" + }, + "conversions": "Conversions", + "@conversions": { + "description": "Not yet translated. Once done, remove this comment" + }, + "findOutMore": "Find out more", + "@findOutMore": { + "description": "Not yet translated. Once done, remove this comment" + }, "length": "長度", "area": "面積",