5 Commits

Author SHA1 Message Date
4bbbcdd93f Updated label
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m8s
Pull Request Pipeline / lint (pull_request) Successful in 2m11s
2026-01-12 00:47:43 +01:00
7fc4bbfb13 Added placeholder setting tiles for legal
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m13s
Pull Request Pipeline / lint (pull_request) Successful in 2m14s
2026-01-11 17:09:05 +01:00
857e05127d Updated arb files 2026-01-11 16:55:28 +01:00
86982ada0f Updated license file
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m6s
Pull Request Pipeline / lint (pull_request) Successful in 2m9s
2026-01-11 16:48:08 +01:00
e51bf3eabb Updated spacing 2026-01-11 16:48:02 +01:00
9 changed files with 356 additions and 263 deletions

View File

@@ -13,6 +13,7 @@
"create_match": "Spiel erstellen",
"create_new_group": "Neue Gruppe erstellen",
"create_new_match": "Neues Spiel erstellen",
"data": "Daten",
"data_successfully_deleted": "Daten erfolgreich gelöscht",
"data_successfully_exported": "Daten erfolgreich exportiert",
"data_successfully_imported": "Daten erfolgreich importiert",
@@ -34,18 +35,18 @@
"import_data": "Daten importieren",
"info": "Info",
"invalid_schema": "Ungültiges Schema",
"licenses": "Lizenzen",
"no_licenses_found": "Keine Lizenzen gefunden",
"no_license_text_available": "Kein Lizenztext verfügbar",
"error": "Fehler",
"least_points": "Niedrigste Punkte",
"legal": "Rechtliches",
"legal_notice": "Impressum",
"licenses": "Lizenzen",
"match_in_progress": "Spiel läuft...",
"match_name": "Spieltitel",
"matches": "Spiele",
"menu": "Menü",
"most_points": "Höchste Punkte",
"no_data_available": "Keine Daten verfügbar",
"no_groups_created_yet": "Noch keine Gruppen erstellt",
"no_licenses_found": "Keine Lizenzen gefunden",
"no_license_text_available": "Kein Lizenztext verfügbar",
"no_matches_created_yet": "Noch keine Spiele erstellt",
"no_players_created_yet": "Noch keine Spieler:in erstellt",
"no_players_found_with_that_name": "Keine Spieler:in mit diesem Namen gefunden",
@@ -59,6 +60,7 @@
"player_name": "Spieler:innenname",
"players": "Spieler:innen",
"players_count": "{count} Spieler",
"privacy_policy": "Datenschutzerklärung",
"quick_create": "Schnellzugriff",
"recent_matches": "Letzte Spiele",
"ruleset": "Regelwerk",

View File

@@ -39,6 +39,9 @@
"@create_new_match": {
"description": "Button text to create a new match"
},
"@data": {
"description": "Data label"
},
"@data_successfully_deleted": {
"description": "Success message after deleting data"
},
@@ -107,21 +110,18 @@
"@invalid_schema": {
"description": "Error message for invalid schema"
},
"@licenses": {
"description": "Licenses menu item"
},
"@no_licenses_found": {
"description": "Message when no licenses are found"
},
"@no_license_text_available": {
"description": "Message when no license text is available"
},
"@error": {
"description": "Error label"
},
"@least_points": {
"description": "Title for least points ruleset"
},
"@legal": {
"description": "Legal section header"
},
"@legal_notice": {
"description": "Legal notice menu item"
},
"@licenses": {
"description": "Licenses menu item"
},
"@match_in_progress": {
"description": "Message when match is in progress"
},
@@ -131,9 +131,6 @@
"@matches": {
"description": "Label for matches"
},
"@menu": {
"description": "Menu label"
},
"@most_points": {
"description": "Title for most points ruleset"
},
@@ -143,6 +140,12 @@
"@no_groups_created_yet": {
"description": "Message when no groups exist"
},
"@no_licenses_found": {
"description": "Message when no licenses are found"
},
"@no_license_text_available": {
"description": "Message when no license text is available"
},
"@no_matches_created_yet": {
"description": "Message when no matches exist"
},
@@ -187,6 +190,9 @@
}
}
},
"@privacy_policy": {
"description": "Privacy policy menu item"
},
"@quick_create": {
"description": "Title for quick create section"
},
@@ -221,7 +227,7 @@
"description": "Shows the number of selected players"
},
"@settings": {
"description": "Settings label"
"description": "Label for the App Settings"
},
"@single_loser": {
"description": "Title for single loser ruleset"
@@ -284,6 +290,7 @@
"create_match": "Create match",
"create_new_group": "Create new group",
"create_new_match": "Create new match",
"data": "Data",
"data_successfully_deleted": "Data successfully deleted",
"data_successfully_exported": "Data successfully exported",
"data_successfully_imported": "Data successfully imported",
@@ -305,18 +312,18 @@
"import_data": "Import data",
"info": "Info",
"invalid_schema": "Invalid Schema",
"licenses": "Licenses",
"no_licenses_found": "No licenses found",
"no_license_text_available": "No license text available",
"error": "Error",
"least_points": "Least Points",
"legal": "Legal",
"legal_notice": "Legal Notice",
"licenses": "Licenses",
"match_in_progress": "Match in progress...",
"match_name": "Match name",
"matches": "Matches",
"menu": "Menu",
"most_points": "Most Points",
"no_data_available": "No data available",
"no_groups_created_yet": "No groups created yet",
"no_licenses_found": "No licenses found",
"no_license_text_available": "No license text available",
"no_matches_created_yet": "No matches created yet",
"no_players_created_yet": "No players created yet",
"no_players_found_with_that_name": "No players found with that name",
@@ -330,6 +337,7 @@
"player_name": "Player name",
"players": "Players",
"players_count": "{count} Players",
"privacy_policy": "Privacy Policy",
"quick_create": "Quick Create",
"recent_matches": "Recent Matches",
"ruleset": "Ruleset",

View File

@@ -176,6 +176,12 @@ abstract class AppLocalizations {
/// **'Create new match'**
String get create_new_match;
/// Data label
///
/// In en, this message translates to:
/// **'Data'**
String get data;
/// Success message after deleting data
///
/// In en, this message translates to:
@@ -302,36 +308,30 @@ abstract class AppLocalizations {
/// **'Invalid Schema'**
String get invalid_schema;
/// Licenses menu item
///
/// In en, this message translates to:
/// **'Licenses'**
String get licenses;
/// Message when no licenses are found
///
/// In en, this message translates to:
/// **'No licenses found'**
String get no_licenses_found;
/// Message when no license text is available
///
/// In en, this message translates to:
/// **'No license text available'**
String get no_license_text_available;
/// Error label
///
/// In en, this message translates to:
/// **'Error'**
String get error;
/// Title for least points ruleset
///
/// In en, this message translates to:
/// **'Least Points'**
String get least_points;
/// Legal section header
///
/// In en, this message translates to:
/// **'Legal'**
String get legal;
/// Legal notice menu item
///
/// In en, this message translates to:
/// **'Legal Notice'**
String get legal_notice;
/// Licenses menu item
///
/// In en, this message translates to:
/// **'Licenses'**
String get licenses;
/// Message when match is in progress
///
/// In en, this message translates to:
@@ -350,12 +350,6 @@ abstract class AppLocalizations {
/// **'Matches'**
String get matches;
/// Menu label
///
/// In en, this message translates to:
/// **'Menu'**
String get menu;
/// Title for most points ruleset
///
/// In en, this message translates to:
@@ -374,6 +368,18 @@ abstract class AppLocalizations {
/// **'No groups created yet'**
String get no_groups_created_yet;
/// Message when no licenses are found
///
/// In en, this message translates to:
/// **'No licenses found'**
String get no_licenses_found;
/// Message when no license text is available
///
/// In en, this message translates to:
/// **'No license text available'**
String get no_license_text_available;
/// Message when no matches exist
///
/// In en, this message translates to:
@@ -452,6 +458,12 @@ abstract class AppLocalizations {
/// **'{count} Players'**
String players_count(int count);
/// Privacy policy menu item
///
/// In en, this message translates to:
/// **'Privacy Policy'**
String get privacy_policy;
/// Title for quick create section
///
/// In en, this message translates to:
@@ -518,7 +530,7 @@ abstract class AppLocalizations {
/// **'Selected players'**
String get selected_players;
/// Settings label
/// Label for the App Settings
///
/// In en, this message translates to:
/// **'Settings'**

View File

@@ -49,6 +49,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get create_new_match => 'Neues Spiel erstellen';
@override
String get data => 'Daten';
@override
String get data_successfully_deleted => 'Daten erfolgreich gelöscht';
@@ -115,21 +118,18 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get invalid_schema => 'Ungültiges Schema';
@override
String get licenses => 'Lizenzen';
@override
String get no_licenses_found => 'Keine Lizenzen gefunden';
@override
String get no_license_text_available => 'Kein Lizenztext verfügbar';
@override
String get error => 'Fehler';
@override
String get least_points => 'Niedrigste Punkte';
@override
String get legal => 'Rechtliches';
@override
String get legal_notice => 'Impressum';
@override
String get licenses => 'Lizenzen';
@override
String get match_in_progress => 'Spiel läuft...';
@@ -139,9 +139,6 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get matches => 'Spiele';
@override
String get menu => 'Menü';
@override
String get most_points => 'Höchste Punkte';
@@ -151,6 +148,12 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get no_groups_created_yet => 'Noch keine Gruppen erstellt';
@override
String get no_licenses_found => 'Keine Lizenzen gefunden';
@override
String get no_license_text_available => 'Kein Lizenztext verfügbar';
@override
String get no_matches_created_yet => 'Noch keine Spiele erstellt';
@@ -193,6 +196,9 @@ class AppLocalizationsDe extends AppLocalizations {
return '$count Spieler';
}
@override
String get privacy_policy => 'Datenschutzerklärung';
@override
String get quick_create => 'Schnellzugriff';

View File

@@ -49,6 +49,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get create_new_match => 'Create new match';
@override
String get data => 'Data';
@override
String get data_successfully_deleted => 'Data successfully deleted';
@@ -115,21 +118,18 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get invalid_schema => 'Invalid Schema';
@override
String get licenses => 'Licenses';
@override
String get no_licenses_found => 'No licenses found';
@override
String get no_license_text_available => 'No license text available';
@override
String get error => 'Error';
@override
String get least_points => 'Least Points';
@override
String get legal => 'Legal';
@override
String get legal_notice => 'Legal Notice';
@override
String get licenses => 'Licenses';
@override
String get match_in_progress => 'Match in progress...';
@@ -139,9 +139,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get matches => 'Matches';
@override
String get menu => 'Menu';
@override
String get most_points => 'Most Points';
@@ -151,6 +148,12 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get no_groups_created_yet => 'No groups created yet';
@override
String get no_licenses_found => 'No licenses found';
@override
String get no_license_text_available => 'No license text available';
@override
String get no_matches_created_yet => 'No matches created yet';
@@ -193,6 +196,9 @@ class AppLocalizationsEn extends AppLocalizations {
return '$count Players';
}
@override
String get privacy_policy => 'Privacy Policy';
@override
String get quick_create => 'Quick Create';

View File

@@ -80,7 +80,7 @@ class LicenseDetailView extends StatelessWidget {
],
if (package.homepage != null &&
package.homepage!.isNotEmpty) ...[
const SizedBox(height: 4),
const SizedBox(height: 8),
SelectableText(
package.homepage!,
textAlign: TextAlign.center,
@@ -93,7 +93,7 @@ class LicenseDetailView extends StatelessWidget {
],
),
),
const SizedBox(height: 24),
const SizedBox(height: 20),
Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16),

View File

@@ -38,6 +38,7 @@ const allDependencies = <Package>[
_cross_file,
_crypto,
_csslib,
_cupertino_icons,
_dart_pubspec_licenses,
_dart_style,
_dbus,
@@ -153,28 +154,29 @@ const allDependencies = <Package>[
/// Direct `dependencies`.
const dependencies = <Package>[
_flutter,
_clock,
_cupertino_icons,
_drift,
_drift_flutter,
_file_picker,
_file_saver,
_font_awesome_flutter,
_intl,
_json_schema,
_package_info_plus,
_path_provider,
_provider,
_skeletonizer,
_uuid,
_file_picker,
_json_schema,
_file_saver,
_clock,
_intl,
_package_info_plus,
_font_awesome_flutter,
_url_launcher
_url_launcher,
_uuid
];
/// Direct `dev_dependencies`.
const devDependencies = <Package>[
_build_runner,
_dart_pubspec_licenses,
_flutter_lints,
_drift_dev,
_build_runner
_flutter_lints
];
/// Package license definition.
@@ -1468,6 +1470,40 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',
);
/// cupertino_icons 1.0.8
const _cupertino_icons = Package(
name: 'cupertino_icons',
description: 'Default icons asset for Cupertino widgets based on Apple styled icons',
repository: 'https://github.com/flutter/packages/tree/main/third_party/packages/cupertino_icons',
authors: [],
version: '1.0.8',
spdxIdentifiers: ['MIT'],
isMarkdown: false,
isSdk: false,
dependencies: [],
devDependencies: [PackageRef('flutter')],
license: '''The MIT License (MIT)
Copyright (c) 2016 Vladimir Kharlampidi
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''',
);
/// dart_pubspec_licenses 3.0.15
const _dart_pubspec_licenses = Package(
name: 'dart_pubspec_licenses',
@@ -7255,16 +7291,16 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.''',
);
/// game_tracker 0.0.4+111
/// game_tracker 0.0.5+127
const _game_tracker = Package(
name: 'game_tracker',
description: 'Game Tracking App for Card Games',
authors: [],
version: '0.0.4+111',
version: '0.0.5+127',
spdxIdentifiers: [],
isMarkdown: false,
isSdk: false,
dependencies: [PackageRef('flutter'), PackageRef('drift'), PackageRef('drift_flutter'), PackageRef('path_provider'), PackageRef('provider'), PackageRef('skeletonizer'), PackageRef('uuid'), PackageRef('file_picker'), PackageRef('json_schema'), PackageRef('file_saver'), PackageRef('clock'), PackageRef('intl'), PackageRef('package_info_plus'), PackageRef('font_awesome_flutter'), PackageRef('url_launcher')],
devDependencies: [PackageRef('dart_pubspec_licenses'), PackageRef('flutter_lints'), PackageRef('drift_dev'), PackageRef('build_runner')],
dependencies: [PackageRef('flutter'), PackageRef('clock'), PackageRef('cupertino_icons'), PackageRef('drift'), PackageRef('drift_flutter'), PackageRef('file_picker'), PackageRef('file_saver'), PackageRef('font_awesome_flutter'), PackageRef('intl'), PackageRef('json_schema'), PackageRef('package_info_plus'), PackageRef('path_provider'), PackageRef('provider'), PackageRef('skeletonizer'), PackageRef('url_launcher'), PackageRef('uuid')],
devDependencies: [PackageRef('build_runner'), PackageRef('dart_pubspec_licenses'), PackageRef('drift_dev'), PackageRef('flutter_lints')],
);

View File

@@ -40,7 +40,9 @@ class _SettingsViewState extends State<SettingsView> {
child: Scaffold(
appBar: AppBar(backgroundColor: CustomTheme.backgroundColor),
backgroundColor: CustomTheme.backgroundColor,
body: Column(
body: SingleChildScrollView(
child: Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -48,7 +50,7 @@ class _SettingsViewState extends State<SettingsView> {
padding: const EdgeInsets.only(left: 16, bottom: 10),
child: Text(
textAlign: TextAlign.start,
loc.menu,
loc.settings,
style: const TextStyle(
fontSize: 28,
fontWeight: FontWeight.bold,
@@ -59,7 +61,7 @@ class _SettingsViewState extends State<SettingsView> {
padding: const EdgeInsets.only(left: 16, top: 10, bottom: 10),
child: Text(
textAlign: TextAlign.start,
loc.settings,
loc.data,
style: const TextStyle(
fontSize: 22,
fontWeight: FontWeight.bold,
@@ -71,9 +73,8 @@ class _SettingsViewState extends State<SettingsView> {
icon: Icons.upload,
suffixWidget: const Icon(Icons.arrow_forward_ios, size: 16),
onPressed: () async {
final String json = await DataTransferService.getAppDataAsJson(
context,
);
final String json =
await DataTransferService.getAppDataAsJson(context);
final result = await DataTransferService.exportData(
json,
'game_tracker-data',
@@ -87,7 +88,9 @@ class _SettingsViewState extends State<SettingsView> {
icon: Icons.download,
suffixWidget: const Icon(Icons.arrow_forward_ios, size: 16),
onPressed: () async {
final result = await DataTransferService.importData(context);
final result = await DataTransferService.importData(
context,
);
if (!context.mounted) return;
showImportSnackBar(context: context, result: result);
},
@@ -126,12 +129,15 @@ class _SettingsViewState extends State<SettingsView> {
});
},
),
const Padding(
padding: EdgeInsets.only(left: 16, top: 10, bottom: 10),
Padding(
padding: const EdgeInsets.only(left: 16, top: 10, bottom: 10),
child: Text(
textAlign: TextAlign.start,
'App',
style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold),
loc.legal,
style: const TextStyle(
fontSize: 22,
fontWeight: FontWeight.bold,
),
),
),
SettingsListTile(
@@ -140,13 +146,26 @@ class _SettingsViewState extends State<SettingsView> {
suffixWidget: const Icon(Icons.arrow_forward_ios, size: 16),
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => const LicensesView()),
MaterialPageRoute(
builder: (context) => const LicensesView(),
),
);
},
),
const Spacer(),
SettingsListTile(
title: loc.legal_notice,
icon: Icons.account_balance_sharp,
suffixWidget: const Icon(Icons.arrow_forward_ios, size: 16),
onPressed: null,
),
SettingsListTile(
title: loc.privacy_policy,
icon: Icons.gpp_good_rounded,
suffixWidget: const Icon(Icons.arrow_forward_ios, size: 16),
onPressed: null,
),
Padding(
padding: const EdgeInsets.all(20),
padding: const EdgeInsets.only(top: 30, bottom: 20),
child: Center(
child: Column(
spacing: 4,
@@ -179,8 +198,9 @@ class _SettingsViewState extends State<SettingsView> {
? CupertinoIcons.mail_solid
: Icons.email,
),
onTap: () =>
launchUrl(Uri.parse('mailto:hi@liquid-dev.de')),
onTap: () => launchUrl(
Uri.parse('mailto:hi@liquid-dev.de'),
),
),
],
),
@@ -208,6 +228,8 @@ class _SettingsViewState extends State<SettingsView> {
],
),
),
),
),
);
}
@@ -282,6 +304,7 @@ class _SettingsViewState extends State<SettingsView> {
);
}
/// Initializes the package information.
Future<void> _initPackageInfo() async {
final info = await PackageInfo.fromPlatform();
setState(() {

View File

@@ -1,7 +1,7 @@
name: game_tracker
description: "Game Tracking App for Card Games"
publish_to: 'none'
version: 0.0.5+127
version: 0.0.5+132
environment:
sdk: ^3.8.1