Explorar o código

Add German localization and language picker support.

Register de locale in the project and provide full German strings for UI, Info.plist, and menu bar.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 hai 1 mes
pai
achega
c34539ef3c

+ 1 - 0
Info.plist

@@ -13,6 +13,7 @@
 		<string>en</string>
 		<string>fr</string>
 		<string>fr-CA</string>
+		<string>de</string>
 		<string>zh-Hans</string>
 		<string>zh-Hant</string>
 	</array>

+ 1 - 0
meetings_app.xcodeproj/project.pbxproj

@@ -99,6 +99,7 @@
 				Base,
 				fr,
 				"fr-CA",
+				de,
 				"zh-Hans",
 				"zh-Hant",
 			);

+ 3 - 1
meetings_app/Localization/AppLanguageManager.swift

@@ -8,7 +8,7 @@ enum AppLanguageManager {
     private static let defaultsKey = "settings.appLanguageCode"
 
     /// UI languages shown in Settings → Language (order preserved).
-    private static let supportedLanguageCodes = ["en", "fr", "fr-CA", "zh-Hans", "zh-Hant"]
+    private static let supportedLanguageCodes = ["en", "fr", "fr-CA", "de", "zh-Hans", "zh-Hant"]
 
     /// `nil` follows the system language; otherwise uses the selected `.lproj` code.
     static var selectedLanguageCode: String? {
@@ -61,6 +61,8 @@ enum AppLanguageManager {
             return "Français"
         case "fr-CA":
             return "Français (Canada)"
+        case "de":
+            return "Deutsch"
         case "zh-Hans":
             return "简体中文"
         case "zh-Hant":

+ 4 - 0
meetings_app/de.lproj/InfoPlist.strings

@@ -0,0 +1,4 @@
+"CFBundleDisplayName" = "Meet KI-Assistent";
+"CFBundleName" = "Meet KI-Assistent";
+"NSMicrophoneUsageDescription" = "Mit Ihrer Zustimmung zeichnet die App das Besprechungsaudio auf diesem Mac auf und zeigt es nach der Besprechung im KI-Assistenten an.";
+"NSSpeechRecognitionUsageDescription" = "Diese App wandelt Ihr gespeichertes Besprechungsaudio in Texttranskripte für den KI-Assistenten um.";

+ 452 - 0
meetings_app/de.lproj/Localizable.strings

@@ -0,0 +1,452 @@
+/* AppBrand.name ("Meetings") absichtlich ausgelassen — Der App-Name bleibt im Code unverändert. */
+"AI Companion for Meet" = "Meet KI-Assistent";
+
+/* MARK: - Allgemein */
+"OK" = "OK";
+"Cancel" = "Abbrechen";
+"Continue" = "Fortfahren";
+"Apply" = "Übernehmen";
+"Reset" = "Zurücksetzen";
+"Save" = "Speichern";
+"Copy" = "Kopieren";
+"Copied" = "Kopiert";
+"Close" = "Schließen";
+"Join" = "Beitreten";
+"None" = "Keine";
+"Link" = "Link";
+"Stop" = "Stopp";
+"Address" = "Adresse";
+"Title" = "Titel";
+"Notes" = "Notizen";
+"Start" = "Start";
+"Premium" = "Premium";
+"Popular" = "Beliebt";
+"Browser" = "Browser";
+"Meeting" = "Besprechung";
+"Error" = "Fehler";
+"Success" = "Erfolg";
+
+/* MARK: - Statusleiste */
+"Meetings status menu" = "Besprechungsstatus-Menü";
+"Open App" = "App öffnen";
+"Join Meetings" = "Besprechungen beitreten";
+"Schedule" = "Planen";
+"Calendar" = "Kalender";
+"Widgets" = "Widgets";
+"AI Companion" = "KI-Assistent";
+"Settings" = "Einstellungen";
+"Top meetings" = "Besprechungen oben anheften";
+"No upcoming meetings" = "Keine anstehenden Besprechungen";
+"Sign Out" = "Abmelden";
+"Sign In" = "Anmelden";
+"Quit" = "Beenden";
+
+/* MARK: - Startbildschirm */
+"Preparing your meetings workspace" = "Vorbereitung Ihres Besprechungsarbeitsbereichs";
+"CONNECTING SERVICES" = "DIENSTE WERDEN VERBUNDEN";
+"READY" = "BEREIT";
+"Plan smart, achieve more" = "Intelligent planen, mehr erreichen";
+
+/* MARK: - Widgets */
+"Add Widget to Desktop" = "Widget zum Desktop hinzufügen";
+"Choose a size and add your Google Meet widget." = "Wählen Sie eine Größe und fügen Sie Ihr Meet-von-Google-Widget hinzu.";
+"Tip: Right-click a desktop widget to remove it." = "Tipp: Klicken Sie mit der rechten Maustaste auf ein Desktop-Widget, um es zu entfernen.";
+"Removed %@ widget from desktop." = "Widget %@ vom Desktop entfernt.";
+"Added %@ widget from desktop." = "Widget %@ vom Desktop hinzugefügt.";
+"Widgets are Premium only. Upgrade to add widgets." = "Widgets sind nur in Premium verfügbar. Upgraden Sie, um Widgets hinzuzufügen.";
+"Remove Widget" = "Widget entfernen";
+"Small" = "Klein";
+"Medium" = "Mittel";
+"Quick actions" = "Schnellaktionen";
+"Open Meet" = "Meet öffnen";
+"Upcoming meetings" = "Anstehende Besprechungen";
+"Sign in to see upcoming meetings" = "Melden Sie sich an, um anstehende Besprechungen zu sehen";
+"Sign in with Google" = "Mit Google-Konto anmelden";
+"Google Meet" = "Meet von Google";
+"Open and join quickly" = "Schnell öffnen und beitreten";
+"Refresh" = "Aktualisieren";
+
+/* MARK: - Seitenleiste und Navigation */
+"Planning" = "Planung";
+"Additional" = "Weitere";
+"Get Premium" = "Premium holen";
+"Manage Subscription" = "Abonnement verwalten";
+"App for Google Meet" = "App für Meet von Google";
+
+/* MARK: - Besprechung beitreten */
+"New Instant Meet" = "Neues sofortiges Meet";
+"Start instant Meet in more section with\nGoogle Meet meet." = "Starten Sie ein sofortiges Meet im Bereich „Mehr“\nmit Meet von Google.";
+"Join with Link" = "Mit Link beitreten";
+"Code or meet.google.com/…" = "Code oder meet.google.com/…";
+"Join with ID" = "Mit ID beitreten";
+"Join with URL" = "Mit URL beitreten";
+"Meeting URL" = "Besprechungs-URL";
+"Enter meeting URL..." = "Besprechungs-URL eingeben...";
+"Quick Join Meeting" = "Besprechung schnell beitreten";
+"Invalid Meet link" = "Ungültiger Meet-Link";
+"Enter a valid Google Meet link or meeting code (for example nkd-grps-duv, meet.google.com/nkd-grps-duv, or https://meet.google.com/nkd-grps-duv)." = "Geben Sie einen gültigen Meet-von-Google-Link oder Besprechungscode ein (z. B. nkd-grps-duv, meet.google.com/nkd-grps-duv oder https://meet.google.com/nkd-grps-duv).";
+"Instant Meeting" = "Sofortige Besprechung";
+"Connect Google to start Instant Meeting" = "Verbinden Sie Ihr Google-Konto, um eine sofortige Besprechung zu starten";
+"To auto-stop recording when the meeting ends, connect your Google account first." = "Um die Aufzeichnung automatisch zu beenden, wenn die Besprechung endet, verbinden Sie zuerst Ihr Google-Konto.";
+"Could not create Instant Meeting" = "Sofortige Besprechung konnte nicht erstellt werden";
+"Free trial used. Upgrade to continue." = "Kostenlose Testversion genutzt. Upgrade durchführen, um fortzufahren.";
+
+/* MARK: - Im Web surfen */
+"Browse the web" = "Im Web surfen";
+"Enter a web address (for example meet.google.com)." = "Geben Sie eine Webadresse ein (z. B. meet.google.com).";
+"Invalid address" = "Ungültige Adresse";
+"Enter a valid http or https URL." = "Geben Sie eine gültige HTTP- oder HTTPS-URL ein.";
+"Browse" = "Surfen";
+"Quick links" = "Schnelllinks";
+"Zoom help" = "Zoom-Hilfe";
+"https://example.com or example.com" = "https://example.com oder example.com";
+"Enter a valid web address, for example https://example.com" = "Geben Sie eine gültige Webadresse ein, z. B. https://example.com";
+"Address not allowed" = "Adresse nicht erlaubt";
+"This URL is not permitted with the current in-app browser policy (whitelist)." = "Diese URL ist mit der aktuellen Richtlinie für den In-App-Browser (Whitelist) nicht zulässig.";
+"Unable to load page" = "Seite kann nicht geladen werden";
+"Could not load this page in the in-app browser.\n\n%@" = "Diese Seite konnte nicht im In-App-Browser geladen werden.\n\n%@";
+"Page stopped loading" = "Laden der Seite wurde gestoppt";
+"Unable to open browser" = "Browser kann nicht geöffnet werden";
+"Unable to Open Safari" = "Safari kann nicht geöffnet werden";
+
+/* MARK: - Planung und Kalender */
+"All" = "Alle";
+"Today" = "Heute";
+"This week" = "Diese Woche";
+"This month" = "Diesen Monat";
+"Previous week" = "Vorherige Woche";
+"Previous month" = "Vorheriger Monat";
+"Custom range" = "Benutzerdefinierter Bereich";
+"No meetings match the selected filters." = "Keine Besprechungen entsprechen den ausgewählten Filtern.";
+"Adjust the date range and tap Apply." = "Passen Sie den Datumsbereich an und tippen Sie auf „Übernehmen“.";
+"Premium required. Get Premium now to unlock Calendar." = "Premium erforderlich. Holen Sie sich jetzt Premium, um den Kalender freizuschalten.";
+"Premium required. Click to open paywall." = "Premium erforderlich. Klicken Sie, um die Bezahlschranke zu öffnen.";
+"Get Premium to see events" = "Premium holen, um Ereignisse zu sehen";
+"Connect Google" = "Google-Konto verbinden";
+"Sign in with Google first to schedule a meeting from Calendar." = "Melden Sie sich zuerst mit Ihrem Google-Konto an, um eine Besprechung über den Kalender zu planen.";
+"Select date" = "Datum auswählen";
+"Choose a date to schedule your meeting." = "Wählen Sie ein Datum, um Ihre Besprechung zu planen.";
+"Google schedule" = "Google-Kalender";
+"To show scheduled meetings, connect your Google account. You’ll need a Google OAuth client ID (Desktop) and a redirect URI matching the app’s callback scheme." = "Um geplante Besprechungen anzuzeigen, verbinden Sie Ihr Google-Konto. Sie benötigen eine Google-OAuth-Client-ID (Desktop) und eine Weiterleitungs-URI, die dem Callback-Schema der App entspricht.";
+"Actions" = "Aktionen";
+"Schedule meeting" = "Besprechung planen";
+"Team sync" = "Team-Synchronisierung";
+"Duration (min)" = "Dauer (Min.)";
+"Refresh saved meetings" = "Gespeicherte Besprechungen aktualisieren";
+
+/* MARK: - Einstellungen */
+"Manage appearance, account, and app options." = "Verwalten Sie Aussehen, Konto und App-Optionen.";
+"Appearance" = "Aussehen";
+"Account" = "Konto";
+"App" = "App";
+"Notifications" = "Benachrichtigungen";
+"Help & Legal" = "Hilfe & Rechtliches";
+"Dark Mode" = "Dunkelmodus";
+"Language" = "Sprache";
+"System Language" = "Systemsprache";
+"Rate Us" = "Bewerten Sie uns";
+"Share App" = "App teilen";
+"Upgrade" = "Upgrade";
+"Privacy Policy" = "Datenschutzrichtlinie";
+"Support" = "Support";
+"Terms of Services" = "Nutzungsbedingungen";
+"AI Language 1" = "KI-Sprache 1";
+"AI Language 2" = "KI-Sprache 2";
+"Google account connected" = "Google-Konto verbunden";
+"Google account not connected" = "Google-Konto nicht verbunden";
+"Signed in" = "Angemeldet";
+"Sign in to sync your meetings and calendar." = "Melden Sie sich an, um Ihre Besprechungen und Ihren Kalender zu synchronisieren.";
+"Log out" = "Abmelden";
+"Check out %@ for managing and joining meetings." = "Probieren Sie %@ zum Verwalten und Beitreten von Besprechungen aus.";
+"Meetings App" = "Besprechungs-App";
+
+/* MARK: - Aufzeichnungszustimmung */
+"Record this meeting locally?" = "Diese Besprechung lokal aufzeichnen?";
+"With your consent, the app will record meeting audio on this Mac and show it in AI Companion after the meeting." = "Mit Ihrer Zustimmung zeichnet die App das Besprechungsaudio auf diesem Mac auf und zeigt es nach der Besprechung im KI-Assistenten an.";
+"Allow and Continue" = "Erlauben und fortfahren";
+"Continue Without Recording" = "Ohne Aufzeichnung fortfahren";
+"Transcription Languages" = "Transkriptionssprachen";
+"Preferred Language 1" = "Bevorzugte Sprache 1";
+"Preferred Language 2" = "Bevorzugte Sprache 2";
+"Microphone permission denied" = "Mikrofonberechtigung verweigert";
+"Microphone permission required" = "Mikrofonberechtigung erforderlich";
+"Enable microphone access in System Settings to record meetings locally." = "Aktivieren Sie den Mikrofonzugriff in den Systemeinstellungen, um Besprechungen lokal aufzuzeichnen.";
+"Could not start recording" = "Aufzeichnung konnte nicht gestartet werden";
+"Recording will start when the meeting starts" = "Die Aufzeichnung beginnt, wenn die Besprechung startet";
+"Meeting recording started (meeting + microphone)" = "Besprechungsaufzeichnung gestartet (Besprechung + Mikrofon)";
+"System audio unavailable. Recording microphone only." = "Systemaudio nicht verfügbar. Nur Mikrofon wird aufgezeichnet.";
+"Meeting recording started (microphone only)" = "Besprechungsaufzeichnung gestartet (nur Mikrofon)";
+"Meeting recording saved" = "Besprechungsaufzeichnung gespeichert";
+
+/* MARK: - KI-Assistent */
+"Get notes from your previous meetings" = "Holen Sie sich Notizen aus Ihren vorherigen Besprechungen";
+"Connect your Google account to see your AI Companion meeting history." = "Verbinden Sie Ihr Google-Konto, um Ihren KI-Assistenten-Besprechungsverlauf zu sehen.";
+"No previous meetings yet for %@. End a meeting to save it here and generate notes." = "Noch keine vorherigen Besprechungen für %@. Beenden Sie eine Besprechung, um sie hier zu speichern und Notizen zu generieren.";
+"this account" = "dieses Konto";
+"Previous meetings" = "Vorherige Besprechungen";
+"Recording in progress: %@" = "Aufzeichnung läuft: %@";
+"Started: %@" = "Gestartet: %@";
+"Stop Recording" = "Aufzeichnung stoppen";
+"Date: %@" = "Datum: %@";
+"Saved time: %@" = "Gespeichert am: %@";
+"Get Notes" = "Notizen holen";
+"Premium required. Click to unlock AI Companion notes." = "Premium erforderlich. Klicken Sie, um KI-Assistenten-Notizen freizuschalten.";
+"Play Audio" = "Audio abspielen";
+"Pause Audio" = "Audio pausieren";
+"Stopped" = "Gestoppt";
+"Speaking..." = "Spricht...";
+"Paused" = "Pausiert";
+"Playing..." = "Wiedergabe...";
+"Not playing" = "Nicht abgespielt";
+"Checking audio..." = "Audio wird überprüft...";
+"Audio file missing" = "Audiodatei fehlt";
+"Could not play recording" = "Aufzeichnung konnte nicht abgespielt werden";
+"Failed: %@" = "Fehlgeschlagen: %@";
+"Failed to play audio" = "Audio konnte nicht abgespielt werden";
+"decode error" = "Decodierungsfehler";
+"Loading..." = "Wird geladen...";
+"Buffering..." = "Puffern...";
+"Finished" = "Abgeschlossen";
+"Transcript not requested" = "Transkript nicht angefordert";
+"Transcript processing..." = "Transkript wird verarbeitet...";
+"Transcript ready" = "Transkript bereit";
+"Transcript unavailable (tap to retry)" = "Transkript nicht verfügbar (tippen Sie zum Wiederholen)";
+"Notes not requested" = "Notizen nicht angefordert";
+"Preparing notes, please wait..." = "Notizen werden vorbereitet, bitte warten...";
+"Notes ready" = "Notizen bereit";
+"Notes unavailable (tap to retry)" = "Notizen nicht verfügbar (tippen Sie zum Wiederholen)";
+"Transcript unavailable" = "Transkript nicht verfügbar";
+"Notes unavailable" = "Notizen nicht verfügbar";
+"Could not find recording details for this meeting." = "Aufzeichnungsdetails für diese Besprechung konnten nicht gefunden werden.";
+"Transcript - %@" = "Transkript - %@";
+"Notes - %@" = "Notizen - %@";
+"Meeting Notes" = "Besprechungsnotizen";
+"Transcript processing..." = "Transkript wird verarbeitet...";
+
+/* MARK: - Bezahlschranke und StoreKit */
+"Meetings Pro" = "Besprechungen Pro";
+"PREMIUM EXPERIENCE" = "PREMIUM-ERFAHRUNG";
+"Elevate your meetings workflow" = "Verbessern Sie Ihren Besprechungsablauf";
+"Unlock automation, premium meeting tools, and priority support for every session." = "Schalten Sie Automatisierung, Premium-Besprechungstools und Prioritäts-Support für jede Sitzung frei.";
+"Manage meetings" = "Besprechungen verwalten";
+"Smart scheduling" = "Intelligente Planung";
+"Faster workflow" = "Schnellerer Arbeitsablauf";
+"Reminder notifications" = "Erinnerungsbenachrichtigungen";
+"Monthly" = "Monatlich";
+"Bi Yearly" = "Halbjährlich";
+"Yearly" = "Jährlich";
+"Most Popular" = "Am beliebtesten";
+"%@ • Most Popular" = "%@ • Am beliebtesten";
+"3 days free trial" = "3 Tage kostenlose Testversion";
+"Cancel anytime" = "Jederzeit kündbar";
+"No lock-in" = "Keine Bindung";
+"Instant access" = "Sofortiger Zugriff";
+"Unlock all tools" = "Alle Tools freischalten";
+"Secure billing" = "Sichere Abrechnung";
+"Handled by Apple" = "Verarbeitet durch Apple";
+"Secured by Apple. Cancel anytime." = "Durch Apple gesichert. Jederzeit kündbar.";
+"Restore Purchase" = "Kauf wiederherstellen";
+"Continue with free plan" = "Mit kostenlosem Plan fortfahren";
+"Already Premium" = "Bereits Premium";
+"You are already premium. Do you want to continue with this purchase?" = "Sie haben bereits Premium. Möchten Sie mit diesem Kauf fortfahren?";
+"Current plan: %@. Choose a different package to switch." = "Aktueller Plan: %@. Wählen Sie ein anderes Paket zum Wechseln.";
+"Premium is active on this Apple ID." = "Premium ist auf dieser Apple-ID aktiv.";
+"Free for %@, then %@" = "Kostenlos für %@, dann %@";
+"Billed via App Store" = "Über den App Store abgerechnet";
+"%@  •  %@" = "%@  •  %@";
+"Save 0%" = "0 % sparen";
+"Save %@%%" = "%@ %% sparen";
+"month" = "Monat";
+"year" = "Jahr";
+"%@ free trial" = "%@ kostenlose Testversion";
+"Processing..." = "Wird verarbeitet...";
+"Premium Active" = "Premium aktiv";
+"Continue with 3 day trail" = "Mit 3-tägiger Testversion fortfahren";
+"Please Wait" = "Bitte warten";
+"A purchase is already being processed." = "Ein Kauf wird bereits verarbeitet.";
+"This Apple ID already has premium access." = "Diese Apple-ID hat bereits Premium-Zugriff.";
+"Purchase Complete" = "Kauf abgeschlossen";
+"Premium has been unlocked successfully." = "Premium wurde erfolgreich freigeschaltet.";
+"Purchase Pending" = "Kauf ausstehend";
+"Your purchase is pending approval. You can continue once it completes." = "Ihr Kauf wartet auf Genehmigung. Sie können fortfahren, sobald er abgeschlossen ist.";
+"Product Not Available" = "Produkt nicht verfügbar";
+"Unable to load this product. Check your StoreKit configuration and product IDs." = "Dieses Produkt kann nicht geladen werden. Überprüfen Sie Ihre StoreKit-Konfiguration und Produkt-IDs.";
+"Already Purchased" = "Bereits gekauft";
+"This plan is already active on your Apple ID." = "Dieser Plan ist bereits auf Ihrer Apple-ID aktiv.";
+"Purchase Failed" = "Kauf fehlgeschlagen";
+"Restore Purchases" = "Käufe wiederherstellen";
+"Purchases restored successfully." = "Käufe erfolgreich wiederhergestellt.";
+"No previous premium purchase was found for this Apple ID." = "Für diese Apple-ID wurde kein vorheriger Premium-Kauf gefunden.";
+"Restore failed: %@" = "Wiederherstellung fehlgeschlagen: %@";
+"Unable to Open Subscriptions" = "Abonnements können nicht geöffnet werden";
+"The subscriptions URL is invalid." = "Die Abonnement-URL ist ungültig.";
+"%@ tapped." = "%@ angetippt.";
+
+/* MARK: - Authentifizierung */
+"Google Sign-In" = "Anmeldung mit Google";
+
+/* MARK: - Sprach erkennungs-/Transkriptionsfehler */
+"Speech recognition permission denied. Enable it in System Settings and try again." = "Spracherkennungsberechtigung verweigert. Aktivieren Sie sie in den Systemeinstellungen und versuchen Sie es erneut.";
+"Speech recognition is restricted on this Mac." = "Die Spracherkennung ist auf diesem Mac eingeschränkt.";
+"Speech recognition authorization is unavailable." = "Spracherkennungsautorisierung ist nicht verfügbar.";
+"Speech recognizer is unavailable for the current locale." = "Der Spracherkenner ist für das aktuelle Gebietsschema nicht verfügbar.";
+"Speech recognizer is unavailable for %@." = "Der Spracherkenner ist für %@ nicht verfügbar.";
+"No audio was available to transcribe." = "Kein Audio zum Transkribieren verfügbar.";
+
+/* MARK: - StoreKit-Transaktionsfehler */
+"Unable to load products: %@" = "Produkte können nicht geladen werden: %@";
+"Product ID not found in StoreKit response. Requested: %@. Loaded IDs: %@" = "Produkt-ID in StoreKit-Antwort nicht gefunden. Angefragt: %@. Geladene IDs: %@";
+"Purchase verification failed." = "Kaufüberprüfung fehlgeschlagen.";
+"Unknown purchase state." = "Unbekannter Kaufzustand.";
+"none" = "keine";
+
+/* MARK: - Preistexte für die Bezahlschranke */
+"%@ one-time purchase" = "%@ einmaliger Kauf";
+"%@/month" = "%@/Monat";
+"%@/6 months" = "%@/6 Monate";
+"%@/year (3 days free trial)" = "%@/Jahr (3 Tage kostenlose Testversion)";
+"day" = "Tag";
+"week" = "Woche";
+"period" = "Zeitraum";
+"1 %@" = "1 %@";
+"%d %@s" = "%d %@";
+
+/* MARK: - Toasts und schnelle Rückmeldungen */
+"Meeting added successfully." = "Besprechung erfolgreich hinzugefügt.";
+"An issue occurred. Please try again." = "Ein Problem ist aufgetreten. Bitte versuchen Sie es erneut.";
+"Failed to load transcript." = "Transkript konnte nicht geladen werden.";
+"Failed to generate notes." = "Notizen konnten nicht generiert werden.";
+
+/* MARK: - Browserwarnungen */
+"Try Again" = "Erneut versuchen";
+"The in-app browser closed this page unexpectedly. You can try loading it again in this same window." = "Der In-App-Browser hat diese Seite unerwartet geschlossen. Sie können versuchen, sie in diesem Fenster erneut zu laden.";
+
+/* MARK: - Planungs- und Kalenderfehler */
+"Couldn't load schedule." = "Zeitplan konnte nicht geladen werden.";
+"Couldn't refresh schedule." = "Zeitplan konnte nicht aktualisiert werden.";
+"Couldn't connect Google account." = "Google-Konto konnte nicht verbunden werden.";
+"Couldn't logout Google account." = "Google-Konto konnte nicht abgemeldet werden.";
+"Couldn't load schedule" = "Zeitplan konnte nicht geladen werden";
+"Couldn't determine Meet meeting code from URL." = "Meet-Besprechungscode konnte nicht aus der URL ermittelt werden.";
+"Refreshing…" = "Aktualisierung…";
+"Connect Google to see meetings" = "Verbinden Sie Ihr Google-Konto, um Besprechungen zu sehen";
+"Connect to load schedule" = "Verbinden Sie sich, um den Zeitplan zu laden";
+"Loading…" = "Wird geladen…";
+"Loading schedule…" = "Zeitplan wird geladen…";
+"Start date must be on or before end date." = "Das Startdatum muss vor oder am Enddatum liegen.";
+"Invalid custom date range" = "Ungültiger benutzerdefinierter Datumsbereich";
+"No meetings" = "Keine Besprechungen";
+"No meetings for selected filters" = "Keine Besprechungen für die ausgewählten Filter";
+"No meetings on %@" = "Keine Besprechungen am %@";
+"1 meeting on %@" = "1 Besprechung am %@";
+"%d meetings on %@" = "%d Besprechungen am %@";
+"All day" = "Ganztägig";
+"Duration: all day" = "Dauer: ganztägig";
+"Duration: %dh %dm" = "Dauer: %dh %dm";
+"Duration: %dh" = "Dauer: %dh";
+"Duration: %dm" = "Dauer: %dm";
+"%@ - %@" = "%@ - %@";
+"Scheduled Meeting" = "Geplante Besprechung";
+
+/* MARK: - Popup zum Erstellen von Besprechungen */
+"Please enter a title." = "Bitte geben Sie einen Titel ein.";
+"Duration must be a positive number of minutes." = "Die Dauer muss eine positive Anzahl von Minuten sein.";
+"Invalid start time." = "Ungültige Startzeit.";
+
+/* MARK: - Erinnerungen und Benachrichtigungen */
+"Reminders" = "Erinnerungen";
+"1 Day Before" = "1 Tag vorher";
+"12 Hours Before" = "12 Stunden vorher";
+"1 Hour Before" = "1 Stunde vorher";
+"Starts in 1 day" = "Beginnt in 1 Tag";
+"Starts in 12 hours" = "Beginnt in 12 Stunden";
+"Starts in 1 hour" = "Beginnt in 1 Stunde";
+
+/* MARK: - Google OAuth-Fehler */
+"Missing Google OAuth Client ID." = "Fehlende Google-OAuth-Client-ID.";
+"Missing Google OAuth Client Secret." = "Fehlendes Google-OAuth-Client-Secret.";
+"Invalid OAuth callback URL." = "Ungültige OAuth-Callback-URL.";
+"Google did not return an authorization code." = "Google hat keinen Autorisierungscode zurückgegeben.";
+"Token exchange failed: %@" = "Token-Austausch fehlgeschlagen: %@";
+"Could not open browser for Google sign-in." = "Browser für die Anmeldung mit Google konnte nicht geöffnet werden.";
+"Google sign-in timed out." = "Zeitüberschreitung bei der Anmeldung mit Google.";
+"No stored Google tokens found." = "Keine gespeicherten Google-Konto-Token gefunden.";
+
+/* MARK: - KI-Assistent-/Transkriptionsfehler */
+"Recording not found." = "Aufzeichnung nicht gefunden.";
+"Local meeting audio is missing." = "Lokales Besprechungsaudio fehlt.";
+"Generated transcript was empty." = "Generiertes Transkript war leer.";
+"(No transcript entries found.)" = "(Keine Transkripteinträge gefunden.)";
+"No conference record found for this meeting." = "Kein Konferenzdatensatz für diese Besprechung gefunden.";
+"No transcript found for this meeting." = "Kein Transkript für diese Besprechung gefunden.";
+"Unable to create audio composition tracks." = "Audiospurkomposition konnte nicht erstellt werden.";
+"Unable to create audio export session." = "Audio-Export-Sitzung konnte nicht erstellt werden.";
+"Audio mix export failed." = "Audio-Mix-Export fehlgeschlagen.";
+"No display available for system audio capture." = "Kein Display für die Systemaudioerfassung verfügbar.";
+"Cannot add audio writer input." = "Audio-Writer-Eingabe kann nicht hinzugefügt werden.";
+
+/* MARK: - Google-API-Fehler */
+"Google Meet returned an invalid response." = "Meet von Google hat eine ungültige Antwort zurückgegeben.";
+"Google Meet API error (%d): %@" = "Meet-von-Google-API-Fehler (%d): %@";
+"Failed to parse Google Meet response: %@" = "Meet-von-Google-Antwort konnte nicht analysiert werden: %@";
+"Google Calendar returned an invalid response." = "Google Kalender hat eine ungültige Antwort zurückgegeben.";
+"Google Calendar API error (%d): %@" = "Google Kalender-API-Fehler (%d): %@";
+"Failed to parse Google Calendar events: %@" = "Google Kalender-Ereignisse konnten nicht analysiert werden: %@";
+
+/* MARK: - OpenAI-Fehler */
+"OpenAI API key is missing. Set OPENAI_API_KEY in the environment or app key vault." = "OpenAI-API-Schlüssel fehlt. Setzen Sie OPENAI_API_KEY in der Umgebung oder im App-Key-Vault.";
+"Notes generation returned an invalid response." = "Notizengenerierung hat eine ungültige Antwort zurückgegeben.";
+"Notes generation failed (%d): %@" = "Notizengenerierung fehlgeschlagen (%d): %@";
+"Notes generation returned empty text." = "Notizengenerierung hat leeren Text zurückgegeben.";
+"OpenAI transcription returned an invalid response." = "OpenAI-Transkription hat eine ungültige Antwort zurückgegeben.";
+"OpenAI transcription failed (%d): %@" = "OpenAI-Transkription fehlgeschlagen (%d): %@";
+"OpenAI transcription returned no text." = "OpenAI-Transkription hat keinen Text zurückgegeben.";
+
+/* MARK: - Navigation und In-App-Browser */
+"Open sites in the in-app browser (back, forward, reload, address bar). OAuth and “Continue in browser” flows stay inside the app." = "Öffnen Sie Websites im In-App-Browser (Zurück, Vor, Neu laden, Adressleiste). OAuth- und „Im Browser fortfahren“-Abläufe bleiben innerhalb der App.";
+"Open in app browser" = "Im App-Browser öffnen";
+"Meet help" = "Meet-Hilfe";
+"Go" = "Los";
+"Back" = "Zurück";
+"Forward" = "Vor";
+"Reload" = "Neu laden";
+
+/* MARK: - Planungs- und Kalenderbezeichnungen */
+"Google Calendar" = "Google Kalender";
+"Untitled meeting" = "Unbenannte Besprechung";
+"Created event missing start/end." = "Erstelltem Ereignis fehlen Start/Ende.";
+"Created event missing Meet/HTML link." = "Erstelltem Ereignis fehlt Meet/HTML-Link.";
+
+/* MARK: - Google-Konto */
+"Google account" = "Google-Konto";
+"%@, Google account" = "%@, Google-Konto";
+"Google User" = "Google-Benutzer";
+
+/* MARK: - Zoom beitreten (nicht verwendete Teile) */
+"Meeting ID" = "Besprechungs-ID";
+"Enter meeting ID..." = "Besprechungs-ID eingeben...";
+"Meeting Passcode" = "Besprechungscode";
+"Enter meeting passcode..." = "Besprechungscode eingeben...";
+
+/* MARK: - Bezahlschranke (alternative Vorteile) */
+"Virtual backgrounds" = "Virtuelle Hintergründe";
+"Tools for productivity" = "Tools für Produktivität";
+"24/7 support" = "24/7-Support";
+
+/* MARK: - Transkriptionssprecher */
+"You" = "Sie";
+
+/* MARK: - Schlüsselbundfehler */
+"Failed to read OAuth tokens from Keychain." = "OAuth-Token konnten nicht aus dem Schlüsselbund gelesen werden.";
+"Keychain returned an invalid token payload." = "Der Schlüsselbund hat eine ungültige Token-Nutzlast zurückgegeben.";
+"Failed to update OAuth tokens in Keychain." = "OAuth-Token konnten im Schlüsselbund nicht aktualisiert werden.";
+"Failed to save OAuth tokens to Keychain." = "OAuth-Token konnten nicht im Schlüsselbund gespeichert werden.";
+"Failed to delete OAuth tokens from Keychain." = "OAuth-Token konnten nicht aus dem Schlüsselbund gelöscht werden.";
+"Unable to allocate audio buffer." = "Audio-Puffer konnte nicht zugewiesen werden.";
+"Invalid revoke response." = "Ungültige Widerrufsantwort.";
+"Token revoke failed with status %d." = "Token-Widerruf fehlgeschlagen mit Status %d.";
+
+/* MARK: - Fehlerdiagnose */
+"Keychain: %d (%@)" = "Schlüsselbund: %d (%@)";
+"OSStatus: %d" = "OSStatus: %d";
+"Item: service=%@, account=%@" = "Element: Dienst=%@, Konto=%@";

+ 17 - 0
meetings_app/de.lproj/Main.strings

@@ -0,0 +1,17 @@
+/* Class = "NSMenuItem"; title = "AI Companion for Meet"; ObjectID = "1Xt-HY-uBw"; */
+"1Xt-HY-uBw.title" = "Meet KI-Assistent";
+
+/* Class = "NSMenu"; title = "AI Companion for Meet"; ObjectID = "uQy-DD-JDr"; */
+"uQy-DD-JDr.title" = "Meet KI-Assistent";
+
+/* Class = "NSMenuItem"; title = "About AI Companion for Meet"; ObjectID = "5kV-Vb-QxS"; */
+"5kV-Vb-QxS.title" = "Über Meet KI-Assistent";
+
+/* Class = "NSMenuItem"; title = "Hide AI Companion for Meet"; ObjectID = "Olw-nP-bQN"; */
+"Olw-nP-bQN.title" = "Meet KI-Assistent ausblenden";
+
+/* Class = "NSMenuItem"; title = "Quit AI Companion for Meet"; ObjectID = "4sb-4s-VLi"; */
+"4sb-4s-VLi.title" = "Meet KI-Assistent beenden";
+
+/* Class = "NSMenuItem"; title = "AI Companion for Meet Help"; ObjectID = "FKE-Sm-Kum"; */
+"FKE-Sm-Kum.title" = "Hilfe für Meet KI-Assistent";