glanzlicht / MeinWeimar_APP

Official MeinWeimar App

Verified secure showcase
204 Files 2 MB Public size 14 Redacted Dart · PHP · XML · GITIGNORE · YAML · PLIST

Project overview

MeinWeimar_APP is a verified code showcase with 204 visible project entries across 2 top-level modules. The primary detected language is Dart; protected files remain visible in the structure while their contents stay private.

README

MeinWeimar — Flutter App & WordPress Plugin

> Working in Progress · Private portfolio repository · Active development

MeinWeimar is a location-based local platform for residents, students and visitors. This repository intentionally contains only two product parts:

  1. the Flutter consumer app;
  2. the meinweimar-core WordPress plugin that provides the editorial/admin
  3. layer and the REST contract consumed by the app.

The complete public website, WordPress core, databases, private infrastructure and unrelated platform modules are not part of this repository.

MeinWeimar consumer app preview

Why this project is interesting

MeinWeimar combines a mobile/web Flutter client with WordPress used as a structured content and administration backend. The goal is a maintainable product boundary: content, branding, navigation, categories, media and configuration are managed in WordPress and delivered through a versioned REST contract instead of being hardcoded in the Flutter UI.

The project demonstrates work across:

  • Flutter/Dart application architecture for iOS, Android and Web;
  • WordPress plugin architecture with custom post types, taxonomies, admin
  • settings and REST endpoints;

  • localized German/English UI and backend-controlled labels;
  • discovery/list/detail flows for places, services, events, classifieds, jobs
  • and real estate;

  • map, GPS, geocoding, marker and navigation contracts;
  • caching, ETag/config-version handling and offline-safe fallbacks;
  • role-aware account, claim, favorites, moderation and messaging boundaries;
  • automated Flutter tests, PHP/REST contract checks and release builds.

Repository structure

flutter-app/       Flutter consumer application
wordpress-plugin/  meinweimar-core WordPress plugin
screenshots/       Curated portfolio preview only

Current status

This is an active Working in Progress project. The core architecture and many end-to-end flows are implemented and continuously tested. Native device polish, production content, final legal/privacy review and further product modules are still being developed. The repository does not claim to be a finished production release.

Local development

Flutter app

cd flutter-app
flutter pub get
flutter analyze
flutter test
flutter run --dart-define=MW_API_BASE_URL=https://example.test/wp-json/meinweimar/v1

The API base URL and other environment-specific values are supplied at build or run time. No credentials are stored in the repository.

WordPress plugin

Copy wordpress-plugin into a WordPress installation's wp-content/plugins/meinweimar-core directory and activate it in the admin area. The plugin owns the MeinWeimar content types, editorial settings, permissions, REST responses, media/configuration contracts and frontend integration points.

Privacy and repository boundary

This repository is private and is prepared for controlled technical review. Secrets, production database exports, user data, WordPress uploads, private keys and infrastructure configuration must remain outside version control. The public-facing portfolio page uses a separate, redacted presentation layer and does not expose the private repository directly.

For technical reviewers

The most relevant entry points are:

  • flutter-app/lib/core — shared configuration, networking, localization,
  • theme and location contracts;

  • flutter-app/lib/features — consumer-facing product surfaces;
  • flutter-app/lib/repositories — API boundary and data access;
  • wordpress-plugin/includes — plugin services, REST, admin and contracts;
  • wordpress-plugin/assets — admin/frontend integration assets.

MeinWeimar is deliberately presented as an evolving product rather than a finished demo: the repository shows the architectural decisions, the working implementation and the remaining engineering work transparently.

flutter-app/lib/l10n/app_localizations_de.dartDart
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for German (`de`).
class AppLocalizationsDe extends AppLocalizations {
AppLocalizationsDe([String locale = 'de']) : super(locale);
@override
String get appTitle => 'MeinWeimar';
@override
String get brandFallback => 'MeinWeimar';
@override
String get navStart => 'Start';
@override
String get navPlaces => 'Orte';
@override
String get navMap => 'Karte';
@override
String get navEvents => 'Events';
@override
String get navCommunity => 'Community';
@override
String get navSaved => 'Gespeichert';
@override
String get navMore => 'Mehr';
@override
String get onboardingTitle => 'Entdecke Weimar auf deine Art';
@override
String get onboardingBody =>
'Wähle deine Sprache. Deinen Standort kannst du später freiwillig für lokale Entdeckungen freigeben.';
@override
String get onboardingOfflineBody =>
'Die Sprachauswahl funktioniert auch offline. Inhalte werden geladen, sobald eine Verbindung verfügbar ist.';
@override
String get languageLabel => 'Sprache';
@override
String get languageGerman => 'Deutsch';
@override
String get languageEnglish => 'English';
@override
String get continueLabel => 'Weiter';
@override
String get loadingLabel => 'Wird geladen';
@override
String get loadMore => 'Mehr laden';
@override
String get loadingMore => 'Weitere Inhalte werden geladen …';
@override
String get searchHint => 'Orte, Events und Empfehlungen suchen';
@override
String get searchSubmit => 'Suchen';
@override
String get useLocation => 'Meinen Standort verwenden';
@override
String get locationActive => 'Standort aktiv';
@override
String get addressSearchTitle => 'Rund um eine Adresse entdecken';
@override
String get addressSearchHint => 'Adresse oder Ort eingeben';
@override
String get addressSearchSubmit => 'Adresse suchen';
@override
String addressSearchSelected(String label) {
return 'Ausgewählter Standort: $label';
}
@override
String get addressSearchNotConfigured =>
'Die Adresssuche wird zentral über WordPress konfiguriert.';
@override
String get addressSearchNoResults => 'Kein passender Standort gefunden.';
@override
String get locationDenied => 'Standort nicht freigegeben';
@override
String get locationUnavailable => 'Standort ist gerade nicht verfügbar';
@override
String get locationFallback => 'Du kannst auch ohne GPS suchen.';
@override
String get mapView => 'Karte';
@override
String get filterAll => 'Alle';
@override
String get filterMinimum => 'Von';
@override
String get filterMaximum => 'Bis';
@override
String get categoryFilterLabel => 'Kategorie';
@override
String get categoryFallback => 'Weitere Kategorie';
@override
String get placeCategoryGastronomy => 'Gastronomie';
@override
String get placeCategoryLeisure => 'Freizeit';
@override
String get placeCategoryCulture => 'Kultur';
@override
String get placeCategoryPlaygrounds => 'Spielplätze';
@override
String get placeCategoryShopping => 'Shopping';
@override
String get placeCategoryServices => 'Dienstleistungen';
@override
String get placeCategoryHealth => 'Gesundheit';
@override
String get placeCategoryOther => 'Sonstiges';
@override
String get eventCategoryConcerts => 'Konzerte';
@override
String get eventCategoryCulture => 'Theater & Kultur';
@override
String get eventCategoryLeisure => 'Freizeit';
@override
String get eventCategoryComedy => 'Comedy';
@override
String get eventCategoryShows => 'Shows';
@override
String get eventCategorySport => 'Sport';
@override
String get eventCategoryMarkets => 'Märkte & Feste';
@override
String get eventCategoryWorkshops => 'Workshops';
@override
String get eventDateAll => 'Alle Termine';
@override
String get eventDateToday => 'Heute';
@override
String get eventDateWeekend => 'Dieses Wochenende';
@override
String get eventDateNext7Days => 'Nächste 7 Tage';
@override
String get eventFilterApply => 'Events anzeigen';
@override
String get servicesFilterApply => 'Services anzeigen';
@override
String get classifiedsFilterApply => 'Kleinanzeigen anzeigen';
@override
String get realEstateFilterApply => 'Immobilien anzeigen';
@override
String get categoryApartment => 'Wohnung';
@override
String get categoryHouse => 'Haus';
@override
String get categoryTemporaryLiving => 'Wohnen auf Zeit';
@override
String get categoryWgRoom => 'WG-Zimmer';
@override
String get categoryLand => 'Grundstück';
@override
String get categoryGarageParking => 'Garage / Stellplatz';
@override
String get categoryCommercial => 'Gewerbe';
@override
String get categoryOfficePractice => 'Büro / Praxis';
@override
String get categoryRetailHospitality => 'Laden / Gastronomie';
@override
String get categoryWarehouse => 'Lager / Halle';
@override
String get categoryElectronics => 'Elektronik';
@override
String get categoryFurnitureHome => 'Möbel / Wohnen';
@override
String get categoryClothing => 'Kleidung';
@override
String get categoryBikesSports => 'Fahrrad / Sport';
@override
String get categoryTickets => 'Tickets';
@override
String get categoryBooksMedia => 'Bücher / Medien';
@override
String get categoryServices => 'Dienstleistungen';
@override
String get categoryItTech => 'IT / Technik';
@override
String get categoryHealthcare => 'Gesundheit / Pflege';
@override
String get categoryEducation => 'Bildung / Erziehung';
@override
String get categoryOfficeAdmin => 'Büro / Verwaltung';
@override
String get categoryRetailJobs => 'Handel / Gastronomie';
@override
String get categoryCraftTrade => 'Handwerk / Bau';
@override
String get categoryPublicSocial => 'Öffentlicher Dienst / Soziales';
@override
String get categoryCultureCreative => 'Kultur / Kreativ';
@override
String get categoryTransportLogistics => 'Transport / Logistik';
@override
String get categoryApprenticeshipInternship => 'Ausbildung / Praktikum';
@override
String get mapCurrentLocation => 'Mein Standort';
@override
String get listView => 'Liste';
@override
String radiusLabel(Object radius) {
return 'Radius: $radius';
}
@override
String get radiusLabelUnit => 'km';
@override
String get radiusMetersUnit => 'm';
@override
String get radiusKilometersUnit => 'km';
@override
String get placesTitle => 'Orte entdecken';
@override
String get eventsTitle => 'Events entdecken';
@override
String get discoveryTitle => 'Entdecken';
@override
String get discoveryIntroBody =>
'Finde Orte, Events und Empfehlungen rund um Weimar.';
@override
String resultsCount(int count) {
return '$count Ergebnisse';
}
@override
String resultsCountSingular(int count) {
return '$count Ergebnis';
}
@override
String resultsSummary(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Ergebnisse',
one: '$count Ergebnis',
zero: 'Keine Ergebnisse',
);
return '$_temp0';
}
@override
String get noResultsTitle => 'Nichts gefunden';
@override
String get noResultsBody =>
'Versuche einen anderen Suchbegriff oder erweitere den Radius.';
@override
String get editorialNoResultsBody =>
'Versuche einen anderen Suchbegriff oder wähle eine Kategorie.';
@override
String get errorTitle => 'Das hat nicht geklappt';
@override
String get errorBody => 'Die Inhalte konnten nicht geladen werden.';
@override
String get errorNetworkUnavailable => 'Keine Verbindung zur MeinWeimar-API.';
@override
String get errorTimeout => 'Die Anfrage hat zu lange gedauert.';
@override
String get errorNotFound => 'Dieser Eintrag ist nicht mehr verfügbar.';
@override
String get errorPermissionDenied =>
'Du hast keine Berechtigung für diesen Inhalt.';
@override
String get errorInvalidResponse =>
'Die API hat eine ungültige Antwort geliefert.';
@override
String get errorServiceUnavailable =>
'Dieser Dienst ist momentan nicht verfügbar.';
@override
String get errorConflict =>
'Diese Aktion steht im Konflikt mit einem aktuellen Stand.';
@override
String get errorRateLimited =>
'Zu viele Versuche. Bitte später erneut versuchen.';
@override
String get errorValidation =>
'Die Eingaben oder Datei konnten nicht akzeptiert werden.';
@override
String get retry => 'Erneut versuchen';
@override
String get offlineTitle => 'Du bist offline';
@override
String get offlineBody =>
'Bereits geladene Inhalte bleiben verfügbar. Versuche es später erneut.';
@override
String get emptySavedTitle => 'Noch nichts gespeichert';
@override
String get emptySavedBody =>
'Speichere Orte und Events, um sie hier wiederzufinden.';
@override
String get savedIntroBody =>
'Deine gespeicherten Orte und Events bleiben hier griffbereit.';
@override
String get authRequiredTitle => 'Anmeldung erforderlich';
@override
String get authRequiredBody =>
'Melde dich an, um deine gespeicherten Inhalte zu sehen.';
@override
String get communityTitle => 'Community Live';
@override
String get communityBody =>
'Entdecke Menschen und Treffpunkte in deiner Umgebung freiwillig und mit klaren Privatsphäre-Einstellungen.';
@override
String get communitySafety =>
'Community Live bleibt jederzeit deaktivierbar. Keine Hintergrundortung.';
@override
String get communityPlanned => 'In Vorbereitung';
@override
String get communityAvailabilityBody =>
'Live-Karte und Nachrichten werden erst nach der Freigabe des Sicherheits- und Datenschutzkonzepts aktiviert.';
@override
String get moreTitle => 'Mehr';
@override
String get availableModulesTitle => 'Weitere Bereiche';
@override
String get availableModulesBody =>
'Alle von MeinWeimar freigegebenen Bereiche entdecken.';
@override
String get moduleServices => 'Services und Einrichtungen';
@override
String get moduleClassifieds => 'Kleinanzeigen';
@override
String get moduleJobs => 'Jobs';
@override
String get moduleRealEstate => 'Immobilien';
@override
String get moduleNews => 'News';
@override
String get moduleGuides => 'Ratgeber';
@override
String get settingsTitle => 'Einstellungen';
@override
String get settingsAvailabilityBody =>
'Weitere Einstellungen werden mit dem verbindlichen Account- und Datenschutzvertrag ergänzt.';
@override
String get privacyTitle => 'Datenschutz';
@override
String get privacyAvailabilityBody =>
'Datenschutzoptionen werden zentral über den freigegebenen Account- und Standortvertrag angebunden.';
@override
String get profileTitle => 'Mein Profil';
@override
String get profileSignedIn => 'Angemeldet';
@override
String get profileStatusLabel => 'Status';
@override
String get profileUnavailable => 'Das Profil ist nicht verfügbar.';
@override
String get profileEdit => 'Profil bearbeiten';
@override
String get profileNickname => 'Anzeigename';
@override
String get profileAge => 'Alter';
@override
String get profileGender => 'Geschlecht';
@override
String get profileVisibility => 'Profil-Sichtbarkeit';
@override
String get profileAvatarVisibility => 'Profilbild-Sichtbarkeit';
@override
String get profilePublic => 'Öffentlich';
@override
String get profilePrivate => 'Privat';
@override
String get profileBio => 'Über mich';
@override
String get profileSave => 'Profil speichern';
@override
String get profileSaving => 'Profil wird gespeichert …';
@override
String get profileSaved => 'Profil gespeichert.';
@override
String get profileSaveError => 'Das Profil konnte nicht gespeichert werden.';
@override
String get profileSystemDefault => 'Systemstandard';
@override
String get claimTitle => 'Business-Claims';
@override
String get claimDescription =>
'Prüfe deine Anfragen zur Inhaberschaft lokaler Orte.';
@override
String get claimEmptyTitle => 'Noch keine Claims';
@override
String get claimEmptyBody =>
'Hier erscheinen deine eingereichten Claim-Anfragen.';
@override
String get claimPending => 'In Prüfung';
@override
String get claimApproved => 'Freigegeben';
@override
String get claimRejected => 'Abgelehnt';
@override
String get claimDecisionNote => 'Hinweis zur Entscheidung';
@override
String get claimObject => 'Objekt';
@override
String claimSummary(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Anfragen',
one: '1 Anfrage',
zero: 'Keine Anfragen',
);
return '$_temp0';
}
@override
String get claimSubmittedOn => 'Eingereicht am';
@override
String get claimApplicantNote => 'Deine Notiz';
@override
String get apiContractTitle => 'Datenquelle';
@override
String get apiContractBody =>
'Inhalte, Marke und Navigation kommen aus der MeinWeimar-API. UI-Texte bleiben lokalisiert.';
@override
String get detailBack => 'Zurück';
@override
String get detailAddress => 'Adresse';
@override
String get detailContact => 'Kontakt';
@override
String get detailOpeningHours => 'Öffnungszeiten';
@override
String get detailClosed => 'Geschlossen';
@override
String get detailSpecialOffers => 'Sonderangebote und Hinweise';
@override
String get detailNeighbourhood => 'Umgebung';
@override
String get detailRating => 'Bewertung';
@override
String get detailOffer => 'Angebot';
@override
String get detailOfferType => 'Angebotsart';
@override
String get detailProvider => 'Anbieter';
@override
String get detailPriceType => 'Preisangabe';
@override
String get detailAvailability => 'Verfügbar ab';
@override
String get detailTransactionType => 'Vermarktungsart';
@override
String get detailArea => 'Fläche';
@override
String get detailBathrooms => 'Bäder';
@override
String get detailCondition => 'Zustand';
@override
String get detailDelivery => 'Übergabe / Versand';
@override
String get detailEmploymentType => 'Beschäftigungsart';
@override
String get detailWorkMode => 'Arbeitsmodell';
@override
String get detailSalary => 'Vergütung';
@override
String get detailApplication => 'Bewerbung';
@override
String get listingValueOffer => 'Angebot';
@override
String get listingValueSearch => 'Gesuch';
@override
String get listingValueEmployment => 'Stelle / Beschäftigung';
@override
String get listingValueRent => 'Miete';
@override
String get listingValueSale => 'Kaufen';
@override
String get listingValuePrivate => 'Privat';
@override
String get listingValueBusiness => 'Unternehmen';
@override
String get listingValueOrganization => 'Organisation';
@override
String get listingValueBroker => 'Makler / Broker';
@override
String get listingValueEmployer => 'Arbeitgeber';
@override
String get listingValueFixed => 'Festpreis';
@override
String get listingValueNegotiable => 'Verhandelbar';
@override
String get listingValueFree => 'Zu verschenken';
@override
String get listingValueOnRequest => 'Auf Anfrage';
@override
String get listingValueRange => 'Preisspanne';
@override
String get listingValueOnce => 'Einmalig';
@override
String get listingValueHour => 'Pro Stunde';
@override
String get listingValueMonth => 'Pro Monat';
@override
String get listingValueYear => 'Pro Jahr';
@override
String get listingValueCommissionFree => 'Provisionsfrei';
@override
String get listingValueCommissionPaid => 'Provisionspflichtig';
@override
String get listingValuePercentage => 'Prozentsatz';
@override
String get listingValueMonthlyRent => 'Monatliche Kaltmieten';
@override
String get listingValueIncluded => 'Enthalten';
@override
String get listingValueExcluded => 'Nicht enthalten';
@override
String get listingValueBuyer => 'Käufer';
@override
String get listingValueSeller => 'Verkäufer';
@override
String get listingValueBothParties => 'Beide Parteien';
@override
String get listingValueTenant => 'Mieter';
@override
String get listingValueLandlord => 'Vermieter';
@override
String get listingValueNew => 'Neu';
@override
String get listingValueUsed => 'Gebraucht';
@override
String get listingValueDefective => 'Defekt';
@override
String get listingValueUnknown => 'Nicht angegeben';
@override
String get listingValuePickup => 'Abholung';
@override
String get listingValueShipping => 'Versand';
@override
String get listingValueBoth => 'Abholung oder Versand';
@override
String get listingValueDigital => 'Digital';
@override
String get listingValueNone => 'Keine Angabe';
@override
String get listingValueFullTime => 'Vollzeit';
@override
String get listingValuePartTime => 'Teilzeit';
@override
String get listingValueMinijob => 'Minijob';
@override
String get listingValueWorkingStudent => 'Werkstudent';
@override
String get listingValueTemporary => 'Befristet';
@override
String get listingValueFreelance => 'Freiberuflich';
@override
String get listingValueApprenticeship => 'Ausbildung';
@override
String get listingValueInternship => 'Praktikum';
@override
String get listingValueTrainee => 'Trainee';
@override
String get listingValueSeasonal => 'Saisonarbeit';
@override
String get listingValueVolunteer => 'Ehrenamt';
@override
String get listingValueOnsite => 'Vor Ort';
@override
String get listingValueHybrid => 'Hybrid';
@override
String get listingValueRemote => 'Fernarbeit';
@override
String get listingValueCash => 'Barzahlung';
@override
String get listingValueBankTransfer => 'Überweisung';
@override
String get listingValueSecurePayment => 'Sichere Zahlung';
@override
String get listingValueOther => 'Andere';
@override
String get listingValueFirstOccupancy => 'Erstbezug';
@override
String get listingValueRenovated => 'Renoviert';
@override
String get listingValueWellKept => 'Gepflegt';
@override
String get listingValueNeedsRenovation => 'Renovierungsbedürftig';
@override
String get listingValueDemand => 'Bedarfsausweis';
@override
String get listingValueConsumption => 'Verbrauchsausweis';
@override
String get listingValueYes => 'Ja';
@override
String get listingValueNo => 'Nein';
@override
String get listingValueMoreThanSix => 'Mehr als 6';
@override
String get listingValueCustom => 'Eigene Anzahl';
@override
String get detailListingStatus => 'Status';
@override
String get detailPrice => 'Preis / Vergütung';
@override
String get detailOrganisation => 'Organisation';
@override
String get detailPropertyKind => 'Immobilienart';
@override
String get detailRooms => 'Zimmer';
@override
String get detailContactPreference => 'Kontaktpräferenz';
@override
String get detailExpires => 'Ablaufdatum';
@override
String get detailBrand => 'Marke';
@override
String get detailModel => 'Modell / Typ';
@override
String get detailColor => 'Farbe';
@override
String get detailSize => 'Größe / Maße';
@override
String get detailMaterial => 'Material';
@override
String get detailItemAge => 'Alter / Kaufjahr';
@override
String get detailOriginalPrice => 'Ursprünglicher Preis';
@override
String get detailPaymentMode => 'Zahlungsart';
@override
String get detailReferenceCode => 'Referenznummer';
@override
String get detailDepartment => 'Abteilung / Team';
@override
String get detailWorkHours => 'Arbeitszeit';
@override
String get detailStartDate => 'Arbeitsbeginn';
@override
String get detailApplicationDeadline => 'Bewerbungsfrist';
@override
String get detailRequirements => 'Anforderungen';
@override
String get detailResponsibilities => 'Aufgaben';
@override
String get detailBenefits => 'Vorteile';
@override
String get detailLanguages => 'Sprachen';
@override
String get detailEducation => 'Ausbildung / Abschluss';
@override
String get detailExperienceYears => 'Erfahrung';
@override
String get detailNoExperienceRequired => 'Keine Erfahrung erforderlich';
@override
String get detailApplicationEmail => 'Bewerbungs-E-Mail';
@override
String get detailApplicationMethod => 'Bewerbungsweg';
@override
String get jobsHeroTitle => 'Jobs in Weimar';
@override
String get jobsHeroBody =>
'Lokale Stellenangebote aus Weimar und der Region.';
@override
String get jobsSearchHint => 'Jobtitel, Unternehmen oder Stichwort';
@override
String get jobsTopJob => 'Top Job';
@override
String get jobsNew => 'Neu';
@override
String get jobsApplyNow => 'Jetzt bewerben';
@override
String get jobsAbout => 'Über uns';
@override
String get jobsTasks => 'Deine Aufgaben';
@override
String get jobsRequirements => 'Das bringst du mit';
@override
String get jobsDetailsTitle => 'Stelleninformationen';
@override
String get jobsScreenTitle => 'Job-Details';
@override
String get jobsSalaryHour => 'Brutto/Stunde';
@override
String get jobsSalaryMonth => 'Brutto/Monat';
@override
String get jobsSalaryYear => 'Brutto/Jahr';
@override
String get jobsSalaryOnce => 'Brutto';
@override
String get jobsFilterApply => 'Jobs anzeigen';
@override
String get jobsFilterReset => 'Zurücksetzen';
@override
String get jobsLocation => 'Standort';
@override
String get jobsWorkModel => 'Arbeitsmodell';
@override
String get jobsEmploymentType => 'Beschäftigungsart';
@override
String get jobsSalaryGross => 'Gehalt (brutto)';
@override
String get jobsSalaryInterval => 'Darstellung';
@override
String get jobsSalaryMonthly => 'Brutto monatlich';
@override
String get jobsSalaryYearly => 'Brutto jährlich';
@override
String get jobsSalaryConversionHint =>
'Monatliche und jährliche Werte werden automatisch umgerechnet.';
@override
String get jobsIndustry => 'Branche';
@override
String get jobsCompany => 'Unternehmen';
@override
String get jobsMoreFilters => 'Weitere Filter';
@override
String jobsLocationSummary(String radius) {
return 'Weimar + $radius';
}
@override
String get jobsAllIndustries => 'Alle Branchen';
@override
String get jobsAllCompanies => 'Alle Unternehmen';
@override
String get jobsTopOnly => 'Nur Top Jobs anzeigen';
@override
String get jobsRecentOnly => 'Nur neue Jobs (letzte 7 Tage)';
@override
String get jobsNewestFirst => 'Neueste zuerst';
@override
String jobsFound(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Jobs gefunden',
one: '1 Job gefunden',
zero: 'Keine Jobs gefunden',
);
return '$_temp0';
}
@override
String get detailBedrooms => 'Schlafzimmer';
@override
String get detailFloor => 'Etage';
@override
String get detailTotalFloors => 'Etagen insgesamt';
@override
String get detailYearBuilt => 'Baujahr';
@override
String get detailLastRenovated => 'Modernisiert';
@override
String get detailColdRent => 'Kaltmiete';
@override
String get detailWarmRent => 'Warmmiete';
@override
String get detailAdditionalCosts => 'Nebenkosten';
@override
String get detailHeatingCostsIncluded =>
'Heizkosten in Nebenkosten enthalten';
@override
String get detailDeposit => 'Kaution';
@override
String get detailHouseFee => 'Hausgeld';
@override
String get detailCommissionType => 'Provisionsart';
@override
String get detailCommissionAmount => 'Provision';
@override
String get detailCommissionApplicable => 'Provision fällig?';
@override
String get detailCommissionCalculation => 'Berechnungsart';
@override
String get detailCommissionTotal => 'Gesamtprovision';
@override
String get detailCommissionMonths => 'Anzahl Kaltmieten';
@override
String get detailCommissionBuyerShare => 'Anteil Käufer';
@override
String get detailCommissionSellerShare => 'Anteil Verkäufer';
@override
String get detailCommissionVat => 'Umsatzsteuer';
@override
String get detailCommissionPayer => 'Zahlungspflichtig';
@override
String get detailEnergyCertificate => 'Energieausweis';
@override
String get detailEnergyValue => 'Energiekennwert';
@override
String get detailEnergyClass => 'Effizienzklasse';
@override
String get detailHeatingType => 'Heizungsart';
@override
String get detailEnergySource => 'Energieträger';
@override
String get detailParkingSpaces => 'Stellplätze';
@override
String get detailParkingPrice => 'Stellplatzpreis';
@override
String get detailKitchen => 'Küche';
@override
String get detailBalcony => 'Balkon';
@override
String get detailTerrace => 'Terrasse';
@override
String get detailGarden => 'Garten';
@override
String get detailBasement => 'Keller';
@override
String get detailAttic => 'Dachboden';
@override
String get detailElevator => 'Aufzug';
@override
String get detailGuestToilet => 'Gäste-WC';
@override
String get detailAirConditioning => 'Klimaanlage';
@override
String get detailFloorHeating => 'Fußbodenheizung';
@override
String get detailFireplace => 'Kamin';
@override
String get detailFurnished => 'Möbliert';
@override
String get detailBarrierFree => 'Barrierefrei';
@override
String get detailPetsAllowed => 'Haustiere erlaubt';
@override
String get detailGarage => 'Garage';
@override
String get detailCarport => 'Carport';
@override
String get detailECharging => 'E-Ladepunkt';
@override
String get linkOpenFailed => 'Der Link konnte nicht geöffnet werden.';
@override
String get detailFeatured => 'Hervorgehoben';
@override
String get detailDescription => 'Beschreibung';
@override
String get save => 'Speichern';
@override
String get saved => 'Gespeichert';
@override
String get routeAction => 'Route öffnen';
@override
String get callAction => 'Anrufen';
@override
String get websiteAction => 'Website';
@override
String get shareAction => 'Teilen';
@override
String get placesFilterApply => 'Orte anzeigen';
@override
String get eventDate => 'Termin';
@override
String get detailEvent => 'Veranstaltung';
@override
String get eventTicketMode => 'Tickets / Anmeldung';
@override
String get eventTicketUrl => 'Tickets / Anmeldung öffnen';
@override
String get eventTicketPrice => 'Ticketpreis';
@override
String get eventOrganizer => 'Veranstalter';
@override
String get eventOrganizerUrl => 'Veranstalter-Website öffnen';
@override
String get eventVenue => 'Veranstaltungsort';
@override
String get eventOccurrences => 'Weitere Termine';
@override
String get eventTimezone => 'Zeitzone';
@override
String get eventCalendarSave => 'Kalenderdatei speichern';
@override
String get eventTicketFree => 'Kostenlos';
@override
String get eventTicketExternal => 'Externe Buchung';
@override
String get eventTicketInternal => 'Interne Buchung';
@override
String get eventTicketRegistration => 'Anmeldung erforderlich';
@override
String get contentUnavailable => 'Details sind gerade nicht verfügbar.';
@override
String get contentTypePlace => 'Ort';
@override
String get contentTypeEvent => 'Event';
@override
String get contentTypeService => 'Service oder Einrichtung';
@override
String get contentTypeClassified => 'Kleinanzeige';
@override
String get contentTypeJob => 'Job';
@override
String get contentTypeRealEstate => 'Immobilie';
@override
String get contentTypeOther => 'Eintrag';
@override
String distanceKm(String distance) {
return '$distance km entfernt';
}
@override
String get unknownValue => 'Nicht angegeben';
@override
String get locationPermissionTitle => 'Lokale Entdeckungen';
@override
String get locationPermissionBody =>
'Für eine optimale Funktion der MeinWeimar-App können wir deinen Standort verwenden, um Inhalte in deiner Nähe anzuzeigen. Deine Live-GPS-Position wird nicht als Profil- oder Inhaltsdaten gespeichert und nur für eine von dir gestartete Umkreissuche vorübergehend als Suchparameter verwendet.';
@override
String get locationStartupTitle => 'Standort für lokale Entdeckungen';
@override
String get locationStartupBody =>
'Damit MeinWeimar dir Orte, Events und Angebote in deiner Nähe zeigen kann, benötigen wir deine Koordinaten. Deine Live-GPS-Position wird nicht als Profil- oder Inhaltsdaten gespeichert und nur für eine von dir gestartete Umkreissuche vorübergehend als Suchparameter verwendet.';
@override
String get allowLocation => 'Standort erlauben';
@override
String get later => 'Später';
@override
String get permissionDenied => 'Berechtigung abgelehnt';
@override
String get permissionDeniedBody =>
'Du kannst weiterhin über Adresse, Region und Kategorien entdecken.';
@override
String systemErrorCode(String code) {
return 'Fehlercode: $code';
}
@override
String get refresh => 'Aktualisieren';
@override
String get openDetails => 'Details öffnen';
@override
String get back => 'Zurück';
@override
String get close => 'Schließen';
@override
String get selectLanguage => 'Sprache auswählen';
@override
String selectedLanguage(String language) {
return 'Ausgewählte Sprache: $language';
}
@override
String get mapProviderPending =>
'Kartenanbieter wird über einen austauschbaren Adapter angebunden.';
@override
String get mapProviderConfigured =>
'Kartenquelle ist zentral konfiguriert; der austauschbare Adapter kann sie verwenden.';
@override
String get mapSourceUnavailable =>
'Keine Kartenquelle konfiguriert. Die Karte bleibt ohne Kacheln nutzbar.';
@override
String get mapGoogleFallback =>
'Keine interne Kartenquelle aktiv. Du kannst Google Maps öffnen.';
@override
String get openGoogleMaps => 'Google Maps öffnen';
@override
String get mapTileLoadFailed =>
'Die Kartenkacheln konnten nicht geladen werden.';
@override
String get mapSearchCenter => 'Suchzentrum';
@override
String get mapZoomIn => 'Vergrößern';
@override
String get mapZoomOut => 'Verkleinern';
@override
String get mapStyleRoad => 'Straßenkarte';
@override
String get mapStyleLight => 'Helle Karte';
@override
String get mapStyleDark => 'Dunkle Karte';
@override
String get mapStyleSatellite => 'Satellit';
@override
String markerLabel(String title) {
return 'Marker für $title';
}
@override
String mapClusterLabel(int count) {
return '$count Orte auf der Karte';
}
@override
String get menuLabel => 'Menü';
@override
String get searchSemantics => 'Suche';
@override
String get filterLabel => 'Filter';
@override
String get clearLabel => 'Zurücksetzen';
@override
String get sortAuto => 'Automatisch';
@override
String get sortDistance => 'Entfernung';
@override
String get sortNewest => 'Neueste';
@override
String get sortTitle => 'Alphabetisch';
@override
String get eventEnd => 'Ende';
@override
String get eventStatus => 'Status';
@override
String get eventScheduled => 'Geplant';
@override
String get eventCancelled => 'Abgesagt';
@override
String get eventPostponed => 'Verschoben';
@override
String get eventStatusUnknown => 'Status nicht angegeben';
@override
String get mapNoPublicLocations =>
'Für diese Treffer sind keine öffentlichen Positionen verfügbar.';
@override
String get imageSuggestCta => 'Bild vorschlagen';
@override
String get imageSuggestTitle => 'Bild vorschlagen';
@override
String imageSuggestBody(String title) {
return 'Für „$title“ ein Bild zur Prüfung einreichen.';
}
@override
String imageSuggestTarget(String resource) {
return 'Ziel: $resource';
}
@override
String get imageSuggestUploadTitle => 'Bild auswählen';
@override
String get imageSuggestSelect => 'Bild auswählen';
@override
String get imageSuggestSelectAnother => 'Anderes Bild auswählen';
@override
String get imageSuggestNoFile => 'Noch kein Bild ausgewählt';
@override
String get imageSuggestPreviewFailed =>
'Vorschau konnte nicht geladen werden.';
@override
String get imageSuggestFileUnavailable =>
'Die Bilddatei konnte nicht gelesen werden.';
@override
String get imageSuggestLoginTitle => 'Anmeldung erforderlich';
@override
String get imageSuggestLoginBody =>
'Melde dich an, um ein Bild vorzuschlagen.';
@override
String get imageSuggestRightsTitle => 'Rechte und Bestätigung';
@override
String get imageSuggestRightsHolder =>
'Ich bin Urheber des Bildes oder besitze ausreichende Nutzungsrechte.';
@override
String get imageSuggestLawfulSource =>
'Das Bild wurde nicht unrechtmäßig aus dem Internet übernommen.';
@override
String get imageSuggestPersons =>
'Abgebildete Personen haben zugestimmt oder sind nicht identifizierbar.';
@override
String get imageSuggestPlatformLicense =>
'Ich räume MeinWeimar die erforderlichen Nutzungsrechte für Anzeige, Speicherung und Verarbeitung ein.';
@override
String get imageSuggestMetadataTitle => 'Optionale Angaben';
@override
String get imageSuggestOptional =>
'Quelle, Lizenz, Fotograf und Beschreibung sind optional.';
@override
String get imageSuggestSource => 'Quelle';
@override
String get imageSuggestLicense => 'Lizenz';
@override
String get imageSuggestPhotographer => 'Fotograf oder Urheber';
@override
String get imageSuggestDescription => 'Bildbeschreibung';
@override
String get imageSuggestSubmit => 'Zur Prüfung einreichen';
@override
String get imageSuggestSubmitting => 'Wird eingereicht …';
@override
String get imageSuggestStatusTitle => 'Bildvorschlag eingereicht';
@override
String get imageSuggestStatusSubmitted => 'Eingereicht';
@override
String get imageSuggestStatusInReview => 'In Prüfung';
@override
String get imageSuggestStatusAccepted => 'Akzeptiert';
@override
String get imageSuggestStatusRejected => 'Abgelehnt';
@override
String get imageSuggestStatusNeedsInfo => 'Rückfrage erforderlich';
@override
String get imageSuggestStatusPending => 'Status wird geprüft';
@override
String get imageSuggestTargetOther => 'Inhalt';
@override
String get imageSuggestUnavailableTitle => 'Bildvorschlag nicht verfügbar';
@override
String get imageSuggestUnavailableBody =>
'Bilder können derzeit nur für Orte und Services vorgeschlagen werden.';
@override
String get imageSuggestReason => 'Hinweis';
@override
String get imageSuggestReasonCopyright => 'Urheber- oder Nutzungsrechte';
@override
String get imageSuggestReasonPrivacy =>
'Datenschutz oder abgebildete Personen';
@override
String get imageSuggestReasonQuality => 'Bildqualität';
@override
String get imageSuggestReasonDuplicate => 'Duplikat';
@override
String get imageSuggestReasonMalware => 'Sicherheitsprüfung';
@override
String get imageSuggestReasonUnclearRights => 'Unklare Rechteherkunft';
@override
String get imageSuggestReasonWrongTarget => 'Falsches Zielobjekt';
@override
String get imageSuggestReasonOther => 'Sonstiger Grund';
@override
String get imageSuggestReasonUnknown => 'Weitere Angaben erforderlich';
@override
String get imageSuggestMyTitle => 'Meine Bildvorschläge';
@override
String get imageSuggestMyBody =>
'Verfolge hier den Prüfstatus deiner eingereichten Bilder.';
@override
String get imageSuggestMyEmpty => 'Du hast noch keine Bilder vorgeschlagen.';
@override
String get imageSuggestMyRetry => 'Bildvorschläge erneut laden';
@override
String imageSuggestMyItemStatus(String status) {
return 'Status: $status';
}
@override
String imageSuggestSubmittedAt(String date) {
return 'Eingereicht: $date';
}
@override
String get imageSuggestViewAll => 'Alle Bildvorschläge anzeigen';
@override
String get imageSuggestResponseTitle => 'Rückfrage beantworten';
@override
String get imageSuggestResponseBody =>
'Bitte ergänze die angeforderten Angaben. Deine Antwort wird erneut geprüft.';
@override
String get imageSuggestResponseLabel => 'Deine Antwort';
@override
String get imageSuggestResponseRequired => 'Bitte gib eine Antwort ein.';
@override
String get imageSuggestResponseSubmit => 'Antwort senden';
@override
String get imageSuggestResponseSubmitting => 'Antwort wird gesendet …';
@override
String get imageSuggestResponseSent =>
'Antwort gesendet. Der Bildvorschlag wird erneut geprüft.';
@override
String get imageSuggestResponseOpen => 'Rückfrage beantworten';
@override
String get notificationsTitle => 'Benachrichtigungen';
@override
String get notificationsEmptyTitle => 'Keine Benachrichtigungen';
@override
String get notificationsEmptyBody =>
'Hier erscheinen deine persönlichen Hinweise.';
@override
String get notificationsFilterAll => 'Alle';
@override
String get notificationsFilterUnread => 'Ungelesen';
@override
String notificationsUnreadCount(num count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count ungelesene Hinweise',
one: '1 ungelesener Hinweis',
zero: 'Keine ungelesenen Hinweise',
);
return '$_temp0';
}
@override
String get notificationGenericBody => 'Es gibt einen neuen Hinweis für dich.';
@override
String get notificationImageSuggestionTitle => 'Bildvorschlag aktualisiert';
@override
String notificationImageSuggestionBody(String status) {
return 'Der Bildvorschlag hat den Status: $status.';
}
@override
String get favoriteRemove => 'Aus gespeicherten entfernen';
@override
String get favoriteSaving => 'Speicherung wird aktualisiert …';
@override
String get favoriteSavedBody => 'In deinen gespeicherten Inhalten abgelegt.';
@override
String get favoriteRemovedBody =>
'Aus deinen gespeicherten Inhalten entfernt.';
@override
String get favoriteError =>
'Die Speicherung konnte nicht aktualisiert werden.';
@override
String get homeQuickAccessTitle => 'Schnellzugriff';
@override
String get homeEventsTitle => 'Aktuelle Events';
@override
String get homeNewsTitle => 'Neuigkeiten aus Weimar';
@override
String get homeNearbyTitle => 'In deiner Nähe';
@override
String get homeNearbyAction => 'Mehr Orte';
@override
String get homeNearbyBody =>
'Aktiviere deinen Standort oder suche eine Adresse, um Orte in deiner Nähe zu entdecken.';
@override
String get homeListingsTitle => 'Neueste Angebote';
@override
String get homeEmptyBody => 'Hier gibt es gerade noch keine Inhalte.';
@override
String get homeCommunityTitle => 'Mit Weimar verbunden';
@override
String get homeCommunityBody =>
'Tausche dich aus, entdecke lokale Tipps und bring dich in die Stadtgemeinschaft ein.';
@override
String get homeCommunityAction => 'Community öffnen';
}

Architecture

High-level modules detected from the verified public snapshot. Protected implementation details are intentionally omitted.

flutter-appmodule
wordpress-pluginmodule

Technology stack

DartPHPJavaScriptARBLOCKPBXPROJFlutter / Dart
Dart56.1%
PHP29.4%
JavaScript4.0%
ARB2.9%
LOCK1.7%
PBXPROJ1.7%
CSS1.5%
Markdown0.4%