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';

// 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')];

  /// No description provided for @appTitle.
  ///
  /// In de, this message translates to:
  /// **'HouseHoldKeaper'**
  String get appTitle;

  /// No description provided for @tabHome.
  ///
  /// In de, this message translates to:
  /// **'Übersicht'**
  String get tabHome;

  /// No description provided for @tabRooms.
  ///
  /// In de, this message translates to:
  /// **'Räume'**
  String get tabRooms;

  /// No description provided for @tabSettings.
  ///
  /// In de, this message translates to:
  /// **'Einstellungen'**
  String get tabSettings;

  /// No description provided for @homeEmptyTitle.
  ///
  /// In de, this message translates to:
  /// **'Noch nichts zu tun!'**
  String get homeEmptyTitle;

  /// No description provided for @homeEmptyMessage.
  ///
  /// In de, this message translates to:
  /// **'Lege zuerst einen Raum an, um Aufgaben zu planen.'**
  String get homeEmptyMessage;

  /// No description provided for @homeEmptyAction.
  ///
  /// In de, this message translates to:
  /// **'Raum erstellen'**
  String get homeEmptyAction;

  /// No description provided for @roomsEmptyTitle.
  ///
  /// In de, this message translates to:
  /// **'Hier ist noch alles leer!'**
  String get roomsEmptyTitle;

  /// No description provided for @roomsEmptyMessage.
  ///
  /// In de, this message translates to:
  /// **'Erstelle deinen ersten Raum, um loszulegen.'**
  String get roomsEmptyMessage;

  /// No description provided for @roomsEmptyAction.
  ///
  /// In de, this message translates to:
  /// **'Raum erstellen'**
  String get roomsEmptyAction;

  /// No description provided for @settingsSectionAppearance.
  ///
  /// In de, this message translates to:
  /// **'Darstellung'**
  String get settingsSectionAppearance;

  /// No description provided for @settingsThemeLabel.
  ///
  /// In de, this message translates to:
  /// **'Farbschema'**
  String get settingsThemeLabel;

  /// No description provided for @themeSystem.
  ///
  /// In de, this message translates to:
  /// **'System'**
  String get themeSystem;

  /// No description provided for @themeLight.
  ///
  /// In de, this message translates to:
  /// **'Hell'**
  String get themeLight;

  /// No description provided for @themeDark.
  ///
  /// In de, this message translates to:
  /// **'Dunkel'**
  String get themeDark;

  /// No description provided for @settingsSectionAbout.
  ///
  /// In de, this message translates to:
  /// **'Über'**
  String get settingsSectionAbout;

  /// No description provided for @aboutAppName.
  ///
  /// In de, this message translates to:
  /// **'HouseHoldKeaper'**
  String get aboutAppName;

  /// No description provided for @aboutTagline.
  ///
  /// In de, this message translates to:
  /// **'Dein Haushalt, entspannt organisiert.'**
  String get aboutTagline;

  /// No description provided for @aboutVersion.
  ///
  /// In de, this message translates to:
  /// **'Version {version}'**
  String aboutVersion(String version);

  /// No description provided for @roomFormCreateTitle.
  ///
  /// In de, this message translates to:
  /// **'Raum erstellen'**
  String get roomFormCreateTitle;

  /// No description provided for @roomFormEditTitle.
  ///
  /// In de, this message translates to:
  /// **'Raum bearbeiten'**
  String get roomFormEditTitle;

  /// No description provided for @roomFormNameLabel.
  ///
  /// In de, this message translates to:
  /// **'Raumname'**
  String get roomFormNameLabel;

  /// No description provided for @roomFormNameHint.
  ///
  /// In de, this message translates to:
  /// **'z.B. Küche, Badezimmer...'**
  String get roomFormNameHint;

  /// No description provided for @roomFormNameRequired.
  ///
  /// In de, this message translates to:
  /// **'Bitte einen Namen eingeben'**
  String get roomFormNameRequired;

  /// No description provided for @roomFormIconLabel.
  ///
  /// In de, this message translates to:
  /// **'Symbol wählen'**
  String get roomFormIconLabel;

  /// No description provided for @roomDeleteConfirmTitle.
  ///
  /// In de, this message translates to:
  /// **'Raum löschen?'**
  String get roomDeleteConfirmTitle;

  /// No description provided for @roomDeleteConfirmMessage.
  ///
  /// In de, this message translates to:
  /// **'Der Raum und alle zugehörigen Aufgaben werden unwiderruflich gelöscht.'**
  String get roomDeleteConfirmMessage;

  /// No description provided for @roomDeleteConfirmAction.
  ///
  /// In de, this message translates to:
  /// **'Löschen'**
  String get roomDeleteConfirmAction;

  /// No description provided for @roomCardDueCount.
  ///
  /// In de, this message translates to:
  /// **'{count} fällig'**
  String roomCardDueCount(int count);

  /// No description provided for @cancel.
  ///
  /// In de, this message translates to:
  /// **'Abbrechen'**
  String get cancel;

  /// No description provided for @taskFormCreateTitle.
  ///
  /// In de, this message translates to:
  /// **'Aufgabe erstellen'**
  String get taskFormCreateTitle;

  /// No description provided for @taskFormEditTitle.
  ///
  /// In de, this message translates to:
  /// **'Aufgabe bearbeiten'**
  String get taskFormEditTitle;

  /// No description provided for @taskFormNameLabel.
  ///
  /// In de, this message translates to:
  /// **'Aufgabenname'**
  String get taskFormNameLabel;

  /// No description provided for @taskFormNameHint.
  ///
  /// In de, this message translates to:
  /// **'z.B. Staubsaugen, Fenster putzen...'**
  String get taskFormNameHint;

  /// No description provided for @taskFormNameRequired.
  ///
  /// In de, this message translates to:
  /// **'Bitte einen Namen eingeben'**
  String get taskFormNameRequired;

  /// No description provided for @taskFormFrequencyLabel.
  ///
  /// In de, this message translates to:
  /// **'Wiederholung'**
  String get taskFormFrequencyLabel;

  /// No description provided for @taskFormFrequencyCustom.
  ///
  /// In de, this message translates to:
  /// **'Benutzerdefiniert'**
  String get taskFormFrequencyCustom;

  /// No description provided for @taskFormFrequencyEvery.
  ///
  /// In de, this message translates to:
  /// **'Alle'**
  String get taskFormFrequencyEvery;

  /// No description provided for @frequencyShortcutDaily.
  ///
  /// In de, this message translates to:
  /// **'Täglich'**
  String get frequencyShortcutDaily;

  /// No description provided for @frequencyShortcutWeekly.
  ///
  /// In de, this message translates to:
  /// **'Wöchentlich'**
  String get frequencyShortcutWeekly;

  /// No description provided for @frequencyShortcutBiweekly.
  ///
  /// In de, this message translates to:
  /// **'Alle 2 Wochen'**
  String get frequencyShortcutBiweekly;

  /// No description provided for @frequencyShortcutMonthly.
  ///
  /// In de, this message translates to:
  /// **'Monatlich'**
  String get frequencyShortcutMonthly;

  /// No description provided for @taskFormFrequencyUnitDays.
  ///
  /// In de, this message translates to:
  /// **'Tage'**
  String get taskFormFrequencyUnitDays;

  /// No description provided for @taskFormFrequencyUnitWeeks.
  ///
  /// In de, this message translates to:
  /// **'Wochen'**
  String get taskFormFrequencyUnitWeeks;

  /// No description provided for @taskFormFrequencyUnitMonths.
  ///
  /// In de, this message translates to:
  /// **'Monate'**
  String get taskFormFrequencyUnitMonths;

  /// No description provided for @taskFormEffortLabel.
  ///
  /// In de, this message translates to:
  /// **'Aufwand'**
  String get taskFormEffortLabel;

  /// No description provided for @taskFormDescriptionLabel.
  ///
  /// In de, this message translates to:
  /// **'Beschreibung (optional)'**
  String get taskFormDescriptionLabel;

  /// No description provided for @taskFormDueDateLabel.
  ///
  /// In de, this message translates to:
  /// **'Erstes Fälligkeitsdatum'**
  String get taskFormDueDateLabel;

  /// No description provided for @taskDeleteConfirmTitle.
  ///
  /// In de, this message translates to:
  /// **'Aufgabe löschen?'**
  String get taskDeleteConfirmTitle;

  /// No description provided for @taskDeleteConfirmMessage.
  ///
  /// In de, this message translates to:
  /// **'Die Aufgabe wird unwiderruflich gelöscht.'**
  String get taskDeleteConfirmMessage;

  /// No description provided for @taskDeleteConfirmAction.
  ///
  /// In de, this message translates to:
  /// **'Löschen'**
  String get taskDeleteConfirmAction;

  /// No description provided for @taskEmptyTitle.
  ///
  /// In de, this message translates to:
  /// **'Noch keine Aufgaben'**
  String get taskEmptyTitle;

  /// No description provided for @taskEmptyMessage.
  ///
  /// In de, this message translates to:
  /// **'Erstelle die erste Aufgabe für diesen Raum.'**
  String get taskEmptyMessage;

  /// No description provided for @taskEmptyAction.
  ///
  /// In de, this message translates to:
  /// **'Aufgabe erstellen'**
  String get taskEmptyAction;

  /// No description provided for @templatePickerTitle.
  ///
  /// In de, this message translates to:
  /// **'Aufgaben aus Vorlagen hinzufügen?'**
  String get templatePickerTitle;

  /// No description provided for @templatePickerSkip.
  ///
  /// In de, this message translates to:
  /// **'Überspringen'**
  String get templatePickerSkip;

  /// No description provided for @templatePickerAdd.
  ///
  /// In de, this message translates to:
  /// **'Hinzufügen'**
  String get templatePickerAdd;

  /// No description provided for @templatePickerSelected.
  ///
  /// In de, this message translates to:
  /// **'{count} ausgewählt'**
  String templatePickerSelected(int count);

  /// No description provided for @dailyPlanProgress.
  ///
  /// In de, this message translates to:
  /// **'{completed} von {total} erledigt'**
  String dailyPlanProgress(int completed, int total);

  /// No description provided for @dailyPlanSectionOverdue.
  ///
  /// In de, this message translates to:
  /// **'Überfällig'**
  String get dailyPlanSectionOverdue;

  /// No description provided for @dailyPlanSectionToday.
  ///
  /// In de, this message translates to:
  /// **'Heute'**
  String get dailyPlanSectionToday;

  /// No description provided for @dailyPlanSectionUpcoming.
  ///
  /// In de, this message translates to:
  /// **'Demnächst'**
  String get dailyPlanSectionUpcoming;

  /// No description provided for @dailyPlanUpcomingCount.
  ///
  /// In de, this message translates to:
  /// **'Demnächst ({count})'**
  String dailyPlanUpcomingCount(int count);

  /// No description provided for @dailyPlanAllClearTitle.
  ///
  /// In de, this message translates to:
  /// **'Alles erledigt! 🌟'**
  String get dailyPlanAllClearTitle;

  /// No description provided for @dailyPlanAllClearMessage.
  ///
  /// In de, this message translates to:
  /// **'Keine Aufgaben für heute. Genieße den Moment!'**
  String get dailyPlanAllClearMessage;

  /// No description provided for @dailyPlanNoOverdue.
  ///
  /// In de, this message translates to:
  /// **'Keine überfälligen Aufgaben'**
  String get dailyPlanNoOverdue;

  /// No description provided for @dailyPlanNoTasks.
  ///
  /// In de, this message translates to:
  /// **'Noch keine Aufgaben angelegt'**
  String get dailyPlanNoTasks;

  /// No description provided for @settingsSectionNotifications.
  ///
  /// In de, this message translates to:
  /// **'Benachrichtigungen'**
  String get settingsSectionNotifications;

  /// No description provided for @notificationsEnabledLabel.
  ///
  /// In de, this message translates to:
  /// **'Tägliche Erinnerung'**
  String get notificationsEnabledLabel;

  /// No description provided for @notificationsTimeLabel.
  ///
  /// In de, this message translates to:
  /// **'Uhrzeit'**
  String get notificationsTimeLabel;

  /// No description provided for @notificationsPermissionDeniedHint.
  ///
  /// In de, this message translates to:
  /// **'Benachrichtigungen sind in den Systemeinstellungen deaktiviert. Tippe hier, um sie zu aktivieren.'**
  String get notificationsPermissionDeniedHint;

  /// No description provided for @notificationTitle.
  ///
  /// In de, this message translates to:
  /// **'Dein Tagesplan'**
  String get notificationTitle;

  /// No description provided for @notificationBody.
  ///
  /// In de, this message translates to:
  /// **'{count} Aufgaben fällig'**
  String notificationBody(int count);

  /// No description provided for @notificationBodyWithOverdue.
  ///
  /// In de, this message translates to:
  /// **'{count} Aufgaben fällig ({overdue} überfällig)'**
  String notificationBodyWithOverdue(int count, int overdue);

  /// No description provided for @calendarTodayButton.
  ///
  /// In de, this message translates to:
  /// **'Heute'**
  String get calendarTodayButton;

  /// No description provided for @taskHistoryTitle.
  ///
  /// In de, this message translates to:
  /// **'Verlauf'**
  String get taskHistoryTitle;

  /// No description provided for @taskHistoryEmpty.
  ///
  /// In de, this message translates to:
  /// **'Noch nie erledigt'**
  String get taskHistoryEmpty;

  /// No description provided for @taskHistoryCount.
  ///
  /// In de, this message translates to:
  /// **'{count} Mal erledigt'**
  String taskHistoryCount(int count);

  /// No description provided for @sortAlphabetical.
  ///
  /// In de, this message translates to:
  /// **'A–Z'**
  String get sortAlphabetical;

  /// No description provided for @sortInterval.
  ///
  /// In de, this message translates to:
  /// **'Intervall'**
  String get sortInterval;

  /// No description provided for @sortEffort.
  ///
  /// In de, this message translates to:
  /// **'Aufwand'**
  String get sortEffort;

  /// No description provided for @sortLabel.
  ///
  /// In de, this message translates to:
  /// **'Sortierung'**
  String get sortLabel;
}

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'].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 'de':
      return AppLocalizationsDe();
  }

  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.',
  );
}
