- Flutter/Dart (iOS + Android), Riverpod, go_router, i18n via ARB (deutsch) - Feature-Struktur: today, plants, locations, household (V2-Platzhalter), settings - Intervall-Modell: Aufgaben werden aus lastWatered/lastFertilized + Intervall berechnet - In-Memory-Demo-Daten, Firebase-Anbindung folgt im nächsten Block - Doku: Architektur, Firebase-Einrichtung, Forgejo-Git-Hosting Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
488 lines
14 KiB
Dart
488 lines
14 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';
|
||
|
||
// 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('de')];
|
||
|
||
/// No description provided for @appTitle.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Planty'**
|
||
String get appTitle;
|
||
|
||
/// No description provided for @menuToday.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Heute'**
|
||
String get menuToday;
|
||
|
||
/// No description provided for @menuPlants.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Meine Pflanzen'**
|
||
String get menuPlants;
|
||
|
||
/// No description provided for @menuLocations.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Stellplätze'**
|
||
String get menuLocations;
|
||
|
||
/// No description provided for @menuHousehold.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Haushalt'**
|
||
String get menuHousehold;
|
||
|
||
/// No description provided for @menuSettings.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Einstellungen'**
|
||
String get menuSettings;
|
||
|
||
/// No description provided for @todayTitle.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Heute'**
|
||
String get todayTitle;
|
||
|
||
/// No description provided for @todayAllDone.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Alles versorgt!'**
|
||
String get todayAllDone;
|
||
|
||
/// No description provided for @todayEmptyHint.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Heute stehen keine Aufgaben an.'**
|
||
String get todayEmptyHint;
|
||
|
||
/// No description provided for @todayNextTask.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Nächste Aufgabe: {date}'**
|
||
String todayNextTask(String date);
|
||
|
||
/// No description provided for @todayOpenTasks.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'{count, plural, one{1 offene Aufgabe} other{{count} offene Aufgaben}}'**
|
||
String todayOpenTasks(int count);
|
||
|
||
/// No description provided for @taskWaterTitle.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'{name} gießen'**
|
||
String taskWaterTitle(String name);
|
||
|
||
/// No description provided for @taskFertilizeTitle.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'{name} düngen'**
|
||
String taskFertilizeTitle(String name);
|
||
|
||
/// No description provided for @taskDueToday.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Heute fällig'**
|
||
String get taskDueToday;
|
||
|
||
/// No description provided for @taskOverdue.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'{days, plural, one{Seit gestern überfällig} other{Seit {days} Tagen überfällig}}'**
|
||
String taskOverdue(int days);
|
||
|
||
/// No description provided for @taskDone.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Erledigt'**
|
||
String get taskDone;
|
||
|
||
/// No description provided for @taskDoneConfirmation.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'{name} als erledigt markiert.'**
|
||
String taskDoneConfirmation(String name);
|
||
|
||
/// No description provided for @addPlant.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Pflanze hinzufügen'**
|
||
String get addPlant;
|
||
|
||
/// No description provided for @plantsTitle.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Meine Pflanzen'**
|
||
String get plantsTitle;
|
||
|
||
/// No description provided for @plantsEmpty.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Noch keine Pflanzen angelegt.'**
|
||
String get plantsEmpty;
|
||
|
||
/// No description provided for @plantsEmptyHint.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Lege deine erste Pflanze über den Button unten an.'**
|
||
String get plantsEmptyHint;
|
||
|
||
/// No description provided for @plantDetailTitle.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Pflanzenprofil'**
|
||
String get plantDetailTitle;
|
||
|
||
/// No description provided for @nicknameLabel.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Spitzname'**
|
||
String get nicknameLabel;
|
||
|
||
/// No description provided for @speciesLabel.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Pflanzenart'**
|
||
String get speciesLabel;
|
||
|
||
/// No description provided for @locationLabel.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Stellplatz'**
|
||
String get locationLabel;
|
||
|
||
/// No description provided for @locationNone.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Kein Stellplatz'**
|
||
String get locationNone;
|
||
|
||
/// No description provided for @wateringEvery.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Gießen: alle {days} Tage'**
|
||
String wateringEvery(int days);
|
||
|
||
/// No description provided for @fertilizingEvery.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Düngen: alle {days} Tage'**
|
||
String fertilizingEvery(int days);
|
||
|
||
/// No description provided for @wateringIntervalLabel.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Gieß-Intervall (Tage)'**
|
||
String get wateringIntervalLabel;
|
||
|
||
/// No description provided for @fertilizingIntervalLabel.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Dünge-Intervall (Tage)'**
|
||
String get fertilizingIntervalLabel;
|
||
|
||
/// No description provided for @lastWatered.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Zuletzt gegossen: {date}'**
|
||
String lastWatered(String date);
|
||
|
||
/// No description provided for @lastFertilized.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Zuletzt gedüngt: {date}'**
|
||
String lastFertilized(String date);
|
||
|
||
/// No description provided for @never.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'noch nie'**
|
||
String get never;
|
||
|
||
/// No description provided for @save.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Speichern'**
|
||
String get save;
|
||
|
||
/// No description provided for @cancel.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Abbrechen'**
|
||
String get cancel;
|
||
|
||
/// No description provided for @delete.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Löschen'**
|
||
String get delete;
|
||
|
||
/// No description provided for @deletePlantQuestion.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'{name} wirklich löschen?'**
|
||
String deletePlantQuestion(String name);
|
||
|
||
/// No description provided for @requiredField.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Bitte ausfüllen'**
|
||
String get requiredField;
|
||
|
||
/// No description provided for @invalidNumber.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Bitte eine Zahl größer 0 eingeben'**
|
||
String get invalidNumber;
|
||
|
||
/// No description provided for @locationsTitle.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Stellplätze'**
|
||
String get locationsTitle;
|
||
|
||
/// No description provided for @locationsEmpty.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Noch keine Stellplätze angelegt.'**
|
||
String get locationsEmpty;
|
||
|
||
/// No description provided for @addLocation.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Stellplatz hinzufügen'**
|
||
String get addLocation;
|
||
|
||
/// No description provided for @locationNameLabel.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Name des Stellplatzes'**
|
||
String get locationNameLabel;
|
||
|
||
/// No description provided for @locationPlantCount.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'{count, plural, =0{Keine Pflanzen} one{1 Pflanze} other{{count} Pflanzen}}'**
|
||
String locationPlantCount(int count);
|
||
|
||
/// No description provided for @householdTitle.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Haushalt'**
|
||
String get householdTitle;
|
||
|
||
/// No description provided for @householdPlaceholder.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Hier kannst du bald deinen Haushalt teilen, damit Familie oder Pflanzen-Sitter die Pflanzen mitversorgen können.'**
|
||
String get householdPlaceholder;
|
||
|
||
/// No description provided for @householdComingSoon.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Kommt in Version 2'**
|
||
String get householdComingSoon;
|
||
|
||
/// No description provided for @settingsTitle.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Einstellungen'**
|
||
String get settingsTitle;
|
||
|
||
/// No description provided for @settingsAppearance.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Erscheinungsbild'**
|
||
String get settingsAppearance;
|
||
|
||
/// 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 @settingsTextSize.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Schriftgröße'**
|
||
String get settingsTextSize;
|
||
|
||
/// No description provided for @textSizeNormal.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Normal'**
|
||
String get textSizeNormal;
|
||
|
||
/// No description provided for @textSizeLarge.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Groß'**
|
||
String get textSizeLarge;
|
||
|
||
/// No description provided for @textSizeXLarge.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Sehr groß'**
|
||
String get textSizeXLarge;
|
||
|
||
/// No description provided for @settingsHighContrast.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Hoher Kontrast'**
|
||
String get settingsHighContrast;
|
||
|
||
/// No description provided for @settingsReminderTime.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Erinnerungszeit'**
|
||
String get settingsReminderTime;
|
||
|
||
/// No description provided for @settingsReminderTimeHint.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Zu dieser Uhrzeit erinnert dich Planty an offene Aufgaben.'**
|
||
String get settingsReminderTimeHint;
|
||
|
||
/// No description provided for @demoDataBanner.
|
||
///
|
||
/// In de, this message translates to:
|
||
/// **'Demo-Daten – werden durch deine echten Pflanzen ersetzt'**
|
||
String get demoDataBanner;
|
||
}
|
||
|
||
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.',
|
||
);
|
||
}
|