Преглед изворни кода

Add Swedish localization and language picker support.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 пре 1 месец
родитељ
комит
891f9980cd

+ 1 - 0
Info.plist

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

+ 1 - 0
meetings_app.xcodeproj/project.pbxproj

@@ -100,6 +100,7 @@
 				fr,
 				"fr-CA",
 				de,
+				sv,
 				"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", "de", "zh-Hans", "zh-Hant"]
+    private static let supportedLanguageCodes = ["en", "fr", "fr-CA", "de", "sv", "zh-Hans", "zh-Hant"]
 
     /// `nil` follows the system language; otherwise uses the selected `.lproj` code.
     static var selectedLanguageCode: String? {
@@ -63,6 +63,8 @@ enum AppLanguageManager {
             return "Français (Canada)"
         case "de":
             return "Deutsch"
+        case "sv":
+            return "Svenska"
         case "zh-Hans":
             return "简体中文"
         case "zh-Hant":

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

@@ -0,0 +1,4 @@
+"CFBundleDisplayName" = "Meet AI-assistent";
+"CFBundleName" = "Meet AI-assistent";
+"NSMicrophoneUsageDescription" = "Med ditt samtycke kommer appen att spela in mötesljud på den här Mac-datorn och visa det i AI-assistenten efter mötet.";
+"NSSpeechRecognitionUsageDescription" = "Den här appen omvandlar ditt sparade mötesljud till texttranskriptioner för AI-assistenten.";

+ 451 - 0
meetings_app/sv.lproj/Localizable.strings

@@ -0,0 +1,451 @@
+/* AppBrand.name ("Meetings") medvetet utelämnat — appnamnet förblir oförändrat i koden. */
+"AI Companion for Meet" = "Meet AI-assistent";
+
+/* MARK: - Allmänt */
+"OK" = "OK";
+"Cancel" = "Avbryt";
+"Continue" = "Fortsätt";
+"Apply" = "Verkställ";
+"Reset" = "Återställ";
+"Save" = "Spara";
+"Copy" = "Kopiera";
+"Copied" = "Kopierad";
+"Close" = "Stäng";
+"Join" = "Gå med";
+"None" = "Ingen";
+"Link" = "Länk";
+"Stop" = "Stoppa";
+"Address" = "Adress";
+"Title" = "Titel";
+"Notes" = "Anteckningar";
+"Start" = "Starta";
+"Premium" = "Premium";
+"Popular" = "Populär";
+"Browser" = "Webbläsare";
+"Meeting" = "Möte";
+"Error" = "Fel";
+"Success" = "Lyckades";
+
+/* MARK: - Statusfält */
+"Meetings status menu" = "Statusmeny för möten";
+"Open App" = "Öppna appen";
+"Join Meetings" = "Gå med i möten";
+"Schedule" = "Schemalägg";
+"Calendar" = "Kalender";
+"Widgets" = "Widgetar";
+"AI Companion" = "AI-assistent";
+"Settings" = "Inställningar";
+"Top meetings" = "Möten högst upp";
+"No upcoming meetings" = "Inga kommande möten";
+"Sign Out" = "Logga ut";
+"Sign In" = "Logga in";
+"Quit" = "Avsluta";
+
+/* MARK: - Startskärm */
+"Preparing your meetings workspace" = "Förbereder din mötesarbetsyta";
+"CONNECTING SERVICES" = "ANSLUTER TJÄNSTER";
+"READY" = "REDO";
+"Plan smart, achieve more" = "Planera smart, uppnå mer";
+
+/* MARK: - Widgetar */
+"Add Widget to Desktop" = "Lägg till widget på skrivbordet";
+"Choose a size and add your Google Meet widget." = "Välj en storlek och lägg till din Meet-från-Google-widget.";
+"Tip: Right-click a desktop widget to remove it." = "Tips: Högerklicka på en skrivbordswidget för att ta bort den.";
+"Removed %@ widget from desktop." = "Tog bort %@-widget från skrivbordet.";
+"Added %@ widget from desktop." = "Lade till %@-widget från skrivbordet.";
+"Widgets are Premium only. Upgrade to add widgets." = "Widgetar är endast för Premium. Uppgradera för att lägga till widgets.";
+"Remove Widget" = "Ta bort widget";
+"Small" = "Liten";
+"Medium" = "Medium";
+"Quick actions" = "Snabba åtgärder";
+"Open Meet" = "Öppna Meet";
+"Upcoming meetings" = "Kommande möten";
+"Sign in to see upcoming meetings" = "Logga in för att se kommande möten";
+"Sign in with Google" = "Logga in med Google-konto";
+"Google Meet" = "Meet från Google";
+"Open and join quickly" = "Öppna och gå med snabbt";
+"Refresh" = "Uppdatera";
+
+/* MARK: - Sidofält och navigering */
+"Planning" = "Planering";
+"Additional" = "Ytterligare";
+"Get Premium" = "Skaffa Premium";
+"Manage Subscription" = "Hantera prenumeration";
+"App for Google Meet" = "App för Meet från Google";
+
+/* MARK: - Gå med i möte */
+"New Instant Meet" = "Nytt direkt-Meet";
+"Start instant Meet in more section with\nGoogle Meet meet." = "Starta ett direkt-Meet i avsnittet Mer\nmed Meet från Google.";
+"Join with Link" = "Gå med via länk";
+"Code or meet.google.com/…" = "Kod eller meet.google.com/…";
+"Join with ID" = "Gå med via ID";
+"Join with URL" = "Gå med via URL";
+"Meeting URL" = "Mötes-URL";
+"Enter meeting URL..." = "Ange mötes-URL...";
+"Quick Join Meeting" = "Gå snabbt med i möte";
+"Invalid Meet link" = "Ogiltig Meet-länk";
+"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)." = "Ange en giltig Meet-från-Google-länk eller möteskod (till exempel nkd-grps-duv, meet.google.com/nkd-grps-duv eller https://meet.google.com/nkd-grps-duv).";
+"Instant Meeting" = "Direktmöte";
+"Connect Google to start Instant Meeting" = "Anslut ditt Google-konto för att starta direktmöte";
+"To auto-stop recording when the meeting ends, connect your Google account first." = "För att automatiskt stoppa inspelningen när mötet slutar, anslut först ditt Google-konto.";
+"Could not create Instant Meeting" = "Kunde inte skapa direktmöte";
+"Free trial used. Upgrade to continue." = "Gratis provperiod använd. Uppgradera för att fortsätta.";
+
+/* MARK: - Surfa på webben */
+"Browse the web" = "Surfa på webben";
+"Enter a web address (for example meet.google.com)." = "Ange en webbadress (till exempel meet.google.com).";
+"Invalid address" = "Ogiltig adress";
+"Enter a valid http or https URL." = "Ange en giltig http- eller https-URL.";
+"Browse" = "Bläddra";
+"Quick links" = "Snabblänkar";
+"Zoom help" = "Zoom-hjälp";
+"https://example.com or example.com" = "https://example.com eller example.com";
+"Enter a valid web address, for example https://example.com" = "Ange en giltig webbadress, till exempel https://example.com";
+"Address not allowed" = "Adressen är inte tillåten";
+"This URL is not permitted with the current in-app browser policy (whitelist)." = "Denna URL är inte tillåten enligt den aktuella webbläsarpolicyn i appen (vitlista).";
+"Unable to load page" = "Kunde inte ladda sidan";
+"Could not load this page in the in-app browser.\n\n%@" = "Kunde inte ladda denna sida i appens webbläsare.\n\n%@";
+"Page stopped loading" = "Sidan slutade laddas";
+"Unable to open browser" = "Kunde inte öppna webbläsaren";
+"Unable to Open Safari" = "Kunde inte öppna Safari";
+
+/* MARK: - Schemaläggning och kalender */
+"All" = "Alla";
+"Today" = "Idag";
+"This week" = "Denna vecka";
+"This month" = "Denna månad";
+"Previous week" = "Föregående vecka";
+"Previous month" = "Föregående månad";
+"Custom range" = "Anpassat intervall";
+"No meetings match the selected filters." = "Inga möten matchar de valda filtren.";
+"Adjust the date range and tap Apply." = "Justera datumintervallet och tryck på Verkställ.";
+"Premium required. Get Premium now to unlock Calendar." = "Premium krävs. Skaffa Premium nu för att låsa upp Kalender.";
+"Premium required. Click to open paywall." = "Premium krävs. Klicka för att öppna betalväggen.";
+"Get Premium to see events" = "Skaffa Premium för att se händelser";
+"Connect Google" = "Anslut Google-konto";
+"Sign in with Google first to schedule a meeting from Calendar." = "Logga först in med ditt Google-konto för att schemalägga ett möte från kalendern.";
+"Select date" = "Välj datum";
+"Choose a date to schedule your meeting." = "Välj ett datum för att schemalägga ditt möte.";
+"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." = "För att visa schemalagda möten, anslut ditt Google-konto. Du behöver ett Google-OAuth-klient-ID (dator) och en omdirigerings-URI som matchar appens återanropschema.";
+"Actions" = "Åtgärder";
+"Schedule meeting" = "Schemalägg möte";
+"Team sync" = "Teamsynkronisering";
+"Duration (min)" = "Längd (min)";
+"Refresh saved meetings" = "Uppdatera sparade möten";
+
+/* MARK: - Inställningar */
+"Manage appearance, account, and app options." = "Hantera utseende, konto och appalternativ.";
+"Appearance" = "Utseende";
+"Account" = "Konto";
+"App" = "App";
+"Notifications" = "Aviseringar";
+"Help & Legal" = "Hjälp och juridisk information";
+"Dark Mode" = "Mörkt läge";
+"Language" = "Språk";
+"System Language" = "Systemets språk";
+"Rate Us" = "Betygsätt oss";
+"Share App" = "Dela appen";
+"Upgrade" = "Uppgradera";
+"Privacy Policy" = "Integritetspolicy";
+"Support" = "Support";
+"Terms of Services" = "Användarvillkor";
+"AI Language 1" = "AI-språk 1";
+"AI Language 2" = "AI-språk 2";
+"Google account connected" = "Google-konto anslutet";
+"Google account not connected" = "Google-konto inte anslutet";
+"Signed in" = "Inloggad";
+"Sign in to sync your meetings and calendar." = "Logga in för att synkronisera dina möten och din kalender.";
+"Log out" = "Logga ut";
+"Check out %@ for managing and joining meetings." = "Prova %@ för att hantera och gå med i möten.";
+"Meetings App" = "Mötesappen";
+
+/* MARK: - Samtycke för inspelning */
+"Record this meeting locally?" = "Spela in det här mötet lokalt?";
+"With your consent, the app will record meeting audio on this Mac and show it in AI Companion after the meeting." = "Med ditt samtycke kommer appen att spela in mötesljud på den här Mac-datorn och visa det i AI-assistenten efter mötet.";
+"Allow and Continue" = "Tillåt och fortsätt";
+"Continue Without Recording" = "Fortsätt utan inspelning";
+"Transcription Languages" = "Transkriberingsspråk";
+"Preferred Language 1" = "Föredraget språk 1";
+"Preferred Language 2" = "Föredraget språk 2";
+"Microphone permission denied" = "Mikrofontillstånd nekad";
+"Microphone permission required" = "Mikrofontillstånd krävs";
+"Enable microphone access in System Settings to record meetings locally." = "Aktivera mikrofonåtkomst i Systeminställningar för att spela in möten lokalt.";
+"Could not start recording" = "Kunde inte starta inspelning";
+"Recording will start when the meeting starts" = "Inspelningen startar när mötet börjar";
+"Meeting recording started (meeting + microphone)" = "Mötesinspelning startad (möte + mikrofon)";
+"System audio unavailable. Recording microphone only." = "Systemljud är inte tillgängligt. Spelar bara in mikrofon.";
+"Meeting recording started (microphone only)" = "Mötesinspelning startad (endast mikrofon)";
+"Meeting recording saved" = "Mötesinspelning sparad";
+
+/* MARK: - AI-assistent */
+"Get notes from your previous meetings" = "Få anteckningar från dina tidigare möten";
+"Connect your Google account to see your AI Companion meeting history." = "Anslut ditt Google-konto för att se din AI-assistent-möteshistorik.";
+"No previous meetings yet for %@. End a meeting to save it here and generate notes." = "Inga tidigare möten än för %@. Avsluta ett möte för att spara det här och generera anteckningar.";
+"this account" = "det här kontot";
+"Previous meetings" = "Tidigare möten";
+"Recording in progress: %@" = "Inspelning pågår: %@";
+"Started: %@" = "Startad: %@";
+"Stop Recording" = "Stoppa inspelning";
+"Date: %@" = "Datum: %@";
+"Saved time: %@" = "Sparad tid: %@";
+"Get Notes" = "Hämta anteckningar";
+"Premium required. Click to unlock AI Companion notes." = "Premium krävs. Klicka för att låsa upp AI-assistentens anteckningar.";
+"Play Audio" = "Spela upp ljud";
+"Pause Audio" = "Pausa ljud";
+"Stopped" = "Stoppad";
+"Speaking..." = "Tal...";
+"Paused" = "Pausad";
+"Playing..." = "Spelar upp...";
+"Not playing" = "Spelar inte upp";
+"Checking audio..." = "Kontrollerar ljud...";
+"Audio file missing" = "Ljudfil saknas";
+"Could not play recording" = "Kunde inte spela upp inspelning";
+"Failed: %@" = "Misslyckades: %@";
+"Failed to play audio" = "Misslyckades att spela upp ljud";
+"decode error" = "avkodningsfel";
+"Loading..." = "Laddar...";
+"Buffering..." = "Buffrar...";
+"Finished" = "Avslutad";
+"Transcript not requested" = "Transkription begärdes inte";
+"Transcript processing..." = "Bearbetar transkription...";
+"Transcript ready" = "Transkription klar";
+"Transcript unavailable (tap to retry)" = "Transkription inte tillgänglig (tryck för att försöka igen)";
+"Notes not requested" = "Anteckningar begärdes inte";
+"Preparing notes, please wait..." = "Förbereder anteckningar, vänta...";
+"Notes ready" = "Anteckningar klara";
+"Notes unavailable (tap to retry)" = "Anteckningar inte tillgängliga (tryck för att försöka igen)";
+"Transcript unavailable" = "Transkription inte tillgänglig";
+"Notes unavailable" = "Anteckningar inte tillgängliga";
+"Could not find recording details for this meeting." = "Kunde inte hitta inspelningsinformation för det här mötet.";
+"Transcript - %@" = "Transkription - %@";
+"Notes - %@" = "Anteckningar - %@";
+"Meeting Notes" = "Mötesanteckningar";
+
+/* MARK: - Betalvägg och StoreKit */
+"Meetings Pro" = "Möten Pro";
+"PREMIUM EXPERIENCE" = "PREMIUMUPPLEVELSE";
+"Elevate your meetings workflow" = "Höj din mötesarbetsprocess";
+"Unlock automation, premium meeting tools, and priority support for every session." = "Lås upp automatisering, premiummötesverktyg och prioriterad support för varje session.";
+"Manage meetings" = "Hantera möten";
+"Smart scheduling" = "Smart schemaläggning";
+"Faster workflow" = "Snabbare arbetsflöde";
+"Reminder notifications" = "Påminnelseaviseringar";
+"Monthly" = "Månadsvis";
+"Bi Yearly" = "Halvårsvis";
+"Yearly" = "Årsvis";
+"Most Popular" = "Mest populär";
+"%@ • Most Popular" = "%@ • Mest populär";
+"3 days free trial" = "3 dagars gratis provperiod";
+"Cancel anytime" = "Säg upp när som helst";
+"No lock-in" = "Ingen bindningstid";
+"Instant access" = "Omedelbar åtkomst";
+"Unlock all tools" = "Lås upp alla verktyg";
+"Secure billing" = "Säker fakturering";
+"Handled by Apple" = "Hanteras av Apple";
+"Secured by Apple. Cancel anytime." = "Säkrad av Apple. Säg upp när som helst.";
+"Restore Purchase" = "Återställ köp";
+"Continue with free plan" = "Fortsätt med gratisplan";
+"Already Premium" = "Redan Premium";
+"You are already premium. Do you want to continue with this purchase?" = "Du har redan Premium. Vill du fortsätta med detta köp?";
+"Current plan: %@. Choose a different package to switch." = "Nuvarande plan: %@. Välj ett annat paket för att byta.";
+"Premium is active on this Apple ID." = "Premium är aktivt på detta Apple-ID.";
+"Free for %@, then %@" = "Gratis i %@, sedan %@";
+"Billed via App Store" = "Faktureras via App Store";
+"%@  •  %@" = "%@  •  %@";
+"Save 0%" = "Spara 0 %";
+"Save %@%%" = "Spara %@ %%";
+"month" = "månad";
+"year" = "år";
+"%@ free trial" = "%@ gratis provperiod";
+"Processing..." = "Bearbetar...";
+"Premium Active" = "Premium aktivt";
+"Continue with 3 day trail" = "Fortsätt med 3 dagars provperiod";
+"Please Wait" = "Vänta";
+"A purchase is already being processed." = "Ett köp bearbetas redan.";
+"This Apple ID already has premium access." = "Detta Apple-ID har redan Premium-åtkomst.";
+"Purchase Complete" = "Köp slutfört";
+"Premium has been unlocked successfully." = "Premium har låsts upp framgångsrikt.";
+"Purchase Pending" = "Köp väntar";
+"Your purchase is pending approval. You can continue once it completes." = "Ditt köp väntar på godkännande. Du kan fortsätta när det är slutfört.";
+"Product Not Available" = "Produkten är inte tillgänglig";
+"Unable to load this product. Check your StoreKit configuration and product IDs." = "Kunde inte ladda denna produkt. Kontrollera din StoreKit-konfiguration och produkt-ID.";
+"Already Purchased" = "Redan köpt";
+"This plan is already active on your Apple ID." = "Denna plan är redan aktiv på ditt Apple-ID.";
+"Purchase Failed" = "Köp misslyckades";
+"Restore Purchases" = "Återställ köp";
+"Purchases restored successfully." = "Köp återställda framgångsrikt.";
+"No previous premium purchase was found for this Apple ID." = "Inget tidigare Premium-köp hittades för detta Apple-ID.";
+"Restore failed: %@" = "Återställning misslyckades: %@";
+"Unable to Open Subscriptions" = "Kunde inte öppna prenumerationer";
+"The subscriptions URL is invalid." = "Prenumerations-URL:en är ogiltig.";
+"%@ tapped." = "%@ trycktes.";
+
+/* MARK: - Autentisering */
+"Google Sign-In" = "Inloggning med Google";
+
+/* MARK: - Taligenkännings-/transkriberingsfel */
+"Speech recognition permission denied. Enable it in System Settings and try again." = "Taligenkänningstillstånd nekad. Aktivera det i Systeminställningar och försök igen.";
+"Speech recognition is restricted on this Mac." = "Taligenkänning är begränsad på denna Mac.";
+"Speech recognition authorization is unavailable." = "Auktorisering för taligenkänning är inte tillgänglig.";
+"Speech recognizer is unavailable for the current locale." = "Taligenkännaren är inte tillgänglig för den aktuella språkinställningen.";
+"Speech recognizer is unavailable for %@." = "Taligenkännaren är inte tillgänglig för %@.";
+"No audio was available to transcribe." = "Inget ljud fanns tillgängligt att transkribera.";
+
+/* MARK: - StoreKit-transaktionsfel */
+"Unable to load products: %@" = "Kunde inte ladda produkter: %@";
+"Product ID not found in StoreKit response. Requested: %@. Loaded IDs: %@" = "Produkt-ID hittades inte i StoreKit-svar. Begärdes: %@. Laddade ID: %@";
+"Purchase verification failed." = "Köpverifiering misslyckades.";
+"Unknown purchase state." = "Okänt köptillstånd.";
+"none" = "ingen";
+
+/* MARK: - Pristexter för betalvägg */
+"%@ one-time purchase" = "%@ engångsköp";
+"%@/month" = "%@/månad";
+"%@/6 months" = "%@/6 månader";
+"%@/year (3 days free trial)" = "%@/år (3 dagars gratis provperiod)";
+"day" = "dag";
+"week" = "vecka";
+"period" = "period";
+"1 %@" = "1 %@";
+"%d %@s" = "%d %@";
+
+/* MARK: - Toasts och snabb feedback */
+"Meeting added successfully." = "Möte har lagts till.";
+"An issue occurred. Please try again." = "Ett problem uppstod. Försök igen.";
+"Failed to load transcript." = "Misslyckades att ladda transkription.";
+"Failed to generate notes." = "Misslyckades att generera anteckningar.";
+
+/* MARK: - Webbläsarvarningar */
+"Try Again" = "Försök igen";
+"The in-app browser closed this page unexpectedly. You can try loading it again in this same window." = "Appens webbläsare stängde denna sida oväntat. Du kan försöka ladda den igen i samma fönster.";
+
+/* MARK: - Schemaläggnings- och kalenderfel */
+"Couldn't load schedule." = "Kunde inte ladda schema.";
+"Couldn't refresh schedule." = "Kunde inte uppdatera schema.";
+"Couldn't connect Google account." = "Google-kontot kunde inte anslutas.";
+"Couldn't logout Google account." = "Google-kontot kunde inte loggas ut.";
+"Couldn't load schedule" = "Kunde inte ladda schema";
+"Couldn't determine Meet meeting code from URL." = "Kunde inte fastställa Meet-möteskod från URL.";
+"Refreshing…" = "Uppdaterar...";
+"Connect Google to see meetings" = "Anslut ditt Google-konto för att se möten";
+"Connect to load schedule" = "Anslut för att ladda schema";
+"Loading…" = "Laddar...";
+"Loading schedule…" = "Laddar schema...";
+"Start date must be on or before end date." = "Startdatum måste vara före eller samma som slutdatum.";
+"Invalid custom date range" = "Ogiltigt anpassat datumintervall";
+"No meetings" = "Inga möten";
+"No meetings for selected filters" = "Inga möten för valda filter";
+"No meetings on %@" = "Inga möten den %@";
+"1 meeting on %@" = "1 möte den %@";
+"%d meetings on %@" = "%d möten den %@";
+"All day" = "Heldag";
+"Duration: all day" = "Längd: heldag";
+"Duration: %dh %dm" = "Längd: %dh %dm";
+"Duration: %dh" = "Längd: %dh";
+"Duration: %dm" = "Längd: %dm";
+"%@ - %@" = "%@ - %@";
+"Scheduled Meeting" = "Schemalagt möte";
+
+/* MARK: - Popup för att skapa möte */
+"Please enter a title." = "Ange en titel.";
+"Duration must be a positive number of minutes." = "Längden måste vara ett positivt antal minuter.";
+"Invalid start time." = "Ogiltig starttid.";
+
+/* MARK: - Påminnelser och aviseringar */
+"Reminders" = "Påminnelser";
+"1 Day Before" = "1 dag innan";
+"12 Hours Before" = "12 timmar innan";
+"1 Hour Before" = "1 timme innan";
+"Starts in 1 day" = "Börjar om 1 dag";
+"Starts in 12 hours" = "Börjar om 12 timmar";
+"Starts in 1 hour" = "Börjar om 1 timme";
+
+/* MARK: - Google OAuth-fel */
+"Missing Google OAuth Client ID." = "Saknar Google-OAuth-klient-ID.";
+"Missing Google OAuth Client Secret." = "Saknar Google-OAuth-klienthemlighet.";
+"Invalid OAuth callback URL." = "Ogiltig OAuth-återanrops-URL.";
+"Google did not return an authorization code." = "Google returnerade ingen auktoriseringskod.";
+"Token exchange failed: %@" = "Tokenutbyte misslyckades: %@";
+"Could not open browser for Google sign-in." = "Kunde inte öppna webbläsaren för inloggning med Google.";
+"Google sign-in timed out." = "Inloggningen med Google tog för lång tid.";
+"No stored Google tokens found." = "Inga sparade Google-konto-token hittades.";
+
+/* MARK: - AI-assistent-/transkriberingsfel */
+"Recording not found." = "Inspelning hittades inte.";
+"Local meeting audio is missing." = "Lokalt mötesljud saknas.";
+"Generated transcript was empty." = "Genererad transkription var tom.";
+"(No transcript entries found.)" = "(Inga transkriptionsposter hittades.)";
+"No conference record found for this meeting." = "Ingen konferenspost hittades för detta möte.";
+"No transcript found for this meeting." = "Ingen transkription hittades för detta möte.";
+"Unable to create audio composition tracks." = "Kunde inte skapa ljudkompositionsspår.";
+"Unable to create audio export session." = "Kunde inte skapa ljudexportsession.";
+"Audio mix export failed." = "Ljudmixexport misslyckades.";
+"No display available for system audio capture." = "Ingen skärm tillgänglig för systemljudinspelning.";
+"Cannot add audio writer input." = "Kan inte lägga till ljudskrivarindata.";
+
+/* MARK: - Google API-fel */
+"Google Meet returned an invalid response." = "Meet från Google returnerade ett ogiltigt svar.";
+"Google Meet API error (%d): %@" = "Meet-från-Google-API-fel (%d): %@";
+"Failed to parse Google Meet response: %@" = "Meet-från-Google-svar kunde inte tolkas: %@";
+"Google Calendar returned an invalid response." = "Google Kalender returnerade ett ogiltigt svar.";
+"Google Calendar API error (%d): %@" = "Google Kalender-API-fel (%d): %@";
+"Failed to parse Google Calendar events: %@" = "Google Kalender-händelser kunde inte tolkas: %@";
+
+/* MARK: - OpenAI-fel */
+"OpenAI API key is missing. Set OPENAI_API_KEY in the environment or app key vault." = "OpenAI API-nyckel saknas. Ange OPENAI_API_KEY i miljön eller appens nyckelvalv.";
+"Notes generation returned an invalid response." = "Anteckningsgenerering returnerade ett ogiltigt svar.";
+"Notes generation failed (%d): %@" = "Anteckningsgenerering misslyckades (%d): %@";
+"Notes generation returned empty text." = "Anteckningsgenerering returnerade tom text.";
+"OpenAI transcription returned an invalid response." = "OpenAI-transkribering returnerade ett ogiltigt svar.";
+"OpenAI transcription failed (%d): %@" = "OpenAI-transkribering misslyckades (%d): %@";
+"OpenAI transcription returned no text." = "OpenAI-transkribering returnerade ingen text.";
+
+/* MARK: - Navigering och webbläsare i appen */
+"Open sites in the in-app browser (back, forward, reload, address bar). OAuth and “Continue in browser” flows stay inside the app." = "Öppna webbplatser i appens webbläsare (bakåt, framåt, ladda om, adressfält). OAuth- och ”Fortsätt i webbläsaren”-flöden stannar i appen.";
+"Open in app browser" = "Öppna i appens webbläsare";
+"Meet help" = "Meet-hjälp";
+"Go" = "Gå";
+"Back" = "Tillbaka";
+"Forward" = "Framåt";
+"Reload" = "Ladda om";
+
+/* MARK: - Etiketter för schemaläggning och kalender */
+"Google Calendar" = "Google-kalender";
+"Untitled meeting" = "Namnlöst möte";
+"Created event missing start/end." = "Skapad händelse saknar start/slut.";
+"Created event missing Meet/HTML link." = "Skapad händelse saknar Meet/HTML-länk.";
+
+/* MARK: - Google-konto */
+"Google account" = "Google-konto";
+"%@, Google account" = "%@, Google-konto";
+"Google User" = "Användare av Google";
+
+/* MARK: - Gå med i Zoom (oanvända delar) */
+"Meeting ID" = "Mötes-ID";
+"Enter meeting ID..." = "Ange mötes-ID...";
+"Meeting Passcode" = "Möteskod";
+"Enter meeting passcode..." = "Ange möteskod...";
+
+/* MARK: - Betalvägg (alternativa förmåner) */
+"Virtual backgrounds" = "Virtuella bakgrunder";
+"Tools for productivity" = "Verktyg för produktivitet";
+"24/7 support" = "Support dygnet runt";
+
+/* MARK: - Transkriptionstalare */
+"You" = "Du";
+
+/* MARK: - Nyckelrings fel */
+"Failed to read OAuth tokens from Keychain." = "Misslyckades att läsa OAuth-token från nyckelringen.";
+"Keychain returned an invalid token payload." = "Nyckelringen returnerade en ogiltig token-nyttolast.";
+"Failed to update OAuth tokens in Keychain." = "Misslyckades att uppdatera OAuth-token i nyckelringen.";
+"Failed to save OAuth tokens to Keychain." = "Misslyckades att spara OAuth-token till nyckelringen.";
+"Failed to delete OAuth tokens from Keychain." = "Misslyckades att ta bort OAuth-token från nyckelringen.";
+"Unable to allocate audio buffer." = "Kunde inte allokera ljudbuffert.";
+"Invalid revoke response." = "Ogiltigt återkallandesvar.";
+"Token revoke failed with status %d." = "Tokenåterkallande misslyckades med status %d.";
+
+/* MARK: - Felsökningsdiagnostik */
+"Keychain: %d (%@)" = "Nyckelring: %d (%@)";
+"OSStatus: %d" = "OSStatus: %d";
+"Item: service=%@, account=%@" = "Objekt: tjänst=%@, konto=%@";

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

@@ -0,0 +1,17 @@
+/* Class = "NSMenuItem"; title = "AI Companion for Meet"; ObjectID = "1Xt-HY-uBw"; */
+"1Xt-HY-uBw.title" = "Meet AI-assistent";
+
+/* Class = "NSMenu"; title = "AI Companion for Meet"; ObjectID = "uQy-DD-JDr"; */
+"uQy-DD-JDr.title" = "Meet AI-assistent";
+
+/* Class = "NSMenuItem"; title = "About AI Companion for Meet"; ObjectID = "5kV-Vb-QxS"; */
+"5kV-Vb-QxS.title" = "Om Meet AI-assistent";
+
+/* Class = "NSMenuItem"; title = "Hide AI Companion for Meet"; ObjectID = "Olw-nP-bQN"; */
+"Olw-nP-bQN.title" = "Dölj Meet AI-assistent";
+
+/* Class = "NSMenuItem"; title = "Quit AI Companion for Meet"; ObjectID = "4sb-4s-VLi"; */
+"4sb-4s-VLi.title" = "Avsluta Meet AI-assistent";
+
+/* Class = "NSMenuItem"; title = "AI Companion for Meet Help"; ObjectID = "FKE-Sm-Kum"; */
+"FKE-Sm-Kum.title" = "Hjälp för Meet AI-assistent";