From 787ab5dbd0a685b364205897d3572415ff56d4a1 Mon Sep 17 00:00:00 2001 From: Silent Date: Fri, 12 Mar 2021 19:59:39 +0100 Subject: [PATCH 1/4] String: Add a new constructor --- src/common/string.cpp | 5 +++++ src/common/string.h | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/src/common/string.cpp b/src/common/string.cpp index 08e0768fd..ecc2c8c33 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -161,6 +161,11 @@ String::String(const char* Text) : m_pStringData(const_cast Assign(Text); } +String::String(const char* Text, u32 Count) : m_pStringData(const_cast(&s_EmptyStringData)) +{ + AppendString(Text, Count); +} + String::String(String&& moveString) { Assign(moveString); diff --git a/src/common/string.h b/src/common/string.h index 3e35e3d34..05e145ed7 100644 --- a/src/common/string.h +++ b/src/common/string.h @@ -46,6 +46,9 @@ public: // For strings that do not allocate any space on the heap, see StaticString. String(const char* Text); + // Creates a string contained the specified text (with length). + String(const char* Text, u32 Count); + // Creates a string using the same buffer as another string (copy-on-write). String(const String& copyString); @@ -315,6 +318,12 @@ public: Assign(Text); } + StackString(const char* Text, u32 Count) : String(&m_sStringData) + { + InitStackStringData(); + AppendString(Text, Count); + } + StackString(const String& copyString) : String(&m_sStringData) { // force a copy by passing it a string pointer, instead of a string object From 948a6b530b1ec547e4fc66f99fb348b6abe96132 Mon Sep 17 00:00:00 2001 From: Silent Date: Fri, 12 Mar 2021 20:03:25 +0100 Subject: [PATCH 2/4] Make TranslateString and TranslateStdString support numbers --- src/core/host_interface.cpp | 45 +++++++++++++++++++++++--- src/core/host_interface.h | 6 ++-- src/duckstation-qt/qthostinterface.cpp | 26 ++++++--------- src/duckstation-qt/qthostinterface.h | 8 ++--- 4 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src/core/host_interface.cpp b/src/core/host_interface.cpp index f482c664b..bbb65fe1f 100644 --- a/src/core/host_interface.cpp +++ b/src/core/host_interface.cpp @@ -992,14 +992,51 @@ float HostInterface::GetFloatSettingValue(const char* section, const char* key, return float_value.value_or(default_value); } -TinyString HostInterface::TranslateString(const char* context, const char* str) const +TinyString HostInterface::TranslateString(const char* context, const char* str, + const char* disambiguation /*= nullptr*/, int n /*= -1*/) const { - return str; + TinyString result(str); + if (n >= 0) + { + const std::string number = std::to_string(n); + result.Replace("%n", number.c_str()); + result.Replace("%Ln", number.c_str()); + } + return result; } -std::string HostInterface::TranslateStdString(const char* context, const char* str) const +std::string HostInterface::TranslateStdString(const char* context, const char* str, + const char* disambiguation /*= nullptr*/, int n /*= -1*/) const { - return str; + std::string result(str); + if (n >= 0) + { + const std::string number = std::to_string(n); + // Made to mimick Qt's behaviour + // https://github.com/qt/qtbase/blob/255459250d450286a8c5c492dab3f6d3652171c9/src/corelib/kernel/qcoreapplication.cpp#L2099 + size_t percent_pos = 0; + size_t len = 0; + while ((percent_pos = result.find('%', percent_pos + len)) != std::string::npos) + { + len = 1; + if (percent_pos + len == result.length()) + break; + if (result[percent_pos + len] == 'L') + { + ++len; + if (percent_pos + len == result.length()) + break; + } + if (result[percent_pos + len] == 'n') + { + ++len; + result.replace(percent_pos, len, number); + len = number.length(); + } + } + } + + return result; } bool HostInterface::GetMainDisplayRefreshRate(float* refresh_rate) diff --git a/src/core/host_interface.h b/src/core/host_interface.h index c5e87712d..641ced6a0 100644 --- a/src/core/host_interface.h +++ b/src/core/host_interface.h @@ -118,8 +118,10 @@ public: virtual std::vector GetSettingStringList(const char* section, const char* key) = 0; /// Translates a string to the current language. - virtual TinyString TranslateString(const char* context, const char* str) const; - virtual std::string TranslateStdString(const char* context, const char* str) const; + virtual TinyString TranslateString(const char* context, const char* str, const char* disambiguation = nullptr, + int n = -1) const; + virtual std::string TranslateStdString(const char* context, const char* str, const char* disambiguation = nullptr, + int n = -1) const; /// Returns the refresh rate for the "main" display. Use when it's not possible to query the graphics API for the /// refresh rate of the monitor the window is running in. diff --git a/src/duckstation-qt/qthostinterface.cpp b/src/duckstation-qt/qthostinterface.cpp index 0b9e7d959..7ccc8f5e3 100644 --- a/src/duckstation-qt/qthostinterface.cpp +++ b/src/duckstation-qt/qthostinterface.cpp @@ -127,8 +127,6 @@ void QtHostInterface::shutdownOnThread() void QtHostInterface::installTranslator() { - m_translator = std::make_unique(); - std::string language = GetStringSettingValue("Main", "Language", ""); if (language.empty()) language = "en"; @@ -143,7 +141,8 @@ void QtHostInterface::installTranslator() return; } - if (!m_translator->load(path)) + auto translator = std::make_unique(qApp); + if (!translator->load(path)) { QMessageBox::warning( nullptr, QStringLiteral("Translation Error"), @@ -152,7 +151,7 @@ void QtHostInterface::installTranslator() } Log_InfoPrintf("Loaded translation file for language '%s'", language.c_str()); - qApp->installTranslator(m_translator.get()); + qApp->installTranslator(translator.release()); } void QtHostInterface::ReportError(const char* message) @@ -1602,22 +1601,17 @@ void QtHostInterface::setImGuiKeyMap() io.KeyMap[ImGuiKey_Z] = Qt::Key_Z & IMGUI_KEY_MASK; } -TinyString QtHostInterface::TranslateString(const char* context, const char* str) const +TinyString QtHostInterface::TranslateString(const char* context, const char* str, + const char* disambiguation /*= nullptr*/, int n /*= -1*/) const { - const QString translated(m_translator->translate(context, str)); - if (translated.isEmpty()) - return TinyString(str); - - return TinyString(translated.toUtf8().constData()); + const QByteArray bytes(qApp->translate(context, str, disambiguation, n).toUtf8()); + return TinyString(bytes.constData(), bytes.size()); } -std::string QtHostInterface::TranslateStdString(const char* context, const char* str) const +std::string QtHostInterface::TranslateStdString(const char* context, const char* str, + const char* disambiguation /*= nullptr*/, int n /*= -1*/) const { - const QString translated(m_translator->translate(context, str)); - if (translated.isEmpty()) - return std::string(str); - - return translated.toStdString(); + return qApp->translate(context, str, disambiguation, n).toStdString(); } QtHostInterface::Thread::Thread(QtHostInterface* parent) : QThread(parent), m_parent(parent) {} diff --git a/src/duckstation-qt/qthostinterface.h b/src/duckstation-qt/qthostinterface.h index fe17fe922..a1dd4aa34 100644 --- a/src/duckstation-qt/qthostinterface.h +++ b/src/duckstation-qt/qthostinterface.h @@ -64,8 +64,10 @@ public: void SetStringListSettingValue(const char* section, const char* key, const std::vector& values); void RemoveSettingValue(const char* section, const char* key); - TinyString TranslateString(const char* context, const char* str) const override; - std::string TranslateStdString(const char* context, const char* str) const override; + TinyString TranslateString(const char* context, const char* str, const char* disambiguation = nullptr, + int n = -1) const override; + std::string TranslateStdString(const char* context, const char* str, const char* disambiguation = nullptr, + int n = -1) const override; bool RequestRenderWindowSize(s32 new_window_width, s32 new_window_height) override; void* GetTopLevelWindowHandle() const override; @@ -263,8 +265,6 @@ private: void queueSettingsSave(); void wakeThread(); - std::unique_ptr m_translator; - MainWindow* m_main_window = nullptr; QThread* m_original_thread = nullptr; Thread* m_worker_thread = nullptr; From 6350bb0e362b070ae70ea927ab58b6e9c0754182 Mon Sep 17 00:00:00 2001 From: Silent Date: Fri, 12 Mar 2021 21:40:24 +0100 Subject: [PATCH 3/4] Hook up plurality to OSD messages --- .../translations/duckstation-qt_en.ts | 45 +++++++++++++++++++ src/frontend-common/common_host_interface.cpp | 20 +++++---- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/duckstation-qt/translations/duckstation-qt_en.ts b/src/duckstation-qt/translations/duckstation-qt_en.ts index 0df202fdc..d9f62f15a 100644 --- a/src/duckstation-qt/translations/duckstation-qt_en.ts +++ b/src/duckstation-qt/translations/duckstation-qt_en.ts @@ -41,6 +41,51 @@ + + OSDMessage + + Loaded %n cheats from list. + + Loaded %n cheat from list. + Loaded %n cheats from list. + + + + %n cheats are enabled. + + %n cheat is enabled. + %n cheats are enabled. + + + + %n cheats are now active. + + %n cheat is now active. + %n cheats are now active. + + + + %n cheats are now inactive. + + %n cheat is now inactive. + %n cheats are now inactive. + + + + Loaded %n cheats from database. + + Loaded %n cheat from database. + Loaded %n cheats from database. + + + + Saved %n cheats to '%s'. + + Saved %n cheat to '%s'. + Saved %n cheats to '%s'. + + + QtHostInterface diff --git a/src/frontend-common/common_host_interface.cpp b/src/frontend-common/common_host_interface.cpp index 365b6b0ed..4958ec047 100644 --- a/src/frontend-common/common_host_interface.cpp +++ b/src/frontend-common/common_host_interface.cpp @@ -1273,10 +1273,10 @@ void CommonHostInterface::DoToggleCheats() } cl->SetMasterEnable(!cl->GetMasterEnable()); - AddFormattedOSDMessage(10.0f, - cl->GetMasterEnable() ? TranslateString("OSDMessage", "%u cheats are now active.") : - TranslateString("OSDMessage", "%u cheats are now inactive."), - cl->GetEnabledCodeCount()); + AddOSDMessage(cl->GetMasterEnable() ? + TranslateStdString("OSDMessage", "%n cheats are now active.", "", cl->GetEnabledCodeCount()) : + TranslateStdString("OSDMessage", "%n cheats are now inactive.", "", cl->GetEnabledCodeCount()), + 10.0f); } std::optional @@ -3041,8 +3041,9 @@ bool CommonHostInterface::LoadCheatList(const char* filename) return false; } - AddFormattedOSDMessage(10.0f, TranslateString("OSDMessage", "Loaded %u cheats from list. %u cheats are enabled."), - cl->GetCodeCount(), cl->GetEnabledCodeCount()); + AddOSDMessage(TranslateStdString("OSDMessage", "Loaded %n cheats from list.", "", cl->GetCodeCount()) + + TranslateStdString("OSDMessage", " %n cheats are enabled.", "", cl->GetEnabledCodeCount()), + 10.0f); System::SetCheatList(std::move(cl)); return true; } @@ -3068,7 +3069,7 @@ bool CommonHostInterface::LoadCheatListFromDatabase() if (!cl->LoadFromPackage(System::GetRunningCode())) return false; - AddFormattedOSDMessage(10.0f, TranslateString("OSDMessage", "Loaded %u cheats from database."), cl->GetCodeCount()); + AddOSDMessage(TranslateStdString("OSDMessage", "Loaded %n cheats from database.", "", cl->GetCodeCount()), 10.0f); System::SetCheatList(std::move(cl)); return true; } @@ -3098,8 +3099,9 @@ bool CommonHostInterface::SaveCheatList(const char* filename) if (!System::GetCheatList()->SaveToPCSXRFile(filename)) return false; - AddFormattedOSDMessage(5.0f, TranslateString("OSDMessage", "Saved %u cheats to '%s'."), - System::GetCheatList()->GetCodeCount(), filename); + // This shouldn't be needed, but lupdate doesn't gather this string otherwise... + const u32 code_count = System::GetCheatList()->GetCodeCount(); + AddFormattedOSDMessage(5.0f, TranslateString("OSDMessage", "Saved %n cheats to '%s'.", "", code_count), filename); return true; } From 5515a581e04ddd103d699b7b3e4083166cb92284 Mon Sep 17 00:00:00 2001 From: Silent Date: Fri, 12 Mar 2021 21:49:55 +0100 Subject: [PATCH 4/4] Update PL localization --- .../translations/duckstation-qt_pl.ts | 729 +++++++++--------- 1 file changed, 371 insertions(+), 358 deletions(-) diff --git a/src/duckstation-qt/translations/duckstation-qt_pl.ts b/src/duckstation-qt/translations/duckstation-qt_pl.ts index 1ecb297dd..bbd59fc57 100644 --- a/src/duckstation-qt/translations/duckstation-qt_pl.ts +++ b/src/duckstation-qt/translations/duckstation-qt_pl.ts @@ -74,38 +74,32 @@ Gotów... - + &Login Za&loguj się - + &Cancel &Anuluj - - + Login Error Błąd logowania - A user name and password must be provided. - Nie podano nazwy użytkownika lub hasła. - - - Logging in... Logowanie... - + Login failed. Please check your username and password, and try again. Nie udało się zalogować. Proszę sprawdzić nazwę użytkownika oraz hasło i spróbować ponownie. - + Login failed. Logowanie zakończone niepowodzeniem. @@ -1794,17 +1788,17 @@ Token logowania wygenerowany %2. CommonHostInterface - + Are you sure you want to stop emulation? Czy na pewno chcesz zatrzymać emulację? - + The current state will be saved. Aktualny stan zostanie zapisany. - + Invalid version %u (%s version %u) Nieprawidłowa wersja %u (%s wersja %u) @@ -3807,32 +3801,32 @@ Ten plik może mieć kilka gigabajtów, więc pamiętaj o zużyciu dysku SSD. GameListCompatibilityRating - + Unknown Nieznany - + Doesn't Boot Nie uruchamia się - + Crashes In Intro Awarie w intro - + Crashes In-Game Awarie w grze - + Graphical/Audio Issues Problemy graficzne/audio - + No Issues Nie ma problemów @@ -4842,402 +4836,402 @@ Spowoduje to pobranie około 4 megabajtów za pośrednictwem bieżącego połąc Hotkeys - - - - - - - - - - - - - - + + + + + + + + + + + + + + General Główne - + Open Quick Menu Otwórz menu podręczne - + Fast Forward Szybkie przewijanie - + Toggle Fast Forward Przełącz szybkie przewijanie - + Turbo Turbo - + Toggle Turbo Przełącz Turbo - + Toggle Fullscreen Przełącz tryb pełnoekranowy - + Toggle Pause Przełącz pauzę - + Toggle Cheats Przełącz cheaty - + Power Off System Wyłącz system - + Toggle Patch Codes Przełącz kody łatek - + Reset System Resetuj system - + Save Screenshot Zapisz zrzut ekranu - + Frame Step Następna klatka - + Rewind Przewiń - - - - - - - - + + + + + + + + Graphics Grafika - + Toggle Software Rendering Przełącz renderowanie programowe - + Toggle PGXP Przełącz PGXP - + Toggle PGXP Depth Buffer Przełącz bufor głębi PGXP - + Increase Resolution Scale Zwiększ skalę rozdzielczości - + Decrease Resolution Scale Zmniejsz skalę rozdzielczości - + Toggle Post-Processing Przełącz Post-Processing - + Reload Post Processing Shaders Załaduj ponownie shadery Post-Processingu - + Reload Texture Replacements Załaduj ponownie zamienniki tekstur - - - - - - - - + + + + + + + + Save States Zapisy stanu - + Load From Selected Slot Wczytaj z wybranego slotu - + Save To Selected Slot Zapisz w wybranym slocie - + Select Previous Save Slot Wybierz poprzedni slot zapisu - + Select Next Save Slot Wybierz następny slot zapisu - + Load Game State 1 Wczytaj stan gry 1 - + Load Game State 2 Wczytaj stan gry 2 - + Load Game State 3 Wczytaj stan gry 3 - + Load Game State 4 Wczytaj stan gry 4 - + Load Game State 5 Wczytaj stan gry 5 - + Load Game State 6 Wczytaj stan gry 6 - + Load Game State 7 Wczytaj stan gry 7 - + Load Game State 8 Wczytaj stan gry 8 - + Load Game State 9 Wczytaj stan gry 9 - + Load Game State 10 Wczytaj stan gry 10 - + Save Game State 1 Zapisz stan gry 1 - + Save Game State 2 Zapisz stan gry 2 - + Save Game State 3 Zapisz stan gry 3 - + Save Game State 4 Zapisz stan gry 4 - + Save Game State 5 Zapisz stan gry 5 - + Save Game State 6 Zapisz stan gry 6 - + Save Game State 7 Zapisz stan gry 7 - + Save Game State 8 Zapisz stan gry 8 - + Save Game State 9 Zapisz stan gry 9 - + Save Game State 10 Zapisz stan gry 10 - + Load Global State 1 Wczytaj stan globalny 1 - + Load Global State 2 Wczytaj stan globalny 2 - + Load Global State 3 Wczytaj stan globalny 3 - + Load Global State 4 Wczytaj stan globalny 4 - + Load Global State 5 Wczytaj stan globalny 5 - + Load Global State 6 Wczytaj stan globalny 6 - + Load Global State 7 Wczytaj stan globalny 7 - + Load Global State 8 Wczytaj stan globalny 8 - + Load Global State 9 Wczytaj stan globalny 9 - + Load Global State 10 Wczytaj stan globalny 10 - + Save Global State 1 Zapisz stan globalny 1 - + Save Global State 2 Zapisz stan globalny 2 - + Save Global State 3 Zapisz stan globalny 3 - + Save Global State 4 Zapisz stan globalny 4 - + Save Global State 5 Zapisz stan globalny 5 - + Save Global State 6 Zapisz stan globalny 6 - + Save Global State 7 Zapisz stan globalny 7 - + Save Global State 8 Zapisz stan globalny 8 - + Save Global State 9 Zapisz stan globalny 9 - + Save Global State 10 Zapisz stan globalny 10 - - - - + + + + Audio Dźwięk - + Toggle Mute Przełącz Wyciszenie - + Toggle CD Audio Mute Przełącz wyciszanie dźwięku CD - + Volume Up Głośniej - + Volume Down Ciszej @@ -5361,677 +5355,677 @@ Spowoduje to pobranie około 4 megabajtów za pośrednictwem bieżącego połąc MainWindow - - - + + + DuckStation DuckStation - + &System &System - - + + Change Disc Zmień płytę - + From Playlist... Z listy odtwarzania... - + Cheats Cheaty - + Load State Wczytaj Stan - + Save State Zapisz Stan - + S&ettings &Ustawienia - + Theme Skórka - + Language Język - + &Help &Pomoc - + &Debug &Debugowanie - + Switch GPU Renderer Przełącz renderer GPU - + Switch CPU Emulation Mode Przełącz tryb emulacji CPU - + Switch Crop Mode Przełącz tryb kadrowania - + &View &Widok - + &Window Size &Rozmiar Okna - + &Tools &Narzędzia - + toolBar Pasek narzędzi - + Start &Disc... Uruchom &Płytę... - + Start &BIOS Uruchom &BIOS - + &Scan For New Games Skanuj w poszukiwaniu nowych &gier - + &Rescan All Games Przeskanuj ponownie &wszystkie gry - + Power &Off &Wyłącz zasilanie - + &Reset &Resetuj - + &Pause &Pauza - + &Load State &Wczytaj Stan - + &Save State &Zapisz Stan - + E&xit W&yjdź - + B&IOS Settings... Ustawienia &BIOS... - + C&onsole Settings... Ustawienia K&onsoli... - + E&mulation Settings... Ustawienia &Emulacji... - + &Controller Settings... Ustawienia &Kontrolera... - + &Hotkey Settings... Ustawienia &Skrótów Klawiszowych... - + &Display Settings... Ustawienia &Wyświetlania... - + &Enhancement Settings... Ustawienia &Ulepszeń... - + &Post-Processing Settings... Ustawienia &Post-Processingu... - + Fullscreen Pełny Ekran - + Resolution Scale Skalowanie rozdzielczości - + &GitHub Repository... Repozytorium &GitHub... - + &Issue Tracker... &Lista Problemów... - + &Discord Server... Serwer &Discord... - + Check for &Updates... Sprawdź &Aktualizacje... - + About &Qt... O &Qt... - + &About DuckStation... &O DuckStation... - + Change Disc... Zmień Płytę... - + Cheats... Cheaty... - + Audio Settings... Ustawienia Dźwięku... - + Achievement Settings... Ustawienia Osiągnięć... - + Game List Settings... Ustawienia Listy Gier... - + General Settings... Ustawienia Główne... - + Advanced Settings... Ustawienia Zaawansowane... - + Add Game Directory... Dodaj katalog gier... - + &Settings... &Ustawienia... - + From File... Z pliku... - + From Game List... Z listy gier... - + Remove Disc Wyjmij płytę - + Resume State Wznów stan - + Global State Globalny Stan - + Show VRAM Pokaż VRAM - + Dump CPU to VRAM Copies Zrzuć CPU do kopii VRAM - + Dump VRAM to CPU Copies Zrzuć VRAM do kopii CPU - + Disable All Enhancements Wyłącz wszystkie ulepszenia - + Disable Interlacing Wyłącz przeplot - + Force NTSC Timings Wymuś taktowanie NTSC - + Dump Audio Zrzuć Dźwięk - + Dump RAM... Zrzuć RAM... - + Dump VRAM... Zrzuć VRAM... - + Dump SPU RAM... Zrzuć SPU RAM... - + Show GPU State Pokaż stan GPU - + Show CDROM State Pokaż stan CDROM - + Show SPU State Pokaż stan SPU - + Show Timers State Pokaż stan timerów - + Show MDEC State Pokaż stan MDEC - + Show DMA State Pokaż stan DMA - + &Screenshot &Zrzut ekranu - + &Memory Card Settings... Ustawienia K&art Pamięci... - + Resume Wznów - + Resumes the last save state created. Wznawia ostatni utworzony zapis stanu. - + &Toolbar Pasek &narzędzi - + Lock Toolbar Zablokuj pasek narzędzi - + &Status Bar Pasek &stanu - + Game &List &Lista gier - + System &Display &Wyświetlacz systemu - + Game &Properties Właściwości &gry - + Memory &Card Editor Edytor &Kart Pamięci - + C&heat Manager Menedżer &Cheatów - + CPU D&ebugger Debugger &CPU - + Game &Grid &Siatka gier - + Show Titles (Grid View) Pokaż Tytuły (Widok Siatki) - + Zoom &In (Grid View) Po&większ (Widok Siatki) - + Ctrl++ Ctrl++ - + Zoom &Out (Grid View) Po&mniejsz (Widok Siatki) - + Ctrl+- Ctrl+- - + Refresh &Covers (Grid View) Odśwież &Okładki (Widok Siatki) - + Open Memory Card Directory... Otwórz katalog kart pamięci... - + Open Data Directory... Otwórz katalog danych... - + Power Off &Without Saving Wyłącz zasilanie bez &zapisywania - + All File Types (*.bin *.img *.iso *.cue *.chd *.ecm *.mds *.exe *.psexe *.psf *.minipsf *.m3u);;Single-Track Raw Images (*.bin *.img *.iso);;Cue Sheets (*.cue);;MAME CHD Images (*.chd);;Error Code Modeler Images (*.ecm);;Media Descriptor Sidecar Images (*.mds);;PlayStation Executables (*.exe *.psexe);;Portable Sound Format Files (*.psf *.minipsf);;Playlists (*.m3u) Wszystkie typy plików (*.bin *.img *.iso *.cue *.chd *.ecm *.mds *.exe *.psexe *.psf *.minipsf *.m3u);;Single-Track Raw Images (*.bin *.img *.iso);;Cue Sheets (*.cue);;MAME CHD Images (*.chd);;Error Code Modeler Images (*.ecm);;Media Descriptor Sidecar Images (*.mds);;PlayStation Executables (*.exe *.psexe);;Portable Sound Format Files (*.psf *.minipsf);;Playlisty (*.m3u) - + Failed to create host display. Nie udało się utworzyć ekranu hosta. - + Failed to create host display device context. Nie udało się utworzyć kontekstu urządzenia wyświetlania hosta. - - + + Select Disc Image Wybierz obraz płyty - + Cheat Manager Menedżer Cheatów - + Properties... Właściwości... - + Open Containing Directory... Otwórz katalog zawierający... - + Set Cover Image... Ustaw obraz okładki... - + Default Boot Domyślny rozruch - + Fast Boot Szybki rozruch - + Full Boot Pełny rozruch - + Boot and Debug Rozruch i debugowanie - + Add Search Directory... Dodaj katalog wyszukiwania... - + Select Cover Image Wybierz obraz okładki - + All Cover Image Types (*.jpg *.jpeg *.png) Wszystkie typy obrazów okładki (*.jpg *.jpeg *.png) - + Cover Already Exists Okładka już istnieje - + A cover image for this game already exists, do you wish to replace it? Grafika okładki tej gry już istnieje, czy chcesz ją zastąpić? - - + + Copy Error Błąd kopiowania - + Failed to remove existing cover '%1' Nie udało się usunąć istniejącej okładki '%1' - + Failed to copy '%1' to '%2' Nie udało się skopiować '%1' do '%2' - + Language changed. Please restart the application to apply. Język się zmienił. Uruchom ponownie. - + %1x Scale %1x Skala - - - + + + Destination File Plik docelowy - - + + Binary Files (*.bin) Pliki binarne (*.bin) - + Binary Files (*.bin);;PNG Images (*.png) Pliki binarne (*.bin);;Obrazy PNG (*.png) - + Default Domyślna - + Fusion Fuzja - + Dark Fusion (Gray) Ciemna Fuzja (Szary) - + Dark Fusion (Blue) Ciemna Fuzja (Niebieski) - + QDarkStyle Q Ciemny Styl - - + + Memory Card Not Found Nie znaleziono Karty Pamięci - - + + Memory card '%1' could not be found. Try starting the game and saving to create it. Nie znaleziono karty pamięci '%1'. Spróbuj uruchomić grę i zapisać, aby ją utworzyć. - + Updater Error Błąd aktualizacji - + <p>Sorry, you are trying to update a DuckStation version which is not an official GitHub release. To prevent incompatibilities, the auto-updater is only enabled on official builds.</p><p>To obtain an official build, please follow the instructions under "Downloading and Running" at the link below:</p><p><a href="https://github.com/stenzek/duckstation/">https://github.com/stenzek/duckstation/</a></p> <p>Przepraszamy, próbujesz zaktualizować wersję DuckStation, która nie jest oficjalną wersją z GitHub. Aby zapobiec niekompatybilnościom, automatyczne aktualizacje są włączone tylko w oficjalnych kompilacjach.</p><p>Aby uzyskać oficjalną kompilację, postępuj zgodnie z instrukcjami w sekcji "Pobieranie i uruchamianie" pod linkiem poniżej:</p><p><a href="https://github.com/stenzek/duckstation/">https://github.com/stenzek/duckstation/</a></p> - + Automatic updating is not supported on the current platform. Aktualizacje automatyczne nie są obsługiwane na obecnej platformie. @@ -6479,17 +6473,17 @@ Spowoduje to pobranie około 4 megabajtów za pośrednictwem bieżącego połąc OSDMessage - + Acquired exclusive fullscreen. Uzyskano ekskluzywny pełny ekran. - + Failed to acquire exclusive fullscreen. Nie udało się uzyskać ekskluzywnego pełnego ekranu. - + Lost exclusive fullscreen. Utracono ekskluzywny pełny ekran. @@ -6614,7 +6608,7 @@ Spowoduje to pobranie około 4 megabajtów za pośrednictwem bieżącego połąc PGXP wyłączone, ponowna kompilacja wszystkich bloków. - + Switching to %s renderer... Przełączenie na %s renderer... @@ -6695,178 +6689,207 @@ Spowoduje to pobranie około 4 megabajtów za pośrednictwem bieżącego połąc Włożono płytę '%s' (%s). - - + + Failed to load post processing shader chain. Nie udało się załadować łańcucha modułów cieniujących po przetwarzaniu. - + No cheats are loaded. - Żadne kody/haki nie są załadowane. + Żadne cheaty nie są załadowane. + + + + %n cheats are now active. + + %n cheat jest teraz aktywny. + %n cheaty są teraz aktywne. + %n cheatów jest teraz aktywnych. + + + + + %n cheats are now inactive. + + %n cheat jest teraz nieaktywny. + %n cheaty są teraz nieaktywne. + %n cheatów jest teraz nieaktywnych. + - - %u cheats are now active. - %u kody/haki są teraz aktywne. - - - - %u cheats are now inactive. - %u kody/haki są teraz nieaktywne. - - - + Fast forwarding... Szybkie przewijanie... - + Stopped fast forwarding. Zatrzymano szybkie przewijanie. - + Turboing... Turbo... - + Stopped turboing. Zatrzymano turbo. - + Hotkey unavailable because achievements hardcore mode is active. Skrót klawiszowy niedostępny, ponieważ tryb ekstremalnych osiągnięć jest włączony. - + Rewinding... Przewijanie... - + Stopped rewinding. Zatrzymano przewijanie. - + PGXP is now enabled. PGXP jest teraz włączone. - + PGXP is now disabled. PGXP jest teraz wyłączone. - + PGXP Depth Buffer is now enabled. Bufor głębi PGXP jest teraz włączony. - + PGXP Depth Buffer is now disabled. Bufor głębi PGXP jest teraz wyłączony. - + Texture replacements reloaded. Ponownie załadowano zamienniki tekstur. - + Volume: Muted Dzwięk: Wyciszony - - - + + + Volume: %d%% Głośność: %d%% - + CD Audio Muted. CD Audio wyciszone. - + CD Audio Unmuted. CD Audio odciszone. - + Loaded input profile from '%s' Załadowano profil wejściowy z '%s' - + Started dumping audio to '%s'. Rozpoczęto zrzucanie dźwięku do '%s'. - + Failed to start dumping audio to '%s'. Nie udało się rozpocząć zrzutu dźwięku do '%s'. - + Stopped dumping audio. Zatrzymano przesyłanie dźwięku. - + Screenshot file '%s' already exists. Plik zrzutu ekranu '%s' już istnieje. - + Failed to save screenshot to '%s' Nie udało się zapisać zrzutu ekranu w '%s' - + Screenshot saved to '%s'. Zrzut ekranu został zapisany w '%s'. - + Input profile '%s' cannot be found. Profil wejściowy '%s' nie może być znaleziony. - + Using input profile '%s'. Korzystanie z profilu wejściowego '%s'. - + Failed to load cheats from '%s'. Nie udało się załadować cheatów z '%s'. - - - Loaded %u cheats from list. %u cheats are enabled. - Załadowano %u cheaty z listy. %u cheatów jest włączonych. + + + Loaded %n cheats from list. + + Załadowano %n cheat z listy. + Załadowano %n cheaty z listy. + Załadowano %n cheatów z listy. + + + + + %n cheats are enabled. + + %n cheat jest włączony. + %n cheaty są włączone. + %n cheatów jest włączonych. + + + + + Loaded %n cheats from database. + + Załadowano %n cheat z bazy danych. + Załadowano %n cheaty z bazy danych. + Załadowano %n cheatów z bazy danych. + + + + + Saved %n cheats to '%s'. + + Zapisano %n cheat do '%s'. + Zapisano %n cheaty do '%s'. + Zapisano %n cheatów do '%s'. + - - Loaded %u cheats from database. - Załadowano %u cheatów z bazy danych. - - - + Failed to save cheat list to '%s' - Nie udało się zapisać listy kodów do '%s' - - - - Saved %u cheats to '%s'. - Zapisano %u cheatów do '%s'. + Nie udało się zapisać listy cheatów do '%s' @@ -6983,16 +7006,6 @@ Spowoduje to pobranie około 4 megabajtów za pośrednictwem bieżącego połąc PGXP Depth Buffer disabled by game settings. Bufor głębi PGXP wyłączony przez ustawienia gry. - - - Recompiler memory exceptions forced by game settings. - Wyjątki pamięci rekompilatora wymuszone przez ustawienia gry. - - - - Recompiler ICache forced by game settings. - Rekompilator ICache wymuszony przez ustawienia gry. - Failed to read executable from disc. Achievements disabled. @@ -7204,63 +7217,63 @@ Adres URL to: %1 QtHostInterface - + No resume save state found. Nie znaleziono stanu wznawiania zapisu. - - + + Game Save %1 (%2) Zapis gry %1 (%2) - + Game Save %1 (Empty) Zapis gry %1 (Pusty) - + Global Save %1 (%2) Globalny zapis %1 (%2) - + Global Save %1 (Empty) Globalny zapis %1 (Pusty) - + Resume Wznawianie - + Load State Wczytaj Stan - + Resume (%1) Wznawianie (%1) - + Edit Memory Cards... Edytuj karty pamięci... - + Delete Save States... Usuń zapisane stany... - + Confirm Save State Deletion Potwierdź usunięcie zapisanego stanu - + Are you sure you want to delete all save states for %1? The saves will not be recoverable. @@ -7269,17 +7282,17 @@ The saves will not be recoverable. Zapisów nie będzie można odzyskać. - + &Enabled Cheats &Włączone kody - + &Apply Cheats &Zastosuj kody - + Game ID: %1 Game Title: %2 Game Developer: %3 @@ -7296,7 +7309,7 @@ Osiągnięć: %5 (%6) - + %n points %n punkt @@ -7305,12 +7318,12 @@ Osiągnięć: %5 (%6) - + Rich presence inactive or unsupported. Rich presence wyłączony lub niewspierany. - + Game not loaded or no RetroAchievements available. Nie wczytano gry lub brak dostępnych RetroAchievementów.