Prechádzať zdrojové kódy

Add Dutch localization and language picker support.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 1 mesiac pred
rodič
commit
e561759eaf

+ 1 - 0
Info.plist

@@ -14,6 +14,7 @@
 		<string>fr</string>
 		<string>fr-CA</string>
 		<string>de</string>
+		<string>nl</string>
 		<string>sv</string>
 		<string>ko</string>
 		<string>pt-BR</string>

+ 1 - 0
meetings_app.xcodeproj/project.pbxproj

@@ -102,6 +102,7 @@
 				"es-ES",
 				"es-MX",
 				de,
+				nl,
 				sv,
 				ko,
 				"pt-BR",

+ 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", "es-ES", "es-MX", "de", "sv", "ko", "pt-BR", "ru", "vi", "zh-Hans", "zh-Hant"]
+    private static let supportedLanguageCodes = ["en", "fr", "fr-CA", "es-ES", "es-MX", "de", "nl", "sv", "ko", "pt-BR", "ru", "vi", "zh-Hans", "zh-Hant"]
 
     /// `nil` follows the system language; otherwise uses the selected `.lproj` code.
     static var selectedLanguageCode: String? {
@@ -93,6 +93,8 @@ enum AppLanguageManager {
             return "Español (México)"
         case "de":
             return "Deutsch"
+        case "nl":
+            return "Nederlands"
         case "sv":
             return "Svenska"
         case "ko":

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

@@ -0,0 +1,4 @@
+"CFBundleDisplayName" = "AI-assistent voor Google Meet";
+"CFBundleName" = "AI-assistent voor Google Meet";
+"NSMicrophoneUsageDescription" = "Met uw toestemming neemt de app het vergaderingsgeluid op deze Mac op en toont het in de AI-assistent na de vergadering.";
+"NSSpeechRecognitionUsageDescription" = "Deze app zet uw opgeslagen vergaderingsaudio om in teksttranscripten voor de AI-assistent.";

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

@@ -0,0 +1,452 @@
+/* AppBrand.name ("Meetings") opzettelijk weggelaten — de app-naam blijft ongewijzigd in de code. */
+"AI Companion for Meet" = "AI-assistent voor Google Meet";
+
+/* MARK: - Algemeen */
+"OK" = "OK";
+"Cancel" = "Annuleren";
+"Continue" = "Doorgaan";
+"Apply" = "Toepassen";
+"Reset" = "Herstellen";
+"Save" = "Opslaan";
+"Copy" = "Kopiëren";
+"Copied" = "Gekopieerd";
+"Close" = "Sluiten";
+"Join" = "Deelnemen";
+"None" = "Geen";
+"Link" = "Link";
+"Stop" = "Stoppen";
+"Address" = "Adres";
+"Title" = "Titel";
+"Notes" = "Notities";
+"Start" = "Starten";
+"Premium" = "Premium";
+"Popular" = "Populair";
+"Browser" = "Browser";
+"Meeting" = "Vergadering";
+"Error" = "Fout";
+"Success" = "Succes";
+
+/* MARK: - Statusbalk */
+"Meetings status menu" = "Statusmenu vergaderingen";
+"Open App" = "App openen";
+"Join Meetings" = "Deelnemen aan vergaderingen";
+"Schedule" = "Plannen";
+"Calendar" = "Agenda";
+"Widgets" = "Widgets";
+"AI Companion" = "AI-assistent";
+"Settings" = "Instellingen";
+"Top meetings" = "Vastgezette vergaderingen";
+"No upcoming meetings" = "Geen aankomende vergaderingen";
+"Sign Out" = "Uitloggen";
+"Sign In" = "Inloggen";
+"Quit" = "Afsluiten";
+
+/* MARK: - Startscherm */
+"Preparing your meetings workspace" = "Uw vergaderwerkruimte voorbereiden";
+"CONNECTING SERVICES" = "DIENSTEN VERBINDEN";
+"READY" = "GEREED";
+"Plan smart, achieve more" = "Slim plannen, meer bereiken";
+
+/* MARK: - Widgets */
+"Add Widget to Desktop" = "Widget aan bureaublad toevoegen";
+"Choose a size and add your Google Meet widget." = "Kies een formaat en voeg uw Google Meet-widget toe.";
+"Tip: Right-click a desktop widget to remove it." = "Tip: Klik met de rechtermuisknop op een bureaubladwidget om deze te verwijderen.";
+"Removed %@ widget from desktop." = "Widget %@ van bureaublad verwijderd.";
+"Added %@ widget from desktop." = "Widget %@ van bureaublad toegevoegd.";
+"Widgets are Premium only. Upgrade to add widgets." = "Widgets zijn alleen voor Premium. Upgrade om widgets toe te voegen.";
+"Remove Widget" = "Widget verwijderen";
+"Small" = "Klein";
+"Medium" = "Middel";
+"Quick actions" = "Snelle acties";
+"Open Meet" = "Google Meet openen";
+"Upcoming meetings" = "Aankomende vergaderingen";
+"Sign in to see upcoming meetings" = "Log in om aankomende vergaderingen te zien";
+"Sign in with Google" = "Inloggen met Google";
+"Google Meet" = "Google Meet";
+"Open and join quickly" = "Snel openen en deelnemen";
+"Refresh" = "Vernieuwen";
+
+/* MARK: - Zijbalk en navigatie */
+"Planning" = "Planning";
+"Additional" = "Extra";
+"Get Premium" = "Premium nemen";
+"Manage Subscription" = "Abonnement beheren";
+"App for Google Meet" = "App voor Google Meet";
+
+/* MARK: - Deelnemen aan een vergadering */
+"New Instant Meet" = "Nieuwe instant vergadering";
+"Start instant Meet in more section with\nGoogle Meet meet." = "Start een instant Google Meet-vergadering in het gedeelte Meer\nmet Google Meet.";
+"Join with Link" = "Deelnemen met link";
+"Code or meet.google.com/…" = "Code of meet.google.com/…";
+"Join with ID" = "Deelnemen met ID";
+"Join with URL" = "Deelnemen met URL";
+"Meeting URL" = "Vergader-URL";
+"Enter meeting URL..." = "Voer vergader-URL in...";
+"Quick Join Meeting" = "Snel deelnemen aan vergadering";
+"Invalid Meet link" = "Ongeldige Google 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)." = "Voer een geldige Google Meet-link of vergadercode in (bijvoorbeeld nkd-grps-duv, meet.google.com/nkd-grps-duv of https://meet.google.com/nkd-grps-duv).";
+"Instant Meeting" = "Instant vergadering";
+"Connect Google to start Instant Meeting" = "Verbind Google om een instant vergadering te starten";
+"To auto-stop recording when the meeting ends, connect your Google account first." = "Verbind eerst uw Google-account om de opname automatisch te stoppen wanneer de vergadering eindigt.";
+"Could not create Instant Meeting" = "Kon geen instant vergadering aanmaken";
+"Free trial used. Upgrade to continue." = "Gratis proefperiode gebruikt. Upgrade om door te gaan.";
+
+/* MARK: - Op het web browsen */
+"Browse the web" = "Op het web browsen";
+"Enter a web address (for example meet.google.com)." = "Voer een webadres in (bijvoorbeeld meet.google.com).";
+"Invalid address" = "Ongeldig adres";
+"Enter a valid http or https URL." = "Voer een geldige http- of https-URL in.";
+"Browse" = "Bladeren";
+"Quick links" = "Snelle links";
+"Zoom help" = "Zoom-hulp";
+"https://example.com or example.com" = "https://example.com of example.com";
+"Enter a valid web address, for example https://example.com" = "Voer een geldig webadres in, bijvoorbeeld https://example.com";
+"Address not allowed" = "Adres niet toegestaan";
+"This URL is not permitted with the current in-app browser policy (whitelist)." = "Deze URL is niet toegestaan volgens het huidige in-app browserbeleid (whitelist).";
+"Unable to load page" = "Kan pagina niet laden";
+"Could not load this page in the in-app browser.\n\n%@" = "Kon deze pagina niet laden in de in-app browser.\n\n%@";
+"Page stopped loading" = "Pagina laden gestopt";
+"Unable to open browser" = "Kan browser niet openen";
+"Unable to Open Safari" = "Kan Safari niet openen";
+
+/* MARK: - Plannen en agenda */
+"All" = "Alle";
+"Today" = "Vandaag";
+"This week" = "Deze week";
+"This month" = "Deze maand";
+"Previous week" = "Vorige week";
+"Previous month" = "Vorige maand";
+"Custom range" = "Aangepast bereik";
+"No meetings match the selected filters." = "Geen vergaderingen die overeenkomen met de geselecteerde filters.";
+"Adjust the date range and tap Apply." = "Pas het datumbereik aan en tik op Toepassen.";
+"Premium required. Get Premium now to unlock Calendar." = "Premium vereist. Neem nu Premium om de Agenda te ontgrendelen.";
+"Premium required. Click to open paywall." = "Premium vereist. Klik om de betaalmuur te openen.";
+"Get Premium to see events" = "Neem Premium om afspraken te zien";
+"Connect Google" = "Google verbinden";
+"Sign in with Google first to schedule a meeting from Calendar." = "Log eerst in met Google om een vergadering te plannen vanuit de Agenda.";
+"Select date" = "Datum selecteren";
+"Choose a date to schedule your meeting." = "Kies een datum om uw vergadering te plannen.";
+"Google schedule" = "Google-agenda";
+"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." = "Verbind uw Google-account om geplande vergaderingen te tonen. U hebt een Google OAuth-client-ID (Desktop) en een omleidings-URI nodig die overeenkomt met het callback-schema van de app.";
+"Actions" = "Acties";
+"Schedule meeting" = "Vergadering plannen";
+"Team sync" = "Teamsynchronisatie";
+"Duration (min)" = "Duur (min)";
+"Refresh saved meetings" = "Opgeslagen vergaderingen vernieuwen";
+
+/* MARK: - Instellingen */
+"Manage appearance, account, and app options." = "Beheer uiterlijk, account en app-opties.";
+"Appearance" = "Uiterlijk";
+"Account" = "Account";
+"App" = "App";
+"Notifications" = "Meldingen";
+"Help & Legal" = "Help & Juridisch";
+"Dark Mode" = "Donkere modus";
+"Language" = "Taal";
+"System Language" = "Systeemtaal";
+"Rate Us" = "Beoordeel ons";
+"Share App" = "App delen";
+"Upgrade" = "Upgraden";
+"Privacy Policy" = "Privacybeleid";
+"Support" = "Ondersteuning";
+"Terms of Services" = "Servicevoorwaarden";
+"AI Language 1" = "AI-taal 1";
+"AI Language 2" = "AI-taal 2";
+"Google account connected" = "Google-account verbonden";
+"Google account not connected" = "Google-account niet verbonden";
+"Signed in" = "Ingelogd";
+"Sign in to sync your meetings and calendar." = "Log in om uw vergaderingen en agenda te synchroniseren.";
+"Log out" = "Uitloggen";
+"Check out %@ for managing and joining meetings." = "Bekijk %@ voor het beheren van en deelnemen aan vergaderingen.";
+"Meetings App" = "Vergaderingen-app";
+
+/* MARK: - Toestemming voor opname */
+"Record this meeting locally?" = "Deze vergadering lokaal opnemen?";
+"With your consent, the app will record meeting audio on this Mac and show it in AI Companion after the meeting." = "Met uw toestemming neemt de app het vergaderingsgeluid op deze Mac op en toont het in de AI-assistent na de vergadering.";
+"Allow and Continue" = "Toestaan en doorgaan";
+"Continue Without Recording" = "Doorgaan zonder opnemen";
+"Transcription Languages" = "Transcriptietalen";
+"Preferred Language 1" = "Voorkeurstaal 1";
+"Preferred Language 2" = "Voorkeurstaal 2";
+"Microphone permission denied" = "Microfoontoestemming geweigerd";
+"Microphone permission required" = "Microfoontoestemming vereist";
+"Enable microphone access in System Settings to record meetings locally." = "Schakel microfoontoegang in Systeemvoorkeuren in om vergaderingen lokaal op te nemen.";
+"Could not start recording" = "Kon opname niet starten";
+"Recording will start when the meeting starts" = "Opname start wanneer de vergadering begint";
+"Meeting recording started (meeting + microphone)" = "Vergaderopname gestart (vergadering + microfoon)";
+"System audio unavailable. Recording microphone only." = "Systeemaudio niet beschikbaar. Alleen microfoon opnemen.";
+"Meeting recording started (microphone only)" = "Vergaderopname gestart (alleen microfoon)";
+"Meeting recording saved" = "Vergaderopname opgeslagen";
+
+/* MARK: - AI-assistent */
+"Get notes from your previous meetings" = "Krijg notities van uw eerdere vergaderingen";
+"Connect your Google account to see your AI Companion meeting history." = "Verbind uw Google-account om uw AI-assistent vergaderingsgeschiedenis te zien.";
+"No previous meetings yet for %@. End a meeting to save it here and generate notes." = "Nog geen eerdere vergaderingen voor %@. Beëindig een vergadering om deze hier op te slaan en notities te genereren.";
+"this account" = "dit account";
+"Previous meetings" = "Eerdere vergaderingen";
+"Recording in progress: %@" = "Opname bezig: %@";
+"Started: %@" = "Gestart: %@";
+"Stop Recording" = "Opname stoppen";
+"Date: %@" = "Datum: %@";
+"Saved time: %@" = "Opgeslagen tijd: %@";
+"Get Notes" = "Notities ophalen";
+"Premium required. Click to unlock AI Companion notes." = "Premium vereist. Klik om AI-assistent notities te ontgrendelen.";
+"Play Audio" = "Audio afspelen";
+"Pause Audio" = "Audio pauzeren";
+"Stopped" = "Gestopt";
+"Speaking..." = "Aan het spreken...";
+"Paused" = "Gepauzeerd";
+"Playing..." = "Aan het afspelen...";
+"Not playing" = "Niet aan het afspelen";
+"Checking audio..." = "Audio controleren...";
+"Audio file missing" = "Audiobestand ontbreekt";
+"Could not play recording" = "Kon opname niet afspelen";
+"Failed: %@" = "Mislukt: %@";
+"Failed to play audio" = "Afspelen audio mislukt";
+"decode error" = "decodeerfout";
+"Loading..." = "Laden...";
+"Buffering..." = "Bufferen...";
+"Finished" = "Voltooid";
+"Transcript not requested" = "Transcript niet aangevraagd";
+"Transcript processing..." = "Transcript verwerken...";
+"Transcript ready" = "Transcript gereed";
+"Transcript unavailable (tap to retry)" = "Transcript niet beschikbaar (tik om opnieuw te proberen)";
+"Notes not requested" = "Notities niet aangevraagd";
+"Preparing notes, please wait..." = "Notities voorbereiden, even geduld...";
+"Notes ready" = "Notities gereed";
+"Notes unavailable (tap to retry)" = "Notities niet beschikbaar (tik om opnieuw te proberen)";
+"Transcript unavailable" = "Transcript niet beschikbaar";
+"Notes unavailable" = "Notities niet beschikbaar";
+"Could not find recording details for this meeting." = "Kon geen opnamedetails voor deze vergadering vinden.";
+"Transcript - %@" = "Transcript - %@";
+"Notes - %@" = "Notities - %@";
+"Meeting Notes" = "Vergadernotities";
+"Transcript processing..." = "Transcript verwerken...";
+
+/* MARK: - Betaalmuur en StoreKit */
+"Meetings Pro" = "Vergaderingen Pro";
+"PREMIUM EXPERIENCE" = "PREMIUM-ERVARING";
+"Elevate your meetings workflow" = "Verbeter uw vergaderworkflow";
+"Unlock automation, premium meeting tools, and priority support for every session." = "Ontgrendel automatisering, premium vergadertools en prioritaire ondersteuning voor elke sessie.";
+"Manage meetings" = "Vergaderingen beheren";
+"Smart scheduling" = "Slim plannen";
+"Faster workflow" = "Snellere workflow";
+"Reminder notifications" = "Herinneringsmeldingen";
+"Monthly" = "Maandelijks";
+"Bi Yearly" = "Halfjaarlijks";
+"Yearly" = "Jaarlijks";
+"Most Popular" = "Meest populair";
+"%@ • Most Popular" = "%@ • Meest populair";
+"3 days free trial" = "3 dagen gratis proberen";
+"Cancel anytime" = "Altijd annuleerbaar";
+"No lock-in" = "Geen verplichting";
+"Instant access" = "Directe toegang";
+"Unlock all tools" = "Ontgrendel alle tools";
+"Secure billing" = "Veilige facturering";
+"Handled by Apple" = "Afgehandeld door Apple";
+"Secured by Apple. Cancel anytime." = "Beveiligd door Apple. Altijd annuleerbaar.";
+"Restore Purchase" = "Aankoop herstellen";
+"Continue with free plan" = "Doorgaan met gratis abonnement";
+"Already Premium" = "Al Premium";
+"You are already premium. Do you want to continue with this purchase?" = "U bent al premium. Wilt u doorgaan met deze aankoop?";
+"Current plan: %@. Choose a different package to switch." = "Huidig abonnement: %@. Kies een ander pakket om te wisselen.";
+"Premium is active on this Apple ID." = "Premium is actief op dit Apple ID.";
+"Free for %@, then %@" = "Gratis voor %@, daarna %@";
+"Billed via App Store" = "Gefactureerd via App Store";
+"%@  •  %@" = "%@  •  %@";
+"Save 0%" = "Bespaar 0%";
+"Save %@%%" = "Bespaar %@%%";
+"month" = "maand";
+"year" = "jaar";
+"%@ free trial" = "%@ gratis proefperiode";
+"Processing..." = "Verwerken...";
+"Premium Active" = "Premium actief";
+"Continue with 3 day trail" = "Doorgaan met 3 dagen proberen";
+"Please Wait" = "Even geduld";
+"A purchase is already being processed." = "Er wordt al een aankoop verwerkt.";
+"This Apple ID already has premium access." = "Dit Apple ID heeft al premium-toegang.";
+"Purchase Complete" = "Aankoop voltooid";
+"Premium has been unlocked successfully." = "Premium is succesvol ontgrendeld.";
+"Purchase Pending" = "Aankoop in behandeling";
+"Your purchase is pending approval. You can continue once it completes." = "Uw aankoop wacht op goedkeuring. U kunt doorgaan zodra deze is voltooid.";
+"Product Not Available" = "Product niet beschikbaar";
+"Unable to load this product. Check your StoreKit configuration and product IDs." = "Kan dit product niet laden. Controleer uw StoreKit-configuratie en product-ID's.";
+"Already Purchased" = "Al gekocht";
+"This plan is already active on your Apple ID." = "Dit abonnement is al actief op uw Apple ID.";
+"Purchase Failed" = "Aankoop mislukt";
+"Restore Purchases" = "Aankopen herstellen";
+"Purchases restored successfully." = "Aankopen succesvol hersteld.";
+"No previous premium purchase was found for this Apple ID." = "Er is geen eerdere premium-aankoop gevonden voor dit Apple ID.";
+"Restore failed: %@" = "Herstellen mislukt: %@";
+"Unable to Open Subscriptions" = "Kan abonnementen niet openen";
+"The subscriptions URL is invalid." = "De abonnementen-URL is ongeldig.";
+"%@ tapped." = "Op %@ getikt.";
+
+/* MARK: - Authenticatie */
+"Google Sign-In" = "Google-aanmelding";
+
+/* MARK: - Spraakherkenning/transcriptiefouten */
+"Speech recognition permission denied. Enable it in System Settings and try again." = "Toestemming voor spraakherkenning geweigerd. Schakel het in Systeemvoorkeuren in en probeer het opnieuw.";
+"Speech recognition is restricted on this Mac." = "Spraakherkenning is beperkt op deze Mac.";
+"Speech recognition authorization is unavailable." = "Autorisatie voor spraakherkenning is niet beschikbaar.";
+"Speech recognizer is unavailable for the current locale." = "Spraakherkenner is niet beschikbaar voor de huidige landinstelling.";
+"Speech recognizer is unavailable for %@." = "Spraakherkenner is niet beschikbaar voor %@.";
+"No audio was available to transcribe." = "Er was geen audio beschikbaar om te transcriberen.";
+
+/* MARK: - StoreKit-transactiefouten */
+"Unable to load products: %@" = "Kan producten niet laden: %@";
+"Product ID not found in StoreKit response. Requested: %@. Loaded IDs: %@" = "Product-ID niet gevonden in StoreKit-antwoord. Aangevraagd: %@. Geladen ID's: %@";
+"Purchase verification failed." = "Aankoopverificatie mislukt.";
+"Unknown purchase state." = "Onbekende aankoopstatus.";
+"none" = "geen";
+
+/* MARK: - Prijsteksten betaalmuur */
+"%@ one-time purchase" = "%@ eenmalige aankoop";
+"%@/month" = "%@/maand";
+"%@/6 months" = "%@/6 maanden";
+"%@/year (3 days free trial)" = "%@/jaar (3 dagen gratis proberen)";
+"day" = "dag";
+"week" = "week";
+"period" = "periode";
+"1 %@" = "1 %@";
+"%d %@s" = "%d %@";
+
+/* MARK: - Toasts en snelle feedback */
+"Meeting added successfully." = "Vergadering succesvol toegevoegd.";
+"An issue occurred. Please try again." = "Er is een probleem opgetreden. Probeer het opnieuw.";
+"Failed to load transcript." = "Transcript laden mislukt.";
+"Failed to generate notes." = "Notities genereren mislukt.";
+
+/* MARK: - Browserwaarschuwingen */
+"Try Again" = "Opnieuw proberen";
+"The in-app browser closed this page unexpectedly. You can try loading it again in this same window." = "De in-app browser heeft deze pagina onverwachts gesloten. U kunt proberen deze opnieuw te laden in hetzelfde venster.";
+
+/* MARK: - Plannings- en agendafouten */
+"Couldn't load schedule." = "Kon schema niet laden.";
+"Couldn't refresh schedule." = "Kon schema niet vernieuwen.";
+"Couldn't connect Google account." = "Kon Google-account niet verbinden.";
+"Couldn't logout Google account." = "Kon niet uitloggen bij Google-account.";
+"Couldn't load schedule" = "Kon schema niet laden";
+"Couldn't determine Meet meeting code from URL." = "Kon Google Meet-vergadercode niet bepalen uit URL.";
+"Refreshing…" = "Vernieuwen…";
+"Connect Google to see meetings" = "Verbind Google om vergaderingen te zien";
+"Connect to load schedule" = "Verbind om schema te laden";
+"Loading…" = "Laden…";
+"Loading schedule…" = "Schema laden…";
+"Start date must be on or before end date." = "Startdatum moet op of voor de einddatum liggen.";
+"Invalid custom date range" = "Ongeldig aangepast datumbereik";
+"No meetings" = "Geen vergaderingen";
+"No meetings for selected filters" = "Geen vergaderingen voor geselecteerde filters";
+"No meetings on %@" = "Geen vergaderingen op %@";
+"1 meeting on %@" = "1 vergadering op %@";
+"%d meetings on %@" = "%d vergaderingen op %@";
+"All day" = "Hele dag";
+"Duration: all day" = "Duur: hele dag";
+"Duration: %dh %dm" = "Duur: %du %dm";
+"Duration: %dh" = "Duur: %du";
+"Duration: %dm" = "Duur: %dm";
+"%@ - %@" = "%@ - %@";
+"Scheduled Meeting" = "Geplande vergadering";
+
+/* MARK: - Vergadering aanmaken pop-up */
+"Please enter a title." = "Voer een titel in.";
+"Duration must be a positive number of minutes." = "Duur moet een positief aantal minuten zijn.";
+"Invalid start time." = "Ongeldige starttijd.";
+
+/* MARK: - Herinneringen en meldingen */
+"Reminders" = "Herinneringen";
+"1 Day Before" = "1 dag ervoor";
+"12 Hours Before" = "12 uur ervoor";
+"1 Hour Before" = "1 uur ervoor";
+"Starts in 1 day" = "Begint over 1 dag";
+"Starts in 12 hours" = "Begint over 12 uur";
+"Starts in 1 hour" = "Begint over 1 uur";
+
+/* MARK: - Google OAuth-fouten */
+"Missing Google OAuth Client ID." = "Ontbrekende Google OAuth Client-ID.";
+"Missing Google OAuth Client Secret." = "Ontbrekend Google OAuth Client Secret.";
+"Invalid OAuth callback URL." = "Ongeldige OAuth callback-URL.";
+"Google did not return an authorization code." = "Google heeft geen autorisatiecode geretourneerd.";
+"Token exchange failed: %@" = "Tokenuitwisseling mislukt: %@";
+"Could not open browser for Google sign-in." = "Kon browser niet openen voor Google-aanmelding.";
+"Google sign-in timed out." = "Google-aanmelding verlopen.";
+"No stored Google tokens found." = "Geen opgeslagen Google-tokens gevonden.";
+
+/* MARK: - AI-assistent/transcriptiefouten */
+"Recording not found." = "Opname niet gevonden.";
+"Local meeting audio is missing." = "Lokale vergaderingsaudio ontbreekt.";
+"Generated transcript was empty." = "Gegenereerd transcript was leeg.";
+"(No transcript entries found.)" = "(Geen transcriptitems gevonden.)";
+"No conference record found for this meeting." = "Geen conferentieverslag gevonden voor deze vergadering.";
+"No transcript found for this meeting." = "Geen transcript gevonden voor deze vergadering.";
+"Unable to create audio composition tracks." = "Kan audiocompositietracks niet maken.";
+"Unable to create audio export session." = "Kan audio-exportsessie niet maken.";
+"Audio mix export failed." = "Export audiomix mislukt.";
+"No display available for system audio capture." = "Geen display beschikbaar voor systeemaudio-opname.";
+"Cannot add audio writer input." = "Kan audio-schrijfinvoer niet toevoegen.";
+
+/* MARK: - Google API-fouten */
+"Google Meet returned an invalid response." = "Google Meet retourneerde een ongeldig antwoord.";
+"Google Meet API error (%d): %@" = "Google Meet API-fout (%d): %@";
+"Failed to parse Google Meet response: %@" = "Parseren Google Meet-antwoord mislukt: %@";
+"Google Calendar returned an invalid response." = "Google Agenda retourneerde een ongeldig antwoord.";
+"Google Calendar API error (%d): %@" = "Google Agenda API-fout (%d): %@";
+"Failed to parse Google Calendar events: %@" = "Parseren Google Agenda-afspraken mislukt: %@";
+
+/* MARK: - OpenAI-fouten */
+"OpenAI API key is missing. Set OPENAI_API_KEY in the environment or app key vault." = "OpenAI API-sleutel ontbreekt. Stel OPENAI_API_KEY in de omgeving of app-sleutelkluis in.";
+"Notes generation returned an invalid response." = "Notitiegeneratie retourneerde een ongeldig antwoord.";
+"Notes generation failed (%d): %@" = "Notitiegeneratie mislukt (%d): %@";
+"Notes generation returned empty text." = "Notitiegeneratie retourneerde lege tekst.";
+"OpenAI transcription returned an invalid response." = "OpenAI-transcriptie retourneerde een ongeldig antwoord.";
+"OpenAI transcription failed (%d): %@" = "OpenAI-transcriptie mislukt (%d): %@";
+"OpenAI transcription returned no text." = "OpenAI-transcriptie retourneerde geen tekst.";
+
+/* MARK: - Navigatie en 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." = "Open sites in de in-app browser (terug, vooruit, vernieuwen, adresbalk). OAuth- en „Doorgaan in browser“-stromen blijven in de app.";
+"Open in app browser" = "Openen in app-browser";
+"Meet help" = "Google Meet-help";
+"Go" = "Ga";
+"Back" = "Terug";
+"Forward" = "Vooruit";
+"Reload" = "Vernieuwen";
+
+/* MARK: - Agenda- en planningslabels */
+"Google Calendar" = "Google Agenda";
+"Untitled meeting" = "Naamloze vergadering";
+"Created event missing start/end." = "Aangemaakte afspraak mist start/eind.";
+"Created event missing Meet/HTML link." = "Aangemaakte afspraak mist Google Meet/HTML-link.";
+
+/* MARK: - Google-account */
+"Google account" = "Google-account";
+"%@, Google account" = "%@, Google-account";
+"Google User" = "Google-gebruiker";
+
+/* MARK: - Deelnemen aan Zoom (ongebruikte delen) */
+"Meeting ID" = "Vergaderings-ID";
+"Enter meeting ID..." = "Voer vergaderings-ID in...";
+"Meeting Passcode" = "Vergaderingswachtwoord";
+"Enter meeting passcode..." = "Voer vergaderingswachtwoord in...";
+
+/* MARK: - Betaalmuur (alternatieve voordelen) */
+"Virtual backgrounds" = "Virtuele achtergronden";
+"Tools for productivity" = "Productiviteitstools";
+"24/7 support" = "24/7 ondersteuning";
+
+/* MARK: - Transcriptsprekers */
+"You" = "U";
+
+/* MARK: - Sleutelhangerfouten */
+"Failed to read OAuth tokens from Keychain." = "Lezen van OAuth-tokens uit Sleutelhanger mislukt.";
+"Keychain returned an invalid token payload." = "Sleutelhanger retourneerde een ongeldige token-payload.";
+"Failed to update OAuth tokens in Keychain." = "Bijwerken van OAuth-tokens in Sleutelhanger mislukt.";
+"Failed to save OAuth tokens to Keychain." = "Opslaan van OAuth-tokens in Sleutelhanger mislukt.";
+"Failed to delete OAuth tokens from Keychain." = "Verwijderen van OAuth-tokens uit Sleutelhanger mislukt.";
+"Unable to allocate audio buffer." = "Kan audiobuffer niet toewijzen.";
+"Invalid revoke response." = "Ongeldig intrekkingsantwoord.";
+"Token revoke failed with status %d." = "Token intrekken mislukt met status %d.";
+
+/* MARK: - Foutdiagnose */
+"Keychain: %d (%@)" = "Sleutelhanger: %d (%@)";
+"OSStatus: %d" = "OSStatus: %d";
+"Item: service=%@, account=%@" = "Item: service=%@, account=%@";

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

@@ -0,0 +1,17 @@
+/* Class = "NSMenuItem"; title = "AI Companion for Meet"; ObjectID = "1Xt-HY-uBw"; */
+"1Xt-HY-uBw.title" = "AI-assistent voor Google Meet";
+
+/* Class = "NSMenu"; title = "AI Companion for Meet"; ObjectID = "uQy-DD-JDr"; */
+"uQy-DD-JDr.title" = "AI-assistent voor Google Meet";
+
+/* Class = "NSMenuItem"; title = "About AI Companion for Meet"; ObjectID = "5kV-Vb-QxS"; */
+"5kV-Vb-QxS.title" = "Over AI-assistent voor Google Meet";
+
+/* Class = "NSMenuItem"; title = "Hide AI Companion for Meet"; ObjectID = "Olw-nP-bQN"; */
+"Olw-nP-bQN.title" = "AI-assistent voor Google Meet verbergen";
+
+/* Class = "NSMenuItem"; title = "Quit AI Companion for Meet"; ObjectID = "4sb-4s-VLi"; */
+"4sb-4s-VLi.title" = "AI-assistent voor Google Meet afsluiten";
+
+/* Class = "NSMenuItem"; title = "AI Companion for Meet Help"; ObjectID = "FKE-Sm-Kum"; */
+"FKE-Sm-Kum.title" = "Help voor AI-assistent voor Google Meet";