added core files with l10n

This commit is contained in:
Adrian Baumgart 2024-03-31 17:55:01 +02:00
parent 86dcba28e4
commit 9a2d3a7125
No known key found for this signature in database
8 changed files with 78 additions and 53 deletions

3
l10n.yaml Normal file
View File

@ -0,0 +1,3 @@
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart

2
lib/l10n/app_en.arb Normal file
View File

@ -0,0 +1,2 @@
{
}

View File

@ -3,6 +3,7 @@ import 'package:shlink_app/views/login_view.dart';
import 'package:shlink_app/views/navigationbar_view.dart'; import 'package:shlink_app/views/navigationbar_view.dart';
import 'globals.dart' as globals; import 'globals.dart' as globals;
import 'package:dynamic_color/dynamic_color.dart'; import 'package:dynamic_color/dynamic_color.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
void main() { void main() {
runApp(const MyApp()); runApp(const MyApp());
@ -40,6 +41,18 @@ class MyApp extends StatelessWidget {
_defaultDarkColorScheme, _defaultDarkColorScheme,
useMaterial3: true, 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()); home: const InitialPage());
}); });
} }

View File

@ -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/API/server_manager.dart';
import 'package:shlink_app/views/short_url_edit_view.dart'; import 'package:shlink_app/views/short_url_edit_view.dart';
import 'package:shlink_app/views/url_list_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 '../API/Classes/ShortURL/short_url.dart';
import '../globals.dart' as globals; import '../globals.dart' as globals;
@ -24,7 +25,6 @@ class _HomeViewState extends State<HomeView> {
@override @override
void initState() { void initState() {
// TODO: implement initState
super.initState(); super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
loadAllData(); loadAllData();
@ -113,22 +113,22 @@ class _HomeViewState extends State<HomeView> {
child: Wrap( child: Wrap(
alignment: WrapAlignment.spaceEvenly, alignment: WrapAlignment.spaceEvenly,
children: [ children: [
_ShlinkStatsCardWidget( ShlinkStatsCardWidget(
icon: Icons.link, icon: Icons.link,
text: text:
"${shlinkStats?.shortUrlsCount.toString() ?? "0"} Short URLs", "${shlinkStats?.shortUrlsCount.toString() ?? "0"} Short URLs",
borderColor: Colors.blue), borderColor: Colors.blue),
_ShlinkStatsCardWidget( ShlinkStatsCardWidget(
icon: Icons.remove_red_eye, icon: Icons.remove_red_eye,
text: text:
"${shlinkStats?.nonOrphanVisits.total ?? "0"} Visits", "${shlinkStats?.nonOrphanVisits.total ?? "0"} Visits",
borderColor: Colors.green), borderColor: Colors.green),
_ShlinkStatsCardWidget( ShlinkStatsCardWidget(
icon: Icons.warning, icon: Icons.warning,
text: text:
"${shlinkStats?.orphanVisits.total ?? "0"} Orphan Visits", "${shlinkStats?.orphanVisits.total ?? "0"} Orphan Visits",
borderColor: Colors.red), borderColor: Colors.red),
_ShlinkStatsCardWidget( ShlinkStatsCardWidget(
icon: Icons.sell, icon: Icons.sell,
text: text:
"${shlinkStats?.tagsCount.toString() ?? "0"} Tags", "${shlinkStats?.tagsCount.toString() ?? "0"} Tags",
@ -244,44 +244,4 @@ class _HomeViewState extends State<HomeView> {
child: const Icon(Icons.add), 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)),
)
],
),
)),
);
}
}

View File

@ -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<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)),
)
],
),
)),
);
}
}

View File

@ -145,11 +145,10 @@ packages:
flutter_launcher_icons: flutter_launcher_icons:
dependency: "direct dev" dependency: "direct dev"
description: description:
path: "." name: flutter_launcher_icons
ref: "feat/monochrome-icons-support" sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea"
resolved-ref: "1902eba83da89b0350a70672ac7c963cd995e017" url: "https://pub.dev"
url: "https://github.com/OutdatedGuy/flutter_launcher_icons.git" source: hosted
source: git
version: "0.13.1" version: "0.13.1"
flutter_lints: flutter_lints:
dependency: "direct dev" dependency: "direct dev"
@ -159,6 +158,11 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.1" version: "3.0.1"
flutter_localizations:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_process_text: flutter_process_text:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -37,11 +37,13 @@ dependencies:
dartz: ^0.10.1 dartz: ^0.10.1
qr_flutter: ^4.1.0 qr_flutter: ^4.1.0
tuple: ^2.0.2 tuple: ^2.0.2
intl: ^0.18.1 intl: any
dynamic_color: ^1.6.6 dynamic_color: ^1.6.6
url_launcher: 6.1.9 url_launcher: 6.1.9
package_info_plus: ^4.0.2 package_info_plus: ^4.0.2
shared_preferences: ^2.2.2 shared_preferences: ^2.2.2
flutter_localizations:
sdk: flutter
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
@ -53,6 +55,7 @@ dev_dependencies:
flutter: flutter:
uses-material-design: true uses-material-design: true
generate: true
# flutter pub run flutter_launcher_icons # flutter pub run flutter_launcher_icons
flutter_launcher_icons: flutter_launcher_icons:

View File

@ -14,7 +14,6 @@ void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async { testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame. // Build our app and trigger a frame.
await tester.pumpWidget(const MyApp()); await tester.pumpWidget(const MyApp());
// Verify that our counter starts at 0. // Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget); expect(find.text('0'), findsOneWidget);
expect(find.text('1'), findsNothing); expect(find.text('1'), findsNothing);