diff --git a/l10n.yaml b/l10n.yaml new file mode 100644 index 0000000..4e6692e --- /dev/null +++ b/l10n.yaml @@ -0,0 +1,3 @@ +arb-dir: lib/l10n +template-arb-file: app_en.arb +output-localization-file: app_localizations.dart \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/lib/l10n/app_en.arb @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index f8cd4b4..a0441c8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:shlink_app/views/login_view.dart'; import 'package:shlink_app/views/navigationbar_view.dart'; import 'globals.dart' as globals; import 'package:dynamic_color/dynamic_color.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; void main() { runApp(const MyApp()); @@ -40,6 +41,18 @@ class MyApp extends StatelessWidget { _defaultDarkColorScheme, useMaterial3: true, ), + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + localeListResolutionCallback: (locales, supportedLocales) { + for (Locale locale in locales!) { + if (supportedLocales.contains(locale) || + supportedLocales.where((element) => + element.languageCode == locale.languageCode).isNotEmpty) { + return locale; + } + } + return const Locale('en'); + }, home: const InitialPage()); }); } diff --git a/lib/views/home_view.dart b/lib/views/home_view.dart index 69a9bd5..0b168d9 100644 --- a/lib/views/home_view.dart +++ b/lib/views/home_view.dart @@ -4,6 +4,7 @@ import 'package:shlink_app/API/Classes/ShlinkStats/shlink_stats.dart'; import 'package:shlink_app/API/server_manager.dart'; import 'package:shlink_app/views/short_url_edit_view.dart'; import 'package:shlink_app/views/url_list_view.dart'; +import 'package:shlink_app/widgets/shlink_stats_card_widget.dart'; import '../API/Classes/ShortURL/short_url.dart'; import '../globals.dart' as globals; @@ -24,7 +25,6 @@ class _HomeViewState extends State { @override void initState() { - // TODO: implement initState super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { loadAllData(); @@ -113,22 +113,22 @@ class _HomeViewState extends State { child: Wrap( alignment: WrapAlignment.spaceEvenly, children: [ - _ShlinkStatsCardWidget( + ShlinkStatsCardWidget( icon: Icons.link, text: "${shlinkStats?.shortUrlsCount.toString() ?? "0"} Short URLs", borderColor: Colors.blue), - _ShlinkStatsCardWidget( + ShlinkStatsCardWidget( icon: Icons.remove_red_eye, text: "${shlinkStats?.nonOrphanVisits.total ?? "0"} Visits", borderColor: Colors.green), - _ShlinkStatsCardWidget( + ShlinkStatsCardWidget( icon: Icons.warning, text: "${shlinkStats?.orphanVisits.total ?? "0"} Orphan Visits", borderColor: Colors.red), - _ShlinkStatsCardWidget( + ShlinkStatsCardWidget( icon: Icons.sell, text: "${shlinkStats?.tagsCount.toString() ?? "0"} Tags", @@ -244,44 +244,4 @@ class _HomeViewState extends State { child: const Icon(Icons.add), )); } -} - -// stats card widget -class _ShlinkStatsCardWidget extends StatefulWidget { - const _ShlinkStatsCardWidget( - {required this.text, required this.icon, this.borderColor}); - - final IconData icon; - final Color? borderColor; - final String text; - - @override - State<_ShlinkStatsCardWidget> createState() => _ShlinkStatsCardWidgetState(); -} - -class _ShlinkStatsCardWidgetState extends State<_ShlinkStatsCardWidget> { - @override - Widget build(BuildContext context) { - var randomColor = ([...Colors.primaries]..shuffle()).first; - return Padding( - padding: const EdgeInsets.all(4), - child: Container( - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - border: Border.all(color: widget.borderColor ?? randomColor), - borderRadius: BorderRadius.circular(8)), - child: SizedBox( - child: Wrap( - children: [ - Icon(widget.icon), - Padding( - padding: const EdgeInsets.only(left: 4), - child: Text(widget.text, - style: const TextStyle(fontWeight: FontWeight.bold)), - ) - ], - ), - )), - ); - } -} +} \ No newline at end of file diff --git a/lib/widgets/shlink_stats_card_widget.dart b/lib/widgets/shlink_stats_card_widget.dart new file mode 100644 index 0000000..3c086a9 --- /dev/null +++ b/lib/widgets/shlink_stats_card_widget.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +// stats card widget +class ShlinkStatsCardWidget extends StatefulWidget { + const ShlinkStatsCardWidget( + {super.key, required this.text, required this.icon, this.borderColor}); + + final IconData icon; + final Color? borderColor; + final String text; + + @override + State createState() => ShlinkStatsCardWidgetState(); +} + +class ShlinkStatsCardWidgetState extends State { + @override + Widget build(BuildContext context) { + var randomColor = ([...Colors.primaries]..shuffle()).first; + return Padding( + padding: const EdgeInsets.all(4), + child: Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + border: Border.all(color: widget.borderColor ?? randomColor), + borderRadius: BorderRadius.circular(8)), + child: SizedBox( + child: Wrap( + children: [ + Icon(widget.icon), + Padding( + padding: const EdgeInsets.only(left: 4), + child: Text(widget.text, + style: const TextStyle(fontWeight: FontWeight.bold)), + ) + ], + ), + )), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index d0be5e8..d42bedd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -145,11 +145,10 @@ packages: flutter_launcher_icons: dependency: "direct dev" description: - path: "." - ref: "feat/monochrome-icons-support" - resolved-ref: "1902eba83da89b0350a70672ac7c963cd995e017" - url: "https://github.com/OutdatedGuy/flutter_launcher_icons.git" - source: git + name: flutter_launcher_icons + sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" + url: "https://pub.dev" + source: hosted version: "0.13.1" flutter_lints: dependency: "direct dev" @@ -159,6 +158,11 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.1" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" flutter_process_text: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 5354004..5d28478 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -37,11 +37,13 @@ dependencies: dartz: ^0.10.1 qr_flutter: ^4.1.0 tuple: ^2.0.2 - intl: ^0.18.1 + intl: any dynamic_color: ^1.6.6 url_launcher: 6.1.9 package_info_plus: ^4.0.2 shared_preferences: ^2.2.2 + flutter_localizations: + sdk: flutter dev_dependencies: flutter_test: @@ -53,6 +55,7 @@ dev_dependencies: flutter: uses-material-design: true + generate: true # flutter pub run flutter_launcher_icons flutter_launcher_icons: diff --git a/test/widget_test.dart b/test/widget_test.dart index 6f72122..3a5e513 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -14,7 +14,6 @@ void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. await tester.pumpWidget(const MyApp()); - // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget); expect(find.text('1'), findsNothing);