screentinker/frontend/js/i18n/de.js
ScreenTinker fab4ae909a feat(api): token management endpoints + Settings UI
- routes/tokens.js: create (returns the full secret once), list (never the secret),
  revoke. Mounted JWT-only via api-surface.js so an API token can never mint, list or
  revoke tokens - no self-escalation.
- Settings "API Tokens" section: create form (name + read/write/full scope), one-time
  secret reveal with copy, token list, revoke; i18n across en/es/fr/de/pt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 18:45:09 -05:00

1127 lines
58 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// German translations. Reviewed for UI register (formal Sie is the de-facto
// standard for B2B software in DACH). Native review recommended before
// publicizing as fully supported.
export default {
// Nav
'nav.displays': 'Bildschirme',
'nav.content': 'Inhalt',
'nav.playlists': 'Playlists',
'nav.layouts': 'Layouts',
'nav.widgets': 'Widgets',
'nav.schedule': 'Zeitplan',
'nav.walls': 'Videowände',
'nav.reports': 'Berichte',
'nav.kiosk': 'Kiosk',
'nav.designer': 'Designer',
'nav.activity': 'Aktivität',
'nav.teams': 'Teams',
'nav.help': 'Hilfe',
'nav.settings': 'Einstellungen',
'nav.subscription': 'Abonnement',
'nav.admin': 'Admin',
// Common
'common.save': 'Speichern',
'common.cancel': 'Abbrechen',
'common.delete': 'Löschen',
'common.edit': 'Bearbeiten',
'common.done': 'Fertig',
'common.loading': 'Wird geladen...',
'common.connected': 'Verbunden',
'common.disconnected': 'Getrennt',
'common.never': 'Nie',
'common.just_now': 'Gerade eben',
'common.minutes_ago': 'vor {n}m',
'common.hours_ago': 'vor {n}h',
'common.days_ago': 'vor {n}t',
'common.unknown': 'Unbekannt',
// Auth
'auth.sign_in': 'Anmelden',
'auth.sign_out': 'Abmelden',
'auth.create_account': 'Konto erstellen',
'auth.create_admin_account': 'Administratorkonto erstellen',
'auth.email': 'E-Mail',
'auth.password': 'Passwort',
'auth.name': 'Name',
'auth.placeholder_email': 'sie@beispiel.com',
'auth.placeholder_password': '••••••••',
'auth.placeholder_name': 'Ihr Name',
'auth.placeholder_register_password': 'Mindestens 6 Zeichen',
'auth.subtitle_setup': 'Erstellen Sie Ihr Administratorkonto, um zu beginnen',
'auth.subtitle_signin': 'Melden Sie sich an, um Ihre Bildschirme zu verwalten',
'auth.trial_notice': 'Neue Konten erhalten einen kostenlosen 14-Tage-Pro-Test',
'auth.divider_or': 'ODER',
'auth.signin_google': 'Mit Google anmelden',
'auth.signin_microsoft': 'Mit Microsoft anmelden',
'auth.back_to_signin': 'Zurück zur Anmeldung',
'auth.support_access': 'Support-Zugang',
'auth.support_token_placeholder': 'Support-Token einfügen',
'auth.support_authenticate': 'Mit Support-Token authentifizieren',
'auth.terms': 'Nutzungsbedingungen',
'auth.privacy': 'Datenschutzerklärung',
'auth.error_email_password_required': 'E-Mail und Passwort sind erforderlich',
'auth.error_password_min_6': 'Das Passwort muss mindestens 6 Zeichen lang sein',
'auth.error_login_failed': 'Anmeldung fehlgeschlagen',
'auth.error_registration_failed': 'Registrierung fehlgeschlagen',
'auth.error_paste_support_token': 'Fügen Sie einen Support-Token ein',
'auth.error_support_failed': 'Support-Anmeldung fehlgeschlagen',
'auth.error_google_failed': 'Google-Anmeldung fehlgeschlagen',
'auth.error_microsoft_failed': 'Microsoft-Anmeldung fehlgeschlagen',
// Dashboard
'dashboard.title': 'Bildschirme',
'dashboard.subtitle': 'Verwalten Sie Ihre Remote-Bildschirme',
'dashboard.help_tip': 'Ihre gekoppelten Bildschirmgeräte. Grün = online, rot = offline. Klicken Sie auf ein Gerät, um seine Playlist zu verwalten, die Telemetrie anzuzeigen oder die Fernsteuerung zu nutzen.',
'dashboard.add': 'Bildschirm hinzufügen',
'dashboard.create_group': '+ Gruppe',
'dashboard.search': 'Bildschirme suchen...',
'dashboard.all_status': 'Alle Status',
'dashboard.online': 'Online',
'dashboard.offline': 'Offline',
'dashboard.awaiting_pairing': 'Wartet auf Kopplung',
'dashboard.no_preview': 'Keine Vorschau verfügbar',
'dashboard.total_displays': 'Bildschirme gesamt',
'dashboard.ungrouped': 'Nicht gruppiert',
'dashboard.no_displays': 'Noch keine Bildschirme',
'dashboard.no_displays_desc': 'Installieren Sie die ScreenTinker-App auf Ihrem TV und koppeln Sie ihn mit dem obigen Button.',
'dashboard.failed_to_load': 'Bildschirme konnten nicht geladen werden',
'dashboard.unknown_playlist': 'Unbekannte Playlist',
'dashboard.mixed_playlists': 'Gemischte Playlists',
'dashboard.playlist_label': 'Playlist: {name}',
'dashboard.devices_count_one': '{n} Gerät',
'dashboard.devices_count_other': '{n} Geräte',
'dashboard.online_count': '{n} online',
'dashboard.set_playlist_placeholder': 'Playlist setzen...',
'dashboard.send_command_placeholder': 'Befehl senden...',
'dashboard.manage': 'Verwalten',
'dashboard.manage_tooltip': 'Geräte hinzufügen/entfernen',
'dashboard.delete_group_tooltip': 'Gruppe löschen',
'dashboard.no_devices_in_group': 'Keine Geräte in dieser Gruppe. Klicken Sie auf Verwalten, um welche hinzuzufügen.',
'dashboard.manage_group_subtitle': 'Markieren Sie Geräte, um sie dieser Gruppe hinzuzufügen',
'dashboard.draft_suffix': '(Entwurf)',
'dashboard.cmd.screen_on': 'Bildschirm an',
'dashboard.cmd.screen_off': 'Bildschirm aus',
'dashboard.cmd.restart_app': 'App neu starten',
'dashboard.cmd.check_update': 'Update prüfen',
'dashboard.cmd.reboot': 'Neustart',
'dashboard.cmd.shutdown': 'Herunterfahren',
'dashboard.prompt_group_name': 'Gruppenname:',
'dashboard.error_pairing_code': 'Geben Sie einen gültigen 6-stelligen Kopplungscode ein',
'dashboard.confirm_add_to_group': '{name} ist bereits in: {groups}\n\nAuch zu „{target}“ hinzufügen?',
'dashboard.confirm_assign_playlist': 'Playlist „{playlist}“ allen Geräten in „{group}“ zuweisen?',
'dashboard.confirm_destructive_command': '{cmd} alle {n} Geräte in „{group}“?\n\nDies kann nicht rückgängig gemacht werden.',
'dashboard.confirm_delete_group': 'Diese Gruppe löschen? Geräte sind nicht betroffen.',
'dashboard.toast.display_paired': 'Bildschirm erfolgreich gekoppelt!',
'dashboard.toast.group_created': 'Gruppe erstellt',
'dashboard.toast.group_deleted': 'Gruppe gelöscht',
'dashboard.toast.already_in_group': '{name} ist bereits in {group}',
'dashboard.toast.moved_device': '{name} nach {group} verschoben',
'dashboard.toast.removed_device_one': '{name} aus 1 Gruppe entfernt',
'dashboard.toast.removed_device_other': '{name} aus {n} Gruppen entfernt',
'dashboard.toast.playlist_assigned_one': 'Playlist 1 Gerät zugewiesen',
'dashboard.toast.playlist_assigned_other': 'Playlist {n} Geräten zugewiesen',
'dashboard.toast.command_sent': '{cmd} an {sent}/{total} Geräte gesendet',
'dashboard.toast.command_sent_with_offline': '{cmd} an {sent}/{total} Geräte gesendet ({offline} offline)',
// Content library
'content.title': 'Inhaltsbibliothek',
'content.subtitle': 'Laden Sie Ihre Mediendateien hoch und verwalten Sie sie',
'content.help_tip': 'Laden Sie hier Videos und Bilder hoch. Wählen Sie mehrere Dateien für einen Sammel-Upload. Verwenden Sie Remote-URL für externe Quellen. Klicken Sie auf eine Miniaturansicht für die Vorschau.',
'content.drop': 'Dateien hier ablegen oder zum Hochladen klicken',
'content.upload_hint': 'Unterstützt MP4, WebM, AVI, MKV, JPEG, PNG, GIF, WebP',
'content.upload_progress': 'Wird hochgeladen...',
'content.upload_progress_named': '{name} wird hochgeladen...',
'content.upload_progress_named_pct': '{name} wird hochgeladen... {pct}%',
'content.remote_url': 'Remote-URL',
'content.remote_desc': 'Direkt von einer URL streamen. Spart lokale Bandbreite.',
'content.remote_url_placeholder': 'https://beispiel.com/video.mp4',
'content.remote_name_placeholder': 'Anzeigename (optional)',
'content.remote_add_btn': 'Remote-URL hinzufügen',
'content.youtube': 'YouTube',
'content.youtube_desc': 'Betten Sie ein YouTube-Video auf Ihren Bildschirmen ein.',
'content.youtube_url_placeholder': 'https://youtube.com/watch?v=...',
'content.youtube_name_placeholder': 'Anzeigename (optional)',
'content.youtube_add_btn': 'YouTube-Video hinzufügen',
'content.search_placeholder': 'Inhalt suchen...',
'content.new_folder_btn': '+ Neuer Ordner',
'content.breadcrumb_root': 'Alle Inhalte',
'content.rename_btn': 'Umbenennen',
'content.delete_folder_btn': 'Ordner löschen',
'content.prompt_folder_name': 'Ordnername:',
'content.prompt_rename_folder': 'Ordner umbenennen:',
'content.confirm_delete_folder': 'Diesen Ordner löschen? Inhalte werden in den Hauptordner verschoben. Unterordner werden ebenfalls gelöscht.',
'content.empty_folder_title': 'Dieser Ordner ist leer',
'content.empty_folder_desc': 'Inhalte hierher ziehen oder die Aktion Verschieben verwenden.',
'content.no_content': 'Noch keine Inhalte',
'content.no_content_desc': 'Laden Sie Videos und Bilder hoch, um zu beginnen.',
'content.failed_to_load': 'Inhalt konnte nicht geladen werden',
'content.type_youtube': 'YouTube',
'content.type_remote': 'Remote-URL',
'content.type_remote_short': 'Remote',
'content.type_video': 'Video',
'content.type_image': 'Bild',
'content.btn_edit': 'Bearbeiten',
'content.btn_delete': 'Löschen',
'content.btn_confirm_delete': 'Löschen bestätigen?',
'content.btn_deleting': 'Wird gelöscht...',
'content.edit_modal_title': 'Inhalt bearbeiten',
'content.label_filename': 'Dateiname / Anzeigename',
'content.label_remote_url_field': 'Remote-URL',
'content.label_mime_type': 'MIME-Typ',
'content.label_folder': 'Ordner',
'content.label_replace_file': 'Datei ersetzen',
'content.replace_file_hint': 'Leer lassen, um die aktuelle Datei zu behalten',
'content.folder_root_option': '— Hauptordner —',
'content.save_changes': 'Änderungen speichern',
'content.mime.video_mp4': 'Video (MP4)',
'content.mime.video_webm': 'Video (WebM)',
'content.mime.image_jpeg': 'Bild (JPEG)',
'content.mime.image_png': 'Bild (PNG)',
'content.mime.image_gif': 'Bild (GIF)',
'content.mime.image_webp': 'Bild (WebP)',
'content.error_enter_url': 'Geben Sie eine URL ein',
'content.error_enter_youtube_url': 'Geben Sie eine YouTube-URL ein',
'content.error_update_failed': 'Aktualisierung fehlgeschlagen',
'content.toast.remote_added': 'Remote-Inhalt hinzugefügt',
'content.toast.youtube_added': 'YouTube-Video hinzugefügt',
'content.toast.deleted': 'Inhalt gelöscht',
'content.toast.updated': 'Inhalt aktualisiert',
'content.toast.uploaded_named': '{name} erfolgreich hochgeladen',
'content.toast.upload_failed_named': '{name} konnte nicht hochgeladen werden: {error}',
'content.toast.folder_created_named': 'Ordner „{name}“ erstellt',
'content.toast.folder_renamed': 'Ordner umbenannt',
'content.toast.folder_deleted': 'Ordner gelöscht',
'content.toast.moved': 'Verschoben',
'content.toast.moved_to_root': 'In den Hauptordner verschoben',
// Device detail
'device.back': 'Zurück zu Bildschirmen',
'device.owner_label': 'Besitzer: {owner}',
'device.rename': 'Umbenennen',
'device.screenshot_btn': 'Screenshot',
'device.remove': 'Entfernen',
'device.click_to_confirm': 'Erneut klicken zum Bestätigen',
'device.prompt_new_name': 'Neuen Namen eingeben:',
'device.confirm_discard_draft': 'Alle nicht veröffentlichten Änderungen verwerfen und zur letzten veröffentlichten Version zurückkehren?',
'device.failed_load': 'Gerät konnte nicht geladen werden',
'device.no_screenshot': 'Kein Screenshot verfügbar. Klicken Sie auf „Screenshot", um einen aufzunehmen.',
'device.no_content_assigned': 'Kein Inhalt zugewiesen',
'device.now_playing_id': 'Wiedergabe: {id}',
'device.playlist_count_one': '1 Element in der Playlist',
'device.playlist_count_other': '{n} Elemente in der Playlist',
'device.tab.now_playing': 'Aktuelle Wiedergabe',
'device.tab.now_playing_tip': 'Live-Screenshot dessen, was aktuell auf diesem Gerät angezeigt wird.',
'device.tab.playlist': 'Playlist',
'device.tab.playlist_tip': 'Diesem Gerät zugewiesener Inhalt. Ziehen zum Sortieren. Medien, Widgets oder Kioskseiten hinzufügen.',
'device.tab.info': 'Geräteinfos',
'device.tab.info_tip': 'Hardware-Telemetrie, Ausrichtung, Notizen und Gerätesteuerung.',
'device.tab.remote': 'Fernsteuerung',
'device.tab.remote_tip': 'Bildschirm in Echtzeit anzeigen und Tastendrücke senden. Funktioniert mit Android-APK und Web-Player.',
'device.draft.banner_title': 'Unveröffentlichte Änderungen',
'device.draft.devices_showing_published': 'Geräte zeigen weiterhin die zuletzt veröffentlichte Version.',
'device.draft.never_published': 'Diese Playlist wurde noch nie veröffentlicht. Geräte zeigen nichts an, bis Sie veröffentlichen.',
'device.draft.discard': 'Verwerfen',
'device.draft.publish': 'Veröffentlichen',
'device.draft.publishing': 'Wird veröffentlicht...',
'device.layout.label': 'Bildschirm-Layout',
'device.layout.fullscreen_default': 'Vollbild (Standard)',
'device.layout.zones_count': '{name} ({n} Zonen)',
'device.layout.template_zones_count': '[Vorlage] {name} ({n} Zonen)',
'device.layout.apply': 'Anwenden',
'device.playlist.label': 'Playlist',
'device.playlist.no_playlist': 'Keine Playlist',
'device.playlist.copy_to_btn': 'Kopieren nach...',
'device.playlist.add_content_btn': 'Inhalt hinzufügen',
'device.playlist.empty_title': 'Kein Inhalt zugewiesen',
'device.playlist.empty_desc': 'Fügen Sie Inhalt aus Ihrer Bibliothek zur Playlist dieses Bildschirms hinzu.',
'device.playlist_picker.with_count': '{name} — {n} Elemente',
'device.playlist_picker.with_auto': '{name} (auto) — {n} Elemente',
'device.info.status': 'Status',
'device.info.ip_address': 'IP-Adresse',
'device.info.battery': 'Akku',
'device.info.storage': 'Speicher',
'device.info.size_free': '{size} frei',
'device.info.player_type': 'Player-Typ',
'device.info.web_player': 'Web-Player',
'device.info.wifi': 'WLAN',
'device.info.uptime': 'Betriebszeit',
'device.info.android_version': 'Android-Version',
'device.info.app_version': 'App-Version',
'device.info.screen_resolution': 'Bildschirmauflösung',
'device.info.ram': 'RAM',
'device.info.cpu_usage': 'CPU-Auslastung',
'device.timeline.title': 'Verfügbarkeit (letzte 24 Stunden)',
'device.timeline.h24_ago': 'vor 24h',
'device.timeline.now': 'Jetzt',
'device.timeline.online': 'Online',
'device.timeline.offline': 'Offline',
'device.timeline.no_data': 'Keine Daten',
'device.timeline.uptime_pct_tracked': '{pct}% Verfügbarkeit ({n}min erfasst)',
'device.timeline.uptime_pct_no_data': '{pct}% Verfügbarkeit (keine Daten)',
'device.form.orientation_label': 'Ausrichtung / Drehung',
'device.form.orientation.landscape': 'Querformat (0°)',
'device.form.orientation.portrait': 'Hochformat (90° im UZS)',
'device.form.orientation.landscape_flipped': 'Querformat gedreht (180°)',
'device.form.orientation.portrait_flipped': 'Hochformat gedreht (270° im UZS)',
'device.form.default_content_label': 'Standardinhalt',
'device.form.default_content_none': 'Keiner ("Warten..." anzeigen)',
'device.form.notes_label': 'Notizen',
'device.form.notes_placeholder': 'Standort, Setup-Details usw.',
'device.form.save_settings': 'Einstellungen speichern',
'device.ctl.reboot_device': 'Gerät neu starten',
'device.ctl.screen_off': 'Bildschirm aus',
'device.ctl.screen_on': 'Bildschirm an',
'device.ctl.launch_player': 'Player starten',
'device.ctl.force_update': 'Update erzwingen',
'device.ctl.shutdown': 'Herunterfahren',
'device.remote.start_prompt': 'Auf „Fernsteuerung starten" klicken zum Beginnen',
'device.remote.start': 'Fernsteuerung starten',
'device.remote.stop': 'Fernsteuerung beenden',
'device.remote.vol_up': 'Vol +',
'device.remote.vol_down': 'Vol -',
'device.remote.home': 'Start',
'device.remote.back': 'Zurück',
'device.remote.recents': 'Zuletzt',
'device.remote.power': 'Power',
'device.remote.ok': 'OK',
'device.remote.settings': 'Einstellungen',
'device.remote.scrn_off': 'Bs. aus',
'device.remote.scrn_on': 'Bs. an',
'device.remote.enable_system_view': 'Systemansicht aktivieren',
'device.remote.system_view_tooltip': 'Fordert den Gerätenutzer auf, Vollbildaufnahme zu erlauben - aktiviert Fernansicht von Startbildschirm, Einstellungen und anderen Apps',
'device.remote.system_view_hint': 'Einmalige Genehmigung am Gerät erforderlich',
'device.remote.waiting_for_approval': 'Warte auf Genehmigung am Gerät...',
'device.remote.system_view_enabled': 'Systemansicht aktiviert',
'device.remote.unlocked_hint': 'Navigation und Systemsteuerung freigeschaltet',
'device.pl_item.widget_with_type': 'Widget ({type})',
'device.pl_item.youtube': 'YouTube',
'device.pl_item.video': 'Video',
'device.pl_item.image': 'Bild',
'device.pl_item.zone_label': 'Zone: {id}',
'device.pl_item.no_zone': 'Keine Zone',
'device.pl_item.mute': 'Stummschalten',
'device.pl_item.unmute': 'Stummschaltung aufheben',
'device.pl_item.remove': 'Entfernen',
'device.copy.no_other_devices': 'Keine anderen Geräte zum Kopieren',
'device.copy.prompt': 'Playlist auf welches Gerät kopieren?\n\n{list}\n\nNummer eingeben:',
'device.copy.invalid_selection': 'Ungültige Auswahl',
'device.copy.toast': '{n} Elemente nach {device} kopiert',
'device.assign.empty_all': 'Noch keine Inhalte, Widgets oder Kioskseiten. Erstellen Sie zuerst etwas!',
'device.assign.modal_title': 'Zur Playlist hinzufügen',
'device.assign.zone_label': 'Zone',
'device.assign.zone_default': 'Standard (Vollbild)',
'device.assign.duration_label': 'Anzeigedauer (Sekunden, für Bilder/Widgets)',
'device.assign.tab.media': 'Medien ({n})',
'device.assign.tab.widgets': 'Widgets ({n})',
'device.assign.tab.kiosk': 'Kiosk ({n})',
'device.assign.no_media': 'Noch keine Medien hochgeladen',
'device.assign.no_widgets': 'Noch keine Widgets erstellt.',
'device.assign.no_kiosk': 'Noch keine Kioskseiten.',
'device.assign.create_one': 'Eines erstellen',
'device.assign.add_selected': 'Auswahl hinzufügen',
'device.assign.select_first': 'Erst etwas auswählen',
'device.assign.kiosk_widget_name': 'Kiosk: {name}',
'device.toast.screenshot_requested': 'Screenshot angefordert',
'device.toast.renamed': 'Bildschirm umbenannt',
'device.toast.removing': 'Wird entfernt...',
'device.toast.removed': 'Bildschirm entfernt',
'device.toast.settings_saved': 'Einstellungen gespeichert',
'device.toast.published': 'Playlist veröffentlicht — Geräte aktualisiert',
'device.toast.draft_discarded': 'Entwurfsänderungen verworfen',
'device.toast.playlist_changed': 'Playlist geändert',
'device.toast.layout_applied': 'Layout angewendet',
'device.toast.switched_to_fullscreen': 'Auf Vollbild umgestellt',
'device.toast.added_to_playlist': 'Zur Playlist hinzugefügt',
'device.toast.unmuted': 'Stummschaltung aufgehoben',
'device.toast.muted': 'Stummgeschaltet',
'device.toast.zone_updated': 'Zone aktualisiert',
'device.toast.removed_from_playlist': 'Inhalt aus Playlist entfernt',
'device.toast.playlist_reordered': 'Playlist neu sortiert',
'device.toast.reboot_sent': 'Neustart-Befehl gesendet',
'device.toast.shutdown_sent': 'Herunterfahren-Befehl gesendet',
'device.toast.screen_off_sent': 'Befehl Bildschirm aus gesendet',
'device.toast.screen_on_sent': 'Befehl Bildschirm an gesendet',
'device.toast.launch_sent': 'Start-Befehl gesendet',
'device.toast.update_triggered': 'Update-Prüfung ausgelöst',
'device.toast.remote_started': 'Fernsteuerungssitzung gestartet',
// Settings
'settings.title': 'Einstellungen',
'settings.subtitle': 'Serverkonfiguration und Setup-Informationen',
'settings.account': 'Konto',
// API-Tokens
'apitoken.title': 'API-Tokens',
'apitoken.desc': 'Persönliche Zugriffstokens für die öffentliche API, beschränkt auf diesen Arbeitsbereich. Behandeln Sie sie wie Passwörter wer das Token hat, kann hier in Ihrem Namen handeln.',
'apitoken.name_placeholder': 'z. B. Agentur-Integration',
'apitoken.scope_read': 'Nur Lesen',
'apitoken.scope_write': 'Lesen & Schreiben',
'apitoken.scope_full': 'Voll (inkl. Gerätebefehle)',
'apitoken.create': 'Token erstellen',
'apitoken.none': 'Noch keine Tokens.',
'apitoken.col_token': 'Token',
'apitoken.col_name': 'Name',
'apitoken.col_scope': 'Bereich',
'apitoken.col_created': 'Erstellt',
'apitoken.col_last_used': 'Zuletzt verwendet',
'apitoken.never': 'Nie',
'apitoken.revoke': 'Widerrufen',
'apitoken.revoked': 'Widerrufen',
'apitoken.secret_title': 'Kopieren Sie Ihr Token jetzt',
'apitoken.secret_warning': 'Dies ist das einzige Mal, dass das vollständige Token angezeigt wird. Bewahren Sie es sicher auf Sie können es nicht erneut einsehen.',
'apitoken.copy': 'Kopieren',
'apitoken.copied': 'In die Zwischenablage kopiert',
'apitoken.created_toast': 'Token erstellt',
'apitoken.revoked_toast': 'Token widerrufen',
'apitoken.revoke_confirm': 'Dieses Token widerrufen? Jede Integration, die es verwendet, funktioniert sofort nicht mehr.',
'settings.save_profile': 'Profil speichern',
'settings.change_password': 'Passwort ändern',
'settings.password_min_8': 'Muss mindestens 8 Zeichen lang sein.',
'settings.current_password': 'Aktuelles Passwort',
'settings.new_password': 'Neues Passwort',
'settings.confirm_new_password': 'Neues Passwort bestätigen',
'settings.sso_note': 'Sie melden sich über {provider} an. Verwalten Sie Ihr Passwort dort.',
'settings.license': 'Lizenz',
'settings.license_mit': 'MIT-Lizenz - alle Funktionen enthalten.',
'settings.platform_admin_link': 'Plattform-Admin-Tools sind auf der Seite',
'settings.platform_admin_page_suffix': '.',
'settings.user_management': 'Benutzerverwaltung',
'settings.loading_users': 'Benutzer werden geladen...',
'settings.white_label': 'White Label / Branding',
'settings.white_label_desc': 'Passen Sie das Erscheinungsbild des Dashboards und Players für Ihre Kunden an.',
'settings.brand_name': 'Markenname',
'settings.logo_url': 'Logo-URL',
'settings.primary_color': 'Primärfarbe',
'settings.bg_color': 'Hintergrundfarbe',
'settings.custom_domain': 'Benutzerdefinierte Domain',
'settings.favicon_url': 'Favicon-URL',
'settings.custom_css': 'Benutzerdefiniertes CSS (optional)',
'settings.hide_branding': '„ScreenTinker"-Branding ausblenden',
'settings.save_branding': 'Branding speichern',
'settings.preview': 'Vorschau',
'settings.white_label_enterprise_only': 'Benutzerdefiniertes Branding ist im Enterprise-Plan verfügbar',
'settings.view_plans': 'Pläne ansehen',
'settings.server_info': 'Serverinformationen',
'settings.server_url': 'Server-URL',
'settings.api_endpoint': 'API-Endpunkt',
'settings.server_url_hint': 'Verwenden Sie diese URL beim Einrichten der Android-App',
'settings.setup_guide': 'Setup-Anleitung',
'settings.setup_step_1': 'Installieren Sie die ScreenTinker APK auf Ihrem TV via Sideloading',
'settings.setup_step_2_prefix': 'Öffnen Sie die App und geben Sie diese Server-URL ein:',
'settings.setup_step_3': 'Die App zeigt einen 6-stelligen Kopplungscode an',
'settings.setup_step_4': 'Klicken Sie auf „Bildschirm hinzufügen" und geben Sie den Code ein',
'settings.setup_step_5': 'Inhalte in die Inhaltsbibliothek hochladen',
'settings.setup_step_6': 'Inhalte der Playlist des Bildschirms zuweisen',
'settings.your_data': 'Ihre Daten',
'settings.your_data_desc': 'Exportieren oder importieren Sie Ihre Geräte, Inhalte, Layouts, Zeitpläne und alle Einstellungen. Nutzen Sie dies zur Migration zwischen Cloud und Selfhosted.',
'settings.export_my_data': 'Meine Daten exportieren',
'settings.include_media_zip': 'Mediendateien einschließen (ZIP)',
'settings.import_data': 'Daten importieren',
'settings.language': 'Sprache',
'settings.about': 'Über',
'settings.about_tagline': 'Digital-Signage-Verwaltungssystem.',
'settings.third_party_licenses': 'Drittanbieter-Lizenzen',
'settings.import.reading_file': 'Datei wird gelesen...',
'settings.import.zip_detected': 'ZIP-Export erkannt: <strong>{name}</strong> ({size} MB)<br>Enthält Daten + Mediendateien.',
'settings.import.confirm': 'Import bestätigen',
'settings.import.invalid_file': 'Ungültige Datei. Muss ein ScreenTinker-Export-JSON oder ZIP sein.',
'settings.import.summary_devices': '{n} Geräte',
'settings.import.summary_content': '{n} Inhalte',
'settings.import.summary_widgets': '{n} Widgets',
'settings.import.summary_layouts': '{n} Layouts',
'settings.import.summary_schedules': '{n} Zeitpläne',
'settings.import.summary_walls': '{n} Videowände',
'settings.import.summary_kiosk': '{n} Kioskseiten',
'settings.import.found_summary': 'Gefunden: {summary}.<br>Von: {email} (exportiert {date})',
'settings.import.empty_export': 'leerer Export',
'settings.import.uploading_zip': 'Wird hochgeladen und importiert... Bei großen Dateien kann dies einen Moment dauern.',
'settings.import.importing': 'Wird importiert...',
'settings.import.complete': 'Import abgeschlossen: {imported}.',
'settings.import.pairing_codes_title': 'Geräte-Kopplungscodes:',
'settings.import.pairing_codes_hint': 'Geben Sie diese Codes an jedem Gerät ein, um sie neu zu verknüpfen. Zuweisungen und Zeitpläne bleiben erhalten.',
'settings.import.failed': 'Import fehlgeschlagen',
'settings.import.failed_with_error': 'Import fehlgeschlagen: {error}',
'settings.import.read_failed': 'Datei konnte nicht gelesen werden: {error}',
'settings.toast.support_token_generated': 'Support-Token erstellt (gültig {hours}h)',
'settings.toast.import_success': 'Daten erfolgreich importiert',
'settings.toast.name_required': 'Name darf nicht leer sein',
'settings.toast.profile_saved': 'Profil gespeichert',
'settings.toast.current_password_required': 'Geben Sie Ihr aktuelles Passwort ein',
'settings.toast.new_password_min_8': 'Neues Passwort muss mindestens 8 Zeichen lang sein',
'settings.toast.passwords_dont_match': 'Neue Passwörter stimmen nicht überein',
'settings.toast.password_changed': 'Passwort geändert',
'settings.toast.branding_saved': 'Branding gespeichert',
'settings.toast.preview_applied': 'Vorschau angewendet (zum Zurücksetzen neu laden)',
'settings.toast.plan_updated': 'Plan aktualisiert',
'settings.toast.user_removed': 'Benutzer entfernt',
'settings.user.col_user': 'Benutzer',
'settings.user.col_auth': 'Auth',
'settings.user.col_role': 'Rolle',
'settings.user.col_plan': 'Plan',
'settings.user.col_actions': 'Aktionen',
'settings.user.remove': 'Entfernen',
'settings.user.you': 'Sie',
'settings.user.confirm': 'Bestätigen?',
'settings.user.count_one': '1 Benutzer registriert',
'settings.user.count_other': '{n} Benutzer registriert',
'settings.user.reset_password': 'Passwort zurücksetzen',
'settings.user.prompt_reset_password': 'Geben Sie ein neues Passwort für {email} ein (mindestens 8 Zeichen):',
'settings.toast.password_reset_for_user': 'Passwort zurückgesetzt',
// Widgets
'widget.title': 'Widgets',
'widget.subtitle': 'Fügen Sie Ihren Layouts dynamische Inhalte hinzu',
'widget.help_tip': 'Dynamische Inhaltselemente: Live-Uhren, Wetter, RSS-Ticker, Text, Webseiten und Social-Feeds. Erstellen Sie ein Widget und weisen Sie es einer Geräte-Playlist zu.',
'widget.new_widget': 'Neues Widget',
'widget.configure': 'Widget konfigurieren',
'widget.preview': 'Vorschau',
'widget.preview_title': 'Vorschau',
'widget.close': 'Schließen',
'widget.edit_x': '{type} bearbeiten',
'widget.new_x': 'Neues {type}',
'widget.empty_title': 'Noch keine Widgets',
'widget.empty_desc': 'Erstellen Sie ein Widget, um Ihren Layouts dynamische Inhalte hinzuzufügen.',
'widget.this_widget': 'dieses Widget',
'widget.confirm_delete': '„{name}" löschen? Dies kann nicht rückgängig gemacht werden.',
'widget.toast.saved': 'Widget gespeichert',
'widget.toast.deleted': 'Widget gelöscht',
'widget.toast.preview_failed': 'Vorschau fehlgeschlagen',
'widget.type.clock.name': 'Uhr',
'widget.type.clock.desc': 'Digitaluhr mit Datum',
'widget.type.weather.name': 'Wetter',
'widget.type.weather.desc': 'Aktuelle Wetterbedingungen',
'widget.type.rss.name': 'Nachrichten-Ticker',
'widget.type.rss.desc': 'Scrollender RSS-Feed',
'widget.type.text.name': 'Text/HTML',
'widget.type.text.desc': 'Benutzerdefinierter Text oder HTML-Inhalt',
'widget.type.webpage.name': 'Webseite',
'widget.type.webpage.desc': 'Webseite einbetten',
'widget.type.social.name': 'Social Feed',
'widget.type.social.desc': 'Social-Media-Feed',
'widget.type.directory_board.name': 'Verzeichnistafel',
'widget.type.directory_board.desc': 'Scrollendes Mieter-/Raumverzeichnis für Lobbys',
'widget.field.name': 'Widget-Name',
'widget.field.format': 'Format',
'widget.field.format_12h': '12 Stunden',
'widget.field.format_24h': '24 Stunden',
'widget.field.timezone': 'Zeitzone',
'widget.field.font_size': 'Schriftgröße',
'widget.field.font_size_px': 'Schriftgröße (px)',
'widget.field.color': 'Farbe',
'widget.field.background': 'Hintergrund',
'widget.field.location': 'Standort',
'widget.field.location_placeholder': 'Stadt, Land',
'widget.field.units': 'Einheiten',
'widget.field.units_imperial': 'Imperial (°F)',
'widget.field.units_metric': 'Metrisch (°C)',
'widget.field.feed_url': 'Feed-URL',
'widget.field.scroll_speed_seconds': 'Scroll-Geschwindigkeit (Sekunden)',
'widget.field.max_items': 'Max. Elemente',
'widget.field.html_content': 'HTML-Inhalt',
'widget.field.css_optional': 'CSS (optional)',
'widget.field.url': 'URL',
'widget.field.zoom_pct': 'Zoom (%)',
'widget.field.refresh_interval': 'Aktualisierungsintervall (Sekunden, 0 = nie)',
'widget.field.platform': 'Plattform',
'widget.field.platform_twitter': 'Twitter/X',
'widget.field.platform_instagram': 'Instagram',
'widget.field.query': 'Abfrage',
'widget.field.query_placeholder': '@handle oder #hashtag',
'widget.picker.default_title': 'Bild auswählen',
'widget.picker.select_logo': 'Logo auswählen',
'widget.picker.select_bg_images': 'Hintergrundbilder auswählen',
'widget.picker.search': 'Bilder suchen...',
'widget.picker.no_matches': 'Keine Treffer.',
'widget.picker.no_images': 'Keine Bilder in Ihrer Bibliothek. Laden Sie zuerst Bilder aus der Inhaltsbibliothek hoch.',
'widget.picker.selected_count': '{n} ausgewählt',
'widget.dir.title_label': 'Titel',
'widget.dir.title_placeholder': 'Lincoln Lager',
'widget.dir.logo_label': 'Logo (optional)',
'widget.dir.footer_text_label': 'Fußzeile',
'widget.dir.footer_placeholder': 'Mietanfragen: Kontakt...',
'widget.dir.bg_images_label': 'Hintergrundbilder (optional)',
'widget.dir.bg_images_hint': 'Bilder wechseln alle 15 Sekunden bei 30 % Deckkraft. Mehrere für Rotation hinzufügen.',
'widget.dir.add_bg_image': '+ Hintergrundbild hinzufügen',
'widget.dir.theme': 'Thema',
'widget.dir.theme_dark': 'Dunkel',
'widget.dir.theme_light': 'Hell',
'widget.dir.scroll_speed': 'Scroll-Geschwindigkeit',
'widget.dir.speed_slow': 'Langsam',
'widget.dir.speed_medium': 'Mittel',
'widget.dir.speed_fast': 'Schnell',
'widget.dir.columns': 'Spalten',
'widget.dir.columns_auto': 'Auto',
'widget.dir.categories': 'Kategorien',
'widget.dir.add_category': '+ Kategorie hinzufügen',
'widget.dir.add_entry': '+ Eintrag hinzufügen',
'widget.dir.empty_categories': 'Fügen Sie Ihre erste Etage oder Abteilung hinzu, um zu beginnen',
'widget.dir.no_entries': 'Noch keine Einträge',
'widget.dir.entry': 'Eintrag',
'widget.dir.entries': 'Einträge',
'widget.dir.collapse': 'Einklappen',
'widget.dir.expand': 'Aufklappen',
'widget.dir.move_up': 'Nach oben',
'widget.dir.move_down': 'Nach unten',
'widget.dir.delete_category': 'Kategorie löschen',
'widget.dir.delete_entry': 'Eintrag löschen',
'widget.dir.unnamed': '(unbenannt)',
'widget.dir.confirm_delete_category': 'Kategorie „{name}" und alle Einträge löschen?',
'widget.dir.category_name_placeholder': 'z. B. Erste Etage',
'widget.dir.entry_id_placeholder': '101',
'widget.dir.entry_name_placeholder': 'Mietername',
'widget.dir.entry_subtitle_placeholder': 'Details (optional)',
'widget.dir.available': 'Verfügbar',
'widget.dir.change': 'Ändern',
'widget.dir.choose_logo': 'Logo wählen',
'widget.dir.remove_logo': 'Entfernen',
'widget.dir.no_bg_images': 'Keine Hintergrundbilder ausgewählt',
'widget.dir.remove_bg': 'Entfernen',
// Designer
'designer.title': 'Inhaltsdesigner',
'designer.subtitle': 'Erstellen Sie dynamischen Anzeigeinhalt',
'designer.help_tip': 'Erstellen Sie individuelle Anzeigen mit Live-Elementen: Uhren, Wetter, RSS-Ticker, Countdowns, QR-Codes. Als Widget veröffentlichen oder als PNG exportieren.',
'designer.load_design': 'Design laden',
'designer.export_png': 'PNG exportieren',
'designer.publish': 'In Bibliothek veröffentlichen',
'designer.preview_hint': 'Klicken Sie auf Elemente zur Auswahl. Ziehen zum Verschieben. Live-Vorschau aktualisiert in Echtzeit.',
'designer.add_element': 'Element hinzufügen',
'designer.background': 'Hintergrund',
'designer.bg_image': 'Bild',
'designer.properties': 'Eigenschaften',
'designer.layers': 'Ebenen',
'designer.no_elements': 'Noch keine Elemente',
'designer.save_design_file': 'Design-Datei speichern',
'designer.qr_label': 'QR-CODE',
'designer.loading_news': 'Nachrichten werden geladen...',
'designer.no_items': 'Keine Einträge',
'designer.feed_unavailable': 'Feed nicht verfügbar',
'designer.countdown_now': 'JETZT!',
'designer.widget_name': 'Design {date}',
'designer.el.text': 'Text',
'designer.el.heading': 'Überschrift',
'designer.el.image': 'Bild',
'designer.el.video': 'Video',
'designer.el.clock': 'Uhr',
'designer.el.date': 'Datum',
'designer.el.weather': 'Wetter',
'designer.el.ticker': 'Ticker',
'designer.el.shape': 'Form',
'designer.el.qr': 'QR-Code',
'designer.el.countdown': 'Countdown',
'designer.el.webpage': 'Webseite',
'designer.bg.black': 'Schwarz',
'designer.bg.dark_blue': 'Dunkelblau',
'designer.bg.dark_gradient': 'Dunkler Verlauf',
'designer.bg.blue_gradient': 'Blauer Verlauf',
'designer.bg.sunset': 'Sonnenuntergang',
'designer.bg.ocean': 'Ozean',
'designer.bg.forest': 'Wald',
'designer.bg.dark_red': 'Dunkelrot',
'designer.bg.white': 'Weiß',
'designer.default.text': 'Ihr Text hier',
'designer.default.heading': 'ÜBERSCHRIFT',
'designer.default.coming_soon': 'Demnächst',
'designer.prompt.video_url': 'Video-URL (MP4):',
'designer.prompt.weather_location': 'Stadt, Land:',
'designer.prompt.rss_url': 'RSS-Feed-URL:',
'designer.prompt.qr_url': 'QR-Code-URL:',
'designer.prompt.countdown_date': 'Zieldatum (JJJJ-MM-TT):',
'designer.prompt.webpage_url': 'Webseiten-URL:',
'designer.prop.text': 'Text',
'designer.prop.size': 'Größe',
'designer.prop.font': 'Schriftart',
'designer.prop.color': 'Farbe',
'designer.prop.bold': 'Fett',
'designer.prop.shadow': 'Schatten',
'designer.prop.format': 'Format',
'designer.prop.show_seconds': 'Sekunden anzeigen',
'designer.prop.muted': 'Stumm',
'designer.prop.loop': 'Schleife',
'designer.prop.opacity': 'Deckkraft',
'designer.prop.shape': 'Form',
'designer.prop.location': 'Standort',
'designer.prop.feed_url': 'Feed-URL',
'designer.prop.speed': 'Geschwindigkeit (Sekunden)',
'designer.prop.text_color': 'Textfarbe',
'designer.prop.bg_color': 'Hintergrundfarbe',
'designer.prop.target_date': 'Zieldatum',
'designer.prop.label': 'Beschriftung',
'designer.toast.published': 'Als Widget veröffentlicht! Weisen Sie es einer Layout-Zone zu.',
'designer.toast.publish_failed': 'Veröffentlichung fehlgeschlagen',
'designer.toast.export_failed': 'Export fehlgeschlagen: {error}',
'designer.toast.loaded': 'Design geladen',
'designer.toast.invalid_file': 'Ungültige Design-Datei',
// Playlists
'playlist.title': 'Playlists',
'playlist.subtitle': 'Erstellen und verwalten Sie Inhaltslisten',
'playlist.show_auto_generated': 'Auto-generierte anzeigen',
'playlist.new_playlist_btn': '+ Neue Playlist',
'playlist.new_playlist': 'Neue Playlist',
'playlist.empty_title': 'Noch keine Playlists',
'playlist.empty_desc': 'Erstellen Sie Ihre erste Playlist, um Inhalte für Ihre Bildschirme zu organisieren.',
'playlist.all_auto_generated': 'Alle Playlists sind auto-generiert. Aktivieren Sie „Auto-generierte anzeigen", um sie zu sehen.',
'playlist.tag_auto': 'auto',
'playlist.tag_draft': 'Entwurf',
'playlist.item_count_one': '1 Element',
'playlist.item_count_other': '{n} Elemente',
'playlist.created_at': 'Erstellt {date}',
'playlist.display_count_one': '1 Bildschirm',
'playlist.display_count_other': '{n} Bildschirme',
'playlist.assigned_to_one': 'Zugewiesen an 1 Bildschirm',
'playlist.assigned_to_other': 'Zugewiesen an {n} Bildschirme',
'playlist.load_failed': 'Playlists konnten nicht geladen werden: {error}',
'playlist.back_to_playlists': 'Zurück zu Playlists',
'playlist.name_placeholder': 'Playlist-Name',
'playlist.desc_placeholder': 'Beschreibung (optional)',
'playlist.create_btn': 'Erstellen',
'playlist.add_desc_placeholder': 'Beschreibung hinzufügen...',
'playlist.click_to_rename': 'Klicken zum Umbenennen',
'playlist.click_to_edit_desc': 'Klicken zum Bearbeiten der Beschreibung',
'playlist.add_content': '+ Inhalt hinzufügen',
'playlist.delete_playlist': 'Playlist löschen',
'playlist.back': 'Zurück',
'playlist.items_empty': 'Diese Playlist ist leer',
'playlist.items_empty_hint': 'Klicken Sie auf „Inhalt hinzufügen", um Elemente hinzuzufügen.',
'playlist.duration': 'Dauer',
'playlist.sec': 'Sek',
'playlist.move_up': 'Nach oben',
'playlist.move_down': 'Nach unten',
'playlist.remove_item': 'Element entfernen',
'playlist.item_widget': 'Widget',
'playlist.unknown_type': 'Unbekannter Typ',
'playlist.confirm_delete': '„{name}" löschen? Dies kann nicht rückgängig gemacht werden.',
'playlist.confirm_discard_draft': 'Alle nicht veröffentlichten Änderungen verwerfen und zur letzten veröffentlichten Version zurückkehren?',
'playlist.draft.banner_title': 'Unveröffentlichte Änderungen',
'playlist.draft.devices_showing_published': 'Geräte zeigen weiterhin die zuletzt veröffentlichte Version.',
'playlist.draft.never_published': 'Diese Playlist wurde noch nie veröffentlicht. Geräte zeigen nichts an, bis Sie veröffentlichen.',
'playlist.draft.discard_changes': 'Änderungen verwerfen',
'playlist.draft.publish': 'Veröffentlichen',
'playlist.draft.publishing': 'Wird veröffentlicht...',
'playlist.toast.created': 'Playlist erstellt',
'playlist.toast.deleted': 'Playlist gelöscht',
'playlist.toast.published': 'Playlist veröffentlicht — Geräte aktualisiert',
'playlist.toast.draft_discarded': 'Entwurfsänderungen verworfen',
'playlist.toast.item_removed': 'Element entfernt',
'playlist.add_modal_title': 'Inhalt zur Playlist hinzufügen',
'playlist.tab_content': 'Inhalt',
'playlist.tab_widgets': 'Widgets',
'playlist.search_placeholder': 'Suchen...',
'playlist.close': 'Schließen',
'playlist.no_content_found': 'Kein Inhalt gefunden',
'playlist.no_widgets_found': 'Keine Widgets gefunden',
'playlist.add_btn': 'Hinzufügen',
'playlist.adding': 'Wird hinzugefügt...',
'playlist.added': 'Hinzugefügt',
// Per-item schedule editor (#74/#75)
'itemsched.title': 'Zeitplan',
'itemsched.hint': 'Elemente ohne Zeitplan werden immer abgespielt. Fügen Sie Blöcke hinzu, um einzuschränken, wann dieses Element erscheint — ausgewertet in der lokalen Zeit jedes Bildschirms.',
'itemsched.none': 'Kein Zeitplan — dieses Element wird immer abgespielt.',
'itemsched.block': 'Block {n}',
'itemsched.remove_block': 'Block entfernen',
'itemsched.from': 'Von',
'itemsched.to': 'Bis',
'itemsched.end_of_day': 'Tagesende',
'itemsched.starts': 'Beginnt',
'itemsched.ends': 'Endet',
'itemsched.dates_hint': '(Daten optional, einschließlich)',
'itemsched.add_block': '+ Zeitplanblock hinzufügen',
'itemsched.cancel': 'Abbrechen',
'itemsched.save': 'Zeitplan speichern',
'itemsched.toast.saved': 'Zeitplan gespeichert — veröffentlichen Sie die Playlist, um sie an die Geräte zu senden',
'itemsched.toast.cleared': 'Zeitplan gelöscht — veröffentlichen, um die Geräte zu aktualisieren',
'itemsched.every_day': 'Täglich',
'itemsched.mon_fri': 'Mo-Fr',
'itemsched.sat_sun': 'Sa-So',
'itemsched.dow_short': 'So,Mo,Di,Mi,Do,Fr,Sa',
'itemsched.err.days': 'Jeder Zeitplanblock benötigt mindestens einen aktiven Tag',
'itemsched.err.start': 'Startzeit muss HH:MM sein',
'itemsched.err.end': 'Endzeit muss HH:MM sein (oder Tagesende)',
'itemsched.err.start_date': 'Startdatum muss JJJJ-MM-TT sein',
'itemsched.err.end_date': 'Enddatum muss JJJJ-MM-TT sein',
'device.clock.label': 'Geräteuhr',
'device.clock.reported': '{time} gemeldet',
'device.clock.skew': '⚠ Uhr weicht um {amount} ab — Zeitpläne können zur falschen lokalen Zeit auslösen',
// Onboarding
'onboarding.back': 'Zurück',
'onboarding.next': 'Weiter',
'onboarding.skip': 'Assistent überspringen',
'onboarding.go_to_dashboard': 'Zum Dashboard',
'onboarding.pair_display': 'Bildschirm koppeln',
'onboarding.step.welcome.title': 'Willkommen bei ScreenTinker!',
'onboarding.step.welcome.intro': 'Lassen Sie uns alles in unter 5 Minuten einrichten.',
'onboarding.step.welcome.guide_through': 'Dieser Assistent führt Sie durch:',
'onboarding.step.welcome.bullet_download': 'Player-App herunterladen',
'onboarding.step.welcome.bullet_pair': 'Ersten Bildschirm koppeln',
'onboarding.step.welcome.bullet_upload': 'Inhalte hochladen und zuweisen',
'onboarding.step.player.title': 'Schritt 1: Player-App holen',
'onboarding.step.player.intro': 'Installieren Sie den Player auf Ihrem Anzeigegerät.',
'onboarding.step.player.android_label': 'Android-APK',
'onboarding.step.player.android_desc': 'TV-Boxen, Tablets, Fire TV',
'onboarding.step.player.web_label': 'Web-Player',
'onboarding.step.player.web_desc': 'Beliebiger Browser, Pi, ChromeOS',
'onboarding.step.player.url_hint': 'Öffnen Sie die App auf Ihrem Bildschirm und geben Sie diese Server-URL ein:',
'onboarding.step.pair.title': 'Schritt 2: Bildschirm koppeln',
'onboarding.step.pair.intro': 'Geben Sie den 6-stelligen Code ein, der auf Ihrem Bildschirm angezeigt wird.',
'onboarding.step.pair.name_placeholder': 'Anzeigename (z. B. Lobby-TV)',
'onboarding.step.upload.title': 'Schritt 3: Inhalt hochladen',
'onboarding.step.upload.intro': 'Laden Sie ein Video oder Bild zur Anzeige hoch.',
'onboarding.step.upload.click_to_select': 'Klicken, um eine Datei auszuwählen',
'onboarding.step.upload.formats': 'MP4, WebM, JPEG, PNG, GIF',
'onboarding.step.upload.uploading': 'Wird hochgeladen...',
'onboarding.step.done.title': 'Alles bereit!',
'onboarding.step.done.intro': 'Ihr Bildschirm ist gekoppelt und der Inhalt läuft!',
'onboarding.step.done.whats_next': 'Wie geht es weiter?',
'onboarding.step.done.next_content': 'Mehr Inhalte in der <strong>Inhaltsbibliothek</strong> hinzufügen',
'onboarding.step.done.next_layouts': 'Multi-Zonen-Layouts in <strong>Layouts</strong> erstellen',
'onboarding.step.done.next_schedule': 'Zeitplan im <strong>Zeitplan</strong>-Kalender einrichten',
'onboarding.step.done.next_widgets': 'Live-Widgets (Uhr, Wetter, Ticker) in <strong>Widgets</strong> hinzufügen',
'onboarding.step.done.next_kiosk': 'Interaktive Bildschirme in <strong>Kiosk</strong> erstellen',
'onboarding.step.done.next_designer': 'Individuelle Inhalte im <strong>Designer</strong> entwerfen',
'onboarding.toast.invalid_code': 'Geben Sie einen gültigen 6-stelligen Code ein',
'onboarding.toast.pairing': 'Wird gekoppelt...',
'onboarding.toast.pair_failed': 'Kopplung fehlgeschlagen',
'onboarding.toast.pair_failed_with_error': 'Kopplung fehlgeschlagen: {error}',
'onboarding.toast.paired': 'Bildschirm gekoppelt!',
'onboarding.toast.uploaded_assigning': 'Hochgeladen! Wird dem Bildschirm zugewiesen...',
'onboarding.toast.content_assigned': 'Inhalt hochgeladen und zugewiesen!',
'onboarding.toast.upload_failed': 'Upload fehlgeschlagen',
'onboarding.toast.error_with_error': 'Fehler: {error}',
// Admin
'admin.title': 'Plattform-Admin',
'admin.subtitle': 'Superadmin-Steuerung - nur Sie sehen dies',
'admin.access_denied': 'Zugriff verweigert',
'admin.access_denied_desc': 'Plattform-Admin-Zugriff erforderlich.',
'admin.all_users': 'Alle Benutzer',
'admin.plans': 'Abonnementpläne',
'admin.system': 'System',
'admin.col.user': 'Benutzer',
'admin.col.auth': 'Auth',
'admin.col.last_login': 'Letzte Anmeldung',
'admin.col.role': 'Rolle',
'admin.col.plan': 'Plan',
'admin.col.actions': 'Aktionen',
'admin.col.devices': 'Geräte',
'admin.col.storage': 'Speicher',
'admin.col.monthly': 'Monatlich',
'admin.col.yearly': 'Jährlich',
'admin.role.user': 'Benutzer',
'admin.role.admin': 'Admin',
'admin.role.superadmin': 'Superadmin',
'admin.remove': 'Entfernen',
'admin.owner': 'Eigentümer',
'admin.confirm': 'Bestätigen?',
'admin.total_users': '{n} Benutzer insgesamt',
'admin.unlimited': 'Unbegrenzt',
'admin.free': 'Kostenlos',
'admin.version': 'Version',
'admin.frontend_hash': 'Frontend-Hash',
'admin.download_db_backup': 'DB-Backup herunterladen',
'admin.server_status': 'Serverstatus',
'admin.toast.role_updated': 'Rolle aktualisiert',
'admin.toast.plan_updated': 'Plan aktualisiert',
'admin.toast.user_removed': 'Benutzer entfernt',
'admin.reset_password': 'Passwort zurücksetzen',
'admin.prompt_reset_password': 'Geben Sie ein neues Passwort für {email} ein (mindestens 8 Zeichen):',
'admin.toast.password_min_8': 'Passwort muss mindestens 8 Zeichen lang sein',
'admin.toast.password_reset': 'Passwort zurückgesetzt',
// Schedule
'schedule.title': 'Zeitplan',
'schedule.subtitle': 'Inhaltsplanungs-Kalender',
'schedule.help_tip': 'Visueller Wochenkalender für Inhaltsplanung. Klicken Sie auf Zeitplan hinzufügen, um Zeitfenster zu erstellen. Wiederholungen für regelmäßige Inhalte. Höhere Priorität überschreibt niedrigere. Geräteebene überschreibt Gruppenebene.',
'schedule.prev_week': '< Zurück',
'schedule.next_week': 'Weiter >',
'schedule.add_schedule': 'Zeitplan hinzufügen',
'schedule.edit_schedule': 'Zeitplan bearbeiten',
'schedule.apply_to': 'Anwenden auf',
'schedule.target_device': 'Gerät',
'schedule.target_group': 'Gruppe',
'schedule.group_devices_count': '{n} Geräte',
'schedule.no_groups_msg': 'Noch keine Gruppen erstellt. Erstellen Sie sie auf der Seite Bildschirme.',
'schedule.zone_note': 'Hinweis: Zonenbasierte Zeitpläne sind layout-spezifisch. Stellen Sie sicher, dass alle Geräte der Gruppe dasselbe Layout verwenden.',
'schedule.playlist_override': 'Playlist überschreiben',
'schedule.no_playlist_override': '— Keine Playlist-Überschreibung —',
'schedule.draft_suffix': '(Entwurf)',
'schedule.layout_override': 'Layout überschreiben',
'schedule.no_layout_override': '— Keine Layout-Überschreibung —',
'schedule.content_label': 'Inhalt',
'schedule.content_hint': '(einzelnes Element, optional)',
'schedule.content_none': '— Keiner —',
'schedule.title_label': 'Titel (optional)',
'schedule.title_placeholder': 'z. B. Morgenplaylist',
'schedule.start_time': 'Startzeit',
'schedule.end_time': 'Endzeit',
'schedule.repeat': 'Wiederholen',
'schedule.repeat_none': 'Keine Wiederholung',
'schedule.repeat_daily': 'Täglich',
'schedule.repeat_weekdays': 'Wochentags',
'schedule.repeat_weekends': 'Wochenenden',
'schedule.repeat_weekly': 'Wöchentlich',
'schedule.priority': 'Priorität',
'schedule.color': 'Farbe',
'schedule.scheduled_label': 'Geplant',
'schedule.tooltip_group_prefix': 'Gruppe: ',
'schedule.tooltip_priority': 'Priorität: {n}',
'schedule.day.sun': 'So',
'schedule.day.mon': 'Mo',
'schedule.day.tue': 'Di',
'schedule.day.wed': 'Mi',
'schedule.day.thu': 'Do',
'schedule.day.fri': 'Fr',
'schedule.day.sat': 'Sa',
'schedule.hour_12am': '00 Uhr',
'schedule.hour_am': ' Uhr',
'schedule.hour_12pm': '12 Uhr',
'schedule.hour_pm': ' Uhr',
'schedule.toast.no_groups': 'Keine Gruppen verfügbar. Erstellen Sie zuerst eine.',
'schedule.toast.saved': 'Zeitplan gespeichert',
// Reports
'report.title': 'Berichte',
'report.subtitle': 'Wiedergabe-Analytik und Geräteverfügbarkeit',
'report.help_tip': 'Wiedergabe-Analytik. Sehen Sie, was wann auf welchem Gerät gespielt wurde. Filtern Sie nach Zeitraum und Gerät. CSV-Export für Verifizierung.',
'report.export_csv': 'CSV exportieren',
'report.device': 'Gerät',
'report.all_devices': 'Alle Geräte',
'report.start_date': 'Startdatum',
'report.end_date': 'Enddatum',
'report.load_report': 'Bericht laden',
'report.select_range': 'Wählen Sie einen Zeitraum und klicken Sie auf Bericht laden',
'report.error': 'Fehler',
'report.total_plays': 'Wiedergaben gesamt',
'report.total_hours': 'Stunden gesamt',
'report.unique_content': 'Einzigartiger Inhalt',
'report.active_devices': 'Aktive Geräte',
'report.avg_duration': 'Durchschn. Dauer',
'report.plays_per_day': 'Wiedergaben pro Tag',
'report.plays_by_hour': 'Wiedergaben pro Stunde',
'report.top_content': 'Top-Inhalte',
'report.by_device': 'Nach Gerät',
'report.no_data': 'Keine Daten',
'report.col.content': 'Inhalt',
'report.col.device': 'Gerät',
'report.col.plays': 'Wiedergaben',
'report.col.total_hours': 'Stunden gesamt',
'report.col.completion': 'Abschluss',
// Kiosk
'kiosk.title': 'Kioskseiten',
'kiosk.subtitle': 'Erstellen Sie interaktive Touchscreen-Oberflächen',
'kiosk.help_tip': 'Erstellen Sie interaktive Touchscreen-Oberflächen. Fügen Sie Buttons mit Symbolen und Aktionen hinzu. Inklusive Leerlaufbildschirm. Geräten als Widget zuweisen.',
'kiosk.new_page': 'Neue Kioskseite',
'kiosk.prompt_name': 'Name der Kioskseite:',
'kiosk.empty_title': 'Noch keine Kioskseiten',
'kiosk.empty_desc': 'Erstellen Sie eine interaktive Touchscreen-Oberfläche für Ihre Bildschirme.',
'kiosk.label': 'Kioskseite',
'kiosk.preview': 'Vorschau',
'kiosk.confirm_delete': 'Kioskseite „{name}" löschen? Dies kann nicht rückgängig gemacht werden.',
'kiosk.toast.deleted': 'Kioskseite gelöscht',
'kiosk.toast.delete_failed': 'Löschen fehlgeschlagen',
'kiosk.toast.saved': 'Kioskseite gespeichert',
'kiosk.not_found': 'Seite nicht gefunden',
'kiosk.back': 'Zurück zu Kioskseiten',
'kiosk.page_settings': 'Seiteneinstellungen',
'kiosk.title_label': 'Titel',
'kiosk.subtitle_label': 'Untertitel',
'kiosk.logo_url': 'Logo-URL',
'kiosk.footer_text': 'Fußzeile',
'kiosk.idle_title': 'Leerlaufbildschirm-Titel',
'kiosk.idle_default': 'Zum Starten berühren',
'kiosk.idle_timeout': 'Leerlauf-Timeout (Sekunden)',
'kiosk.style': 'Stil',
'kiosk.background': 'Hintergrund',
'kiosk.text_color': 'Textfarbe',
'kiosk.columns': 'Spalten',
'kiosk.button_color': 'Button-Farbe',
'kiosk.button_hover': 'Button-Hoverfarbe',
'kiosk.buttons': 'Buttons',
'kiosk.add_btn': '+ Hinzufügen',
'kiosk.icon_placeholder': 'Emoji',
'kiosk.label_placeholder': 'Beschriftung',
'kiosk.sublabel_placeholder': 'Unterbeschriftung',
'kiosk.action_none': 'Keine Aktion',
'kiosk.action_url': 'URL öffnen',
'kiosk.action_page': 'Zu Seite',
'kiosk.url_placeholder': 'URL oder Seite',
'kiosk.no_buttons': 'Noch keine Buttons',
'kiosk.new_button': 'Neuer Button',
// Layout editor
'layout.title': 'Layouts',
'layout.subtitle': 'Bildschirm-Layouts und Vorlagen',
'layout.help_tip': 'Erstellen Sie Multi-Zonen-Bildschirmlayouts. Verwenden Sie Vorlagen oder erstellen Sie eigene. Ziehen Sie Zonen zum Positionieren, ändern Sie die Größe an der Ecke. Layouts auf der Playlist-Registerkarte zuweisen.',
'layout.new_layout': 'Neues Layout',
'layout.templates': 'Vorlagen',
'layout.my_layouts': 'Meine Layouts',
'layout.empty_custom': 'Noch keine benutzerdefinierten Layouts',
'layout.prompt_name': 'Layout-Name:',
'layout.default_zone_name': 'Hauptzone',
'layout.template_label': 'Vorlage',
'layout.use_template': 'Vorlage verwenden',
'layout.zone_count_one': '1 Zone',
'layout.zone_count_other': '{n} Zonen',
'layout.confirm_delete': 'Layout „{name}" löschen? Dies kann nicht rückgängig gemacht werden.',
'layout.toast.deleted': 'Layout gelöscht',
'layout.toast.delete_failed': 'Layout konnte nicht gelöscht werden',
'layout.toast.saved': 'Layout gespeichert',
'layout.not_found': 'Layout nicht gefunden',
'layout.back': 'Zurück zu Layouts',
'layout.add_zone': 'Zone hinzufügen',
'layout.zones': 'Zonen',
'layout.properties': 'Eigenschaften',
'layout.delete_zone': 'Zone löschen',
'layout.zone_n': 'Zone {n}',
'layout.prop.name': 'Name',
'layout.prop.x': 'X (%)',
'layout.prop.y': 'Y (%)',
'layout.prop.width': 'Breite (%)',
'layout.prop.height': 'Höhe (%)',
'layout.prop.type': 'Typ',
'layout.type_content': 'Inhalt',
'layout.type_widget': 'Widget',
// Video walls
'wall.title': 'Videowände',
'wall.subtitle': 'Kombinieren Sie mehrere Bildschirme zu einem großen',
'wall.help_tip': 'Kombinieren Sie mehrere Bildschirme zu einem großen. Rastergröße einstellen, Geräte in Positionen ziehen, Rahmenkompensation einstellen. Inhalt zuweisen, der über alle Geräte abgespielt wird.',
'wall.new_wall': 'Neue Videowand',
'wall.prompt_name': 'Name der Videowand:',
'wall.empty_title': 'Noch keine Videowände',
'wall.empty_desc': 'Erstellen Sie eine Videowand, um mehrere Bildschirme zu kombinieren.',
'wall.grid_summary': '{cols}x{rows}-Raster • {n} Geräte',
'wall.not_found': 'Wand nicht gefunden',
'wall.back': 'Zurück zu Videowänden',
'wall.delete_wall': 'Wand löschen',
'wall.grid_config': 'Raster-Konfiguration',
'wall.columns': 'Spalten',
'wall.rows': 'Zeilen',
'wall.h_bezel': 'H Rahmen (px)',
'wall.v_bezel': 'V Rahmen (px)',
'wall.update': 'Aktualisieren',
'wall.content': 'Inhalt',
'wall.no_content': 'Kein Inhalt',
'wall.set_content': 'Inhalt festlegen',
'wall.available_displays': 'Verfügbare Bildschirme',
'wall.all_assigned': 'Alle Geräte zugewiesen',
'wall.drop_here': 'Hier ablegen',
'wall.toast.placed': '{name} platziert bei [{col},{row}]',
'wall.toast.grid_updated': 'Raster aktualisiert',
'wall.toast.content_updated': 'Inhalt aktualisiert',
'wall.toast.deleted': 'Wand gelöscht',
// Billing
'billing.title': 'Abonnement',
'billing.subtitle': 'Verwalten Sie Ihren Plan und die Abrechnung',
'billing.current_plan': 'Aktueller Plan',
'billing.self_hosted': 'Selbstgehostet',
'billing.trial_days_left': 'Testversion - {n} Tage übrig',
'billing.trial_ends': 'Ihre {plan}-Testversion endet in {n} Tagen',
'billing.trial_after': 'Nach der Testversion werden Sie zum kostenlosen Plan (1 Gerät) verschoben. Upgraden Sie jetzt, um alle Geräte und Funktionen zu behalten.',
'billing.devices': 'Geräte',
'billing.devices_lc': 'Geräte',
'billing.storage': 'Speicher',
'billing.storage_lc': 'Speicher',
'billing.features': 'Funktionen',
'billing.feat.remote_control': 'Fernsteuerung',
'billing.feat.remote_urls': 'Remote-URLs',
'billing.feat.priority_support': 'Prioritäts-Support',
'billing.available_plans': 'Verfügbare Pläne',
'billing.current': 'Aktuell',
'billing.unlimited': 'Unbegrenzt',
'billing.free': 'Kostenlos',
'billing.per_month': '/Mon',
'billing.yearly_save': 'oder {price} $/Jahr ({pct}% sparen)',
'billing.monthly': 'Monatlich',
'billing.yearly': 'Jährlich',
'billing.manage_subscription': 'Abonnement verwalten',
'billing.self_hosted_note': 'Selbstgehosteter Modus: Pläne können von Administratoren ohne Abrechnung zugewiesen werden.',
'billing.failed_to_load': 'Laden fehlgeschlagen',
'billing.toast.checkout_failed': 'Bezahlung konnte nicht gestartet werden: {error}',
'billing.toast.portal_failed': 'Abrechnungsportal konnte nicht geöffnet werden: {error}',
'billing.toast.payment_success': 'Bezahlung erfolgreich! Ihr Plan wurde aktualisiert.',
// Teams
'team.title': 'Teams',
'team.subtitle': 'Teams und gemeinsamen Zugriff verwalten',
'team.help_tip': 'Erstellen Sie Teams, um Geräte mit anderen Nutzern zu teilen. Eigentümer verwalten das Team, Editoren ändern Inhalte/Playlists, Betrachter überwachen nur.',
'team.new_team': 'Neues Team',
'team.prompt_name': 'Teamname:',
'team.empty_title': 'Noch keine Teams',
'team.empty_desc': 'Erstellen Sie ein Team, um Geräte mit anderen Nutzern zu teilen.',
'team.your_role': 'Ihre Rolle: {role}',
'team.member_count_one': '1 Mitglied',
'team.member_count_other': '{n} Mitglieder',
'team.not_found': 'Team nicht gefunden',
'team.back': 'Zurück zu Teams',
'team.delete_team': 'Team löschen',
'team.members_count': 'Mitglieder ({n})',
'team.invite': '+ Einladen',
'team.role_viewer': 'Betrachter',
'team.role_editor': 'Editor',
'team.role_owner': 'Eigentümer',
'team.remove': 'Entfernen',
'team.remove_from_team': 'Aus Team entfernen',
'team.no_members': 'Keine Mitglieder',
'team.shared_devices': 'Geteilte Geräte ({n})',
'team.add_device': '+ Gerät hinzufügen...',
'team.no_devices': 'Keine Geräte mit diesem Team geteilt',
'team.prompt_email': 'E-Mail-Adresse zum Einladen:',
'team.prompt_role': 'Rolle (viewer, editor oder owner):',
'team.toast.invalid_role': 'Ungültige Rolle',
'team.toast.invitation_sent': 'Einladung gesendet',
'team.toast.role_updated': 'Rolle aktualisiert',
'team.toast.member_removed': 'Mitglied entfernt',
'team.toast.device_added': 'Gerät zum Team hinzugefügt',
'team.toast.device_removed': 'Gerät aus Team entfernt',
'team.toast.deleted': 'Team gelöscht',
// Activity
'activity.title': 'Aktivitätsprotokoll',
'activity.subtitle': 'Audit-Trail aller Aktionen',
'activity.load_more': 'Mehr laden',
'activity.empty_title': 'Noch keine Aktivität',
'activity.empty_desc': 'Aktionen erscheinen hier, sobald Sie das System nutzen.',
'activity.system': 'System',
'activity.verb_created': 'hat erstellt',
'activity.verb_updated': 'hat aktualisiert',
'activity.verb_deleted': 'hat gelöscht',
'activity.action_paired_device': 'hat ein Gerät gekoppelt',
'activity.action_added_remote_content': 'hat Remote-Inhalt hinzugefügt',
'activity.noun_content': 'Inhalt',
'activity.noun_device': 'Gerät',
'activity.noun_playlist_assignment': 'Playlist-Zuweisung',
'activity.noun_assignment': 'Zuweisung',
'activity.noun_layout': 'Layout',
'activity.noun_widget': 'Widget',
'activity.noun_schedule': 'Zeitplan',
'activity.noun_video_wall': 'Videowand',
'activity.alert_device_offline': 'Alarm: Gerät offline',
// Help
'help.title': 'Hilfe-Center',
'help.subtitle': 'Schnellanleitungen und FAQ',
'help.faq': 'Häufig gestellte Fragen',
'help.shortcuts': 'Tastaturkürzel',
'help.shortcut_esc': 'Web-Player zurücksetzen (auf Player-Seite)',
'help.shortcut_f': 'Vollbild umschalten (Web-Player)',
// Add Display modal
'add_display.title': 'Bildschirm hinzufügen',
'add_display.intro': 'Geben Sie den 6-stelligen Kopplungscode ein, der auf dem Bildschirm angezeigt wird.',
'add_display.pairing_code': 'Kopplungscode',
'add_display.display_name': 'Anzeigename (optional)',
'add_display.name_placeholder': 'z. B. Lobby-TV',
'add_display.need_player': 'Player-App benötigt? Installieren Sie eine, um einen Kopplungscode zu erhalten:',
'add_display.android_apk': 'Android-APK',
'add_display.web_player': 'Web-Player',
'add_display.raspberry_pi': 'Raspberry Pi',
'add_display.windows': 'Windows',
'add_display.smart_tv_note': 'Smart TVs (LG/Samsung): öffnen Sie den integrierten Browser und navigieren Sie zu <code style="background:var(--bg-input,#0f172a);padding:1px 4px;border-radius:3px">/player</code>',
'add_display.pair_btn': 'Bildschirm koppeln',
};