Forráskód Böngészése

Add Polish localization and language picker support.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 1 hónapja
szülő
commit
d98ac3324a

+ 1 - 0
Info.plist

@@ -16,6 +16,7 @@
 		<string>de</string>
 		<string>it</string>
 		<string>nl</string>
+		<string>pl</string>
 		<string>sv</string>
 		<string>nb</string>
 		<string>fi</string>

+ 1 - 0
meetings_app.xcodeproj/project.pbxproj

@@ -104,6 +104,7 @@
 				de,
 				it,
 				nl,
+				pl,
 				sv,
 				nb,
 				fi,

+ 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", "it", "nl", "sv", "nb", "fi", "el", "he", "ko", "pt-BR", "ru", "vi", "zh-Hans", "zh-Hant"]
+    private static let supportedLanguageCodes = ["en", "fr", "fr-CA", "es-ES", "es-MX", "de", "it", "nl", "pl", "sv", "nb", "fi", "el", "he", "ko", "pt-BR", "ru", "vi", "zh-Hans", "zh-Hant"]
 
     /// `nil` follows the system language; otherwise uses the selected `.lproj` code.
     static var selectedLanguageCode: String? {
@@ -97,6 +97,8 @@ enum AppLanguageManager {
             return "Italiano"
         case "nl":
             return "Nederlands"
+        case "pl":
+            return "Polski"
         case "sv":
             return "Svenska"
         case "nb":

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

@@ -0,0 +1,4 @@
+"CFBundleDisplayName" = "Asystent AI dla Meet";
+"CFBundleName" = "Asystent AI dla Meet";
+"NSMicrophoneUsageDescription" = "Za Twoją zgodą aplikacja będzie nagrywać dźwięk spotkania na tym Macu i wyświetli go w Asystencie AI po spotkaniu.";
+"NSSpeechRecognitionUsageDescription" = "Ta aplikacja konwertuje zapisany dźwięk spotkania na transkrypcje tekstowe dla Asystenta AI.";

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

@@ -0,0 +1,452 @@
+/* AppBrand.name ("Meetings") celowo pominięte — nazwa aplikacji pozostaje niezmieniona w kodzie. */
+"AI Companion for Meet" = "Asystent AI dla Meet";
+
+/* MARK: - Ogólne */
+"OK" = "OK";
+"Cancel" = "Anuluj";
+"Continue" = "Kontynuuj";
+"Apply" = "Zastosuj";
+"Reset" = "Resetuj";
+"Save" = "Zapisz";
+"Copy" = "Kopiuj";
+"Copied" = "Skopiowano";
+"Close" = "Zamknij";
+"Join" = "Dołącz";
+"None" = "Brak";
+"Link" = "Link";
+"Stop" = "Zatrzymaj";
+"Address" = "Adres";
+"Title" = "Tytuł";
+"Notes" = "Notatki";
+"Start" = "Rozpocznij";
+"Premium" = "Premium";
+"Popular" = "Popularne";
+"Browser" = "Przeglądarka";
+"Meeting" = "Spotkanie";
+"Error" = "Błąd";
+"Success" = "Sukces";
+
+/* MARK: - Pasek stanu */
+"Meetings status menu" = "Menu stanu spotkań";
+"Open App" = "Otwórz aplikację";
+"Join Meetings" = "Dołącz do spotkań";
+"Schedule" = "Harmonogram";
+"Calendar" = "Kalendarz";
+"Widgets" = "Widżety";
+"AI Companion" = "Asystent AI";
+"Settings" = "Ustawienia";
+"Top meetings" = "Przypięte spotkania";
+"No upcoming meetings" = "Brak nadchodzących spotkań";
+"Sign Out" = "Wyloguj się";
+"Sign In" = "Zaloguj się";
+"Quit" = "Zakończ";
+
+/* MARK: - Ekran główny */
+"Preparing your meetings workspace" = "Przygotowywanie przestrzeni roboczej spotkań";
+"CONNECTING SERVICES" = "ŁĄCZENIE USŁUG";
+"READY" = "GOTOWE";
+"Plan smart, achieve more" = "Planuj mądrze, osiągaj więcej";
+
+/* MARK: - Widżety */
+"Add Widget to Desktop" = "Dodaj widżet na pulpit";
+"Choose a size and add your Google Meet widget." = "Wybierz rozmiar i dodaj widżet „Meet” Googla.";
+"Tip: Right-click a desktop widget to remove it." = "Wskazówka: Kliknij prawym przyciskiem myszy widżet na pulpicie, aby go usunąć.";
+"Removed %@ widget from desktop." = "Usunięto widżet %@ z pulpitu.";
+"Added %@ widget from desktop." = "Dodano widżet %@ z pulpitu.";
+"Added %@ widget to desktop." = "Dodano widżet %@ na pulpit.";
+"Widgets are Premium only. Upgrade to add widgets." = "Widżety są tylko dla Premium. Ulepsz, aby dodać widżety.";
+"Remove Widget" = "Usuń widżet";
+"Small" = "Mały";
+"Medium" = "Średni";
+"Quick actions" = "Szybkie akcje";
+"Open Meet" = "Otwórz Meet";
+"Upcoming meetings" = "Nadchodzące spotkania";
+"Sign in to see upcoming meetings" = "Zaloguj się, aby zobaczyć nadchodzące spotkania";
+"Sign in with Google" = "Zaloguj się przez Googla";
+"Google Meet" = "„Meet” Googla";
+"Open and join quickly" = "Otwórz i dołącz szybko";
+"Refresh" = "Odśwież";
+
+/* MARK: - Pasek boczny i nawigacja */
+"Planning" = "Planowanie";
+"Additional" = "Dodatkowe";
+"Get Premium" = "Kup Premium";
+"Manage Subscription" = "Zarządzaj subskrypcją";
+"App for Google Meet" = "Aplikacja dla „Meet” Googla";
+
+/* MARK: - Dołączanie do spotkania */
+"New Instant Meet" = "Nowe natychmiastowe Meet";
+"Start instant Meet in more section with\nGoogle Meet meet." = "Rozpocznij natychmiastowe Meet w sekcji Więcej\nz „Meet” Googla.";
+"Join with Link" = "Dołącz przez link";
+"Code or meet.google.com/…" = "Kod lub meet.google.com/…";
+"Join with ID" = "Dołącz przez ID";
+"Join with URL" = "Dołącz przez URL";
+"Meeting URL" = "URL spotkania";
+"Enter meeting URL..." = "Wprowadź URL spotkania...";
+"Quick Join Meeting" = "Szybkie dołączanie do spotkania";
+"Invalid Meet link" = "Nieprawidłowy link „Meet”";
+"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)." = "Wprowadź prawidłowy link „Meet” Googla lub kod spotkania (na przykład nkd-grps-duv, meet.google.com/nkd-grps-duv lub https://meet.google.com/nkd-grps-duv).";
+"Instant Meeting" = "Spotkanie natychmiastowe";
+"Connect Google to start Instant Meeting" = "Połącz Googla, aby rozpocząć spotkanie natychmiastowe";
+"To auto-stop recording when the meeting ends, connect your Google account first." = "Aby automatycznie zatrzymać nagrywanie po zakończeniu spotkania, najpierw połącz konto Googla.";
+"Could not create Instant Meeting" = "Nie można utworzyć spotkania natychmiastowego";
+"Free trial used. Upgrade to continue." = "Wykorzystano bezpłatny okres próbny. Ulepsz, aby kontynuować.";
+
+/* MARK: - Przeglądanie internetu */
+"Browse the web" = "Przeglądaj internet";
+"Enter a web address (for example meet.google.com)." = "Wprowadź adres internetowy (na przykład meet.google.com).";
+"Invalid address" = "Nieprawidłowy adres";
+"Enter a valid http or https URL." = "Wprowadź prawidłowy URL http lub https.";
+"Browse" = "Przeglądaj";
+"Quick links" = "Szybkie linki";
+"Zoom help" = "Pomoc Zoom";
+"https://example.com or example.com" = "https://example.com lub example.com";
+"Enter a valid web address, for example https://example.com" = "Wprowadź prawidłowy adres internetowy, na przykład https://example.com";
+"Address not allowed" = "Adres niedozwolony";
+"This URL is not permitted with the current in-app browser policy (whitelist)." = "Ten URL jest niedozwolony zgodnie z obecną polityką przeglądarki w aplikacji (biała lista).";
+"Unable to load page" = "Nie można załadować strony";
+"Could not load this page in the in-app browser.\n\n%@" = "Nie można załadować tej strony w przeglądarce w aplikacji.\n\n%@";
+"Page stopped loading" = "Ładowanie strony zatrzymane";
+"Unable to open browser" = "Nie można otworzyć przeglądarki";
+"Unable to Open Safari" = "Nie można otworzyć Safari";
+
+/* MARK: - Harmonogram i kalendarz */
+"All" = "Wszystkie";
+"Today" = "Dziś";
+"This week" = "W tym tygodniu";
+"This month" = "W tym miesiącu";
+"Previous week" = "Poprzedni tydzień";
+"Previous month" = "Poprzedni miesiąc";
+"Custom range" = "Własny zakres";
+"No meetings match the selected filters." = "Brak spotkań pasujących do wybranych filtrów.";
+"Adjust the date range and tap Apply." = "Dostosuj zakres dat i dotknij Zastosuj.";
+"Premium required. Get Premium now to unlock Calendar." = "Wymagane Premium. Kup Premium teraz, aby odblokować Kalendarz.";
+"Premium required. Click to open paywall." = "Wymagane Premium. Kliknij, aby otworzyć paywall.";
+"Get Premium to see events" = "Kup Premium, aby zobaczyć wydarzenia";
+"Connect Google" = "Połącz Googla";
+"Sign in with Google first to schedule a meeting from Calendar." = "Zaloguj się najpierw przez Googla, aby zaplanować spotkanie z Kalendarza.";
+"Select date" = "Wybierz datę";
+"Choose a date to schedule your meeting." = "Wybierz datę, aby zaplanować spotkanie.";
+"Google schedule" = "Kalendarz Googla";
+"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." = "Aby wyświetlić zaplanowane spotkania, połącz konto Googla. Będziesz potrzebować identyfikatora klienta OAuth Googla (Desktop) i identyfikatora URI przekierowania zgodnego ze schematem wywołania zwrotnego aplikacji.";
+"Actions" = "Akcje";
+"Schedule meeting" = "Zaplanuj spotkanie";
+"Team sync" = "Synchronizacja zespołu";
+"Duration (min)" = "Czas trwania (min)";
+"Refresh saved meetings" = "Odśwież zapisane spotkania";
+
+/* MARK: - Ustawienia */
+"Manage appearance, account, and app options." = "Zarządzaj wyglądem, kontem i opcjami aplikacji.";
+"Appearance" = "Wygląd";
+"Account" = "Konto";
+"App" = "Aplikacja";
+"Notifications" = "Powiadomienia";
+"Help & Legal" = "Pomoc i informacje prawne";
+"Dark Mode" = "Tryb ciemny";
+"Language" = "Język";
+"System Language" = "Język systemowy";
+"Rate Us" = "Oceń nas";
+"Share App" = "Udostępnij aplikację";
+"Upgrade" = "Ulepsz";
+"Privacy Policy" = "Polityka prywatności";
+"Support" = "Wsparcie";
+"Terms of Services" = "Warunki korzystania z usługi";
+"AI Language 1" = "Język AI 1";
+"AI Language 2" = "Język AI 2";
+"Google account connected" = "Konto Googla połączone";
+"Google account not connected" = "Konto Googla niepołączone";
+"Signed in" = "Zalogowano";
+"Sign in to sync your meetings and calendar." = "Zaloguj się, aby zsynchronizować spotkania i kalendarz.";
+"Log out" = "Wyloguj się";
+"Check out %@ for managing and joining meetings." = "Sprawdź %@ do zarządzania spotkaniami i dołączania do nich.";
+"Meetings App" = "Aplikacja Spotkania";
+
+/* MARK: - Zgoda na nagrywanie */
+"Record this meeting locally?" = "Nagrywać to spotkanie lokalnie?";
+"With your consent, the app will record meeting audio on this Mac and show it in AI Companion after the meeting." = "Za Twoją zgodą aplikacja będzie nagrywać dźwięk spotkania na tym Macu i wyświetli go w Asystencie AI po spotkaniu.";
+"Allow and Continue" = "Zezwól i kontynuuj";
+"Continue Without Recording" = "Kontynuuj bez nagrywania";
+"Transcription Languages" = "Języki transkrypcji";
+"Preferred Language 1" = "Preferowany język 1";
+"Preferred Language 2" = "Preferowany język 2";
+"Microphone permission denied" = "Odmowa dostępu do mikrofonu";
+"Microphone permission required" = "Wymagany dostęp do mikrofonu";
+"Enable microphone access in System Settings to record meetings locally." = "Włącz dostęp do mikrofonu w Ustawieniach systemowych, aby nagrywać spotkania lokalnie.";
+"Could not start recording" = "Nie można rozpocząć nagrywania";
+"Recording will start when the meeting starts" = "Nagrywanie rozpocznie się, gdy rozpocznie się spotkanie";
+"Meeting recording started (meeting + microphone)" = "Rozpoczęto nagrywanie spotkania (spotkanie + mikrofon)";
+"System audio unavailable. Recording microphone only." = "Dźwięk systemowy niedostępny. Nagrywanie tylko mikrofonu.";
+"Meeting recording started (microphone only)" = "Rozpoczęto nagrywanie spotkania (tylko mikrofon)";
+"Meeting recording saved" = "Nagranie spotkania zapisane";
+
+/* MARK: - Asystent AI */
+"Get notes from your previous meetings" = "Uzyskaj notatki z poprzednich spotkań";
+"Connect your Google account to see your AI Companion meeting history." = "Połącz konto Googla, aby zobaczyć historię spotkań Asystenta AI.";
+"No previous meetings yet for %@. End a meeting to save it here and generate notes." = "Brak jeszcze poprzednich spotkań dla %@. Zakończ spotkanie, aby zapisać je tutaj i wygenerować notatki.";
+"this account" = "to konto";
+"Previous meetings" = "Poprzednie spotkania";
+"Recording in progress: %@" = "Nagrywanie w toku: %@";
+"Started: %@" = "Rozpoczęto: %@";
+"Stop Recording" = "Zatrzymaj nagrywanie";
+"Date: %@" = "Data: %@";
+"Saved time: %@" = "Zapisany czas: %@";
+"Get Notes" = "Pobierz notatki";
+"Premium required. Click to unlock AI Companion notes." = "Wymagane Premium. Kliknij, aby odblokować notatki Asystenta AI.";
+"Play Audio" = "Odtwórz dźwięk";
+"Pause Audio" = "Wstrzymaj dźwięk";
+"Stopped" = "Zatrzymano";
+"Speaking..." = "Odtwarzanie...";
+"Paused" = "Wstrzymano";
+"Playing..." = "Odtwarzanie...";
+"Not playing" = "Nie odtwarzane";
+"Checking audio..." = "Sprawdzanie dźwięku...";
+"Audio file missing" = "Brak pliku dźwiękowego";
+"Could not play recording" = "Nie można odtworzyć nagrania";
+"Failed: %@" = "Niepowodzenie: %@";
+"Failed to play audio" = "Nie udało się odtworzyć dźwięku";
+"decode error" = "błąd dekodowania";
+"Loading..." = "Ładowanie...";
+"Buffering..." = "Buforowanie...";
+"Finished" = "Zakończono";
+"Transcript not requested" = "Nie zażądano transkrypcji";
+"Transcript processing..." = "Przetwarzanie transkrypcji...";
+"Transcript ready" = "Transkrypcja gotowa";
+"Transcript unavailable (tap to retry)" = "Transkrypcja niedostępna (dotknij, aby ponowić)";
+"Notes not requested" = "Nie zażądano notatek";
+"Preparing notes, please wait..." = "Przygotowywanie notatek, proszę czekać...";
+"Notes ready" = "Notatki gotowe";
+"Notes unavailable (tap to retry)" = "Notatki niedostępne (dotknij, aby ponowić)";
+"Transcript unavailable" = "Transkrypcja niedostępna";
+"Notes unavailable" = "Notatki niedostępne";
+"Could not find recording details for this meeting." = "Nie można znaleźć szczegółów nagrania dla tego spotkania.";
+"Transcript - %@" = "Transkrypcja - %@";
+"Notes - %@" = "Notatki - %@";
+"Meeting Notes" = "Notatki ze spotkania";
+
+/* MARK: - Paywall i StoreKit */
+"Meetings Pro" = "Spotkania Pro";
+"PREMIUM EXPERIENCE" = "DOŚWIADCZENIE PREMIUM";
+"Elevate your meetings workflow" = "Ulepsz swój przepływ pracy spotkań";
+"Unlock automation, premium meeting tools, and priority support for every session." = "Odblokuj automatyzację, narzędzia premium do spotkań i priorytetowe wsparcie dla każdej sesji.";
+"Manage meetings" = "Zarządzaj spotkaniami";
+"Smart scheduling" = "Inteligentne planowanie";
+"Faster workflow" = "Szybszy przepływ pracy";
+"Reminder notifications" = "Powiadomienia przypominające";
+"Monthly" = "Miesięcznie";
+"Bi Yearly" = "Półrocznie";
+"Yearly" = "Rocznie";
+"Most Popular" = "Najpopularniejsze";
+"%@ • Most Popular" = "%@ • Najpopularniejsze";
+"3 days free trial" = "3 dni bezpłatnego okresu próbnego";
+"Cancel anytime" = "Anuluj w dowolnym momencie";
+"No lock-in" = "Bez zobowiązań";
+"Instant access" = "Natychmiastowy dostęp";
+"Unlock all tools" = "Odblokuj wszystkie narzędzia";
+"Secure billing" = "Bezpieczne płatności";
+"Handled by Apple" = "Obsługiwane przez Jabłko";
+"Secured by Apple. Cancel anytime." = "Zabezpieczone przez Jabłko. Anuluj w dowolnym momencie.";
+"Restore Purchase" = "Przywróć zakup";
+"Continue with free plan" = "Kontynuuj z darmowym planem";
+"Already Premium" = "Już Premium";
+"You are already premium. Do you want to continue with this purchase?" = "Jesteś już premium. Czy chcesz kontynuować ten zakup?";
+"Current plan: %@. Choose a different package to switch." = "Obecny plan: %@. Wybierz inny pakiet, aby zmienić.";
+"Premium is active on this Apple ID." = "Premium jest aktywne na tym ID Jabłka.";
+"Free for %@, then %@" = "Za darmo przez %@, następnie %@";
+"Billed via App Store" = "Rozliczane przez App Store Jabłka";
+"%@  •  %@" = "%@  •  %@";
+"Save 0%" = "Oszczędź 0%";
+"Save %@%%" = "Oszczędź %@%%";
+"month" = "miesiąc";
+"year" = "rok";
+"%@ free trial" = "%@ bezpłatny okres próbny";
+"Processing..." = "Przetwarzanie...";
+"Premium Active" = "Premium aktywne";
+"Continue with 3 day trail" = "Kontynuuj z 3-dniowym okresem próbnym";
+"Please Wait" = "Proszę czekać";
+"A purchase is already being processed." = "Zakup jest już przetwarzany.";
+"This Apple ID already has premium access." = "To ID Jabłka ma już dostęp premium.";
+"Purchase Complete" = "Zakup zakończony";
+"Premium has been unlocked successfully." = "Premium zostało pomyślnie odblokowane.";
+"Purchase Pending" = "Zakup oczekuje";
+"Your purchase is pending approval. You can continue once it completes." = "Twój zakup oczekuje na zatwierdzenie. Możesz kontynuować po jego zakończeniu.";
+"Product Not Available" = "Produkt niedostępny";
+"Unable to load this product. Check your StoreKit configuration and product IDs." = "Nie można załadować tego produktu. Sprawdź konfigurację StoreKit i identyfikatory produktów.";
+"Already Purchased" = "Już zakupiono";
+"This plan is already active on your Apple ID." = "Ten plan jest już aktywny na Twoim ID Jabłka.";
+"Purchase Failed" = "Zakup nieudany";
+"Restore Purchases" = "Przywróć zakupy";
+"Purchases restored successfully." = "Pomyślnie przywrócono zakupy.";
+"No previous premium purchase was found for this Apple ID." = "Nie znaleziono poprzedniego zakupu premium dla tego ID Jabłka.";
+"Restore failed: %@" = "Przywracanie nieudane: %@";
+"Unable to Open Subscriptions" = "Nie można otworzyć Subskrypcji";
+"The subscriptions URL is invalid." = "URL subskrypcji jest nieprawidłowy.";
+"%@ tapped." = "Dotknięto %@.";
+
+/* MARK: - Uwierzytelnianie */
+"Google Sign-In" = "Logowanie przez Googla";
+
+/* MARK: - Błędy rozpoznawania mowy/transkrypcji */
+"Speech recognition permission denied. Enable it in System Settings and try again." = "Odmowa dostępu do rozpoznawania mowy. Włącz je w Ustawieniach systemowych i spróbuj ponownie.";
+"Speech recognition is restricted on this Mac." = "Rozpoznawanie mowy jest ograniczone na tym Macu.";
+"Speech recognition authorization is unavailable." = "Autoryzacja rozpoznawania mowy jest niedostępna.";
+"Speech recognizer is unavailable for the current locale." = "Rozpoznawanie mowy jest niedostępne dla bieżących ustawień regionalnych.";
+"Speech recognizer is unavailable for %@." = "Rozpoznawanie mowy jest niedostępne dla %@.";
+"No audio was available to transcribe." = "Brak dźwięku do transkrypcji.";
+
+/* MARK: - Błędy transakcji StoreKit */
+"Unable to load products: %@" = "Nie można załadować produktów: %@";
+"Product ID not found in StoreKit response. Requested: %@. Loaded IDs: %@" = "Nie znaleziono identyfikatora produktu w odpowiedzi StoreKit. Żądany: %@. Załadowane identyfikatory: %@";
+"Purchase verification failed." = "Weryfikacja zakupu nieudana.";
+"Unknown purchase state." = "Nieznany stan zakupu.";
+"none" = "brak";
+
+/* MARK: - Teksty cen paywall */
+"%@ one-time purchase" = "%@ jednorazowy zakup";
+"%@/month" = "%@/miesiąc";
+"%@/6 months" = "%@/6 miesięcy";
+"%@/year (3 days free trial)" = "%@/rok (3 dni bezpłatnego okresu próbnego)";
+"day" = "dzień";
+"week" = "tydzień";
+"period" = "okres";
+"1 %@" = "1 %@";
+"%d %@s" = "%d %@";
+
+/* MARK: - Powiadomienia i szybka informacja zwrotna */
+"Meeting added successfully." = "Spotkanie dodane pomyślnie.";
+"An issue occurred. Please try again." = "Wystąpił problem. Spróbuj ponownie.";
+"Failed to load transcript." = "Nie udało się załadować transkrypcji.";
+"Failed to generate notes." = "Nie udało się wygenerować notatek.";
+
+/* MARK: - Alerty przeglądarki */
+"Try Again" = "Spróbuj ponownie";
+"The in-app browser closed this page unexpectedly. You can try loading it again in this same window." = "Przeglądarka w aplikacji niespodziewanie zamknęła tę stronę. Możesz spróbować załadować ją ponownie w tym samym oknie.";
+
+/* MARK: - Błędy harmonogramu i kalendarza */
+"Couldn't load schedule." = "Nie można załadować harmonogramu.";
+"Couldn't refresh schedule." = "Nie można odświeżyć harmonogramu.";
+"Couldn't connect Google account." = "Nie można połączyć konta Googla.";
+"Couldn't logout Google account." = "Nie można wylogować się z konta Googla.";
+"Couldn't load schedule" = "Nie można załadować harmonogramu";
+"Couldn't determine Meet meeting code from URL." = "Nie można ustalić kodu spotkania „Meet” z URL.";
+"Refreshing…" = "Odświeżanie…";
+"Connect Google to see meetings" = "Połącz Googla, aby zobaczyć spotkania";
+"Connect to load schedule" = "Połącz, aby załadować harmonogram";
+"Loading…" = "Ładowanie…";
+"Loading schedule…" = "Ładowanie harmonogramu…";
+"Start date must be on or before end date." = "Data początkowa musi być wcześniejsza lub równa dacie końcowej.";
+"Invalid custom date range" = "Nieprawidłowy własny zakres dat";
+"No meetings" = "Brak spotkań";
+"No meetings for selected filters" = "Brak spotkań dla wybranych filtrów";
+"No meetings on %@" = "Brak spotkań w dniu %@";
+"1 meeting on %@" = "1 spotkanie w dniu %@";
+"%d meetings on %@" = "%d spotkań w dniu %@";
+"All day" = "Cały dzień";
+"Duration: all day" = "Czas trwania: cały dzień";
+"Duration: %dh %dm" = "Czas trwania: %dg %dmin";
+"Duration: %dh" = "Czas trwania: %dg";
+"Duration: %dm" = "Czas trwania: %dmin";
+"%@ - %@" = "%@ - %@";
+"Scheduled Meeting" = "Zaplanowane spotkanie";
+
+/* MARK: - Okno tworzenia spotkania */
+"Please enter a title." = "Wprowadź tytuł.";
+"Duration must be a positive number of minutes." = "Czas trwania musi być dodatnią liczbą minut.";
+"Invalid start time." = "Nieprawidłowy czas rozpoczęcia.";
+
+/* MARK: - Przypomnienia i powiadomienia */
+"Reminders" = "Przypomnienia";
+"1 Day Before" = "1 dzień przed";
+"12 Hours Before" = "12 godzin przed";
+"1 Hour Before" = "1 godzina przed";
+"Starts in 1 day" = "Zaczyna się za 1 dzień";
+"Starts in 12 hours" = "Zaczyna się za 12 godzin";
+"Starts in 1 hour" = "Zaczyna się za 1 godzinę";
+
+/* MARK: - Błędy Google OAuth */
+"Missing Google OAuth Client ID." = "Brak identyfikatora klienta OAuth Googla.";
+"Missing Google OAuth Client Secret." = "Brak tajnego klucza klienta OAuth Googla.";
+"Invalid OAuth callback URL." = "Nieprawidłowy URL wywołania zwrotnego OAuth.";
+"Google did not return an authorization code." = "Google nie zwróciło kodu autoryzacyjnego.";
+"Token exchange failed: %@" = "Wymiana tokenu nieudana: %@";
+"Could not open browser for Google sign-in." = "Nie można otworzyć przeglądarki do logowania przez Googla.";
+"Google sign-in timed out." = "Przekroczono limit czasu logowania przez Googla.";
+"No stored Google tokens found." = "Nie znaleziono zapisanych tokenów Googla.";
+
+/* MARK: - Błędy Asystenta AI/transkrypcji */
+"Recording not found." = "Nie znaleziono nagrania.";
+"Local meeting audio is missing." = "Brak lokalnego dźwięku spotkania.";
+"Generated transcript was empty." = "Wygenerowana transkrypcja była pusta.";
+"(No transcript entries found.)" = "(Nie znaleziono wpisów transkrypcji.)";
+"No conference record found for this meeting." = "Nie znaleziono rekordu konferencji dla tego spotkania.";
+"No transcript found for this meeting." = "Nie znaleziono transkrypcji dla tego spotkania.";
+"Unable to create audio composition tracks." = "Nie można utworzyć ścieżek kompozycji audio.";
+"Unable to create audio export session." = "Nie można utworzyć sesji eksportu audio.";
+"Audio mix export failed." = "Eksport miksu audio nieudany.";
+"No display available for system audio capture." = "Brak dostępnego wyświetlacza do przechwytywania dźwięku systemowego.";
+"Cannot add audio writer input." = "Nie można dodać wejścia zapisywania audio.";
+
+/* MARK: - Błędy Google API */
+"Google Meet returned an invalid response." = "„Meet” Googla zwróciło nieprawidłową odpowiedź.";
+"Google Meet API error (%d): %@" = "Błąd API „Meet” Googla (%d): %@";
+"Failed to parse Google Meet response: %@" = "Nie udało się przeanalizować odpowiedzi „Meet” Googla: %@";
+"Google Calendar returned an invalid response." = "Kalendarz Googla zwrócił nieprawidłową odpowiedź.";
+"Google Calendar API error (%d): %@" = "Błąd API Kalendarza Googla (%d): %@";
+"Failed to parse Google Calendar events: %@" = "Nie udało się przeanalizować wydarzeń Kalendarza Googla: %@";
+
+/* MARK: - Błędy OpenAI */
+"OpenAI API key is missing. Set OPENAI_API_KEY in the environment or app key vault." = "Brak klucza API OpenAI. Ustaw OPENAI_API_KEY w środowisku lub magazynie kluczy aplikacji.";
+"Notes generation returned an invalid response." = "Generowanie notatek zwróciło nieprawidłową odpowiedź.";
+"Notes generation failed (%d): %@" = "Generowanie notatek nieudane (%d): %@";
+"Notes generation returned empty text." = "Generowanie notatek zwróciło pusty tekst.";
+"OpenAI transcription returned an invalid response." = "Transkrypcja OpenAI zwróciła nieprawidłową odpowiedź.";
+"OpenAI transcription failed (%d): %@" = "Transkrypcja OpenAI nieudana (%d): %@";
+"OpenAI transcription returned no text." = "Transkrypcja OpenAI nie zwróciła tekstu.";
+
+/* MARK: - Nawigacja i przeglądarka w aplikacji */
+"Open sites in the in-app browser (back, forward, reload, address bar). OAuth and “Continue in browser” flows stay inside the app." = "Otwieraj strony w przeglądarce w aplikacji (wstecz, do przodu, odśwież, pasek adresu). Przepływy OAuth i „Kontynuuj w przeglądarce” pozostają w aplikacji.";
+"Open in app browser" = "Otwórz w przeglądarce aplikacji";
+"Meet help" = "Pomoc „Meet”";
+"Go" = "Przejdź";
+"Back" = "Wstecz";
+"Forward" = "Do przodu";
+"Reload" = "Odśwież";
+
+/* MARK: - Etykiety kalendarza i harmonogramu */
+"Google Calendar" = "Kalendarz Googla";
+"Untitled meeting" = "Spotkanie bez tytułu";
+"Created event missing start/end." = "Utworzone wydarzenie nie ma początku/końca.";
+"Created event missing Meet/HTML link." = "Utworzone wydarzenie nie ma linku Meet/HTML.";
+
+/* MARK: - Konto Google */
+"Google account" = "Konto Googla";
+"%@, Google account" = "%@, konto Googla";
+"Google User" = "Użytkownik Googla";
+
+/* MARK: - Dołączanie do Zoom (nieużywane części) */
+"Meeting ID" = "Identyfikator spotkania";
+"Enter meeting ID..." = "Wprowadź identyfikator spotkania...";
+"Meeting Passcode" = "Kod dostępu do spotkania";
+"Enter meeting passcode..." = "Wprowadź kod dostępu do spotkania...";
+
+/* MARK: - Paywall (alternatywne korzyści) */
+"Virtual backgrounds" = "Wirtualne tła";
+"Tools for productivity" = "Narzędzia produktywności";
+"24/7 support" = "Wsparcie 24/7";
+
+/* MARK: - Mówcy w transkrypcji */
+"You" = "Ty";
+
+/* MARK: - Błędy pęku kluczy */
+"Failed to read OAuth tokens from Keychain." = "Nie udało się odczytać tokenów OAuth z pęku kluczy.";
+"Keychain returned an invalid token payload." = "Pęk kluczy zwrócił nieprawidłowy ładunek tokenu.";
+"Failed to update OAuth tokens in Keychain." = "Nie udało się zaktualizować tokenów OAuth w pęku kluczy.";
+"Failed to save OAuth tokens to Keychain." = "Nie udało się zapisać tokenów OAuth w pęku kluczy.";
+"Failed to delete OAuth tokens from Keychain." = "Nie udało się usunąć tokenów OAuth z pęku kluczy.";
+"Unable to allocate audio buffer." = "Nie można przydzielić bufora audio.";
+"Invalid revoke response." = "Nieprawidłowa odpowiedź unieważnienia.";
+"Token revoke failed with status %d." = "Unieważnienie tokenu nieudane ze statusem %d.";
+
+/* MARK: - Diagnostyka błędów */
+"Keychain: %d (%@)" = "Pęk kluczy: %d (%@)";
+"OSStatus: %d" = "OSStatus: %d";
+"Item: service=%@, account=%@" = "Element: usługa=%@, konto=%@";

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

@@ -0,0 +1,17 @@
+/* Class = "NSMenuItem"; title = "AI Companion for Meet"; ObjectID = "1Xt-HY-uBw"; */
+"1Xt-HY-uBw.title" = "Asystent AI dla Meet";
+
+/* Class = "NSMenu"; title = "AI Companion for Meet"; ObjectID = "uQy-DD-JDr"; */
+"uQy-DD-JDr.title" = "Asystent AI dla Meet";
+
+/* Class = "NSMenuItem"; title = "About AI Companion for Meet"; ObjectID = "5kV-Vb-QxS"; */
+"5kV-Vb-QxS.title" = "O Asystencie AI dla Meet";
+
+/* Class = "NSMenuItem"; title = "Hide AI Companion for Meet"; ObjectID = "Olw-nP-bQN"; */
+"Olw-nP-bQN.title" = "Ukryj Asystenta AI dla Meet";
+
+/* Class = "NSMenuItem"; title = "Quit AI Companion for Meet"; ObjectID = "4sb-4s-VLi"; */
+"4sb-4s-VLi.title" = "Zakończ Asystenta AI dla Meet";
+
+/* Class = "NSMenuItem"; title = "AI Companion for Meet Help"; ObjectID = "FKE-Sm-Kum"; */
+"FKE-Sm-Kum.title" = "Pomoc Asystenta AI dla Meet";