The tabs hold the person's tasks: Today what is overdue (Reschedule moving it all to a day, times kept) and what is due today; Upcoming the overdue ones and the next four weeks day by day; Inbox and each project's screen from Browse the tasks above and in their sections, done ones on asking; Browse the projects with their open counts and the labels. A task's row shows its check in its priority's colour, its date in the colour of how near it is, its deadline, its sub-tasks done and its labels; quick add takes its title, date, priority, project, labels and description and stays for the next; its sheet edits all of it, adds sub-tasks and deletes it with them after asking. Colours are the palette's, cerise for overdue and P1 against the strawberry wash. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
684 lines
19 KiB
Dart
684 lines
19 KiB
Dart
import 'dart:async';
|
||
|
||
import 'package:flutter/foundation.dart';
|
||
import 'package:flutter/widgets.dart';
|
||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||
import 'package:intl/intl.dart' as intl;
|
||
|
||
import 'app_localizations_de.dart';
|
||
import 'app_localizations_en.dart';
|
||
|
||
// ignore_for_file: type=lint
|
||
|
||
/// Callers can lookup localized strings with an instance of AppLocalizations
|
||
/// returned by `AppLocalizations.of(context)`.
|
||
///
|
||
/// Applications need to include `AppLocalizations.delegate()` in their app's
|
||
/// `localizationDelegates` list, and the locales they support in the app's
|
||
/// `supportedLocales` list. For example:
|
||
///
|
||
/// ```dart
|
||
/// import 'l10n/app_localizations.dart';
|
||
///
|
||
/// return MaterialApp(
|
||
/// localizationsDelegates: AppLocalizations.localizationsDelegates,
|
||
/// supportedLocales: AppLocalizations.supportedLocales,
|
||
/// home: MyApplicationHome(),
|
||
/// );
|
||
/// ```
|
||
///
|
||
/// ## Update pubspec.yaml
|
||
///
|
||
/// Please make sure to update your pubspec.yaml to include the following
|
||
/// packages:
|
||
///
|
||
/// ```yaml
|
||
/// dependencies:
|
||
/// # Internationalization support.
|
||
/// flutter_localizations:
|
||
/// sdk: flutter
|
||
/// intl: any # Use the pinned version from flutter_localizations
|
||
///
|
||
/// # Rest of dependencies
|
||
/// ```
|
||
///
|
||
/// ## iOS Applications
|
||
///
|
||
/// iOS applications define key application metadata, including supported
|
||
/// locales, in an Info.plist file that is built into the application bundle.
|
||
/// To configure the locales supported by your app, you’ll need to edit this
|
||
/// file.
|
||
///
|
||
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
|
||
/// Then, in the Project Navigator, open the Info.plist file under the Runner
|
||
/// project’s Runner folder.
|
||
///
|
||
/// Next, select the Information Property List item, select Add Item from the
|
||
/// Editor menu, then select Localizations from the pop-up menu.
|
||
///
|
||
/// Select and expand the newly-created Localizations item then, for each
|
||
/// locale your application supports, add a new item and select the locale
|
||
/// you wish to add from the pop-up menu in the Value field. This list should
|
||
/// be consistent with the languages listed in the AppLocalizations.supportedLocales
|
||
/// property.
|
||
abstract class AppLocalizations {
|
||
AppLocalizations(String locale)
|
||
: localeName = intl.Intl.canonicalizedLocale(locale.toString());
|
||
|
||
final String localeName;
|
||
|
||
static AppLocalizations of(BuildContext context) {
|
||
return Localizations.of<AppLocalizations>(context, AppLocalizations)!;
|
||
}
|
||
|
||
static const LocalizationsDelegate<AppLocalizations> delegate =
|
||
_AppLocalizationsDelegate();
|
||
|
||
/// A list of this localizations delegate along with the default localizations
|
||
/// delegates.
|
||
///
|
||
/// Returns a list of localizations delegates containing this delegate along with
|
||
/// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
|
||
/// and GlobalWidgetsLocalizations.delegate.
|
||
///
|
||
/// Additional delegates can be added by appending to this list in
|
||
/// MaterialApp. This list does not have to be used at all if a custom list
|
||
/// of delegates is preferred or required.
|
||
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
|
||
<LocalizationsDelegate<dynamic>>[
|
||
delegate,
|
||
GlobalMaterialLocalizations.delegate,
|
||
GlobalCupertinoLocalizations.delegate,
|
||
GlobalWidgetsLocalizations.delegate,
|
||
];
|
||
|
||
/// A list of this localizations delegate's supported locales.
|
||
static const List<Locale> supportedLocales = <Locale>[
|
||
Locale('de'),
|
||
Locale('en'),
|
||
Locale('en', 'GB'),
|
||
Locale('en', 'US'),
|
||
];
|
||
|
||
/// The app's name: the window's title, and where halkyon_app's texts name the app.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Halkyon Todo'**
|
||
String get appTitle;
|
||
|
||
/// The app's word in its wordmark, under "Halkyon".
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Todo'**
|
||
String get launchProduct;
|
||
|
||
/// No description provided for @instanceFirstStartSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Choose the instance to keep your tasks on. Someone runs each one; you can add others later.'**
|
||
String get instanceFirstStartSubtitle;
|
||
|
||
/// No description provided for @accountTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Account'**
|
||
String get accountTitle;
|
||
|
||
/// No description provided for @accountDeleteMessage.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Your account is deleted on the server and on all your devices. This can\'t be undone.'**
|
||
String get accountDeleteMessage;
|
||
|
||
/// No description provided for @aboutTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'About Halkyon Todo'**
|
||
String get aboutTitle;
|
||
|
||
/// No description provided for @shellTabToday.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Today'**
|
||
String get shellTabToday;
|
||
|
||
/// No description provided for @shellTabUpcoming.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Upcoming'**
|
||
String get shellTabUpcoming;
|
||
|
||
/// No description provided for @shellTabInbox.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Inbox'**
|
||
String get shellTabInbox;
|
||
|
||
/// No description provided for @shellTabBrowse.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Browse'**
|
||
String get shellTabBrowse;
|
||
|
||
/// No description provided for @settingsTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Settings'**
|
||
String get settingsTitle;
|
||
|
||
/// No description provided for @settingsVersion.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Version {version} (build {build})'**
|
||
String settingsVersion(String version, String build);
|
||
|
||
/// No description provided for @clear.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Clear'**
|
||
String get clear;
|
||
|
||
/// No description provided for @colorLabel.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Colour'**
|
||
String get colorLabel;
|
||
|
||
/// No description provided for @completedShow.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Show done tasks'**
|
||
String get completedShow;
|
||
|
||
/// No description provided for @completedHide.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Hide done tasks'**
|
||
String get completedHide;
|
||
|
||
/// No description provided for @dateTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Date'**
|
||
String get dateTitle;
|
||
|
||
/// No description provided for @dateNextWeek.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Next week'**
|
||
String get dateNextWeek;
|
||
|
||
/// No description provided for @dateWeekend.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This weekend'**
|
||
String get dateWeekend;
|
||
|
||
/// No description provided for @datePick.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Pick a day'**
|
||
String get datePick;
|
||
|
||
/// No description provided for @dateTime.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Time'**
|
||
String get dateTime;
|
||
|
||
/// No description provided for @dateNone.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No date'**
|
||
String get dateNone;
|
||
|
||
/// No description provided for @dateNoneYet.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No date'**
|
||
String get dateNoneYet;
|
||
|
||
/// No description provided for @dayToday.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Today'**
|
||
String get dayToday;
|
||
|
||
/// No description provided for @dayTomorrow.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Tomorrow'**
|
||
String get dayTomorrow;
|
||
|
||
/// No description provided for @dayYesterday.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Yesterday'**
|
||
String get dayYesterday;
|
||
|
||
/// No description provided for @dayHeadingNamed.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{date} · {name}'**
|
||
String dayHeadingNamed(String date, String name);
|
||
|
||
/// No description provided for @deadlineOn.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Deadline {day}'**
|
||
String deadlineOn(String day);
|
||
|
||
/// No description provided for @deadlineNone.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No deadline'**
|
||
String get deadlineNone;
|
||
|
||
/// No description provided for @keysMissing.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This device can\'t save: it doesn\'t hold your account\'s keys. Sign in with your password or recovery phrase to add them.'**
|
||
String get keysMissing;
|
||
|
||
/// No description provided for @labelsTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Labels'**
|
||
String get labelsTitle;
|
||
|
||
/// No description provided for @labelsNone.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No labels yet.'**
|
||
String get labelsNone;
|
||
|
||
/// No description provided for @labelsNoneSet.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No labels'**
|
||
String get labelsNoneSet;
|
||
|
||
/// No description provided for @labelsCount.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{count, plural, =1{1 label} other{{count} labels}}'**
|
||
String labelsCount(int count);
|
||
|
||
/// No description provided for @labelAdd.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'New label'**
|
||
String get labelAdd;
|
||
|
||
/// No description provided for @labelEdit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Edit label'**
|
||
String get labelEdit;
|
||
|
||
/// No description provided for @labelDelete.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete label'**
|
||
String get labelDelete;
|
||
|
||
/// No description provided for @labelDeleteTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete the label?'**
|
||
String get labelDeleteTitle;
|
||
|
||
/// No description provided for @labelDeleteMessage.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'\"{name}\" is taken off every task that has it.'**
|
||
String labelDeleteMessage(String name);
|
||
|
||
/// No description provided for @nameLabel.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Name'**
|
||
String get nameLabel;
|
||
|
||
/// No description provided for @save.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Save'**
|
||
String get save;
|
||
|
||
/// No description provided for @overdue.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Overdue'**
|
||
String get overdue;
|
||
|
||
/// No description provided for @reschedule.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Reschedule'**
|
||
String get reschedule;
|
||
|
||
/// No description provided for @priorityTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Priority'**
|
||
String get priorityTitle;
|
||
|
||
/// No description provided for @priority1.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Priority 1'**
|
||
String get priority1;
|
||
|
||
/// No description provided for @priority2.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Priority 2'**
|
||
String get priority2;
|
||
|
||
/// No description provided for @priority3.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Priority 3'**
|
||
String get priority3;
|
||
|
||
/// No description provided for @priority4.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No priority'**
|
||
String get priority4;
|
||
|
||
/// No description provided for @projectsTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Projects'**
|
||
String get projectsTitle;
|
||
|
||
/// No description provided for @projectsNone.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No projects of your own yet.'**
|
||
String get projectsNone;
|
||
|
||
/// No description provided for @projectAdd.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'New project'**
|
||
String get projectAdd;
|
||
|
||
/// No description provided for @projectEdit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Edit project'**
|
||
String get projectEdit;
|
||
|
||
/// No description provided for @projectDelete.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete project'**
|
||
String get projectDelete;
|
||
|
||
/// No description provided for @projectDeleteTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete the project?'**
|
||
String get projectDeleteTitle;
|
||
|
||
/// No description provided for @projectDeleteMessage.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'\"{name}\" is deleted with its sections and tasks, on all your devices.'**
|
||
String projectDeleteMessage(String name);
|
||
|
||
/// No description provided for @projectEmptyTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Nothing to do here'**
|
||
String get projectEmptyTitle;
|
||
|
||
/// No description provided for @projectEmptyHint.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add a task with the + button.'**
|
||
String get projectEmptyHint;
|
||
|
||
/// No description provided for @projectGone.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This project was deleted.'**
|
||
String get projectGone;
|
||
|
||
/// No description provided for @projectMenu.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'More'**
|
||
String get projectMenu;
|
||
|
||
/// No description provided for @projectPickTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Project'**
|
||
String get projectPickTitle;
|
||
|
||
/// No description provided for @sectionAdd.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'New section'**
|
||
String get sectionAdd;
|
||
|
||
/// No description provided for @sectionEdit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Rename section'**
|
||
String get sectionEdit;
|
||
|
||
/// No description provided for @sectionDelete.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete section'**
|
||
String get sectionDelete;
|
||
|
||
/// No description provided for @sectionDeleteTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete the section?'**
|
||
String get sectionDeleteTitle;
|
||
|
||
/// No description provided for @sectionDeleteMessage.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'\"{name}\" is deleted with its tasks.'**
|
||
String sectionDeleteMessage(String name);
|
||
|
||
/// No description provided for @sectionMenu.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Section'**
|
||
String get sectionMenu;
|
||
|
||
/// No description provided for @subTasks.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Sub-tasks'**
|
||
String get subTasks;
|
||
|
||
/// No description provided for @subTasksDone.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Sub-tasks {done}/{count}'**
|
||
String subTasksDone(int done, int count);
|
||
|
||
/// No description provided for @subTaskAdd.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add sub-task'**
|
||
String get subTaskAdd;
|
||
|
||
/// No description provided for @taskTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Task'**
|
||
String get taskTitle;
|
||
|
||
/// No description provided for @taskAddTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add task'**
|
||
String get taskAddTitle;
|
||
|
||
/// No description provided for @taskAdd.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add'**
|
||
String get taskAdd;
|
||
|
||
/// No description provided for @taskAddOn.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add a task on {day}'**
|
||
String taskAddOn(String day);
|
||
|
||
/// No description provided for @taskTitleHint.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'What\'s to be done?'**
|
||
String get taskTitleHint;
|
||
|
||
/// No description provided for @taskDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Description'**
|
||
String get taskDescription;
|
||
|
||
/// No description provided for @taskDescriptionHint.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Description'**
|
||
String get taskDescriptionHint;
|
||
|
||
/// No description provided for @taskComplete.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Mark as done'**
|
||
String get taskComplete;
|
||
|
||
/// No description provided for @taskReopen.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Mark as not done'**
|
||
String get taskReopen;
|
||
|
||
/// No description provided for @taskCompleted.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Task done'**
|
||
String get taskCompleted;
|
||
|
||
/// No description provided for @taskDelete.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete task'**
|
||
String get taskDelete;
|
||
|
||
/// No description provided for @taskDeleteTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete the task?'**
|
||
String get taskDeleteTitle;
|
||
|
||
/// No description provided for @taskDeleteMessage.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'\"{title}\" is deleted on all your devices.'**
|
||
String taskDeleteMessage(String title);
|
||
|
||
/// No description provided for @taskDeleteWithSubTasks.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'\"{title}\" is deleted with its {count, plural, =1{sub-task} other{{count} sub-tasks}}, on all your devices.'**
|
||
String taskDeleteWithSubTasks(String title, int count);
|
||
|
||
/// No description provided for @taskGone.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This task was deleted.'**
|
||
String get taskGone;
|
||
|
||
/// No description provided for @todayEmptyTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Nothing due today'**
|
||
String get todayEmptyTitle;
|
||
|
||
/// No description provided for @todayEmptyHint.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Tasks dated today, and those overdue, show here.'**
|
||
String get todayEmptyHint;
|
||
|
||
/// No description provided for @lockedRows.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{count, plural, =1{1 item doesn\'t open on this device.} other{{count} items don\'t open on this device.}}'**
|
||
String lockedRows(int count);
|
||
|
||
/// No description provided for @inboxMissingTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No Inbox yet'**
|
||
String get inboxMissingTitle;
|
||
|
||
/// No description provided for @inboxMissingHint.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Your Inbox comes with the next sync, or once this device holds your account\'s keys.'**
|
||
String get inboxMissingHint;
|
||
}
|
||
|
||
class _AppLocalizationsDelegate
|
||
extends LocalizationsDelegate<AppLocalizations> {
|
||
const _AppLocalizationsDelegate();
|
||
|
||
@override
|
||
Future<AppLocalizations> load(Locale locale) {
|
||
return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
|
||
}
|
||
|
||
@override
|
||
bool isSupported(Locale locale) =>
|
||
<String>['de', 'en'].contains(locale.languageCode);
|
||
|
||
@override
|
||
bool shouldReload(_AppLocalizationsDelegate old) => false;
|
||
}
|
||
|
||
AppLocalizations lookupAppLocalizations(Locale locale) {
|
||
// Lookup logic when language+country codes are specified.
|
||
switch (locale.languageCode) {
|
||
case 'en':
|
||
{
|
||
switch (locale.countryCode) {
|
||
case 'GB':
|
||
return AppLocalizationsEnGb();
|
||
case 'US':
|
||
return AppLocalizationsEnUs();
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
// Lookup logic when only language code is specified.
|
||
switch (locale.languageCode) {
|
||
case 'de':
|
||
return AppLocalizationsDe();
|
||
case 'en':
|
||
return AppLocalizationsEn();
|
||
}
|
||
|
||
throw FlutterError(
|
||
'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
|
||
'an issue with the localizations generation tool. Please file an issue '
|
||
'on GitHub with a reproducible sample app and the gen-l10n configuration '
|
||
'that was used.',
|
||
);
|
||
}
|