- Complete MVP with Repository Pattern, SQLite storage - Provider + ChangeNotifier state management - Navigation 2.0 with deep link support - Habit CRUD with twoDayRule, notifications, categories - Backup/Restore via JSON - Statistics with streak tracking - Material You theme support - Biometric lock support - Desktop widget support - 27 languages i18n structure - Comprehensive test suite (87/89 passing)
1461 lines
41 KiB
Dart
1461 lines
41 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_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 'generated/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('en')];
|
||
|
||
/// No description provided for @habits.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habits:'**
|
||
String get habits;
|
||
|
||
/// No description provided for @statistics.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Statistics'**
|
||
String get statistics;
|
||
|
||
/// No description provided for @emptyList.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Empty list'**
|
||
String get emptyList;
|
||
|
||
/// No description provided for @noDataAboutHabits.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'There is no data about habits.'**
|
||
String get noDataAboutHabits;
|
||
|
||
/// No description provided for @topStreak.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Top streak'**
|
||
String get topStreak;
|
||
|
||
/// No description provided for @currentStreak.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Current streak'**
|
||
String get currentStreak;
|
||
|
||
/// No description provided for @total.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Total'**
|
||
String get total;
|
||
|
||
/// No description provided for @unknown.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Unknown'**
|
||
String get unknown;
|
||
|
||
/// No description provided for @warning.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Warning'**
|
||
String get warning;
|
||
|
||
/// No description provided for @allHabitsWillBeReplaced.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'All habits will be replaced with habits from backup.'**
|
||
String get allHabitsWillBeReplaced;
|
||
|
||
/// No description provided for @restore.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Restore'**
|
||
String get restore;
|
||
|
||
/// No description provided for @cancel.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Cancel'**
|
||
String get cancel;
|
||
|
||
/// No description provided for @settings.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Settings'**
|
||
String get settings;
|
||
|
||
/// No description provided for @theme.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Theme'**
|
||
String get theme;
|
||
|
||
/// No description provided for @firstDayOfWeek.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'First day of the week'**
|
||
String get firstDayOfWeek;
|
||
|
||
/// No description provided for @notifications.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Notifications'**
|
||
String get notifications;
|
||
|
||
/// No description provided for @notificationTime.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Notification time'**
|
||
String get notificationTime;
|
||
|
||
/// No description provided for @soundEffects.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Sound effects'**
|
||
String get soundEffects;
|
||
|
||
/// No description provided for @showMonthName.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Show month name'**
|
||
String get showMonthName;
|
||
|
||
/// No description provided for @setColors.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Set colors'**
|
||
String get setColors;
|
||
|
||
/// No description provided for @backup.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Backup'**
|
||
String get backup;
|
||
|
||
/// No description provided for @create.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Create'**
|
||
String get create;
|
||
|
||
/// No description provided for @onboarding.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Onboarding'**
|
||
String get onboarding;
|
||
|
||
/// No description provided for @about.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'About'**
|
||
String get about;
|
||
|
||
/// No description provided for @habo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habo'**
|
||
String get habo;
|
||
|
||
/// No description provided for @copyright.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'©2023 Habo'**
|
||
String get copyright;
|
||
|
||
/// No description provided for @termsAndConditions.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Terms and Conditions'**
|
||
String get termsAndConditions;
|
||
|
||
/// No description provided for @privacyPolicy.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Privacy Policy'**
|
||
String get privacyPolicy;
|
||
|
||
/// No description provided for @disclaimer.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Disclaimer'**
|
||
String get disclaimer;
|
||
|
||
/// No description provided for @sourceCode.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Source code (GitHub)'**
|
||
String get sourceCode;
|
||
|
||
/// No description provided for @ifYouWantToSupport.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'If you want to support Habo you can:'**
|
||
String get ifYouWantToSupport;
|
||
|
||
/// No description provided for @buyMeACoffee.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Buy me a coffee'**
|
||
String get buyMeACoffee;
|
||
|
||
/// No description provided for @reset.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Reset'**
|
||
String get reset;
|
||
|
||
/// No description provided for @done.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Done'**
|
||
String get done;
|
||
|
||
/// No description provided for @congratulationsReward.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Congratulations! Your reward:'**
|
||
String get congratulationsReward;
|
||
|
||
/// No description provided for @ohNoSanction.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Oh no! Your sanction:'**
|
||
String get ohNoSanction;
|
||
|
||
/// No description provided for @month.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Month'**
|
||
String get month;
|
||
|
||
/// No description provided for @week.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Week'**
|
||
String get week;
|
||
|
||
/// No description provided for @habitLoop.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habit loop'**
|
||
String get habitLoop;
|
||
|
||
/// No description provided for @habitLoopDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habit Loop is a psychological model describing the process of habit formation. It consists of three components: Cue, Routine, and Reward. The Cue triggers the Routine (habitual action), which is then reinforced by the Reward, creating a loop that makes the habit more ingrained and likely to be repeated.'**
|
||
String get habitLoopDescription;
|
||
|
||
/// No description provided for @cue.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Cue'**
|
||
String get cue;
|
||
|
||
/// No description provided for @cueDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'is the trigger that initiates your habit. It could be a specific time, location, feeling, or an event.'**
|
||
String get cueDescription;
|
||
|
||
/// No description provided for @routine.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Routine'**
|
||
String get routine;
|
||
|
||
/// No description provided for @routineDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'is the action you take in response to the cue. This is the habit itself.'**
|
||
String get routineDescription;
|
||
|
||
/// No description provided for @reward.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Reward'**
|
||
String get reward;
|
||
|
||
/// No description provided for @rewardDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'is the benefit or positive feeling you experience after performing the routine. It reinforces the habit.'**
|
||
String get rewardDescription;
|
||
|
||
/// No description provided for @editHabit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Edit Habit'**
|
||
String get editHabit;
|
||
|
||
/// No description provided for @createHabit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Create Habit'**
|
||
String get createHabit;
|
||
|
||
/// No description provided for @delete.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete'**
|
||
String get delete;
|
||
|
||
/// No description provided for @habitTitleEmptyError.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'The habit title can not be empty.'**
|
||
String get habitTitleEmptyError;
|
||
|
||
/// No description provided for @save.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Save'**
|
||
String get save;
|
||
|
||
/// No description provided for @exercise.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Exercise'**
|
||
String get exercise;
|
||
|
||
/// No description provided for @habit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habit'**
|
||
String get habit;
|
||
|
||
/// No description provided for @useTwoDayRule.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Use Two day rule'**
|
||
String get useTwoDayRule;
|
||
|
||
/// No description provided for @twoDayRule.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Two day rule'**
|
||
String get twoDayRule;
|
||
|
||
/// No description provided for @twoDayRuleDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'With two day rule, you can miss one day and do not lose a streak if the next day is successful.'**
|
||
String get twoDayRuleDescription;
|
||
|
||
/// No description provided for @advancedHabitBuilding.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Advanced habit building'**
|
||
String get advancedHabitBuilding;
|
||
|
||
/// No description provided for @advancedHabitBuildingDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This section helps you better define your habits utilizing the Habit loop. You should define cues, routines, and rewards for every habit.'**
|
||
String get advancedHabitBuildingDescription;
|
||
|
||
/// No description provided for @at7AM.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'At 7:00AM'**
|
||
String get at7AM;
|
||
|
||
/// No description provided for @do50PushUps.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Do 50 push ups'**
|
||
String get do50PushUps;
|
||
|
||
/// No description provided for @fifteenMinOfVideoGames.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'15 min. of video games'**
|
||
String get fifteenMinOfVideoGames;
|
||
|
||
/// No description provided for @showReward.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Show reward'**
|
||
String get showReward;
|
||
|
||
/// No description provided for @remainderOfReward.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'The reminder of the reward after a successful routine.'**
|
||
String get remainderOfReward;
|
||
|
||
/// No description provided for @habitContract.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habit contract'**
|
||
String get habitContract;
|
||
|
||
/// No description provided for @habitContractDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'While positive reinforcement is recommended, some people may opt for a habit contract. A habit contract allows you to specify a sanction that will be imposed if you miss your habit, and may involve an accountability partner who helps supervise your goals.'**
|
||
String get habitContractDescription;
|
||
|
||
/// No description provided for @donateToCharity.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Donate 10\$ to charity'**
|
||
String get donateToCharity;
|
||
|
||
/// No description provided for @sanction.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Sanction'**
|
||
String get sanction;
|
||
|
||
/// No description provided for @showSanction.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Show sanction'**
|
||
String get showSanction;
|
||
|
||
/// No description provided for @remainderOfSanction.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'The reminder of the sanction after a unsuccessful routine.'**
|
||
String get remainderOfSanction;
|
||
|
||
/// No description provided for @dan.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Dan'**
|
||
String get dan;
|
||
|
||
/// No description provided for @accountabilityPartner.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Accountability partner'**
|
||
String get accountabilityPartner;
|
||
|
||
/// No description provided for @add.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add'**
|
||
String get add;
|
||
|
||
/// No description provided for @haboNeedsPermission.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habo needs permission to send notifications to work properly.'**
|
||
String get haboNeedsPermission;
|
||
|
||
/// No description provided for @allow.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Allow'**
|
||
String get allow;
|
||
|
||
/// No description provided for @date.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Date'**
|
||
String get date;
|
||
|
||
/// No description provided for @check.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Check'**
|
||
String get check;
|
||
|
||
/// No description provided for @fail.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Fail'**
|
||
String get fail;
|
||
|
||
/// No description provided for @skip.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Skip'**
|
||
String get skip;
|
||
|
||
/// No description provided for @note.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Note'**
|
||
String get note;
|
||
|
||
/// No description provided for @yourCommentHere.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Your note here'**
|
||
String get yourCommentHere;
|
||
|
||
/// No description provided for @close.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Close'**
|
||
String get close;
|
||
|
||
/// No description provided for @createYourFirstHabit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Create your first habit.'**
|
||
String get createYourFirstHabit;
|
||
|
||
/// No description provided for @modify.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Modify'**
|
||
String get modify;
|
||
|
||
/// No description provided for @backupFailedError.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'ERROR: Creating backup failed.'**
|
||
String get backupFailedError;
|
||
|
||
/// No description provided for @restoreFailedError.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'ERROR: Restoring backup failed.'**
|
||
String get restoreFailedError;
|
||
|
||
/// No description provided for @habitDeleted.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habit deleted.'**
|
||
String get habitDeleted;
|
||
|
||
/// No description provided for @undo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Undo'**
|
||
String get undo;
|
||
|
||
/// No description provided for @appNotifications.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'App notifications'**
|
||
String get appNotifications;
|
||
|
||
/// No description provided for @appNotificationsChannel.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Notification channel for application notifications'**
|
||
String get appNotificationsChannel;
|
||
|
||
/// No description provided for @habitNotifications.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habit notifications'**
|
||
String get habitNotifications;
|
||
|
||
/// No description provided for @habitNotificationsChannel.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Notification channel for habit notifications'**
|
||
String get habitNotificationsChannel;
|
||
|
||
/// No description provided for @doNotForgetToCheckYourHabits.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Do not forget to check your habits.'**
|
||
String get doNotForgetToCheckYourHabits;
|
||
|
||
/// No description provided for @themeSelect.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{theme, select, device {Device} light {Light} dark {Dark} oled {OLED black} materialYou {Material You} other{Device}}'**
|
||
String themeSelect(String theme);
|
||
|
||
/// No description provided for @defineYourHabits.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Define your habits'**
|
||
String get defineYourHabits;
|
||
|
||
/// No description provided for @defineYourHabitsDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'To better stick to your habits, you can define:'**
|
||
String get defineYourHabitsDescription;
|
||
|
||
/// No description provided for @cueNumbered.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'1. Cue'**
|
||
String get cueNumbered;
|
||
|
||
/// No description provided for @routineNumbered.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'2. Routine'**
|
||
String get routineNumbered;
|
||
|
||
/// No description provided for @rewardNumbered.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'3. Reward'**
|
||
String get rewardNumbered;
|
||
|
||
/// No description provided for @logYourDays.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Log your days'**
|
||
String get logYourDays;
|
||
|
||
/// No description provided for @successful.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Successful'**
|
||
String get successful;
|
||
|
||
/// No description provided for @notSoSuccessful.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Not so successful'**
|
||
String get notSoSuccessful;
|
||
|
||
/// No description provided for @skipDoesNotAffectStreaks.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Skip (does not affect streaks)'**
|
||
String get skipDoesNotAffectStreaks;
|
||
|
||
/// No description provided for @observeYourProgress.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Observe your progress'**
|
||
String get observeYourProgress;
|
||
|
||
/// No description provided for @trackYourProgress.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'You can track your progress through the calendar view in every habit or on the statistics page.'**
|
||
String get trackYourProgress;
|
||
|
||
/// No description provided for @backupCreatedSuccessfully.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Backup created successfully!'**
|
||
String get backupCreatedSuccessfully;
|
||
|
||
/// No description provided for @backupFailed.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Backup failed!'**
|
||
String get backupFailed;
|
||
|
||
/// No description provided for @restoreCompletedSuccessfully.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Restore completed successfully!'**
|
||
String get restoreCompletedSuccessfully;
|
||
|
||
/// No description provided for @restoreFailed.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Restore failed!'**
|
||
String get restoreFailed;
|
||
|
||
/// No description provided for @fileNotFound.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'File not found'**
|
||
String get fileNotFound;
|
||
|
||
/// No description provided for @fileTooLarge.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'File too large (max 10MB)'**
|
||
String get fileTooLarge;
|
||
|
||
/// No description provided for @invalidBackupFile.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Invalid backup file'**
|
||
String get invalidBackupFile;
|
||
|
||
/// No description provided for @progress.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Progress'**
|
||
String get progress;
|
||
|
||
/// No description provided for @enterAmount.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Enter amount'**
|
||
String get enterAmount;
|
||
|
||
/// No description provided for @complete.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Complete'**
|
||
String get complete;
|
||
|
||
/// No description provided for @saveProgress.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Save Progress'**
|
||
String get saveProgress;
|
||
|
||
/// No description provided for @currentProgress.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Current: {current} {unit}'**
|
||
String currentProgress(String current, String unit);
|
||
|
||
/// No description provided for @targetProgress.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Target: {target} {unit}'**
|
||
String targetProgress(String target, String unit);
|
||
|
||
/// No description provided for @progressOf.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{current} / {target} {unit}'**
|
||
String progressOf(String current, String target, String unit);
|
||
|
||
/// No description provided for @numericHabit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Progressive'**
|
||
String get numericHabit;
|
||
|
||
/// No description provided for @targetValue.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Target value'**
|
||
String get targetValue;
|
||
|
||
/// No description provided for @partialValue.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Partial value'**
|
||
String get partialValue;
|
||
|
||
/// No description provided for @unit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Unit'**
|
||
String get unit;
|
||
|
||
/// No description provided for @habitType.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habit type'**
|
||
String get habitType;
|
||
|
||
/// No description provided for @booleanHabit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Checkable (Yes/No)'**
|
||
String get booleanHabit;
|
||
|
||
/// No description provided for @slider.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Slider'**
|
||
String get slider;
|
||
|
||
/// No description provided for @input.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Input'**
|
||
String get input;
|
||
|
||
/// No description provided for @numericHabitDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Numeric habits let you track progress in increments throughout the day.'**
|
||
String get numericHabitDescription;
|
||
|
||
/// No description provided for @partialValueDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'To track progress in smaller increments'**
|
||
String get partialValueDescription;
|
||
|
||
/// No description provided for @categories.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Categories'**
|
||
String get categories;
|
||
|
||
/// No description provided for @addCategory.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add Category'**
|
||
String get addCategory;
|
||
|
||
/// No description provided for @editCategory.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Edit Category'**
|
||
String get editCategory;
|
||
|
||
/// No description provided for @category.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Category'**
|
||
String get category;
|
||
|
||
/// No description provided for @noCategoriesYet.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No categories yet'**
|
||
String get noCategoriesYet;
|
||
|
||
/// No description provided for @createFirstCategory.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Create your first category to organize your habits'**
|
||
String get createFirstCategory;
|
||
|
||
/// No description provided for @pleaseEnterCategoryTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please enter a category title'**
|
||
String get pleaseEnterCategoryTitle;
|
||
|
||
/// No description provided for @categoryAlreadyExists.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Category \"{title}\" already exists'**
|
||
String categoryAlreadyExists(String title);
|
||
|
||
/// No description provided for @categoryCreatedSuccessfully.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Category \"{title}\" created successfully'**
|
||
String categoryCreatedSuccessfully(String title);
|
||
|
||
/// No description provided for @categoryUpdatedSuccessfully.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Category \"{title}\" updated successfully'**
|
||
String categoryUpdatedSuccessfully(String title);
|
||
|
||
/// No description provided for @categoryDeletedSuccessfully.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Category \"{title}\" deleted successfully'**
|
||
String categoryDeletedSuccessfully(String title);
|
||
|
||
/// No description provided for @failedToSaveCategory.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Failed to save category: {error}'**
|
||
String failedToSaveCategory(String error);
|
||
|
||
/// No description provided for @failedToDeleteCategory.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Failed to delete category: {error}'**
|
||
String failedToDeleteCategory(String error);
|
||
|
||
/// No description provided for @selectCategories.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Select Categories'**
|
||
String get selectCategories;
|
||
|
||
/// No description provided for @selectedCategories.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Selected Categories ({count})'**
|
||
String selectedCategories(int count);
|
||
|
||
/// No description provided for @allCategories.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'All Categories'**
|
||
String get allCategories;
|
||
|
||
/// No description provided for @deleteCategory.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete Category'**
|
||
String get deleteCategory;
|
||
|
||
/// No description provided for @deleteCategoryConfirmation.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Are you sure you want to delete \"{title}\"?\n\nThis will remove the category from all habits that use it.'**
|
||
String deleteCategoryConfirmation(String title);
|
||
|
||
/// No description provided for @noHabitsInCategory.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No habits in \"{title}\"'**
|
||
String noHabitsInCategory(String title);
|
||
|
||
/// No description provided for @createHabitForCategory.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Create a habit and assign it to this category'**
|
||
String get createHabitForCategory;
|
||
|
||
/// No description provided for @showCategories.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Show Categories'**
|
||
String get showCategories;
|
||
|
||
/// No description provided for @archive.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Archive'**
|
||
String get archive;
|
||
|
||
/// No description provided for @unarchive.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Unarchive'**
|
||
String get unarchive;
|
||
|
||
/// No description provided for @archiveHabit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Archive habit'**
|
||
String get archiveHabit;
|
||
|
||
/// No description provided for @unarchiveHabit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Unarchive habit'**
|
||
String get unarchiveHabit;
|
||
|
||
/// No description provided for @archivedHabits.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Archived Habits'**
|
||
String get archivedHabits;
|
||
|
||
/// No description provided for @noArchivedHabits.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No archived habits'**
|
||
String get noArchivedHabits;
|
||
|
||
/// No description provided for @viewArchivedHabits.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'View archived habits'**
|
||
String get viewArchivedHabits;
|
||
|
||
/// No description provided for @habitArchived.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habit archived'**
|
||
String get habitArchived;
|
||
|
||
/// No description provided for @habitUnarchived.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habit unarchived'**
|
||
String get habitUnarchived;
|
||
|
||
/// No description provided for @biometric.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Biometric'**
|
||
String get biometric;
|
||
|
||
/// No description provided for @biometricLockEnabled.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Biometric lock enabled'**
|
||
String get biometricLockEnabled;
|
||
|
||
/// No description provided for @biometricLockDisabled.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Biometric lock disabled'**
|
||
String get biometricLockDisabled;
|
||
|
||
/// No description provided for @authenticationError.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Authentication error'**
|
||
String get authenticationError;
|
||
|
||
/// No description provided for @biometricAuthenticationRequired.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Biometric authentication required'**
|
||
String get biometricAuthenticationRequired;
|
||
|
||
/// No description provided for @setupFingerprintFaceUnlock.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please set up your fingerprint or face unlock in device settings'**
|
||
String get setupFingerprintFaceUnlock;
|
||
|
||
/// No description provided for @touchSensor.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Touch sensor'**
|
||
String get touchSensor;
|
||
|
||
/// No description provided for @biometricNotRecognized.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Biometric not recognized, try again'**
|
||
String get biometricNotRecognized;
|
||
|
||
/// No description provided for @biometricRequired.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Biometric required'**
|
||
String get biometricRequired;
|
||
|
||
/// No description provided for @biometricAuthenticationSucceeded.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Biometric authentication succeeded'**
|
||
String get biometricAuthenticationSucceeded;
|
||
|
||
/// No description provided for @deviceCredentialsRequired.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Device credentials required'**
|
||
String get deviceCredentialsRequired;
|
||
|
||
/// No description provided for @setupDeviceCredentials.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please set up device credentials in settings'**
|
||
String get setupDeviceCredentials;
|
||
|
||
/// No description provided for @setupTouchIdFaceId.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please set up your Touch ID or Face ID in device settings'**
|
||
String get setupTouchIdFaceId;
|
||
|
||
/// No description provided for @reenableTouchIdFaceId.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please reenable your Touch ID or Face ID'**
|
||
String get reenableTouchIdFaceId;
|
||
|
||
/// No description provided for @biometricLock.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Biometric Lock'**
|
||
String get biometricLock;
|
||
|
||
/// No description provided for @biometricLockDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Secure app with {authMethod}'**
|
||
String biometricLockDescription(String authMethod);
|
||
|
||
/// No description provided for @authenticateToEnable.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Authenticate to enable biometric lock'**
|
||
String get authenticateToEnable;
|
||
|
||
/// No description provided for @authenticateToAccess.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please authenticate to access Habo'**
|
||
String get authenticateToAccess;
|
||
|
||
/// No description provided for @authenticationRequired.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Authentication Required'**
|
||
String get authenticationRequired;
|
||
|
||
/// No description provided for @authenticationFailedMessage.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please authenticate to access Habo using {authMethod}'**
|
||
String authenticationFailedMessage(String authMethod);
|
||
|
||
/// No description provided for @tryAgain.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Try Again'**
|
||
String get tryAgain;
|
||
|
||
/// No description provided for @authenticating.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Authenticating…'**
|
||
String get authenticating;
|
||
|
||
/// No description provided for @authenticate.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Authenticate'**
|
||
String get authenticate;
|
||
|
||
/// No description provided for @buildingBetterHabits.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Building Better Habits'**
|
||
String get buildingBetterHabits;
|
||
|
||
/// No description provided for @authenticationPrompt.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please authenticate using {authMethod} to access your habits'**
|
||
String authenticationPrompt(String authMethod);
|
||
|
||
/// No description provided for @devicePinPatternPassword.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Device PIN, Pattern, or Password'**
|
||
String get devicePinPatternPassword;
|
||
|
||
/// No description provided for @fingerprint.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Fingerprint'**
|
||
String get fingerprint;
|
||
|
||
/// No description provided for @iris.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Iris'**
|
||
String get iris;
|
||
|
||
/// No description provided for @whatsNewTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'What\'s New'**
|
||
String get whatsNewTitle;
|
||
|
||
/// No description provided for @whatsNewVersion.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Version {version}'**
|
||
String whatsNewVersion(String version);
|
||
|
||
/// No description provided for @featureNumericTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Numeric values in habits'**
|
||
String get featureNumericTitle;
|
||
|
||
/// No description provided for @featureNumericDesc.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Track counts like glasses of water or pages read'**
|
||
String get featureNumericDesc;
|
||
|
||
/// No description provided for @featureDeepLinksTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'URL scheme (deep links)'**
|
||
String get featureDeepLinksTitle;
|
||
|
||
/// No description provided for @featureDeepLinksDesc.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Open Habo directly to screens like settings or create'**
|
||
String get featureDeepLinksDesc;
|
||
|
||
/// No description provided for @featureCategoriesTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Categories'**
|
||
String get featureCategoriesTitle;
|
||
|
||
/// No description provided for @featureCategoriesDesc.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Organize habits with category filters'**
|
||
String get featureCategoriesDesc;
|
||
|
||
/// No description provided for @featureArchiveTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Archive'**
|
||
String get featureArchiveTitle;
|
||
|
||
/// No description provided for @featureArchiveDesc.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Hide habits you no longer track without deleting'**
|
||
String get featureArchiveDesc;
|
||
|
||
/// No description provided for @featureMaterialYouTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Material You theme (Android)'**
|
||
String get featureMaterialYouTitle;
|
||
|
||
/// No description provided for @featureMaterialYouDesc.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Dynamic colors that match your wallpaper'**
|
||
String get featureMaterialYouDesc;
|
||
|
||
/// No description provided for @featureSoundTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'New sound engine'**
|
||
String get featureSoundTitle;
|
||
|
||
/// No description provided for @featureSoundDesc.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Adjustable volume'**
|
||
String get featureSoundDesc;
|
||
|
||
/// No description provided for @featureLockTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Lock feature'**
|
||
String get featureLockTitle;
|
||
|
||
/// No description provided for @featureLockDesc.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Secure the app with Face ID / Touch ID / biometrics'**
|
||
String get featureLockDesc;
|
||
|
||
/// No description provided for @featureIosSoundMixingTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Fixed sound mixing'**
|
||
String get featureIosSoundMixingTitle;
|
||
|
||
/// No description provided for @featureIosSoundMixingDesc.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habo sounds no longer interrupt your music or podcasts'**
|
||
String get featureIosSoundMixingDesc;
|
||
|
||
/// No description provided for @featureHomescreenWidgetTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Homescreen widget'**
|
||
String get featureHomescreenWidgetTitle;
|
||
|
||
/// No description provided for @featureHomescreenWidgetDesc.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'View your habit progress at a glance from your home screen (experimental)'**
|
||
String get featureHomescreenWidgetDesc;
|
||
|
||
/// No description provided for @featureLongpressCheckTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Longpress check'**
|
||
String get featureLongpressCheckTitle;
|
||
|
||
/// No description provided for @featureLongpressCheckDesc.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Longpress on habit buttons to quickly change status'**
|
||
String get featureLongpressCheckDesc;
|
||
|
||
/// No description provided for @haboSyncComingSoon.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Coming Soon'**
|
||
String get haboSyncComingSoon;
|
||
|
||
/// No description provided for @haboSyncDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Sync your habits across all your devices with Habo\'s end-to-end encrypted cloud service.'**
|
||
String get haboSyncDescription;
|
||
|
||
/// No description provided for @haboSyncLearnMore.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Learn more at habo.space/sync'**
|
||
String get haboSyncLearnMore;
|
||
|
||
/// No description provided for @habitsToday.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habits today'**
|
||
String get habitsToday;
|
||
|
||
/// No description provided for @or.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'or'**
|
||
String get or;
|
||
|
||
/// No description provided for @oneTapCheck.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Single tap to check'**
|
||
String get oneTapCheck;
|
||
|
||
/// No description provided for @tapCheckLongPressMenu.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Tap to check, long press for menu'**
|
||
String get tapCheckLongPressMenu;
|
||
|
||
/// No description provided for @categoryName.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Category name'**
|
||
String get categoryName;
|
||
|
||
/// No description provided for @createCategory.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Create category'**
|
||
String get createCategory;
|
||
|
||
/// No description provided for @all.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'All'**
|
||
String get all;
|
||
|
||
/// No description provided for @selectIcon.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Pick an icon'**
|
||
String get selectIcon;
|
||
|
||
/// No description provided for @searchIcons.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Search'**
|
||
String get searchIcons;
|
||
|
||
/// No description provided for @habitArchivedSuccess.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habit archived'**
|
||
String get habitArchivedSuccess;
|
||
|
||
/// No description provided for @habitUnarchivedSuccess.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Habit unarchived'**
|
||
String get habitUnarchivedSuccess;
|
||
}
|
||
|
||
class _AppLocalizationsDelegate
|
||
extends LocalizationsDelegate<AppLocalizations> {
|
||
const _AppLocalizationsDelegate();
|
||
|
||
@override
|
||
Future<AppLocalizations> load(Locale locale) {
|
||
return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
|
||
}
|
||
|
||
@override
|
||
bool isSupported(Locale locale) =>
|
||
<String>['en'].contains(locale.languageCode);
|
||
|
||
@override
|
||
bool shouldReload(_AppLocalizationsDelegate old) => false;
|
||
}
|
||
|
||
AppLocalizations lookupAppLocalizations(Locale locale) {
|
||
// Lookup logic when only language code is specified.
|
||
switch (locale.languageCode) {
|
||
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.',
|
||
);
|
||
}
|