From 5488a84569d37d85cffc9c3b80326f3b01d9e24f Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Thu, 16 Feb 2023 14:17:21 +0100 Subject: [PATCH 01/52] Updated Dutch translation --- po/nl.po | 1909 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 1065 insertions(+), 844 deletions(-) diff --git a/po/nl.po b/po/nl.po index 4b83b47eb..dbf0457a2 100644 --- a/po/nl.po +++ b/po/nl.po @@ -3,8 +3,8 @@ msgid "" msgstr "" "Project-Id-Version: lutris\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-04 23:57+0300\n" -"PO-Revision-Date: 2022-12-03 17:00+0100\n" +"POT-Creation-Date: 2023-02-14 11:30+0100\n" +"PO-Revision-Date: 2023-02-16 14:16+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: Dutch\n" "Language: nl\n" @@ -110,7 +110,7 @@ msgstr "Gebruikersnaam" msgid "Search..." msgstr "Zoeken…" -#: share/lutris/ui/lutris-window.ui:147 lutris/gui/lutriswindow.py:484 +#: share/lutris/ui/lutris-window.ui:147 lutris/gui/lutriswindow.py:481 msgid "Search games" msgstr "Games doorzoeken" @@ -130,7 +130,7 @@ msgstr "Zoom " msgid "Sort Ascending" msgstr "Oplopend sorteren" -#: share/lutris/ui/lutris-window.ui:360 lutris/gui/config/common.py:127 +#: share/lutris/ui/lutris-window.ui:360 lutris/gui/config/common.py:134 #: lutris/gui/views/list.py:48 lutris/gui/views/list.py:172 msgid "Name" msgstr "Naam" @@ -183,7 +183,7 @@ msgstr "Lutris-forum" msgid "Make a donation" msgstr "Doneren" -#: lutris/exceptions.py:26 +#: lutris/exceptions.py:28 #, python-brace-format msgid "" "The following {arch} libraries are required but are not installed on your " @@ -194,59 +194,59 @@ msgstr "" "systeem:\n" "{libs}" -#: lutris/game.py:248 +#: lutris/game.py:281 msgid "Error the runner is not installed" msgstr "Foutmelding: runner is niet geïnstalleerd" -#: lutris/game.py:250 +#: lutris/game.py:283 msgid "A bios file is required to run this game" msgstr "Deze game vereist een bios-bestand" -#: lutris/game.py:254 +#: lutris/game.py:287 msgid "The file {} could not be found" msgstr "‘{}’ is niet aangetroffen" -#: lutris/game.py:256 +#: lutris/game.py:289 msgid "" "This game has no executable set. The install process didn't finish properly." msgstr "" "Er is geen uitvoerbaar bestand ingesteld omdat het installatieproces " "onverwachts is afgebroken." -#: lutris/game.py:259 +#: lutris/game.py:292 #, python-format msgid "The file %s is not executable" msgstr "‘%s’ is niet uitvoerbaar" -#: lutris/game.py:261 +#: lutris/game.py:294 #, python-format msgid "The path '%s' is not set. please set it in the options." msgstr "‘%s’ is niet ingesteld. Stel deze locatie in in de opties." -#: lutris/game.py:263 +#: lutris/game.py:296 #, python-format msgid "Unhandled error: %s" msgstr "Onverwachte foutmelding: %s" -#: lutris/game.py:334 +#: lutris/game.py:367 msgid "Uninstall the game before deleting" msgstr "Deïnstalleer de game alvorens hem te verwijderen" -#: lutris/game.py:406 +#: lutris/game.py:439 msgid "Tried to launch a game that isn't installed." msgstr "Je probeerde een niet-geïnstalleerde game te starten." -#: lutris/game.py:408 lutris/game.py:511 +#: lutris/game.py:441 lutris/game.py:544 msgid "Invalid game configuration: Missing runner" msgstr "Ongeldige gameconfiguratie: runner ontbreekt" -#: lutris/game.py:440 +#: lutris/game.py:473 msgid "Unable to find Xephyr, install it or disable the Xephyr option" msgstr "" "Xephyr is niet aangetroffen. Installeer dit pakket of schakel de Xephyr-" "optie uit." -#: lutris/game.py:487 +#: lutris/game.py:520 #, python-format msgid "" "The selected terminal application could not be launched:\n" @@ -255,11 +255,11 @@ msgstr "" "Het geselecteerde terminalprogramma kan niet worden uitgevoerd:\n" "%s" -#: lutris/game.py:744 +#: lutris/game.py:777 msgid "Error lauching the game:\n" msgstr "De game kan niet worden gestart:\n" -#: lutris/game.py:846 +#: lutris/game.py:882 #, python-format msgid "" "Error: Missing shared library.\n" @@ -270,7 +270,7 @@ msgstr "" "\n" "%s" -#: lutris/game.py:852 +#: lutris/game.py:888 msgid "" "Error: A different Wine version is already using the same Wine prefix." msgstr "" @@ -278,105 +278,105 @@ msgstr "" "" #. Local services don't show an install dialog, they can be launched directly -#: lutris/game_actions.py:61 lutris/gui/widgets/game_bar.py:201 -#: lutris/gui/widgets/game_bar.py:215 +#: lutris/game_actions.py:49 lutris/gui/widgets/game_bar.py:202 +#: lutris/gui/widgets/game_bar.py:216 msgid "Play" msgstr "Spelen" -#: lutris/game_actions.py:62 lutris/gui/widgets/game_bar.py:207 +#: lutris/game_actions.py:50 lutris/gui/widgets/game_bar.py:208 msgid "Stop" msgstr "Stoppen" -#: lutris/game_actions.py:63 lutris/gui/dialogs/runner_install.py:210 -#: lutris/gui/installer/script_box.py:62 lutris/gui/widgets/game_bar.py:210 +#: lutris/game_actions.py:51 lutris/gui/dialogs/runner_install.py:210 +#: lutris/gui/installer/script_box.py:62 lutris/gui/widgets/game_bar.py:211 msgid "Install" msgstr "Installeren" -#: lutris/game_actions.py:64 +#: lutris/game_actions.py:52 msgid "Install updates" msgstr "Updates installeren" -#: lutris/game_actions.py:66 +#: lutris/game_actions.py:54 msgid "Show logs" msgstr "Logboek tonen" -#: lutris/game_actions.py:67 +#: lutris/game_actions.py:55 msgid "Add installed game" msgstr "Geïnstalleerde game toevoegen" -#: lutris/game_actions.py:68 lutris/gui/widgets/sidebar.py:214 +#: lutris/game_actions.py:56 lutris/gui/widgets/sidebar.py:214 msgid "Configure" msgstr "Instellen" -#: lutris/game_actions.py:69 +#: lutris/game_actions.py:57 msgid "Add to favorites" msgstr "Toevoegen aan favorieten" -#: lutris/game_actions.py:70 +#: lutris/game_actions.py:58 msgid "Remove from favorites" msgstr "Verwijderen uit favorieten" -#: lutris/game_actions.py:71 +#: lutris/game_actions.py:59 msgid "Execute script" msgstr "Script uitvoeren" -#: lutris/game_actions.py:72 +#: lutris/game_actions.py:60 msgid "Update shader cache" msgstr "Shadercache bijwerken" -#: lutris/game_actions.py:73 +#: lutris/game_actions.py:61 msgid "Browse files" msgstr "Bestanden verkennen" -#: lutris/game_actions.py:76 lutris/gui/installerwindow.py:346 +#: lutris/game_actions.py:64 lutris/gui/installerwindow.py:385 msgid "Create desktop shortcut" msgstr "Bureaubladsnelkoppeling maken" -#: lutris/game_actions.py:81 +#: lutris/game_actions.py:69 msgid "Delete desktop shortcut" msgstr "Bureaubladsnelkoppeling verwijderen" -#: lutris/game_actions.py:86 lutris/gui/installerwindow.py:350 +#: lutris/game_actions.py:74 lutris/gui/installerwindow.py:389 msgid "Create application menu shortcut" msgstr "Snelkoppeling maken in programmamenu" -#: lutris/game_actions.py:91 +#: lutris/game_actions.py:79 msgid "Delete application menu shortcut" msgstr "Snelkoppeling verwijderen uit programmamenu" -#: lutris/game_actions.py:96 lutris/gui/installerwindow.py:355 +#: lutris/game_actions.py:84 lutris/gui/installerwindow.py:394 msgid "Create steam shortcut" msgstr "Steam-snelkoppeling maken" -#: lutris/game_actions.py:101 +#: lutris/game_actions.py:89 msgid "Delete steam shortcut" msgstr "Steam-snelkoppeling verwijderen" -#: lutris/game_actions.py:104 +#: lutris/game_actions.py:92 msgid "Install another version" msgstr "Andere versie installeren" -#: lutris/game_actions.py:105 lutris/gui/dialogs/uninstall_game.py:113 +#: lutris/game_actions.py:93 lutris/gui/dialogs/uninstall_game.py:113 msgid "Remove" msgstr "Verwijderen" -#: lutris/game_actions.py:106 +#: lutris/game_actions.py:94 msgid "Duplicate" msgstr "Klonen" -#: lutris/game_actions.py:107 +#: lutris/game_actions.py:95 msgid "View on Lutris.net" msgstr "Bekijken op Lutris.net" -#: lutris/game_actions.py:108 +#: lutris/game_actions.py:96 msgid "Hide game from library" msgstr "Verbergen in verzameling" -#: lutris/game_actions.py:109 +#: lutris/game_actions.py:97 msgid "Unhide game from library" msgstr "Tonen in verzameling" -#: lutris/game_actions.py:228 +#: lutris/game_actions.py:219 #, python-format msgid "" "Do you wish to duplicate %s?\n" @@ -386,15 +386,15 @@ msgstr "" "Weet je zeker dat je %s wilt klonen?\n" "De instellingen worden gekloond, maar the gamebestanden niet." -#: lutris/game_actions.py:231 +#: lutris/game_actions.py:222 msgid "Duplicate game?" msgstr "Game klonen?" -#: lutris/game_actions.py:292 +#: lutris/game_actions.py:283 msgid "This game has no installation directory" msgstr "Deze game bevat geen installatiemap" -#: lutris/game_actions.py:296 +#: lutris/game_actions.py:287 #, python-format msgid "" "Can't open %s \n" @@ -404,58 +404,55 @@ msgstr "" "De map bestaat niet." #. use primary configuration -#: lutris/game_actions.py:335 -#, fuzzy +#: lutris/game_actions.py:326 msgid "Select shortcut target" -msgstr "Steam-snelkoppeling verwijderen" +msgstr "Kies een snelkoppelingsdoel" -#: lutris/gui/addgameswindow.py:28 +#: lutris/gui/addgameswindow.py:27 msgid "Search the Lutris website for installers" msgstr "Zoeken naar installatiewizards op Litrus-website" -#: lutris/gui/addgameswindow.py:29 +#: lutris/gui/addgameswindow.py:28 msgid "Query our website for community installers" msgstr "Doorzoek onze website op installatiewizards" -#: lutris/gui/addgameswindow.py:35 +#: lutris/gui/addgameswindow.py:34 msgid "Scan a folder for games" msgstr "Naar games zoeken in map" -#: lutris/gui/addgameswindow.py:36 +#: lutris/gui/addgameswindow.py:35 msgid "Mass-import a folder of games" msgstr "Importeer een map met meerdere games" -#: lutris/gui/addgameswindow.py:42 -#, fuzzy +#: lutris/gui/addgameswindow.py:41 msgid "Install a Windows game from an executable" -msgstr "Installeer een Windows-game middels een mediaschijf" +msgstr "Installeer een Windows-game middels een uitvoerbaar bestand" -#: lutris/gui/addgameswindow.py:43 +#: lutris/gui/addgameswindow.py:42 msgid "Launch a Windows executable (.exe) installer" -msgstr "" +msgstr "Start een Windows-installatiebestand (.exe)" -#: lutris/gui/addgameswindow.py:49 +#: lutris/gui/addgameswindow.py:48 msgid "Install from a local install script" msgstr "Installeer middels een lokaal installatiescript" -#: lutris/gui/addgameswindow.py:50 +#: lutris/gui/addgameswindow.py:49 msgid "Run a YAML install script" msgstr "Voer een yaml-installatiescript uit" -#: lutris/gui/addgameswindow.py:56 -#, fuzzy +#: lutris/gui/addgameswindow.py:55 msgid "Import a ROM" -msgstr "Game importeren" +msgstr "Rom importeren" -#: lutris/gui/addgameswindow.py:57 +#: lutris/gui/addgameswindow.py:56 msgid "Import a ROM that is known to Lutris" -msgstr "" +msgstr "Importeer een voor Lutris bekende rom" -#: lutris/gui/addgameswindow.py:63 +#: lutris/gui/addgameswindow.py:62 msgid "Add locally installed game" msgstr "Geïnstalleerde game toevoegen" -#: lutris/gui/addgameswindow.py:64 +#: lutris/gui/addgameswindow.py:63 msgid "Manually configure a game available locally" msgstr "Stel een lokale game handmatig in" @@ -463,42 +460,39 @@ msgstr "Stel een lokale game handmatig in" msgid "Add games to Lutris" msgstr "Voeg games toe aan Lutris" -#. Action buttons -#: lutris/gui/addgameswindow.py:88 lutris/gui/installerwindow.py:79 +#. Header bar buttons +#: lutris/gui/addgameswindow.py:90 lutris/gui/installerwindow.py:82 msgid "Back" -msgstr "" +msgstr "Terug" -#. defer destory so the game dialog can be centered first #. Continue Button -#: lutris/gui/addgameswindow.py:96 lutris/gui/addgameswindow.py:594 -#: lutris/gui/installerwindow.py:87 lutris/gui/installerwindow.py:864 +#: lutris/gui/addgameswindow.py:98 lutris/gui/addgameswindow.py:611 +#: lutris/gui/installerwindow.py:92 lutris/gui/installerwindow.py:902 msgid "_Continue" msgstr "_Doorgaan" #. Buttons -#: lutris/gui/addgameswindow.py:100 lutris/gui/addgameswindow.py:609 -#: lutris/gui/addgameswindow.py:612 lutris/gui/config/common.py:406 -#: lutris/gui/dialogs/runner_install.py:201 lutris/gui/installerwindow.py:88 -#: lutris/gui/installerwindow.py:924 +#: lutris/gui/addgameswindow.py:102 lutris/gui/addgameswindow.py:626 +#: lutris/gui/addgameswindow.py:629 lutris/gui/config/common.py:410 +#: lutris/gui/dialogs/runner_install.py:201 lutris/gui/installerwindow.py:89 +#: lutris/gui/installerwindow.py:956 #: lutris/gui/widgets/download_progress_box.py:95 msgid "Cancel" msgstr "Annuleren" -#: lutris/gui/addgameswindow.py:114 lutris/gui/config/boxes.py:439 +#: lutris/gui/addgameswindow.py:121 lutris/gui/config/boxes.py:486 msgid "Select folder" -msgstr "Map kiezen" +msgstr "Kies een map" -#: lutris/gui/addgameswindow.py:123 -#, fuzzy +#: lutris/gui/addgameswindow.py:130 msgid "Select script" -msgstr "Script uitvoeren" +msgstr "Kies een script" -#: lutris/gui/addgameswindow.py:127 -#, fuzzy +#: lutris/gui/addgameswindow.py:134 msgid "Select ROM file" -msgstr "Bestand kiezen" +msgstr "Kies een rombestand" -#: lutris/gui/addgameswindow.py:213 +#: lutris/gui/addgameswindow.py:220 msgid "" "Lutris will search Lutris.net for games matching the terms you enter, and " "any that it finds will appear here.\n" @@ -506,31 +500,34 @@ msgid "" "When you click on a game that it found, the installer window will appear to " "perform the installation." msgstr "" +"Er wordt op Lutris.net gezocht naar games die overeenkomen met je " +"zoekopdracht. De resultaten worden vervolgens hier getoond.\n" +"\n" +"Als je op een gevonden game klikt, dan wordt het installatievenster geopend." -#: lutris/gui/addgameswindow.py:234 +#: lutris/gui/addgameswindow.py:241 msgid "Search Lutris.net" msgstr "Lutris.net doorzoeken" -#: lutris/gui/addgameswindow.py:271 +#: lutris/gui/addgameswindow.py:278 msgid "No results" msgstr "Geen resultaten" -#: lutris/gui/addgameswindow.py:273 +#: lutris/gui/addgameswindow.py:280 #, python-brace-format msgid "Showing {count} results" msgstr "Er worden {count} resultaten getoond" -#: lutris/gui/addgameswindow.py:275 +#: lutris/gui/addgameswindow.py:282 #, python-brace-format msgid "{total_count} results, only displaying first {count}" msgstr "{total_count} resultaten - de eerste {count} worden getoond" -#: lutris/gui/addgameswindow.py:307 -#, fuzzy +#: lutris/gui/addgameswindow.py:314 msgid "Folder to scan" msgstr "Kies een te doorzoeken map" -#: lutris/gui/addgameswindow.py:313 +#: lutris/gui/addgameswindow.py:320 msgid "" "Lutris will search this folder for sub-folders that contain games it " "recognizes.\n" @@ -540,36 +537,39 @@ msgid "" "When you click 'Continue' below, the search will begin, and any games found " "will be added at once." msgstr "" +"Er wordt in deze map gezocht naar onderliggende mappen die bekende games " +"bevatten.\n" +"\n" +"Aangetroffen games worden toegevoegd aan Lutris.\n" +"\n" +"Het doorzoeken begint zodra je op ‘Doorgaan’ klikt." -#: lutris/gui/addgameswindow.py:331 -#, fuzzy +#: lutris/gui/addgameswindow.py:338 msgid "You must select a folder to scan for games." -msgstr "Kies een te doorzoeken map" +msgstr "Kies een te doorzoeken map." -#: lutris/gui/addgameswindow.py:333 +#: lutris/gui/addgameswindow.py:340 #, python-format msgid "No folder exists at '%s'." -msgstr "" +msgstr "Er is geen map in ‘%s’." -#: lutris/gui/addgameswindow.py:357 -#, fuzzy +#: lutris/gui/addgameswindow.py:364 msgid "Games found" -msgstr "Geen games aangetroffen" +msgstr "Aangetroffen games" -#: lutris/gui/addgameswindow.py:359 -#, fuzzy +#: lutris/gui/addgameswindow.py:366 msgid "No games found" -msgstr "Geen games aangetroffen" +msgstr "Er zijn geen games aangetroffen" -#: lutris/gui/addgameswindow.py:363 lutris/gui/installerwindow.py:924 +#: lutris/gui/addgameswindow.py:370 lutris/gui/installerwindow.py:956 msgid "_Close" msgstr "_Sluiten" -#: lutris/gui/addgameswindow.py:409 +#: lutris/gui/addgameswindow.py:416 msgid "Game name" msgstr "Gamenaam" -#: lutris/gui/addgameswindow.py:425 +#: lutris/gui/addgameswindow.py:432 msgid "" "Enter the name of the game you will install.\n" "\n" @@ -581,39 +581,46 @@ msgid "" "If you know the Lutris identifier for the game, you can provide it for " "improved Lutris integration, such as Lutris provided banners." msgstr "" +"Voer de naam in van de te installeren game.\n" +"\n" +"De installatie begint zodra je op ‘Installeren’ klikt.\n" +"\n" +"Vervolgens wordt gevraagd om een uitvoerbaar bestand, waarna Wine wordt " +"aangeroepen voor de installatie.\n" +"\n" +"Als je de Lutris-identificatiecode van de game weet, voer deze dan in voor " +"betere Lutris-integratie." -#: lutris/gui/addgameswindow.py:436 -#, fuzzy +#: lutris/gui/addgameswindow.py:443 msgid "32-bit Wine prefix" -msgstr "Wine-profiel" +msgstr "32-bit Wine-profiel" -#: lutris/gui/addgameswindow.py:445 +#: lutris/gui/addgameswindow.py:452 msgid "Select setup file" msgstr "Kies een installatiebestand" -#: lutris/gui/addgameswindow.py:447 lutris/gui/addgameswindow.py:528 -#: lutris/gui/addgameswindow.py:570 lutris/gui/installerwindow.py:901 +#: lutris/gui/addgameswindow.py:454 lutris/gui/addgameswindow.py:535 +#: lutris/gui/addgameswindow.py:577 lutris/gui/installerwindow.py:939 msgid "_Install" msgstr "_Installeren" -#: lutris/gui/addgameswindow.py:465 +#: lutris/gui/addgameswindow.py:472 msgid "You must provide a name for the game you are installing." -msgstr "" +msgstr "Voer de naam van de installeren game in." -#: lutris/gui/addgameswindow.py:481 +#: lutris/gui/addgameswindow.py:488 msgid "Setup file" msgstr "Installatiebestand" -#: lutris/gui/addgameswindow.py:490 +#: lutris/gui/addgameswindow.py:497 msgid "Select the setup file" msgstr "Kies een installatiebestand" -#: lutris/gui/addgameswindow.py:509 -#, fuzzy +#: lutris/gui/addgameswindow.py:516 msgid "Script file" -msgstr "Bestand kiezen" +msgstr "Scriptbestand" -#: lutris/gui/addgameswindow.py:515 +#: lutris/gui/addgameswindow.py:522 msgid "" "Lutris install scripts are YAML files that guide Lutris through the " "installation process.\n" @@ -623,17 +630,25 @@ msgid "" "When you click 'Install' below, the installer window will appear and load " "the script, and it will guide the process from there." msgstr "" +"Lutris-installatiescripts zijn yaml-bestanden die Lutris begeleiden bij het " +"installatieproces.\n" +"\n" +"Deze scripts kunnen worden opgehaald van Lutris.net of met de hand worden " +"geschreven.\n" +"\n" +"Als je op ‘Installeren’ klikt, dan wordt het installatievenster geopend en " +"het script gestart." -#: lutris/gui/addgameswindow.py:534 +#: lutris/gui/addgameswindow.py:541 msgid "You must select a script file to install." -msgstr "" +msgstr "Kies een te installeren scriptbestand." -#: lutris/gui/addgameswindow.py:536 lutris/gui/addgameswindow.py:578 +#: lutris/gui/addgameswindow.py:543 lutris/gui/addgameswindow.py:585 #, python-format msgid "No file exists at '%s'." -msgstr "" +msgstr "Er is geen bestand in ‘%s’." -#: lutris/gui/addgameswindow.py:551 lutris/runners/atari800.py:36 +#: lutris/gui/addgameswindow.py:558 lutris/runners/atari800.py:36 #: lutris/runners/jzintv.py:19 lutris/runners/libretro.py:77 #: lutris/runners/mame.py:78 lutris/runners/mednafen.py:57 #: lutris/runners/mupen64plus.py:20 lutris/runners/o2em.py:45 @@ -643,7 +658,7 @@ msgstr "" msgid "ROM file" msgstr "ROM-bestand" -#: lutris/gui/addgameswindow.py:557 +#: lutris/gui/addgameswindow.py:564 msgid "" "Lutris will identify a ROM via its MD5 hash and download game information " "from Lutris.net.\n" @@ -653,10 +668,16 @@ msgid "" "When you click 'Install' below, the process of installing the game will " "begin." msgstr "" +"Lutris herkent een rom op basis van de md5-controlesom en haalt game-" +"informatie op van Lutris.net.\n" +"\n" +"De rom-gegevens zijn afkomstig van het TOSEC-project.\n" +"\n" +"Als je op ‘Installeren’ klikt, dan wordt het installatieproces gestart." -#: lutris/gui/addgameswindow.py:576 +#: lutris/gui/addgameswindow.py:583 msgid "You must select a ROM file to install." -msgstr "" +msgstr "Kies een te installeren rombestand." #: lutris/gui/application.py:92 msgid "" @@ -697,9 +718,8 @@ msgid "Install a game from a yml file" msgstr "Installeer een game middels een yml-bestand" #: lutris/gui/application.py:144 -#, fuzzy msgid "Force updates" -msgstr "Geen games aangetroffen" +msgstr "Updates afdwingen" #: lutris/gui/application.py:152 msgid "Generate a bash script to run a game without the client" @@ -789,16 +809,16 @@ msgstr "het downloaden van {url} naar {file} is gestart" msgid "No such file: %s" msgstr "Bestand bestaat niet: %s" -#: lutris/gui/application.py:726 +#: lutris/gui/application.py:729 #, python-format msgid "There is no installer available for %s." msgstr "Er is geen installatiebestand van %s beschikbaar." -#: lutris/gui/application.py:737 +#: lutris/gui/application.py:740 msgid "No updates found" msgstr "Geen games aangetroffen" -#: lutris/gui/application.py:748 +#: lutris/gui/application.py:751 msgid "No DLC found" msgstr "Geen uitbreidingen aangetroffen" @@ -810,15 +830,15 @@ msgstr "Game toevoegen" msgid "No options available" msgstr "Geen beschikbare opties" -#: lutris/gui/config/boxes.py:111 +#: lutris/gui/config/boxes.py:133 msgid "Reset option to global or default config" msgstr "Optie terugzetten op globale of standaardwaarde" -#: lutris/gui/config/boxes.py:132 +#: lutris/gui/config/boxes.py:154 msgid "Default: " msgstr "Standaard: " -#: lutris/gui/config/boxes.py:136 +#: lutris/gui/config/boxes.py:158 msgid "" "(Italic indicates that this option is modified in a lower configuration " "level.)" @@ -826,39 +846,39 @@ msgstr "" "(cursieve tekst geeft aan dat deze optie op een lager configuratieniveau " "is ingesteld)" -#: lutris/gui/config/boxes.py:319 +#: lutris/gui/config/boxes.py:366 #, python-format msgid "%s (default)" msgstr "%s (standaard)" -#: lutris/gui/config/boxes.py:403 lutris/gui/widgets/common.py:50 +#: lutris/gui/config/boxes.py:450 lutris/gui/widgets/common.py:50 msgid "Select file" msgstr "Bestand kiezen" -#: lutris/gui/config/boxes.py:482 +#: lutris/gui/config/boxes.py:529 msgid "Add files" msgstr "Bestanden toevoegen" -#: lutris/gui/config/boxes.py:500 +#: lutris/gui/config/boxes.py:547 msgid "Files" msgstr "Bestanden" -#: lutris/gui/config/boxes.py:517 +#: lutris/gui/config/boxes.py:564 msgid "Select files" msgstr "Bestanden selecteren" -#: lutris/gui/config/boxes.py:520 +#: lutris/gui/config/boxes.py:567 msgid "_Add" msgstr "_Toevoegen" -#: lutris/gui/config/boxes.py:521 lutris/gui/dialogs/issue.py:72 -#: lutris/gui/dialogs/__init__.py:222 lutris/gui/dialogs/__init__.py:249 +#: lutris/gui/config/boxes.py:568 lutris/gui/dialogs/issue.py:72 +#: lutris/gui/dialogs/__init__.py:217 lutris/gui/dialogs/__init__.py:243 #: lutris/gui/widgets/common.py:113 #: lutris/gui/widgets/download_progress_box.py:47 msgid "_Cancel" msgstr "_Annuleren" -#: lutris/gui/config/boxes.py:651 +#: lutris/gui/config/boxes.py:698 msgid "" "If modified, these options supersede the same options from the base runner " "configuration." @@ -866,7 +886,7 @@ msgstr "" "Als je dit aanpast, dan overschrijven deze opties die van de basis-" "runnerconfiguratie." -#: lutris/gui/config/boxes.py:672 +#: lutris/gui/config/boxes.py:719 msgid "" "If modified, these options supersede the same options from the base runner " "configuration, which themselves supersede the global preferences." @@ -874,7 +894,7 @@ msgstr "" "Als je dit aanpast, dan overschrijven deze opties die van de basis-" "runnerconfiguratie, welke dan weer de globale voorkeuren overschrijven." -#: lutris/gui/config/boxes.py:678 +#: lutris/gui/config/boxes.py:725 msgid "" "If modified, these options supersede the same options from the global " "preferences." @@ -886,105 +906,105 @@ msgstr "" msgid "Select a runner in the Game Info tab" msgstr "Kies een runner op het tabblad ‘Game-informatie’" -#: lutris/gui/config/common.py:123 +#: lutris/gui/config/common.py:130 msgid "Game info" msgstr "Game-informatie" -#: lutris/gui/config/common.py:139 +#: lutris/gui/config/common.py:146 msgid "Identifier" msgstr "Identificatie" -#: lutris/gui/config/common.py:148 lutris/gui/config/common.py:324 +#: lutris/gui/config/common.py:155 lutris/gui/config/common.py:331 msgid "Change" msgstr "Wijzigen" -#: lutris/gui/config/common.py:157 +#: lutris/gui/config/common.py:164 msgid "Directory" msgstr "Map" -#: lutris/gui/config/common.py:163 +#: lutris/gui/config/common.py:170 msgid "Move" msgstr "Verplaatsen" -#: lutris/gui/config/common.py:183 +#: lutris/gui/config/common.py:190 msgid "The default launch option will be used for this game" -msgstr "" - -#: lutris/gui/config/common.py:185 -#, python-format -msgid "The '%s' launch option will be used for this game" -msgstr "" +msgstr "De standaard opstartoptie wordt gebruikt voor deze game" #: lutris/gui/config/common.py:192 -msgid "Reset" -msgstr "" +#, python-format +msgid "The '%s' launch option will be used for this game" +msgstr "De ‘%s’-optie wordt gebruikt voor deze game" -#: lutris/gui/config/common.py:209 lutris/gui/views/list.py:50 +#: lutris/gui/config/common.py:199 +msgid "Reset" +msgstr "Standaardwaarden" + +#: lutris/gui/config/common.py:216 lutris/gui/views/list.py:50 msgid "Runner" msgstr "Runner" -#: lutris/gui/config/common.py:223 +#: lutris/gui/config/common.py:230 msgid "Set custom cover art" msgstr "Eigen omslagfoto instellen" -#: lutris/gui/config/common.py:223 +#: lutris/gui/config/common.py:230 msgid "Remove custom cover art" msgstr "Eigen omslagfoto verwijderen" -#: lutris/gui/config/common.py:224 +#: lutris/gui/config/common.py:231 msgid "Set custom banner" msgstr "Eigen banier instellen" -#: lutris/gui/config/common.py:224 +#: lutris/gui/config/common.py:231 msgid "Remove custom banner" msgstr "Aangepaste banier verwijderen" -#: lutris/gui/config/common.py:225 +#: lutris/gui/config/common.py:232 msgid "Set custom icon" msgstr "Eigen pictogram instellen" -#: lutris/gui/config/common.py:225 +#: lutris/gui/config/common.py:232 msgid "Remove custom icon" msgstr "Aangepast pictogram verwijderen" -#: lutris/gui/config/common.py:258 +#: lutris/gui/config/common.py:265 msgid "Release year" msgstr "Jaar van uitgave" -#: lutris/gui/config/common.py:300 +#: lutris/gui/config/common.py:307 msgid "Select a runner from the list" msgstr "Kies een runner uit de lijst" -#: lutris/gui/config/common.py:308 +#: lutris/gui/config/common.py:315 msgid "Apply" msgstr "Toepassen" -#: lutris/gui/config/common.py:355 lutris/gui/config/common.py:360 -#: lutris/gui/config/common.py:363 +#: lutris/gui/config/common.py:362 lutris/gui/config/common.py:367 +#: lutris/gui/config/common.py:370 msgid "Game options" msgstr "Game-opties" -#: lutris/gui/config/common.py:367 lutris/gui/config/common.py:370 +#: lutris/gui/config/common.py:374 lutris/gui/config/common.py:377 msgid "Runner options" msgstr "Runner-opties" -#: lutris/gui/config/common.py:373 +#: lutris/gui/config/common.py:380 msgid "System options" msgstr "Systeemopties" -#: lutris/gui/config/common.py:409 +#: lutris/gui/config/common.py:413 msgid "Save" msgstr "Opslaan" -#: lutris/gui/config/common.py:422 lutris/gui/config/common.py:439 +#: lutris/gui/config/common.py:425 msgid "Show advanced options" msgstr "Geavanceerde opties tonen" -#: lutris/gui/config/common.py:424 +#: lutris/gui/config/common.py:427 msgid "Advanced" msgstr "Geavanceerd" -#: lutris/gui/config/common.py:475 +#: lutris/gui/config/common.py:468 msgid "" "Are you sure you want to change the runner for this game ? This will reset " "the full configuration for this game and is not reversible." @@ -993,35 +1013,35 @@ msgstr "" "de volledige configuratie van de game verwijderd. Dit kan niet ongedaan " "worden gemaakt." -#: lutris/gui/config/common.py:479 +#: lutris/gui/config/common.py:472 msgid "Confirm runner change" msgstr "Bevestigen" -#: lutris/gui/config/common.py:531 +#: lutris/gui/config/common.py:524 msgid "Runner not provided" msgstr "Geen runner opgegeven" -#: lutris/gui/config/common.py:534 +#: lutris/gui/config/common.py:527 msgid "Please fill in the name" msgstr "Voer de naam in" -#: lutris/gui/config/common.py:537 +#: lutris/gui/config/common.py:530 msgid "Steam AppID not provided" msgstr "Geen Steam AppId opgegeven" -#: lutris/gui/config/common.py:555 +#: lutris/gui/config/common.py:548 msgid "The following fields have invalid values: " msgstr "De volgende velden bevatten ongeldige waarden: " -#: lutris/gui/config/common.py:562 +#: lutris/gui/config/common.py:555 msgid "Current configuration is not valid, ignoring save request" msgstr "De huidige configuratie is ongeldig; het bewaarverzoek is genegeerd" -#: lutris/gui/config/common.py:601 +#: lutris/gui/config/common.py:594 msgid "Please choose a custom image" msgstr "Kies een aangepaste afbeelding" -#: lutris/gui/config/common.py:609 +#: lutris/gui/config/common.py:602 msgid "Images" msgstr "Afbeeldingen" @@ -1092,13 +1112,13 @@ msgstr "" #: lutris/gui/config/runners_box.py:25 msgid "No runners matched the search" -msgstr "" +msgstr "Er zijn geen overeenkomende runners" #. pretty sure there will always be many runners, so assume plural #: lutris/gui/config/runners_box.py:43 -#, fuzzy, python-format +#, python-format msgid "Search %s runners" -msgstr "Runners verversen" +msgstr "%s runners doorzoeken" #: lutris/gui/config/runner_box.py:91 lutris/gui/widgets/sidebar.py:230 #, python-format @@ -1140,8 +1160,8 @@ msgid "System information" msgstr "Systeeminformatie" #: lutris/gui/dialogs/cache.py:13 -msgid "Cache configuration" -msgstr "Cache-instellingen" +msgid "Download cache configuration" +msgstr "Cache-instellingen ophalen" #: lutris/gui/dialogs/cache.py:40 msgid "Cache path" @@ -1183,42 +1203,44 @@ msgstr "Bezig met downloaden van bestand" msgid "Downloading %s" msgstr "Bezig met downloaden van %s" -#: lutris/gui/dialogs/game_import.py:40 lutris/gui/dialogs/__init__.py:320 -msgid "Launch game" -msgstr "Game starten" +#: lutris/gui/dialogs/game_import.py:100 +msgid "Launch" +msgstr "Starten" -#: lutris/gui/dialogs/game_import.py:98 -#, fuzzy -msgid "Looking for installed game..." -msgstr "Bezig met verwijderen van game…" - -#: lutris/gui/dialogs/game_import.py:107 +#: lutris/gui/dialogs/game_import.py:134 msgid "Calculating checksum..." -msgstr "" +msgstr "Bezig met berekenen van controlesom…" -#: lutris/gui/dialogs/game_import.py:112 +#: lutris/gui/dialogs/game_import.py:143 msgid "Looking up checksum on Lutris.net..." -msgstr "" +msgstr "Bezig met opzoeken van controlesom op Lutris.net…" -#: lutris/gui/dialogs/game_import.py:115 -#, fuzzy +#: lutris/gui/dialogs/game_import.py:146 msgid "This ROM could not be identified." -msgstr "‘{}’ is niet aangetroffen" +msgstr "Deze rom wordt niet herkend." -#: lutris/gui/dialogs/game_import.py:166 -#, fuzzy, python-format +#: lutris/gui/dialogs/game_import.py:155 +msgid "Looking for installed game..." +msgstr "Bezig met zoeken naar geïnstalleerde game…" + +#: lutris/gui/dialogs/game_import.py:204 +#, python-format msgid "Failed to import a ROM: %s" -msgstr "‘%s’ kan niet worden gedownload" +msgstr "De rom kan niet worden geïmporteerd: ‘%s’" -#: lutris/gui/dialogs/game_import.py:187 +#: lutris/gui/dialogs/game_import.py:223 +msgid "Game already installed in Lutris" +msgstr "Deze game is al geïnstalleerd" + +#: lutris/gui/dialogs/game_import.py:245 #, python-format msgid "The platform '%s' is unknown to Lutris." -msgstr "" +msgstr "Het platform ‘%s’ wordt niet herkend door Lutris." -#: lutris/gui/dialogs/game_import.py:197 -#, fuzzy, python-format +#: lutris/gui/dialogs/game_import.py:255 +#, python-format msgid "Lutris does not have a default installer for the '%s' platform." -msgstr "Lutris is niet bevoegd om de game te installeren in" +msgstr "Lutris heeft geen standaard installatiewizard voor het platform ‘%s’." #: lutris/gui/dialogs/issue.py:24 msgid "Submit an issue" @@ -1242,8 +1264,8 @@ msgstr "Op_slaan" msgid "Select a location to save the issue" msgstr "Kies een locatie om het probleem in op te slaan" -#: lutris/gui/dialogs/issue.py:71 lutris/gui/dialogs/__init__.py:221 -#: lutris/gui/dialogs/__init__.py:248 lutris/gui/widgets/common.py:113 +#: lutris/gui/dialogs/issue.py:71 lutris/gui/dialogs/__init__.py:216 +#: lutris/gui/dialogs/__init__.py:242 lutris/gui/widgets/common.py:113 msgid "_OK" msgstr "_Oké" @@ -1332,9 +1354,9 @@ msgid "Calculating size…" msgstr "Bezig met berekenen van omvang…" #: lutris/gui/dialogs/uninstall_game.py:51 -#, fuzzy, python-format +#, python-format msgid "%s does not exist." -msgstr "%s bestaat niet" +msgstr "‘%s’ bestaat niet." #: lutris/gui/dialogs/uninstall_game.py:55 #, python-format @@ -1383,49 +1405,52 @@ msgstr "" "Weet je zeker dat je %s wilt verwijderen uit je verzameling?\n" "Alle bijgehouden tijden worden eveneens gewist." -#: lutris/gui/dialogs/webconnect_dialog.py:103 +#: lutris/gui/dialogs/webconnect_dialog.py:106 msgid "Loading..." msgstr "Bezig met laden…" -#: lutris/gui/dialogs/__init__.py:239 +#: lutris/gui/dialogs/__init__.py:233 msgid "Please choose a file" msgstr "Kies een bestand" -#: lutris/gui/dialogs/__init__.py:271 +#: lutris/gui/dialogs/__init__.py:265 msgid "Checking for runtime updates, please wait…" msgstr "Bezig met controleren op runtime-updates…" -#: lutris/gui/dialogs/__init__.py:309 +#: lutris/gui/dialogs/__init__.py:303 #, python-format msgid "%s is already installed" msgstr "%s is al geïnstalleerd" -#: lutris/gui/dialogs/__init__.py:324 +#: lutris/gui/dialogs/__init__.py:314 +msgid "Launch game" +msgstr "Game starten" + +#: lutris/gui/dialogs/__init__.py:318 msgid "Install the game again" msgstr "Game opnieuw installeren" -#: lutris/gui/dialogs/__init__.py:367 -#, fuzzy +#: lutris/gui/dialogs/__init__.py:361 msgid "Do not ask again for this game." -msgstr "Geen kern gekozen voor deze game" +msgstr "Niet meer vragen bij deze game" -#: lutris/gui/dialogs/__init__.py:426 +#: lutris/gui/dialogs/__init__.py:420 msgid "Login failed" msgstr "Inloggen mislukt" -#: lutris/gui/dialogs/__init__.py:437 +#: lutris/gui/dialogs/__init__.py:430 msgid "Install script for {}" msgstr "Installatiescript van {}" -#: lutris/gui/dialogs/__init__.py:493 +#: lutris/gui/dialogs/__init__.py:485 msgid "Do not display this message again." msgstr "Niet meer tonen" -#: lutris/gui/dialogs/__init__.py:514 +#: lutris/gui/dialogs/__init__.py:505 msgid "Wine is not installed on your system." msgstr "Wine is niet geïnstalleerd." -#: lutris/gui/dialogs/__init__.py:516 +#: lutris/gui/dialogs/__init__.py:507 msgid "" "Having Wine installed on your system guarantees that Wine builds from Lutris " "will have all required dependencies.\n" @@ -1440,16 +1465,16 @@ msgstr "" "WineDependencies.md'>Lutris-wiki (Engels) om te lezen hoe je Wine " "installeert." -#: lutris/gui/dialogs/__init__.py:542 +#: lutris/gui/dialogs/__init__.py:533 #, python-format msgid "Moving %s to %s..." msgstr "Bezig met verplaatsen van %s naar %s…" -#: lutris/gui/dialogs/__init__.py:570 +#: lutris/gui/dialogs/__init__.py:561 msgid "Humble Bundle Cookie Authentication" -msgstr "" +msgstr "Humble Bundle-cookie-authenticatie" -#: lutris/gui/dialogs/__init__.py:582 +#: lutris/gui/dialogs/__init__.py:573 msgid "" "Humble Bundle Authentication via cookie import\n" "\n" @@ -1466,72 +1491,82 @@ msgid "" "new'>open a support ticket to ask Humble Bundle to fix their " "configuration." msgstr "" +"Humble Bundle-authenticatie via cookie-import\n" +"\n" +"In Firefox\n" +"- Installeer de volgende add-on: https://addons.mozilla.org/nl-NL/firefox/" +"addon/export-cookies-txt/\n" +"- Open humblebundle.com op een nieuw tabblad en zorg dat je ingelogd bent;\n" +"- Klik rechtsboven op het cookiepictogram (naast de instellingen);\n" +"- Controleer ‘Prefix HttpOnly cookies’ en klik op ‘humblebundle.com’;\n" +"- Open het gegenereerde bestand, plak de inhoud ervan hieronder en klik op " +"oké;\n" +"- Verwijder het gegenereerde bestand;\n" +"- (Optioneel) Open een ondersteuningsticket en vraag Humble Bundle om hun " +"configuratie aan te passen." -#: lutris/gui/installerwindow.py:71 -#, python-format -msgid "Install %s" -msgstr "%s installeren" +#: lutris/gui/installerwindow.py:115 +msgid "Configure download cache" +msgstr "Downloadcache instellen" -#: lutris/gui/installerwindow.py:84 -msgid "Cache" -msgstr "Cache" - -#: lutris/gui/installerwindow.py:85 +#: lutris/gui/installerwindow.py:118 msgid "Change where Lutris downloads game installer files." -msgstr "" +msgstr "Geef aan waar installatiewizardbestanden moeten worden opgeslagen." -#: lutris/gui/installerwindow.py:89 -msgid "_View source" -msgstr "Bron _bekijken" +#: lutris/gui/installerwindow.py:120 +msgid "View installer source" +msgstr "Installatiebron bekijken" -#: lutris/gui/installerwindow.py:90 -msgid "_Eject" -msgstr "Uitw_erpen" - -#: lutris/gui/installerwindow.py:178 +#: lutris/gui/installerwindow.py:212 msgid "Remove game files" msgstr "Gamebestanden verwijderen" -#: lutris/gui/installerwindow.py:190 +#: lutris/gui/installerwindow.py:224 msgid "Are you sure you want to cancel the installation?" msgstr "Weet je zeker dat je de installatie wilt afbreken?" -#: lutris/gui/installerwindow.py:191 +#: lutris/gui/installerwindow.py:225 msgid "Cancel installation?" msgstr "Installatie afbreken?" -#: lutris/gui/installerwindow.py:301 +#: lutris/gui/installerwindow.py:316 +#, python-format +msgid "Install %s" +msgstr "%s installeren" + +#: lutris/gui/installerwindow.py:339 #, python-format msgid "This game requires %s. Do you want to install it?" msgstr "Deze game is afhankelijk van %s. Wil je het installeren?" -#: lutris/gui/installerwindow.py:302 +#: lutris/gui/installerwindow.py:340 msgid "Missing dependency" msgstr "Ontbrekende afhankelijkheid" -#: lutris/gui/installerwindow.py:310 -msgid "Installing {}" -msgstr "Bezig met installeren van {}" +#: lutris/gui/installerwindow.py:349 +msgid "Installing {}" +msgstr "Bezig met installeren van {}" -#: lutris/gui/installerwindow.py:316 +#: lutris/gui/installerwindow.py:355 msgid "No installer available" msgstr "Er is geen installatiewizard beschikbaar" -#: lutris/gui/installerwindow.py:323 +#: lutris/gui/installerwindow.py:362 #, python-format msgid "Missing field \"%s\" in install script" msgstr "Het veld ‘%s’ ontbreekt in het installatiescript" -#: lutris/gui/installerwindow.py:363 +#: lutris/gui/installerwindow.py:402 msgid "Select installation directory" msgstr "Installatiemap kiezen" -#: lutris/gui/installerwindow.py:380 -#, fuzzy +#: lutris/gui/installerwindow.py:418 msgid "Preparing Lutris for installation" -msgstr "Zoeken naar installatiewizards op Litrus-website" +msgstr "Bezig met voorbereiden van installatie" -#: lutris/gui/installerwindow.py:468 +#: lutris/gui/installerwindow.py:507 msgid "" "This game has extra content. \n" "Select which one you want and they will be available in the 'extras' folder " @@ -1541,48 +1576,51 @@ msgstr "" "Kies de inhoud die je wilt toevoegen aan de ‘extras’-map in de " "installatiemap." -#: lutris/gui/installerwindow.py:561 +#: lutris/gui/installerwindow.py:600 msgid "" "Please review the files needed for the installation then click 'Continue'" msgstr "" "Neem de voor installatie benodigde bestanden door en klik vervolgens op " "‘Doorgaan’" -#: lutris/gui/installerwindow.py:570 -#, fuzzy +#: lutris/gui/installerwindow.py:608 msgid "Downloading game data" -msgstr "Bezig met installeren van gamegegevens" +msgstr "Bezig met ophalen van gamegegevens" -#: lutris/gui/installerwindow.py:590 +#: lutris/gui/installerwindow.py:627 #, python-format msgid "Unable to get files: %s" msgstr "De bestanden kunnen niet worden opgehaald: %s" -#: lutris/gui/installerwindow.py:604 +#: lutris/gui/installerwindow.py:641 msgid "Installing game data" msgstr "Bezig met installeren van gamegegevens" -#: lutris/gui/installerwindow.py:748 +#: lutris/gui/installerwindow.py:784 msgid "Autodetect" msgstr "Automatisch detecteren" -#: lutris/gui/installerwindow.py:754 +#: lutris/gui/installerwindow.py:789 msgid "Browse…" msgstr "Bladeren…" -#: lutris/gui/installerwindow.py:771 +#: lutris/gui/installerwindow.py:796 +msgid "Eject" +msgstr "Uitwerpen" + +#: lutris/gui/installerwindow.py:809 msgid "Select the folder where the disc is mounted" msgstr "Kies de map waarin de schijf is aangekoppeld" -#: lutris/gui/installerwindow.py:831 +#: lutris/gui/installerwindow.py:869 msgid "_Launch" msgstr "_Starten" -#: lutris/gui/installerwindow.py:920 +#: lutris/gui/installerwindow.py:952 msgid "_Abort" -msgstr "" +msgstr "_Afbreken" -#: lutris/gui/installerwindow.py:921 +#: lutris/gui/installerwindow.py:953 msgid "Abort and revert the installation" msgstr "Afbreken en installatie terugdraaien" @@ -1616,19 +1654,19 @@ msgstr "Cachebestand voor toekomstige installaties" msgid "Source:" msgstr "Bron:" -#: lutris/gui/lutriswindow.py:375 +#: lutris/gui/lutriswindow.py:371 #, python-format msgid "Connect your %s account to access your games" msgstr "Koppel je %s-account om toegang te krijgen tot je games" -#: lutris/gui/lutriswindow.py:449 +#: lutris/gui/lutriswindow.py:446 #, python-format msgid "Add a game matching '%s' to your favorites to see it here." msgstr "" "Voeg een game die overeenkomt met ‘%s’ toe aan je favorieten om hem hier te " "tonen." -#: lutris/gui/lutriswindow.py:452 +#: lutris/gui/lutriswindow.py:449 #, python-format msgid "" "No installed games matching '%s' found. Press Ctrl+I to show uninstalled " @@ -1638,7 +1676,7 @@ msgstr "" "om verwijderde games te tonen." #. but not if missing! -#: lutris/gui/lutriswindow.py:454 +#: lutris/gui/lutriswindow.py:451 #, python-format msgid "" "No visible games matching '%s' found. Press Ctrl+H to show hidden games." @@ -1646,43 +1684,42 @@ msgstr "" "Er zijn geen games die overeenkomen met ‘%s’. Druk op Ctrl+H om verborgen " "games te tonen." -#: lutris/gui/lutriswindow.py:457 +#: lutris/gui/lutriswindow.py:454 #, python-format msgid "No games matching '%s' found " msgstr "Er zijn geen games die overeenkomen met “%s” " -#: lutris/gui/lutriswindow.py:460 +#: lutris/gui/lutriswindow.py:457 msgid "Add games to your favorites to see them here." msgstr "Voeg games toe aan je favorieten om ze hier te tonen." -#: lutris/gui/lutriswindow.py:462 +#: lutris/gui/lutriswindow.py:459 msgid "No installed games found. Press Ctrl+I to show uninstalled games." msgstr "" "Er zijn geen geïnstalleerde games aangetroffen. Druk op Ctrl+I om " "verwijderde games te tonen." #. but not if missing! -#: lutris/gui/lutriswindow.py:464 +#: lutris/gui/lutriswindow.py:461 msgid "No visible games found. Press Ctrl+H to show hidden games." msgstr "" "Er zijn geen zichtbare games. Druk op Ctrl+H om verborgen games te tonen." -#: lutris/gui/lutriswindow.py:472 +#: lutris/gui/lutriswindow.py:469 msgid "No games found" msgstr "Geen games aangetroffen" -#: lutris/gui/lutriswindow.py:480 -#, fuzzy, python-format +#: lutris/gui/lutriswindow.py:477 +#, python-format msgid "Search %s games" -msgstr "Games doorzoeken" +msgstr "%s games doorzoeken" -#: lutris/gui/lutriswindow.py:482 -#, fuzzy +#: lutris/gui/lutriswindow.py:479 msgid "Search 1 game" -msgstr "Games doorzoeken" +msgstr "1 game doorzoeken" #: lutris/gui/views/list.py:51 lutris/runners/dolphin.py:26 -#: lutris/runners/scummvm.py:178 +#: lutris/runners/scummvm.py:185 msgid "Platform" msgstr "Platform" @@ -1736,7 +1773,7 @@ msgstr "Downloaden onderbroken" msgid "{downloaded:0.2f} / {size:0.2f}MB ({speed:0.2f}MB/s), {time} remaining" msgstr "{downloaded:0.2f} / {size:0.2f}MB ({speed:0.2f}MB/s), {time} resterend" -#: lutris/gui/widgets/game_bar.py:150 +#: lutris/gui/widgets/game_bar.py:151 #, python-format msgid "" "Platform:\n" @@ -1745,7 +1782,7 @@ msgstr "" "Platform:\n" "%s" -#: lutris/gui/widgets/game_bar.py:159 +#: lutris/gui/widgets/game_bar.py:160 #, python-format msgid "" "Time played:\n" @@ -1754,7 +1791,7 @@ msgstr "" "Speeltijd:\n" "%s" -#: lutris/gui/widgets/game_bar.py:168 +#: lutris/gui/widgets/game_bar.py:169 #, python-format msgid "" "Last played:\n" @@ -1763,7 +1800,7 @@ msgstr "" "Laatst gespeeld:\n" "%s" -#: lutris/gui/widgets/game_bar.py:204 +#: lutris/gui/widgets/game_bar.py:205 msgid "Launching" msgstr "Bezig met starten" @@ -1810,7 +1847,7 @@ msgstr "Favorieten" #: lutris/gui/widgets/sidebar.py:363 msgid "Missing" -msgstr "" +msgstr "Ontbrekend" #: lutris/gui/widgets/sidebar.py:371 msgid "Running" @@ -1899,9 +1936,9 @@ msgstr "" "%s" #: lutris/installer/commands.py:252 -#, fuzzy, python-format +#, python-format msgid "The required file '%s' could not be located." -msgstr "‘{}’ is niet aangetroffen" +msgstr "‘%s’ is vereist, maar niet aangetroffen." #: lutris/installer/commands.py:273 #, python-format @@ -1955,14 +1992,14 @@ msgstr "De opdracht is afgesloten met code %s" msgid "Wrong value for write_file mode: '%s'" msgstr "Onjuiste waarde van write_file-modus: ‘%s’" -#: lutris/installer/commands.py:643 +#: lutris/installer/commands.py:657 msgid "install_or_extract only works with wine!" -msgstr "" +msgstr "install_or_extract werkt alléén i.c.m. Wine!" #: lutris/installer/installer.py:161 #, python-format msgid "YOu are not authenticated to %s" -msgstr "" +msgstr "Je bent niet geauthenticeerd door %s" #: lutris/installer/installer.py:200 msgid "Game config key must be a string" @@ -2111,28 +2148,49 @@ msgid "Emulate Atari 5200" msgstr "Atari 5200 emuleren" #: lutris/runners/atari800.py:67 lutris/runners/mame.py:83 -#: lutris/runners/vice.py:88 +#: lutris/runners/vice.py:92 msgid "Machine" msgstr "Machine" -#: lutris/runners/atari800.py:73 lutris/runners/easyrpg.py:144 -#: lutris/runners/hatari.py:71 lutris/runners/jzintv.py:43 -#: lutris/runners/libretro.py:97 lutris/runners/mame.py:157 -#: lutris/runners/mednafen.py:74 lutris/runners/mupen64plus.py:28 -#: lutris/runners/o2em.py:75 lutris/runners/osmose.py:34 -#: lutris/runners/pcsx2.py:26 lutris/runners/pico8.py:38 +#: lutris/runners/atari800.py:73 lutris/runners/atari800.py:81 +#: lutris/runners/dosbox.py:83 lutris/runners/dosbox.py:91 +#: lutris/runners/easyrpg.py:185 lutris/runners/easyrpg.py:193 +#: lutris/runners/easyrpg.py:203 lutris/runners/easyrpg.py:214 +#: lutris/runners/easyrpg.py:225 lutris/runners/hatari.py:62 +#: lutris/runners/hatari.py:69 lutris/runners/hatari.py:77 +#: lutris/runners/hatari.py:92 lutris/runners/jzintv.py:43 +#: lutris/runners/jzintv.py:49 lutris/runners/mame.py:159 +#: lutris/runners/mame.py:166 lutris/runners/mame.py:175 +#: lutris/runners/mame.py:189 lutris/runners/mednafen.py:74 +#: lutris/runners/mednafen.py:81 lutris/runners/mednafen.py:95 +#: lutris/runners/o2em.py:77 lutris/runners/o2em.py:84 +#: lutris/runners/pico8.py:38 lutris/runners/pico8.py:45 +#: lutris/runners/scummvm.py:76 lutris/runners/scummvm.py:83 +#: lutris/runners/scummvm.py:91 lutris/runners/scummvm.py:104 +#: lutris/runners/scummvm.py:145 lutris/runners/scummvm.py:167 +#: lutris/runners/vice.py:57 lutris/runners/vice.py:64 +#: lutris/runners/vice.py:71 lutris/runners/vice.py:78 +msgid "Graphics" +msgstr "Grafisch" + +#: lutris/runners/atari800.py:74 lutris/runners/easyrpg.py:186 +#: lutris/runners/hatari.py:63 lutris/runners/jzintv.py:44 +#: lutris/runners/libretro.py:97 lutris/runners/mame.py:160 +#: lutris/runners/mednafen.py:75 lutris/runners/mupen64plus.py:28 +#: lutris/runners/o2em.py:78 lutris/runners/osmose.py:34 +#: lutris/runners/pcsx2.py:26 lutris/runners/pico8.py:39 #: lutris/runners/redream.py:24 lutris/runners/reicast.py:41 -#: lutris/runners/scummvm.py:76 lutris/runners/snes9x.py:36 -#: lutris/runners/vice.py:57 lutris/runners/xemu.py:24 -#: lutris/runners/yuzu.py:40 +#: lutris/runners/scummvm.py:77 lutris/runners/snes9x.py:36 +#: lutris/runners/vice.py:58 lutris/runners/xemu.py:24 +#: lutris/runners/yuzu.py:40 lutris/sysoptions.py:327 msgid "Fullscreen" msgstr "Schermvullend" -#: lutris/runners/atari800.py:80 +#: lutris/runners/atari800.py:82 msgid "Fullscreen resolution" msgstr "Schermvullende resolutie" -#: lutris/runners/atari800.py:91 +#: lutris/runners/atari800.py:93 msgid "Could not download Atari 800 BIOS archive" msgstr "Het Atari800-biosarchief kan niet worden gedownload" @@ -2248,11 +2306,19 @@ msgstr "" msgid "none" msgstr "geen" -#: lutris/runners/dosbox.py:85 lutris/runners/scummvm.py:101 +#: lutris/runners/dosbox.py:84 +msgid "Open game in fullscreen" +msgstr "Game schermvullend starten" + +#: lutris/runners/dosbox.py:87 +msgid "Tells DOSBox to launch the game in fullscreen." +msgstr "Geef door aan DOSBox dat de game schermvullend moet worden gestart." + +#: lutris/runners/dosbox.py:92 lutris/runners/scummvm.py:105 msgid "Graphic scaler" msgstr "Grafische schaling" -#: lutris/runners/dosbox.py:93 lutris/runners/scummvm.py:119 +#: lutris/runners/dosbox.py:97 lutris/runners/scummvm.py:123 msgid "" "The algorithm used to scale up the game's base resolution, resulting in " "different visual styles. " @@ -2260,22 +2326,14 @@ msgstr "" "Het algoritme dat moet worden gebruikt om de basisresolutie op te schalen, " "wat kan leiden tot verschillende visuele stijlen. " -#: lutris/runners/dosbox.py:98 +#: lutris/runners/dosbox.py:102 msgid "Exit DOSBox with the game" msgstr "DOSBox afsluiten na beëindigen van game" -#: lutris/runners/dosbox.py:101 +#: lutris/runners/dosbox.py:105 msgid "Shut down DOSBox when the game is quit." msgstr "Sluit DOSBox af als de game wordt afgesloten." -#: lutris/runners/dosbox.py:105 -msgid "Open game in fullscreen" -msgstr "Game schermvullend starten" - -#: lutris/runners/dosbox.py:108 -msgid "Tells DOSBox to launch the game in fullscreen." -msgstr "Geef door aan DOSBox dat de game schermvullend moet worden gestart." - #: lutris/runners/easyrpg.py:10 msgid "EasyRPG Player" msgstr "EasyRPG" @@ -2321,8 +2379,8 @@ msgid "Disable auto detection of the simulated engine." msgstr "Schakel automatische detectie van de gesimuleerde aandrijving uit." #: lutris/runners/easyrpg.py:41 lutris/runners/fsuae.py:156 -#: lutris/runners/mame.py:173 lutris/runners/wine.py:84 -#: lutris/runners/wine.py:418 +#: lutris/runners/mame.py:178 lutris/runners/wine.py:84 +#: lutris/runners/wine.py:432 msgid "Auto" msgstr "Automatisch" @@ -2456,52 +2514,72 @@ msgstr "" "van de opslaglocatie dezelfde is als aan het begin van het logboek, dan zou " "deze optie naar behoren moeten werken." -#: lutris/runners/easyrpg.py:145 -msgid "Start in fullscreen mode." -msgstr "Start op in de schermvullende weergave." - -#: lutris/runners/easyrpg.py:151 +#: lutris/runners/easyrpg.py:144 msgid "Enable audio" msgstr "Audio inschakelen" -#: lutris/runners/easyrpg.py:153 +#: lutris/runners/easyrpg.py:146 msgid "Switch off to disable audio (in case you prefer your own music)." msgstr "" "Schakel uit om audio uit te schakelen (bijv. als je behoefte hebt aan je " "eigen muziek)." +#: lutris/runners/easyrpg.py:154 +msgid "RNG seed" +msgstr "RNG-seed" + +#: lutris/runners/easyrpg.py:155 +msgid "Seeds the random number generator" +msgstr "‘Seed’ de willekeurige getalgenerator" + +#: lutris/runners/easyrpg.py:160 +msgid "Test play" +msgstr "Testen" + #: lutris/runners/easyrpg.py:161 +msgid "Enable TestPlay mode." +msgstr "Schakel de testmodus in." + +#: lutris/runners/easyrpg.py:167 lutris/runners/easyrpg.py:177 +msgid "Controls" +msgstr "Bediening" + +#: lutris/runners/easyrpg.py:168 msgid "Enable mouse" msgstr "Muis gebruiken" -#: lutris/runners/easyrpg.py:163 +#: lutris/runners/easyrpg.py:170 msgid "Use mouse click for decision and scroll wheel for lists." msgstr "" "Gebruik muisklikken om beslissingen te nemen en het scrollwiel om door " "lijsten te bladeren." -#: lutris/runners/easyrpg.py:170 +#: lutris/runners/easyrpg.py:178 msgid "Enable touch" msgstr "Touch inschakelen" -#: lutris/runners/easyrpg.py:171 +#: lutris/runners/easyrpg.py:179 msgid "Use one/two finger tap for decision/cancel." msgstr "Gebruik één of twee vingers om beslissingen te nemen of af te breken." -#: lutris/runners/easyrpg.py:177 +#: lutris/runners/easyrpg.py:187 +msgid "Start in fullscreen mode." +msgstr "Start op in de schermvullende weergave." + +#: lutris/runners/easyrpg.py:194 msgid "Hide title" msgstr "Naam verbergen" -#: lutris/runners/easyrpg.py:179 +#: lutris/runners/easyrpg.py:196 msgid "Hide the title background image and center the command menu." msgstr "" "Verberg de achtergrondafbeelding van de naam en centreer het opdrachtmenu." -#: lutris/runners/easyrpg.py:186 +#: lutris/runners/easyrpg.py:204 msgid "Enable VSync" msgstr "VSync gebruiken" -#: lutris/runners/easyrpg.py:188 +#: lutris/runners/easyrpg.py:206 msgid "" "Switch off to disable VSync and use the FPS limit. VSync may or may not be " "supported on all platforms." @@ -2509,11 +2587,11 @@ msgstr "" "Schakel uit om verticale synchronisatie uit te schakelen het fps-limiet aan " "te houden. VSync wordt mogelijk niet op alle platformen ondersteund." -#: lutris/runners/easyrpg.py:196 lutris/sysoptions.py:368 +#: lutris/runners/easyrpg.py:215 lutris/sysoptions.py:441 msgid "FPS limit" msgstr "FPS-limiet" -#: lutris/runners/easyrpg.py:198 +#: lutris/runners/easyrpg.py:217 msgid "" "Set a custom frames per second limit. If unspecified, the default is 60 FPS. " "Set to '0' to disable the frame limiter. This option may not be supported on " @@ -2523,57 +2601,46 @@ msgstr "" "Stel in op ‘0’ om uit te schakelen. Deze optie wordt mogelijk niet op alle " "platformen ondersteund." -#: lutris/runners/easyrpg.py:206 lutris/runners/wine.py:444 +#: lutris/runners/easyrpg.py:226 lutris/runners/wine.py:458 msgid "Show FPS" msgstr "FPS-informatie tonen" -#: lutris/runners/easyrpg.py:207 +#: lutris/runners/easyrpg.py:227 msgid "Enable frames per second counter." msgstr "Schakel de frames-per-secondeteller in." -#: lutris/runners/easyrpg.py:209 lutris/runners/mednafen.py:85 -#: lutris/runners/wine.py:441 +#: lutris/runners/easyrpg.py:229 lutris/runners/mednafen.py:84 +#: lutris/runners/wine.py:455 msgid "Disabled" msgstr "Uitgeschakeld" -#: lutris/runners/easyrpg.py:210 +#: lutris/runners/easyrpg.py:230 msgid "Fullscreen & title bar" msgstr "Schermvullende weergave en titelbalk" -#: lutris/runners/easyrpg.py:211 +#: lutris/runners/easyrpg.py:231 msgid "Fullscreen, title bar & window" msgstr "Schermvullende weergave, titelbalk en venster" -#: lutris/runners/easyrpg.py:218 -msgid "RNG seed" -msgstr "RNG-seed" +#: lutris/runners/easyrpg.py:238 lutris/runners/easyrpg.py:248 +#: lutris/runners/easyrpg.py:258 lutris/runners/easyrpg.py:268 +msgid "Runtime Package" +msgstr "Runtimepakket" -#: lutris/runners/easyrpg.py:219 -msgid "Seeds the random number generator" -msgstr "‘Seed’ de willekeurige getalgenerator" - -#: lutris/runners/easyrpg.py:224 -msgid "Test play" -msgstr "Testen" - -#: lutris/runners/easyrpg.py:225 -msgid "Enable TestPlay mode." -msgstr "Schakel de testmodus in." - -#: lutris/runners/easyrpg.py:231 +#: lutris/runners/easyrpg.py:239 msgid "Enable RTP" msgstr "RTP inschakelen" -#: lutris/runners/easyrpg.py:233 +#: lutris/runners/easyrpg.py:241 msgid "Switch off to disable support for the Runtime Package (RTP)." msgstr "" "Schakel uit om ondersteuning voor Runtime Package (RTP) uit te schakelen." -#: lutris/runners/easyrpg.py:240 +#: lutris/runners/easyrpg.py:249 msgid "RPG2000 RTP location" msgstr "RPG2000 RTP-locatie" -#: lutris/runners/easyrpg.py:242 +#: lutris/runners/easyrpg.py:251 msgid "" "Full path to a directory containing an extracted RPG Maker 2000 Run-Time-" "Package (RTP)." @@ -2581,11 +2648,11 @@ msgstr "" "De volledige locatie van de map die een geëxtraheerde versie bevat van RPG " "Maker 2000 Run-Time-Package (RTP)." -#: lutris/runners/easyrpg.py:249 +#: lutris/runners/easyrpg.py:259 msgid "RPG2003 RTP location" msgstr "RPG2003 RTP-locatie" -#: lutris/runners/easyrpg.py:251 +#: lutris/runners/easyrpg.py:261 msgid "" "Full path to a directory containing an extracted RPG Maker 2003 Run-Time-" "Package (RTP)." @@ -2593,19 +2660,19 @@ msgstr "" "De volledige locatie van de map die een geëxtraheerde versie bevat van RPG " "Maker 2003 Run-Time-Package (RTP)." -#: lutris/runners/easyrpg.py:258 +#: lutris/runners/easyrpg.py:269 msgid "Fallback RTP location" msgstr "Terugval-RTP-locatie" -#: lutris/runners/easyrpg.py:259 +#: lutris/runners/easyrpg.py:270 msgid "Full path to a directory containing a combined RTP." msgstr "De volledige locatie van de map die een gecombineerde RTP bevat." -#: lutris/runners/easyrpg.py:349 +#: lutris/runners/easyrpg.py:360 msgid "No game directory provided" msgstr "Geen gamemap opgegeven" -#: lutris/runners/easyrpg.py:409 +#: lutris/runners/easyrpg.py:420 msgid "The directory {} could not be found" msgstr "‘{}’ is niet aangetroffen" @@ -2680,7 +2747,7 @@ msgstr "" "De map waarin de opdracht dient te worden uitgevoerd. Let op: dit dient een " "map binnen de sandbox te zijn." -#: lutris/runners/flatpak.py:81 lutris/sysoptions.py:472 +#: lutris/runners/flatpak.py:81 lutris/sysoptions.py:611 msgid "Environment variables" msgstr "Omgevingsvariabelen" @@ -2935,11 +3002,11 @@ msgstr "Locatie van de uitgebreide Kickstart, zoals gebruikt door CD32" msgid "Fullscreen (F12 + S to switch)" msgstr "Schermvullend (druk op F12 + S om te schakelen)" -#: lutris/runners/fsuae.py:283 lutris/runners/o2em.py:81 +#: lutris/runners/fsuae.py:283 lutris/runners/o2em.py:85 msgid "Scanlines display style" msgstr "Weergavestijl van scanlijnen" -#: lutris/runners/fsuae.py:286 lutris/runners/o2em.py:83 +#: lutris/runners/fsuae.py:286 lutris/runners/o2em.py:87 msgid "" "Activates a display filter adding scanlines to imitate the displays of " "yesteryear." @@ -3081,11 +3148,11 @@ msgstr "Atari ST-emulator" msgid "Atari ST" msgstr "Atari ST" -#: lutris/runners/hatari.py:27 +#: lutris/runners/hatari.py:24 msgid "Floppy Disk A" msgstr "Diskette A" -#: lutris/runners/hatari.py:29 lutris/runners/hatari.py:43 +#: lutris/runners/hatari.py:26 lutris/runners/hatari.py:37 msgid "" "Hatari supports floppy disk images in the following formats: ST, DIM, MSA, " "STX, IPF, RAW and CRT. The last three require the caps library (capslib). " @@ -3096,29 +3163,29 @@ msgstr "" "(capslib). ZIP wordt ondersteund, maar je hoeft het bestand niet uit te " "pakken." -#: lutris/runners/hatari.py:41 +#: lutris/runners/hatari.py:35 msgid "Floppy Disk B" msgstr "Diskette B" -#: lutris/runners/hatari.py:51 lutris/runners/redream.py:73 +#: lutris/runners/hatari.py:45 lutris/runners/redream.py:73 #: lutris/runners/zdoom.py:75 msgid "None" msgstr "Geen" -#: lutris/runners/hatari.py:51 +#: lutris/runners/hatari.py:45 msgid "Keyboard" msgstr "Toetsenbord" -#: lutris/runners/hatari.py:51 lutris/runners/o2em.py:39 -#: lutris/runners/scummvm.py:186 +#: lutris/runners/hatari.py:45 lutris/runners/o2em.py:39 +#: lutris/runners/scummvm.py:193 msgid "Joystick" msgstr "Joystick" -#: lutris/runners/hatari.py:60 +#: lutris/runners/hatari.py:51 msgid "Bios file (TOS)" msgstr "BIOS-bestand (TOS)" -#: lutris/runners/hatari.py:62 +#: lutris/runners/hatari.py:53 msgid "" "TOS is the operating system of the Atari ST and is necessary to run " "applications with the best fidelity, minimizing risks of issues.\n" @@ -3128,19 +3195,19 @@ msgstr "" "in de beste kwaliteit te tonen, zodat het risico wordt geminimaliseerd.\n" "TOS 1.02 is aanbevolen voor games." -#: lutris/runners/hatari.py:77 +#: lutris/runners/hatari.py:70 msgid "Scale up display by 2 (Atari ST/STE)" msgstr "Scherm opschalen met 2 (Atari ST/STE)" -#: lutris/runners/hatari.py:79 +#: lutris/runners/hatari.py:72 msgid "Double the screen size in windowed mode." msgstr "Verdubbelt de schermgrootte in venstermodus." -#: lutris/runners/hatari.py:87 +#: lutris/runners/hatari.py:78 msgid "Add borders to display" msgstr "Randen om scherm tonen" -#: lutris/runners/hatari.py:91 +#: lutris/runners/hatari.py:81 msgid "" "Useful for some games and demos using the overscan technique. The Atari ST " "displayed borders around the screen because it was not powerful enough to " @@ -3152,11 +3219,11 @@ msgstr "" "schermvullend te tonen. Maar mensen uit de demogemeenschap verwijderden ze " "en sommige games maakten daar gebruik van." -#: lutris/runners/hatari.py:105 +#: lutris/runners/hatari.py:93 msgid "Display status bar" msgstr "Statusbalk tonen" -#: lutris/runners/hatari.py:109 +#: lutris/runners/hatari.py:96 msgid "" "Displays a status bar with some useful information, like green leds lighting " "up when the floppy disks are read." @@ -3164,23 +3231,28 @@ msgstr "" "Toont een statusbalk met nuttige informatie, zoals groene ledjes die " "oplichten als diskettes worden uitgelezen." -#: lutris/runners/hatari.py:117 +#: lutris/runners/hatari.py:104 lutris/runners/hatari.py:112 +msgid "Joysticks" +msgstr "Joysticks" + +#: lutris/runners/hatari.py:105 +#| msgid "Joystick 1" +msgid "Joystick 0" +msgstr "Joystick 0" + +#: lutris/runners/hatari.py:113 msgid "Joystick 1" msgstr "Joystick 1" -#: lutris/runners/hatari.py:124 -msgid "Joystick 2" -msgstr "Joystick 2" - -#: lutris/runners/hatari.py:136 +#: lutris/runners/hatari.py:125 msgid "Do you want to select an Atari ST BIOS file?" msgstr "Wil je een Atari ST-biosbestand kiezen?" -#: lutris/runners/hatari.py:137 +#: lutris/runners/hatari.py:126 msgid "Use BIOS file?" msgstr "BIOS-bestand gebruiken?" -#: lutris/runners/hatari.py:138 +#: lutris/runners/hatari.py:127 msgid "Select a BIOS file" msgstr "Kies een biosbestand" @@ -3222,7 +3294,7 @@ msgstr "" "Deze bestanden bevatten code van de oorspronkelijke hardware, benodigd voor " "emulatie." -#: lutris/runners/jzintv.py:48 +#: lutris/runners/jzintv.py:50 msgid "Resolution" msgstr "Resolutie" @@ -3301,11 +3373,11 @@ msgstr "" "afwijkende bibliotheek." #: lutris/runners/linux.py:138 -#, fuzzy msgid "" "The runner could not find a command or exe to use for this configuration." msgstr "" -"De runner kan geen opdracht vinden om de instellingen op toe te passen." +"De runner kan geen opdracht of exe-bestand vinden om de instellingen op toe " +"te passen." #: lutris/runners/mame.py:65 lutris/services/mame.py:11 msgid "MAME" @@ -3427,11 +3499,15 @@ msgstr "Ponsband 2" msgid "Print Out" msgstr "Printen" -#: lutris/runners/mame.py:130 +#: lutris/runners/mame.py:130 lutris/runners/mame.py:138 +msgid "Autoboot" +msgstr "Automatisch opstarten" + +#: lutris/runners/mame.py:131 msgid "Autoboot command" msgstr "Automatische opstartopdracht" -#: lutris/runners/mame.py:131 +#: lutris/runners/mame.py:132 msgid "" "Autotype this command when the system has started, an enter keypress is " "automatically added." @@ -3439,15 +3515,15 @@ msgstr "" "Print deze opdracht als het systeem wordt opgestart. Druk op Enter om toe te " "voegen." -#: lutris/runners/mame.py:137 +#: lutris/runners/mame.py:139 msgid "Delay before entering autoboot command" msgstr "Vertraging alvorens opdracht uit te voeren" -#: lutris/runners/mame.py:147 +#: lutris/runners/mame.py:149 msgid "ROM/BIOS path" msgstr "ROM/BIOS-locatie" -#: lutris/runners/mame.py:149 +#: lutris/runners/mame.py:151 msgid "" "Choose the folder containing ROMs and BIOS files.\n" "These files contain code from the original hardware necessary to the " @@ -3457,27 +3533,27 @@ msgstr "" "Deze bestanden bevatten code van de oorspronkelijke hardware, benodigd voor " "emulatie." -#: lutris/runners/mame.py:163 +#: lutris/runners/mame.py:167 msgid "CRT effect ()" msgstr "CRT-effect ()" -#: lutris/runners/mame.py:164 +#: lutris/runners/mame.py:168 msgid "Applies a CRT effect to the screen.Requires OpenGL renderer." msgstr "Past een CRT-effert toe op het scherm. Vereist: OpenGL-renderer." -#: lutris/runners/mame.py:171 +#: lutris/runners/mame.py:176 msgid "Video backend" msgstr "Videoback-end" -#: lutris/runners/mame.py:177 lutris/runners/vice.py:82 +#: lutris/runners/mame.py:182 lutris/runners/vice.py:80 msgid "Software" msgstr "Software" -#: lutris/runners/mame.py:184 +#: lutris/runners/mame.py:190 msgid "Wait for VSync" msgstr "Wachten op VSync" -#: lutris/runners/mame.py:186 +#: lutris/runners/mame.py:192 msgid "" "Enable waiting for the start of vblank before flipping screens; " "reduces tearing effects." @@ -3485,51 +3561,51 @@ msgstr "" "Wacht totdat vblank is gestart voordat de schermen worden gespiegeld. " "Dit voorkomt scheuren." -#: lutris/runners/mame.py:194 +#: lutris/runners/mame.py:200 msgid "Menu mode key" msgstr "Menumodussleutel" -#: lutris/runners/mame.py:196 +#: lutris/runners/mame.py:202 msgid "Scroll Lock" msgstr "ScrollLock" -#: lutris/runners/mame.py:197 +#: lutris/runners/mame.py:203 msgid "Num Lock" msgstr "NumLock" -#: lutris/runners/mame.py:198 +#: lutris/runners/mame.py:204 msgid "Caps Lock" msgstr "CapsLock" -#: lutris/runners/mame.py:199 +#: lutris/runners/mame.py:205 msgid "Menu" msgstr "Menu" -#: lutris/runners/mame.py:200 +#: lutris/runners/mame.py:206 msgid "Right Control" msgstr "Ctrl (rechts)" -#: lutris/runners/mame.py:201 +#: lutris/runners/mame.py:207 msgid "Left Control" msgstr "Ctrl (links)" -#: lutris/runners/mame.py:202 +#: lutris/runners/mame.py:208 msgid "Right Alt" msgstr "Alt (rechts)" -#: lutris/runners/mame.py:203 +#: lutris/runners/mame.py:209 msgid "Left Alt" msgstr "Alt (links)" -#: lutris/runners/mame.py:204 +#: lutris/runners/mame.py:210 msgid "Right Super" msgstr "Super (rechts)" -#: lutris/runners/mame.py:205 +#: lutris/runners/mame.py:211 msgid "Left Super" msgstr "Super (links)" -#: lutris/runners/mame.py:209 +#: lutris/runners/mame.py:215 msgid "" "Key to switch between Full Keyboard Mode and Partial Keyboard Mode (default: " "Scroll Lock)" @@ -3537,11 +3613,11 @@ msgstr "" "Toets om te schakelen tussen de volledige en gedeeltelijke toetsenbordmodi " "(standaard: ScrollLock)" -#: lutris/runners/mame.py:223 lutris/runners/mame.py:265 +#: lutris/runners/mame.py:229 lutris/runners/mame.py:271 msgid "Arcade" msgstr "Speelhal" -#: lutris/runners/mame.py:223 lutris/runners/mame.py:264 +#: lutris/runners/mame.py:229 lutris/runners/mame.py:270 msgid "Nintendo Game & Watch" msgstr "Nintendo Game & Watch" @@ -3685,43 +3761,43 @@ msgstr "" msgid "Machine type" msgstr "Soort machine" -#: lutris/runners/mednafen.py:83 +#: lutris/runners/mednafen.py:82 msgid "Aspect ratio" msgstr "Beeldverhouding" -#: lutris/runners/mednafen.py:86 +#: lutris/runners/mednafen.py:85 msgid "Stretched" msgstr "Uitgerekt" -#: lutris/runners/mednafen.py:87 lutris/runners/vice.py:69 +#: lutris/runners/mednafen.py:86 lutris/runners/vice.py:72 msgid "Preserve aspect ratio" msgstr "Beeldverhouding behouden" -#: lutris/runners/mednafen.py:88 +#: lutris/runners/mednafen.py:87 msgid "Integer scale" msgstr "Integerschaal" -#: lutris/runners/mednafen.py:89 +#: lutris/runners/mednafen.py:88 msgid "Multiple of 2 scale" msgstr "Factor 2-schaal" -#: lutris/runners/mednafen.py:100 +#: lutris/runners/mednafen.py:96 msgid "Video scaler" msgstr "Videoschaal" -#: lutris/runners/mednafen.py:128 +#: lutris/runners/mednafen.py:120 msgid "Sound device" msgstr "Audio-apparaat" -#: lutris/runners/mednafen.py:130 +#: lutris/runners/mednafen.py:122 msgid "Mednafen default" msgstr "Standaard meegeleverd" -#: lutris/runners/mednafen.py:131 +#: lutris/runners/mednafen.py:123 msgid "ALSA default" msgstr "Standaard-ALSA" -#: lutris/runners/mednafen.py:142 +#: lutris/runners/mednafen.py:133 msgid "Use default Mednafen controller configuration" msgstr "Standaard Mednafen-controllerinstellingen gebruiken" @@ -3771,7 +3847,7 @@ msgstr "Phillips Videopac+" msgid "Brandt Jopac" msgstr "Brandt Jopac" -#: lutris/runners/o2em.py:36 lutris/runners/wine.py:399 +#: lutris/runners/o2em.py:36 lutris/runners/wine.py:413 msgid "Disable" msgstr "Uitschakelen" @@ -3787,11 +3863,15 @@ msgstr "W,S,A,D,SPATIEBALK" msgid "BIOS" msgstr "BIOS" -#: lutris/runners/o2em.py:62 +#: lutris/runners/o2em.py:62 lutris/runners/o2em.py:70 +msgid "Controllers" +msgstr "Controllers" + +#: lutris/runners/o2em.py:63 msgid "First controller" msgstr "Eerste controller" -#: lutris/runners/o2em.py:69 +#: lutris/runners/o2em.py:71 msgid "Second controller" msgstr "Tweede controller" @@ -3864,39 +3944,39 @@ msgid "You can put a .p8.png file path, URL, or BBS cartridge ID here." msgstr "" "Je kunt hier een .p8.png-bestandslocatie, -url of bbs-cartridge-id invoeren." -#: lutris/runners/pico8.py:40 +#: lutris/runners/pico8.py:41 msgid "Launch in fullscreen." msgstr "Schermvullend opstarten." -#: lutris/runners/pico8.py:44 lutris/runners/web.py:45 +#: lutris/runners/pico8.py:46 lutris/runners/web.py:45 msgid "Window size" msgstr "Venstergrootte" -#: lutris/runners/pico8.py:47 +#: lutris/runners/pico8.py:49 msgid "The initial size of the game window." msgstr "De initiële grootte van het gamevenster." -#: lutris/runners/pico8.py:52 +#: lutris/runners/pico8.py:54 msgid "Start in splore mode" msgstr "Opstarten in splore-modus" -#: lutris/runners/pico8.py:58 +#: lutris/runners/pico8.py:60 msgid "Extra arguments" msgstr "Opdrachtregelopties" -#: lutris/runners/pico8.py:60 +#: lutris/runners/pico8.py:62 msgid "Extra arguments to the executable" msgstr "Opdrachtregelopties voor het uitvoerbare bestand" -#: lutris/runners/pico8.py:66 +#: lutris/runners/pico8.py:68 msgid "Engine (web only)" msgstr "Aandrijving (alleen online)" -#: lutris/runners/pico8.py:68 +#: lutris/runners/pico8.py:70 msgid "Name of engine (will be downloaded) or local file path" msgstr "Naam van de aandrijving (wordt gedownload) of lokale bestandslocatie" -#: lutris/runners/pico8.py:82 +#: lutris/runners/pico8.py:84 #, python-format msgid "PICO-8 runner (%s)" msgstr "PICO-8-runner (%s)" @@ -4005,7 +4085,13 @@ msgstr "Tijdsynchronisatie" msgid "Audio and video" msgstr "Audio en video" -#: lutris/runners/redream.py:71 +#: lutris/runners/redream.py:71 lutris/runners/scummvm.py:222 +#: lutris/runners/scummvm.py:230 lutris/runners/scummvm.py:237 +#: lutris/runners/scummvm.py:259 lutris/runners/scummvm.py:272 +#: lutris/runners/scummvm.py:292 lutris/runners/scummvm.py:300 +#: lutris/runners/scummvm.py:308 lutris/runners/scummvm.py:316 +#: lutris/runners/scummvm.py:323 lutris/runners/scummvm.py:331 +#: lutris/runners/scummvm.py:340 lutris/runners/scummvm.py:350 msgid "Audio" msgstr "Audio" @@ -4041,23 +4127,29 @@ msgstr "" "De gamedata.\n" "Ondersteunde formaten: iso, cdi" -#: lutris/runners/reicast.py:47 +#: lutris/runners/reicast.py:47 lutris/runners/reicast.py:55 +#: lutris/runners/reicast.py:63 lutris/runners/reicast.py:71 +#| msgid "Gamepad 1" +msgid "Gamepads" +msgstr "Gamepads" + +#: lutris/runners/reicast.py:48 msgid "Gamepad 1" msgstr "Gamepad 1" -#: lutris/runners/reicast.py:54 +#: lutris/runners/reicast.py:56 msgid "Gamepad 2" msgstr "Gamepad 2" -#: lutris/runners/reicast.py:61 +#: lutris/runners/reicast.py:64 msgid "Gamepad 3" msgstr "Gamepad 3" -#: lutris/runners/reicast.py:68 +#: lutris/runners/reicast.py:72 msgid "Gamepad 4" msgstr "Gamepad 4" -#: lutris/runners/reicast.py:84 +#: lutris/runners/reicast.py:88 msgid "You have to copy valid BIOS files to ~/.reicast/data before playing" msgstr "" "Kopieer geldige bios-bestanden naar ~/.reicast/data voordat je gaat spelen" @@ -4160,15 +4252,15 @@ msgstr "Game-identificatie" msgid "Game files location" msgstr "Locatie van gamebestanden" -#: lutris/runners/scummvm.py:82 +#: lutris/runners/scummvm.py:84 msgid "Enable subtitles" msgstr "Ondertiteling tonen" -#: lutris/runners/scummvm.py:89 +#: lutris/runners/scummvm.py:92 msgid "Aspect ratio correction" msgstr "Beeldverhoudingscorrectie" -#: lutris/runners/scummvm.py:93 +#: lutris/runners/scummvm.py:96 msgid "" "Most games supported by ScummVM were made for VGA display modes using " "rectangular pixels. Activating this option for these games will preserve the " @@ -4178,19 +4270,19 @@ msgstr "" "rechthoekige pixels. Schakel deze optie in om games in de oorspronkelijke " "4:3-beeldverhouding te spelen." -#: lutris/runners/scummvm.py:140 +#: lutris/runners/scummvm.py:146 msgid "Render mode" msgstr "Rendermodus" -#: lutris/runners/scummvm.py:157 +#: lutris/runners/scummvm.py:163 msgid "Changes how the game is rendered." msgstr "Geef aan hoe de game gerendered moet worden." -#: lutris/runners/scummvm.py:161 +#: lutris/runners/scummvm.py:168 msgid "Filtering" msgstr "Filteren" -#: lutris/runners/scummvm.py:163 +#: lutris/runners/scummvm.py:170 msgid "" "Uses bilinear interpolation instead of nearest neighbor resampling for the " "aspect ratio correction and stretch mode." @@ -4198,15 +4290,15 @@ msgstr "" "Gebruik bilineaire interpolatie in plaats van ‘nearest neighbor resampling’ " "voor de beeldverhoudingscorrectie en vergrootmodus." -#: lutris/runners/scummvm.py:170 +#: lutris/runners/scummvm.py:177 msgid "Data directory" msgstr "Datamap" -#: lutris/runners/scummvm.py:172 +#: lutris/runners/scummvm.py:179 msgid "Defaults to share/scummvm if unspecified." msgstr "Standaard is dit share/scummvm." -#: lutris/runners/scummvm.py:179 +#: lutris/runners/scummvm.py:186 msgid "" "Specifes platform of game. Allowed values: 2gs, 3do, acorn, amiga, atari, " "c64, fmtowns, nes, mac, pc pc98, pce, segacd, wii, windows" @@ -4215,24 +4307,24 @@ msgstr "" "acorn, amiga, atari, c64, fmtowns, nes, mac, pc pc98, pce, segacd, wii, " "windows" -#: lutris/runners/scummvm.py:187 +#: lutris/runners/scummvm.py:194 msgid "Enables joystick input (default: 0 = first joystick)" msgstr "Schakel joystickinvoer in (standaard: 0 = eerste joystick)" -#: lutris/runners/scummvm.py:193 +#: lutris/runners/scummvm.py:200 msgid "Language" msgstr "Taal" -#: lutris/runners/scummvm.py:194 +#: lutris/runners/scummvm.py:201 msgid "" "Selects language (en, de, fr, it, pt, es, jp, zh, kr, se, gb, hb, ru, cz)" msgstr "Kies een taal (en, de, fr, it, pt, es, jp, zh, kr, se, gb, hb, ru, cz)" -#: lutris/runners/scummvm.py:200 +#: lutris/runners/scummvm.py:207 msgid "Engine speed" msgstr "Aandrijvingssnelheid" -#: lutris/runners/scummvm.py:201 +#: lutris/runners/scummvm.py:208 msgid "" "Sets frames per second limit (0 - 100) for Grim Fandango or Escape from " "Monkey Island (default: 60)." @@ -4240,53 +4332,53 @@ msgstr "" "Stel het aantal frames per seconde in (0 - 100) van Grim Fandango of Escape " "from Monkey Island (standaard: 60)." -#: lutris/runners/scummvm.py:208 +#: lutris/runners/scummvm.py:215 msgid "Talk speed" msgstr "Voorleessnelheid" -#: lutris/runners/scummvm.py:209 +#: lutris/runners/scummvm.py:216 msgid "Sets talk speed for games (default: 60)" msgstr "Stel de voorleessnelheid van games in (standaard: 60)" -#: lutris/runners/scummvm.py:215 +#: lutris/runners/scummvm.py:223 msgid "Music tempo" msgstr "Muzieksnelheid" -#: lutris/runners/scummvm.py:216 +#: lutris/runners/scummvm.py:224 msgid "Sets music tempo (in percent, 50-200) for SCUMM games (default: 100)" msgstr "" "Stel het tempo in (in procent - 50-200) van SCUMM-games (standaard: 100)" -#: lutris/runners/scummvm.py:222 +#: lutris/runners/scummvm.py:231 msgid "Digital iMuse tempo" msgstr "Digital iMuse-tempo" -#: lutris/runners/scummvm.py:223 +#: lutris/runners/scummvm.py:232 msgid "Sets internal Digital iMuse tempo (10 - 100) per second (default: 10)" msgstr "" "Stel het interne Digital iMuse-tempo (10-100) per seconde in (standaard: 10)" -#: lutris/runners/scummvm.py:228 +#: lutris/runners/scummvm.py:238 msgid "Music driver" msgstr "Muziekstuurprogramma" -#: lutris/runners/scummvm.py:244 +#: lutris/runners/scummvm.py:254 msgid "Specifies the device ScummVM uses to output audio." msgstr "Kies het apparaat dat ScummVM moet gebruiken voor audio-uitvoer." -#: lutris/runners/scummvm.py:249 +#: lutris/runners/scummvm.py:260 msgid "Output rate" msgstr "Uitvoersnelheid" -#: lutris/runners/scummvm.py:256 +#: lutris/runners/scummvm.py:267 msgid "Selects output sample rate in Hz." msgstr "Kies de uitvoer-samplesnelheid (in HZ)." -#: lutris/runners/scummvm.py:261 +#: lutris/runners/scummvm.py:273 msgid "OPL driver" msgstr "OPL-stuurprogramma" -#: lutris/runners/scummvm.py:273 +#: lutris/runners/scummvm.py:285 msgid "" "Chooses which emulator is used by ScummVM when the AdLib emulator is chosen " "as the Preferred device." @@ -4294,60 +4386,60 @@ msgstr "" "Geef aan welke emulator gebruikt dient te worden door ScummVM als de AdLib-" "emulator is ingesteld als voorkeursapparaat." -#: lutris/runners/scummvm.py:280 +#: lutris/runners/scummvm.py:293 msgid "Music volume" msgstr "Muziekvolume" -#: lutris/runners/scummvm.py:281 +#: lutris/runners/scummvm.py:294 msgid "Sets the music volume, 0-255 (default: 192)" msgstr "Stel het volumeniveau in, tussen 0 en 255 (standaard: 192)" -#: lutris/runners/scummvm.py:287 +#: lutris/runners/scummvm.py:301 msgid "SFX volume" msgstr "Geluidseffectenvolume" -#: lutris/runners/scummvm.py:288 +#: lutris/runners/scummvm.py:302 msgid "Sets the sfx volume, 0-255 (default: 192)" msgstr "Stel het volumeniveau in, tussen 0 en 255 (standaard: 192)" -#: lutris/runners/scummvm.py:294 +#: lutris/runners/scummvm.py:309 msgid "Speech volume" msgstr "Voorleesvolume" -#: lutris/runners/scummvm.py:295 +#: lutris/runners/scummvm.py:310 msgid "Sets the speech volume, 0-255 (default: 192)" msgstr "Stel het volumeniveau in, tussen 0 en 255 (standaard: 192)" -#: lutris/runners/scummvm.py:301 +#: lutris/runners/scummvm.py:317 msgid "MIDI gain" msgstr "MIDI-versterking" -#: lutris/runners/scummvm.py:302 +#: lutris/runners/scummvm.py:318 msgid "Sets the gain for MIDI playback. 0-1000 (default: 100)" msgstr "" "Stel de versterking van MIDI-muziek in, tussen 0 en 1000 (standaard: 100)" -#: lutris/runners/scummvm.py:308 +#: lutris/runners/scummvm.py:325 msgid "Soundfont" msgstr "Soundfont" -#: lutris/runners/scummvm.py:309 +#: lutris/runners/scummvm.py:326 msgid "Specifies the path to a soundfont file." msgstr "De locatie van een soundfontbestand." -#: lutris/runners/scummvm.py:314 +#: lutris/runners/scummvm.py:332 msgid "Mixed AdLib/MIDI mode" msgstr "Gedeelde AdLib-/MIDI-modus" -#: lutris/runners/scummvm.py:317 +#: lutris/runners/scummvm.py:335 msgid "Combines MIDI music with AdLib sound effects." msgstr "Combineert MIDI-muziek met AdLib-geluidseffecten." -#: lutris/runners/scummvm.py:322 +#: lutris/runners/scummvm.py:341 msgid "True Roland MT-32" msgstr "True Roland MT-32" -#: lutris/runners/scummvm.py:325 +#: lutris/runners/scummvm.py:344 msgid "" "Tells ScummVM that the MIDI device is an actual Roland MT-32, LAPC-I, CM-64, " "CM-32L, CM-500 or other MT-32 device." @@ -4355,11 +4447,11 @@ msgstr "" "Geeft door aan ScummVM dat het MIDI-apparaat een Roland MT-32, LAPC-I, " "CM-64, CM-32L, CM-500 of ander MT-32-apparaat is." -#: lutris/runners/scummvm.py:331 +#: lutris/runners/scummvm.py:351 msgid "Enable Roland GS" msgstr "Roland GS gebruiken" -#: lutris/runners/scummvm.py:334 +#: lutris/runners/scummvm.py:354 msgid "" "Tells ScummVM that the MIDI device is a GS device that has an MT-32 map, " "such as an SC-55, SC-88 or SC-8820." @@ -4367,43 +4459,47 @@ msgstr "" "Geeft door aan ScummVM dat het MIDI-apparaat een GS-apparaat is dat beschikt " "over een MT-32-kaart, zoals een SC-55, SC-88 or SC-8820." -#: lutris/runners/scummvm.py:341 +#: lutris/runners/scummvm.py:361 msgid "Use alternate intro" msgstr "Alternatieve introductie tonen" -#: lutris/runners/scummvm.py:342 +#: lutris/runners/scummvm.py:362 msgid "Uses alternative intro for CD versions" msgstr "Toon een alternatieve introductie van cd-versies" -#: lutris/runners/scummvm.py:348 +#: lutris/runners/scummvm.py:368 msgid "Copy protection" msgstr "Kopieerbeveiliging" -#: lutris/runners/scummvm.py:349 +#: lutris/runners/scummvm.py:369 msgid "Enables copy protection" msgstr "Schakel kopieerbeveiliging in" -#: lutris/runners/scummvm.py:355 +#: lutris/runners/scummvm.py:375 msgid "Demo mode" msgstr "Demomodus" -#: lutris/runners/scummvm.py:356 +#: lutris/runners/scummvm.py:376 msgid "Starts demo mode of Maniac Mansion or The 7th Guest" msgstr "Start de demomodus van Maniac Mansion of The 7th Guest" -#: lutris/runners/scummvm.py:362 +#: lutris/runners/scummvm.py:382 lutris/runners/scummvm.py:390 +msgid "Debugging" +msgstr "Foutopsporing" + +#: lutris/runners/scummvm.py:383 msgid "Debug level" msgstr "Foutopsporingsniveau" -#: lutris/runners/scummvm.py:363 +#: lutris/runners/scummvm.py:384 msgid "Sets debug verbosity level" msgstr "Stel het foutopsporingsniveau in" -#: lutris/runners/scummvm.py:369 +#: lutris/runners/scummvm.py:391 msgid "Debug flags" msgstr "Foutopsporingsopties" -#: lutris/runners/scummvm.py:370 +#: lutris/runners/scummvm.py:392 msgid "Enables engine specific debug flags" msgstr "Stel specifieke foutopsporingsopties in" @@ -4574,18 +4670,18 @@ msgstr "" msgid "Use joysticks" msgstr "Joysticks gebruiken" -#: lutris/runners/vice.py:63 +#: lutris/runners/vice.py:65 msgid "Scale up display by 2" msgstr "Scherm opschalen met 2" -#: lutris/runners/vice.py:75 -msgid "Enable sound emulation of disk drives" -msgstr "Audio-emulatie van harde schijven gebruiken" - -#: lutris/runners/vice.py:81 +#: lutris/runners/vice.py:79 msgid "Graphics renderer" msgstr "Grafische renderer" +#: lutris/runners/vice.py:86 +msgid "Enable sound emulation of disk drives" +msgstr "Audio-emulatie van harde schijven gebruiken" + #: lutris/runners/web.py:17 lutris/runners/web.py:19 msgid "Web" msgstr "Web" @@ -4875,11 +4971,15 @@ msgstr "Geïnstalleerde winetricks gebruiken" msgid "Switch on to use /usr/bin/winetricks for winetricks." msgstr "Gebruik /usr/bin/winetricks als winetricks-opdracht." -#: lutris/runners/wine.py:199 +#: lutris/runners/wine.py:199 lutris/runners/wine.py:213 +msgid "DXVK" +msgstr "DXVK" + +#: lutris/runners/wine.py:200 msgid "Enable DXVK" msgstr "DXVK gebruiken" -#: lutris/runners/wine.py:206 +#: lutris/runners/wine.py:207 msgid "" "Use DXVK to increase compatibility and performance in Direct3D 11, 10 and 9 " "applications by translating their calls to Vulkan." @@ -4887,15 +4987,19 @@ msgstr "" "Met DXVK vergroot je de comptabiliteit met en prestaties van games die " "Direct3D 9, 10 of 11 gebruiken door hun verzoeken door te sturen naar Vulkan." -#: lutris/runners/wine.py:212 +#: lutris/runners/wine.py:214 msgid "DXVK version" msgstr "DXVK-versie" -#: lutris/runners/wine.py:221 +#: lutris/runners/wine.py:223 lutris/runners/wine.py:236 +msgid "VKD3D" +msgstr "VKD3D" + +#: lutris/runners/wine.py:224 msgid "Enable VKD3D" msgstr "VKD3D gebruiken" -#: lutris/runners/wine.py:228 +#: lutris/runners/wine.py:231 msgid "" "Use VKD3D to enable support for Direct3D 12 applications by translating " "their calls to Vulkan." @@ -4903,15 +5007,19 @@ msgstr "" "Met VKD3D vergroot je de comptabiliteit met en prestaties van games die " "Direct3D 12 gebruiken door hun verzoeken door te sturen naar Vulkan." -#: lutris/runners/wine.py:233 +#: lutris/runners/wine.py:237 msgid "VKD3D version" msgstr "VKD3D-versie" -#: lutris/runners/wine.py:241 +#: lutris/runners/wine.py:245 lutris/runners/wine.py:257 +msgid "D3D Extras" +msgstr "D3D-extra's" + +#: lutris/runners/wine.py:246 msgid "Enable D3D Extras" msgstr "D3D-extra's gebruiken" -#: lutris/runners/wine.py:246 +#: lutris/runners/wine.py:251 msgid "" "Replace Wine's D3DX and D3DCOMPILER libraries with alternative ones. Needed " "for proper functionality of DXVK with some games." @@ -4919,28 +5027,37 @@ msgstr "" "Vervangt Wine's D3DX en D3DCOMPILER door alternatieven. Sommige DXVK-games " "vereisen dit." -#: lutris/runners/wine.py:252 +#: lutris/runners/wine.py:258 msgid "D3D Extras version" msgstr "Versie van D3D-extra's" -#: lutris/runners/wine.py:260 +#: lutris/runners/wine.py:266 lutris/runners/wine.py:277 +msgid "DXVK-NVAPI / DLSS" +msgstr "DXVX-NVAPI/DLSS" + +#: lutris/runners/wine.py:267 msgid "Enable DXVK-NVAPI / DLSS" msgstr "DXVX-NVAPI/DLSS gebruiken" -#: lutris/runners/wine.py:265 +#: lutris/runners/wine.py:272 msgid "Enable emulation of Nvidia's NVAPI and add DLSS support, if available." msgstr "" "Emuleer NVIDIA's NVAPI en voeg DLSS-ondersteuning toe (indien beschikbaar)." -#: lutris/runners/wine.py:270 +#: lutris/runners/wine.py:278 msgid "DXVK NVAPI version" msgstr "DXVK-NVAPI-versie" -#: lutris/runners/wine.py:278 +#: lutris/runners/wine.py:286 lutris/runners/wine.py:299 +#| msgid "Enable dgvoodoo2" +msgid "dgvoodoo2" +msgstr "dgvoodoo2" + +#: lutris/runners/wine.py:287 msgid "Enable dgvoodoo2" msgstr "dgvoodoo2 inschakelen" -#: lutris/runners/wine.py:283 +#: lutris/runners/wine.py:292 msgid "" "dgvoodoo2 is an alternative translation layer for rendering old games that " "utilize D3D1-7 and Glide APIs. As it translates to D3D11, it's recommended " @@ -4951,15 +5068,15 @@ msgstr "" "is aanbevolen om dit te gebruiken in combinatie met DXVK. Alleen 32-" "bitprogramma's worden ondersteund." -#: lutris/runners/wine.py:290 +#: lutris/runners/wine.py:300 msgid "dgvoodoo2 version" msgstr "dgvoodoo2-versie" -#: lutris/runners/wine.py:298 +#: lutris/runners/wine.py:308 msgid "Enable Esync" msgstr "Esync gebruiken" -#: lutris/runners/wine.py:305 +#: lutris/runners/wine.py:315 msgid "" "Enable eventfd-based synchronization (esync). This will increase performance " "in applications that take advantage of multi-core processors." @@ -4968,11 +5085,11 @@ msgstr "" "de prestaties van games die optimaal gebruikmaken van processors met " "meerdere kernen." -#: lutris/runners/wine.py:312 +#: lutris/runners/wine.py:322 msgid "Enable Fsync" msgstr "Fsync gebruiken" -#: lutris/runners/wine.py:319 +#: lutris/runners/wine.py:329 msgid "" "Enable futex-based synchronization (fsync). This will increase performance " "in applications that take advantage of multi-core processors. Requires " @@ -4982,11 +5099,11 @@ msgstr "" "prestaties van games die optimaal gebruikmaken van processors met meerdere " "kernen. Hiervoor is kernelversie 5.16 of hoger vereist." -#: lutris/runners/wine.py:327 +#: lutris/runners/wine.py:337 msgid "Enable AMD FidelityFX Super Resolution (FSR)" msgstr "AMD FidelityFX Super Resolution (FSR) gebruiken" -#: lutris/runners/wine.py:331 +#: lutris/runners/wine.py:341 msgid "" "Use FSR to upscale the game window to native resolution.\n" "Requires Lutris Wine FShack >= 6.13 and setting the game to a lower " @@ -5000,11 +5117,11 @@ msgstr "" "Let op: dit werkt niet met games die in de naadloze venstermodus draaien of " "zichzelf opschalen." -#: lutris/runners/wine.py:338 +#: lutris/runners/wine.py:348 msgid "Enable BattlEye Anti-Cheat" msgstr "BattlEye Anti-Cheat inschakelen" -#: lutris/runners/wine.py:342 +#: lutris/runners/wine.py:352 msgid "" "Enable support for BattlEye Anti-Cheat in supported games\n" "Requires Lutris Wine 6.21-2 and newer or any other compatible Wine build.\n" @@ -5013,11 +5130,11 @@ msgstr "" "Vereist: Lutris Wine 6.21-2 of hoger, of elke andere compatibele Wine-" "versie.\n" -#: lutris/runners/wine.py:348 +#: lutris/runners/wine.py:358 msgid "Enable Easy Anti-Cheat" msgstr "Easy Anti-Cheat inschakelen" -#: lutris/runners/wine.py:352 +#: lutris/runners/wine.py:362 msgid "" "Enable support for Easy Anti-Cheat in supported games\n" "Requires Lutris Wine 7.2 and newer or any other compatible Wine build.\n" @@ -5025,11 +5142,16 @@ msgstr "" "Schakel Easy Anti-Cheat in bij ondersteunde games.\n" "Vereist: Lutris Wine 7.2 of hoger, of elke andere compatibele Wine-versie.\n" -#: lutris/runners/wine.py:358 +#: lutris/runners/wine.py:368 lutris/runners/wine.py:380 +#| msgid "Virtual Boy" +msgid "Virtual Desktop" +msgstr "Virtueel bureaublad" + +#: lutris/runners/wine.py:369 msgid "Windowed (virtual desktop)" msgstr "Venster (op virtueel werkblad)" -#: lutris/runners/wine.py:362 +#: lutris/runners/wine.py:373 msgid "" "Run the whole Windows desktop in a window.\n" "Otherwise, run it fullscreen.\n" @@ -5039,19 +5161,24 @@ msgstr "" "in plaats van schermvullend.\n" "Dit is gelijk aan Wine's virtuelebureaubladoptie." -#: lutris/runners/wine.py:369 +#: lutris/runners/wine.py:381 msgid "Virtual desktop resolution" msgstr "Resolutie van virtueel werkblad" -#: lutris/runners/wine.py:372 +#: lutris/runners/wine.py:384 msgid "The size of the virtual desktop in pixels." msgstr "De grootte van het virtuele werkblad, in pixels." -#: lutris/runners/wine.py:376 +#: lutris/runners/wine.py:388 lutris/runners/wine.py:399 +#: lutris/runners/wine.py:400 +msgid "DPI" +msgstr "DPI" + +#: lutris/runners/wine.py:389 msgid "Enable DPI Scaling" msgstr "Scherm vergroten/verkleinen met dpi" -#: lutris/runners/wine.py:380 +#: lutris/runners/wine.py:393 msgid "" "Enables the Windows application's DPI scaling.\n" "Otherwise, the Screen Resolution option in 'Wine configuration' controls " @@ -5060,11 +5187,7 @@ msgstr "" "Schakelt de Windows-dpi-instellingen in.\n" "Dit is gelijk aan Wine's schermresolutie-optie." -#: lutris/runners/wine.py:386 -msgid "DPI" -msgstr "DPI" - -#: lutris/runners/wine.py:389 +#: lutris/runners/wine.py:403 msgid "" "The DPI to be used if 'Enable DPI Scaling' is turned on.\n" "If blank or 'auto', Lutris will auto-detect this." @@ -5073,19 +5196,19 @@ msgstr "" "ingeschakeld.\n" "Blanco of ‘auto’ = automatisch detecteren." -#: lutris/runners/wine.py:395 +#: lutris/runners/wine.py:409 msgid "Mouse Warp Override" msgstr "Automatische cursorplaatsing" -#: lutris/runners/wine.py:398 +#: lutris/runners/wine.py:412 lutris/sysoptions.py:275 msgid "Enable" msgstr "Inschakelen" -#: lutris/runners/wine.py:400 +#: lutris/runners/wine.py:414 msgid "Force" msgstr "Afdwingen" -#: lutris/runners/wine.py:405 +#: lutris/runners/wine.py:419 msgid "" "Override the default mouse pointer warping behavior\n" "Enable: (Wine default) warp the pointer when the mouse is exclusively " @@ -5099,11 +5222,11 @@ msgstr "" "Uitschakelen: plaats de cursor nooit automatisch \n" "Afdwingen: plaats de cursor altijd automatisch op knoppen" -#: lutris/runners/wine.py:414 +#: lutris/runners/wine.py:428 msgid "Audio driver" msgstr "Audiostuurprogramma" -#: lutris/runners/wine.py:425 +#: lutris/runners/wine.py:439 msgid "" "Which audio backend to use.\n" "By default, Wine automatically picks the right one for your system." @@ -5111,45 +5234,45 @@ msgstr "" "Welk audioback-end er moet worden gebruikt.\n" "Standaard kiest Wine automatisch de juiste." -#: lutris/runners/wine.py:433 +#: lutris/runners/wine.py:447 msgid "DLL overrides" msgstr "DLL-afdwinging" -#: lutris/runners/wine.py:434 +#: lutris/runners/wine.py:448 msgid "Sets WINEDLLOVERRIDES when launching the game." msgstr "De tezamen met de game uit te voeren WINEDLLOVERRIDES." -#: lutris/runners/wine.py:438 +#: lutris/runners/wine.py:452 msgid "Output debugging info" msgstr "Uitvoer-foutopsporingsinformatie" -#: lutris/runners/wine.py:442 +#: lutris/runners/wine.py:456 msgid "Enabled" msgstr "Ingeschakeld" -#: lutris/runners/wine.py:443 +#: lutris/runners/wine.py:457 msgid "Inherit from environment" msgstr "Overnemen van werkomgeving" -#: lutris/runners/wine.py:445 +#: lutris/runners/wine.py:459 msgid "Full (CAUTION: Will cause MASSIVE slowdown)" msgstr "Volledig (LET OP: dit leidt tot GIGANTISCHE lags)" -#: lutris/runners/wine.py:448 +#: lutris/runners/wine.py:462 msgid "Output debugging information in the game log (might affect performance)" msgstr "" "Plaats foutopsporingsinformatie in het gamelogboek (dit kan leiden tot " "prestatieverlies)" -#: lutris/runners/wine.py:453 +#: lutris/runners/wine.py:467 msgid "Show crash dialogs" msgstr "Crashschermen tonen" -#: lutris/runners/wine.py:461 +#: lutris/runners/wine.py:475 msgid "Autoconfigure joypads" msgstr "Joypads automatisch instellen" -#: lutris/runners/wine.py:465 +#: lutris/runners/wine.py:479 msgid "" "Automatically disables one of Wine's detected joypad to avoid having 2 " "controllers detected" @@ -5157,11 +5280,15 @@ msgstr "" "Schakelt automatisch één van Wine's gedetecteerde joypads uit om te " "voorkomen dat er 2 worden gedetecteerd" -#: lutris/runners/wine.py:471 +#: lutris/runners/wine.py:485 lutris/runners/wine.py:498 +msgid "Sandbox" +msgstr "Sandbox" + +#: lutris/runners/wine.py:486 msgid "Create a sandbox for Wine folders" msgstr "Wine-mappen in sandbox plaatsen" -#: lutris/runners/wine.py:475 +#: lutris/runners/wine.py:490 msgid "" "Do not use $HOME for desktop integration folders.\n" "By default, it use the directories in the confined Windows environment." @@ -5169,62 +5296,61 @@ msgstr "" "Gebruik $HOME niet voor burueabladintegratiemappen.\n" "Standaard worden de mappen uit het Wine-profiel gebruikt." -#: lutris/runners/wine.py:483 +#: lutris/runners/wine.py:499 msgid "Sandbox directory" msgstr "Sandboxmap" -#: lutris/runners/wine.py:484 +#: lutris/runners/wine.py:500 msgid "Custom directory for desktop integration folders." msgstr "Aangepaste map voor de bureaubladintegratiemappen." -#: lutris/runners/wine.py:493 +#: lutris/runners/wine.py:509 msgid "Run EXE inside Wine prefix" msgstr "EXE uitvoeren op Wine-profiel" -#: lutris/runners/wine.py:494 +#: lutris/runners/wine.py:510 msgid "Wine configuration" msgstr "Wine-instellingen" -#: lutris/runners/wine.py:495 +#: lutris/runners/wine.py:511 msgid "Open Bash terminal" msgstr "Bash-terminalvenster openen" -#: lutris/runners/wine.py:496 +#: lutris/runners/wine.py:512 msgid "Open Wine console" msgstr "Wine-opdrachtprompt openen" -#: lutris/runners/wine.py:497 +#: lutris/runners/wine.py:513 msgid "Wine registry" msgstr "Wine-register" -#: lutris/runners/wine.py:498 +#: lutris/runners/wine.py:514 msgid "Winetricks" msgstr "Winetricks" -#: lutris/runners/wine.py:499 +#: lutris/runners/wine.py:515 msgid "Wine Control Panel" msgstr "Wine-configuratiescherm" -#: lutris/runners/wine.py:681 +#: lutris/runners/wine.py:697 msgid "Select an EXE or MSI file" msgstr "Kies een exe- of msi-bestand" #: lutris/runners/xemu.py:8 msgid "xemu" -msgstr "" +msgstr "xemu" #: lutris/runners/xemu.py:9 msgid "Xbox" -msgstr "" +msgstr "Xbox" #: lutris/runners/xemu.py:10 -#, fuzzy msgid "Xbox emulator" -msgstr "Amiga-emulator" +msgstr "Xbox-emulator" #: lutris/runners/xemu.py:18 msgid "DVD image in iso format" -msgstr "" +msgstr "Dvd-schijfkopie in iso-formaat" #: lutris/runners/yuzu.py:14 msgid "Yuzu" @@ -5382,7 +5508,7 @@ msgstr "" #: lutris/services/amazon.py:572 msgid "Invalid JSON response from Amazon APIs" -msgstr "" +msgstr "Ongeldig json-antwoord van de Amazon-api's" #: lutris/services/amazon.py:630 #, python-format @@ -5399,7 +5525,7 @@ msgstr "" "geïnstalleerd.\n" "Na het installeren kun je inloggen op %s." -#: lutris/services/battlenet.py:85 +#: lutris/services/battlenet.py:90 msgid "Battle.net" msgstr "Battle.net" @@ -5437,9 +5563,8 @@ msgid "Humble Bundle" msgstr "Humble Bundle" #: lutris/services/humblebundle.py:85 -#, fuzzy msgid "Workaround for Humble Bundle authentication" -msgstr "Geen game aangetroffen op Humble Bundle" +msgstr "Tussenoplossing voor Humble Bundle-authenticatie" #: lutris/services/humblebundle.py:86 msgid "" @@ -5449,6 +5574,10 @@ msgid "" "There is a workaround involving copying cookies from Firefox, do you want to " "do this instead?" msgstr "" +"Humble Bundle beperkt api-aanroepen van software als Lutris en GameHub.\n" +"Hierdoor mislukt de authenticatie waarschijnlijk.\n" +"Er is echter een tussenoplossing in de vorm van het kopiëren van cookies uit " +"Firefox. Wil je dit nu doen?" #: lutris/services/humblebundle.py:247 msgid "The download URL for the game could not be determined." @@ -5461,12 +5590,13 @@ msgstr "Geen game aangetroffen op Humble Bundle" #. According to their branding, "itch.io" is supposed to be all lowercase #: lutris/services/itchio.py:78 msgid "itch.io" -msgstr "" +msgstr "itch.io" #: lutris/services/lutris.py:123 #, python-format msgid "Lutris has no installers for %s. Try using a different service instead." msgstr "" +"Lutris heeft geen installatiewizards van %s. Probeer een andere dienst." #: lutris/services/origin.py:129 msgid "Origin" @@ -5493,9 +5623,8 @@ msgid "Local" msgstr "Lokaal" #: lutris/settings.py:13 -#, fuzzy msgid "(c) 2009 Lutris Team" -msgstr "(c) 2010-2022 Het Lutris-team" +msgstr "(c) 2009 Het Lutris-team" #: lutris/settings.py:14 msgid "The Lutris team" @@ -5548,64 +5677,40 @@ msgstr "" "Het databankbestand van %s kan niet worden geopend. Wijzig de naam van het " "bestand en start Lutris opnieuw." -#: lutris/sysoptions.py:29 +#: lutris/sysoptions.py:36 msgid "Keep current" msgstr "Huidige behouden" -#: lutris/sysoptions.py:43 +#: lutris/sysoptions.py:50 msgid "(recommended)" msgstr "(aanbevolen)" -#: lutris/sysoptions.py:46 +#: lutris/sysoptions.py:53 msgid "System" msgstr "Systeem" -#: lutris/sysoptions.py:55 lutris/sysoptions.py:64 lutris/sysoptions.py:75 -#: lutris/sysoptions.py:562 +#: lutris/sysoptions.py:62 lutris/sysoptions.py:71 lutris/sysoptions.py:82 +#: lutris/sysoptions.py:708 msgid "Off" msgstr "Uit" -#: lutris/sysoptions.py:56 +#: lutris/sysoptions.py:63 msgid "Primary" msgstr "Primair" -#. Start the 'choices' with an 'auto' choice. But which one? -#: lutris/sysoptions.py:127 -msgid "Auto: Intel Open Source (MESA: ANV)" -msgstr "Automatisch: Intel Open Source (MESA: ANV)" - -#: lutris/sysoptions.py:128 -msgid "Auto: AMD RADV Open Source (MESA: RADV)" -msgstr "Automatisch: AMD RADV Open Source (MESA: RADV)" - -#: lutris/sysoptions.py:129 -msgid "Auto: Nvidia Proprietary" -msgstr "Automatisch: Nvidia (gesloten stuurprogramma)" - -#. Without VK_ICD_FILENAMES, we'll try to figure out what GPU the -#. user has installed and which has ICD files. If that fails, we'll -#. just use blank and hope for the best. -#: lutris/sysoptions.py:146 lutris/sysoptions.py:151 -msgid "Auto: WARNING -- No Vulkan Loader detected!" -msgstr "Automatisch: WAARSCHUWING -- er is geen Vulkan-loader aangetroffen!" - -#: lutris/sysoptions.py:187 -msgid "Unspecified (Use System Default)" -msgstr "Niet-opgegeven (systeemstandaard)" - -#: lutris/sysoptions.py:195 +#: lutris/sysoptions.py:246 msgid "Default installation folder" msgstr "Standaard installatiemap" -#: lutris/sysoptions.py:198 +#: lutris/sysoptions.py:249 msgid "The default folder where you install your games." msgstr "De standaardmap waarin je games worden geïnstalleerd." -#: lutris/sysoptions.py:206 +#: lutris/sysoptions.py:255 msgid "Disable Lutris Runtime" msgstr "Lutris-runtime uitschakelen" -#: lutris/sysoptions.py:209 +#: lutris/sysoptions.py:257 msgid "" "The Lutris Runtime loads some libraries before running the game, which can " "cause some incompatibilities in some cases. Check this option to disable it." @@ -5614,22 +5719,169 @@ msgstr "" "dit leiden tot incompatibiliteit. Kruis deze optie aan om de runtime uit te " "schakelen." -#: lutris/sysoptions.py:216 +#: lutris/sysoptions.py:265 msgid "Prefer system libraries" msgstr "Voorkeur voor systeembibliotheken" -#: lutris/sysoptions.py:218 +#: lutris/sysoptions.py:267 msgid "" "When the runtime is enabled, prioritize the system libraries over the " "provided ones." msgstr "" "Geef voorrang aan systeembibliotheken, ook als de runtime is ingeschakeld." -#: lutris/sysoptions.py:224 +#: lutris/sysoptions.py:278 +msgid "" +"Use gamescope to draw the game window isolated from your desktop.\n" +"Toggle fullscreen: Super + F" +msgstr "" +"Gebruik gamescope om een venster te isoleren van je werkblad.\n" +"Schermvullende weergave: Super+F" + +#: lutris/sysoptions.py:285 +msgid "Relative Mouse Mode" +msgstr "Relatieve muismodus" + +#: lutris/sysoptions.py:289 +msgid "" +"Always use relative mouse mode instead of flipping\n" +"dependent on cursor visibility (--force-grab-cursor).\n" +"(Since gamescope git commit 054458f, Jan 12, 2023)" +msgstr "" +"Gebruik altijd de relatieve muismodus in plaats van de modus\n" +"op basis van cursorzichtbaarheid (--force-grab-cursor).\n" +"(Sinds gamescope git-commit 054458f, 12 januari 2023)" + +#: lutris/sysoptions.py:297 +msgid "Output Resolution" +msgstr "Uitvoerresolutie" + +#: lutris/sysoptions.py:301 +msgid "" +"Set the resolution used by gamescope (-W, -H).\n" +"Resizing the gamescope window will update these settings.\n" +"\n" +"Empty string: Disabled\n" +"Custom Resolutions: (width)x(height)" +msgstr "" +"Stel de door gamescope gebruikte resolutie in (-W, -H).\n" +"Pas de venstergrootte van gamescope aan na het bijwerken van deze " +"instellingen.\n" +"\n" +"Blanco: uitgeschakeld\n" +"Aangepaste resoluties: (breedte)x(hoogte)" + +#: lutris/sysoptions.py:311 +msgid "Game Resolution" +msgstr "Gameresolutie" + +#: lutris/sysoptions.py:315 +msgid "" +"Set the maximum resolution used by the game (-w, -h).\n" +"\n" +"Empty string: Disabled\n" +"Custom Resolutions: (width)x(height)" +msgstr "" +"Stel de maximumresolutie van de game is (-w, -h).\n" +"\n" +"Blanco: uitgeschakeld\n" +"Aangepaste resoluties: (breedte)x(hoogte)" + +#: lutris/sysoptions.py:323 +msgid "Window Mode" +msgstr "Venstermodus" + +#: lutris/sysoptions.py:328 +msgid "Windowed" +msgstr "Venster" + +#: lutris/sysoptions.py:329 +msgid "Borderless" +msgstr "Naadloos venster" + +#: lutris/sysoptions.py:333 +msgid "" +"Run gamescope in fullscreen, windowed or borderless mode\n" +"Toggle fullscreen (-f) : Super + F" +msgstr "" +"Start gamescope schermvullend of in een (naadloos) venster\n" +"Schermvullende weergave (-f) : Super + F" + +#: lutris/sysoptions.py:339 +msgid "FSR Level" +msgstr "FSR-niveau" + +#: lutris/sysoptions.py:343 +msgid "" +"Use AMD FidelityFX™ Super Resolution 1.0 for upscaling (-U).\n" +"Upscaler sharpness from 0 (max) to 20 (min).\n" +"\n" +"Empty string: Disabled" +msgstr "" +"Gebruik AMD FidelityFX™ Super Resolution 1.0 voor het opschalen (-U).\n" +"Scherpte: 0 (max.) tot 20 (min.).\n" +"\n" +"Blanco: uitgeschakeld" + +#: lutris/sysoptions.py:351 +msgid "FPS Limiter" +msgstr "FPS-limiet" + +#: lutris/sysoptions.py:355 +msgid "" +"Set a frame-rate limit for gamescope specified in frames per second (-r).\n" +"\n" +"Empty string: Disabled" +msgstr "" +"Stel een framesnelheidslimiet voor gamescope in in frames per seconde (-r).\n" +"\n" +"Blanco: uitgeschakeld" + +#: lutris/sysoptions.py:363 +msgid "Restrict number of cores used" +msgstr "Aantal kernen beperken" + +#: lutris/sysoptions.py:365 +msgid "Restrict the game to a maximum number of CPU cores." +msgstr "Beperkt de game tot het gebruik van een maximumaantal cpu-kernen." + +#: lutris/sysoptions.py:371 +msgid "Restrict number of cores to" +msgstr "Aantal kernen beperken tot" + +#: lutris/sysoptions.py:373 +msgid "" +"Maximum number of CPU cores to be used, if 'Restrict number of cores used' " +"is turned on." +msgstr "" +"Beperkt de game tot het gebruik van een maximumaantal cpu-kernen als ‘Aantal " +"kernen beperken’ is ingeschakeld." + +#: lutris/sysoptions.py:381 +msgid "Enable Feral GameMode" +msgstr "Feral GameMode gebruiken" + +#: lutris/sysoptions.py:382 +msgid "Request a set of optimisations be temporarily applied to the host OS" +msgstr "Past tijdelijk een set optimalisaties toe op het hostsysteem" + +#: lutris/sysoptions.py:388 +msgid "FPS counter (MangoHud)" +msgstr "FPS-teller (MangoHud)" + +#: lutris/sysoptions.py:391 +msgid "" +"Display the game's FPS + other information. Requires MangoHud to be " +"installed." +msgstr "" +"Toont de fps van een game, evenals andere technische informatie. MangoHud is " +"hiervoor vereist." + +#: lutris/sysoptions.py:397 msgid "Restore resolution on game exit" msgstr "Resolutie herstellen na beëindigen van game" -#: lutris/sysoptions.py:226 +#: lutris/sysoptions.py:399 msgid "" "Some games don't restore your screen resolution when \n" "closed or when they crash. This is when this option comes \n" @@ -5639,59 +5891,11 @@ msgstr "" "worden afgesloten of crashen. Met deze optie wordt de\n" "resolutie altijd hersteld." -#: lutris/sysoptions.py:233 -msgid "Enable gamescope" -msgstr "Gamescope inschakelen" - -#: lutris/sysoptions.py:237 -msgid "" -"Use gamescope to draw the game window isolated from your desktop.\n" -"Use Ctrl+Super+F to toggle fullscreen" -msgstr "" -"Gebruik gamescope om een venster te isoleren van je werkblad.\n" -"Druk op Ctrl+Super+F om de schermvullende weergave in/uit te schakelen." - -#: lutris/sysoptions.py:243 -msgid "Gamescope output resolution" -msgstr "Gamescope-resolutie" - -#: lutris/sysoptions.py:247 -msgid "Resolution of the window on your desktop" -msgstr "De resolutie van het venster op je werkblad" - -#: lutris/sysoptions.py:252 -msgid "Gamescope game resolution" -msgstr "Gamescope-gameresolutie" - -#: lutris/sysoptions.py:256 -msgid "Resolution of the screen visible to the game" -msgstr "De resolutie van het scherm die de game doorkrijgt" - -#: lutris/sysoptions.py:261 -msgid "Restrict number of cores used" -msgstr "Aantal kernen beperken" - -#: lutris/sysoptions.py:264 -msgid "Restrict the game to a maximum number of CPU cores." -msgstr "Beperkt de game tot het gebruik van een maximumaantal cpu-kernen." - -#: lutris/sysoptions.py:269 -msgid "Restrict number of cores to" -msgstr "Aantal kernen beperken tot" - -#: lutris/sysoptions.py:272 -msgid "" -"Maximum number of CPU cores to be used, if 'Restrict number of cores used' " -"is turned on." -msgstr "" -"Beperkt de game tot het gebruik van een maximumaantal cpu-kernen als ‘Aantal " -"kernen beperken’ is ingeschakeld." - -#: lutris/sysoptions.py:278 +#: lutris/sysoptions.py:408 msgid "Restore gamma on game exit" msgstr "Gamma herstellen na beëindigen van game" -#: lutris/sysoptions.py:280 +#: lutris/sysoptions.py:410 msgid "" "Some games don't correctly restores gamma on exit, making your display too " "bright. Select this option to correct it." @@ -5699,11 +5903,11 @@ msgstr "" "Sommige gamels herstellen het gamma niet als ze worden afgesloten, waardoor " "je helderheid te hoog staat. Kruis deze optie aan om dat te voorkomen." -#: lutris/sysoptions.py:285 +#: lutris/sysoptions.py:416 msgid "Disable desktop effects" msgstr "Bureaubladeffecten uitschakelen" -#: lutris/sysoptions.py:289 +#: lutris/sysoptions.py:420 msgid "" "Disable desktop effects while game is running, reducing stuttering and " "increasing performance" @@ -5711,11 +5915,11 @@ msgstr "" "Schakel bureaubladeffecten uit zolang de game actief is, om lag en traagheid " "te voorkomen" -#: lutris/sysoptions.py:294 +#: lutris/sysoptions.py:426 msgid "Disable screen saver" msgstr "Schermbeveiliging uitschakelen" -#: lutris/sysoptions.py:299 +#: lutris/sysoptions.py:431 msgid "" "Disable the screen saver while a game is running. Requires the screen " "saver's functionality to be exposed over DBus." @@ -5723,19 +5927,58 @@ msgstr "" "Schakel de schermbeveiliging uit tijdens het games van een game. Hiervoor " "dient de functionaliteit te worden doorgegeven middels DBus." -#: lutris/sysoptions.py:306 +#: lutris/sysoptions.py:443 +msgid "Limit the game's FPS to desired number" +msgstr "Stel een FPS-limiet in" + +#: lutris/sysoptions.py:449 +msgid "SDL 1.2 Fullscreen Monitor" +msgstr "SDL 1.2 schermvullend scherm" + +#: lutris/sysoptions.py:453 +msgid "" +"Hint SDL 1.2 games to use a specific monitor when going fullscreen by " +"setting the SDL_VIDEO_FULLSCREEN environment variable" +msgstr "" +"Geeft door aan SDL 1.2-games dat een bepaald beeldscherm moet worden " +"gebruikt om de schermvullende weergave in te schakelen middels " +"SDL_VIDEO_FULLSCREEN" + +#: lutris/sysoptions.py:461 +msgid "Turn off monitors except" +msgstr "Beeldschermen uitschakelen, behalve" + +#: lutris/sysoptions.py:466 +msgid "" +"Only keep the selected screen active while the game is running. \n" +"This is useful if you have a dual-screen setup, and are \n" +"having display issues when running a game in fullscreen." +msgstr "" +"Schakelt alleen het gekozen beeldscherm in zolang de game actief is.\n" +"Dit is nuttig als je meer dan één scherm hebt en problemen hebt\n" +"met schermvullende games." + +#: lutris/sysoptions.py:475 +msgid "Switch resolution to" +msgstr "Resolutie instellen op" + +#: lutris/sysoptions.py:479 +msgid "Switch to this screen resolution while the game is running." +msgstr "Stel de resolutie hier op in zolang de game actief is." + +#: lutris/sysoptions.py:485 msgid "Reset PulseAudio" msgstr "PulseAudio herstarten" -#: lutris/sysoptions.py:310 +#: lutris/sysoptions.py:489 msgid "Restart PulseAudio before launching the game." msgstr "Herstart PulseAudio voordat de game start." -#: lutris/sysoptions.py:315 +#: lutris/sysoptions.py:495 msgid "Reduce PulseAudio latency" msgstr "PulseAudio-vertraging verminderen" -#: lutris/sysoptions.py:319 +#: lutris/sysoptions.py:499 msgid "" "Set the environment variable PULSE_LATENCY_MSEC=60 to improve audio quality " "on some games" @@ -5743,76 +5986,40 @@ msgstr "" "Stelt de omgevingsvariabel PULSE_LATENCY_MSEC=60 in om de audiokwaliteit van " "sommige games te verbeteren" -#: lutris/sysoptions.py:325 +#: lutris/sysoptions.py:506 msgid "Switch to US keyboard layout" msgstr "Overschakelen naar Amerikaanse toetsenbordindeling" -#: lutris/sysoptions.py:328 +#: lutris/sysoptions.py:509 msgid "Switch to US keyboard QWERTY layout while game is running" msgstr "" "Schakel over naar de Amerikaanse QWERTY-indeling zolang de game actief is" -#: lutris/sysoptions.py:335 -msgid "Optimus launcher (NVIDIA Optimus laptops)" -msgstr "Optimus-starter (NVIDIA Optimus-laptops)" +#: lutris/sysoptions.py:515 +msgid "AntiMicroX Profile" +msgstr "AntiMicroX-profiel" -#: lutris/sysoptions.py:337 +#: lutris/sysoptions.py:517 +msgid "Path to an AntiMicroX profile file" +msgstr "Locatie van een AntiMicroX-profielbestand" + +#: lutris/sysoptions.py:524 +msgid "SDL2 gamepad mapping" +msgstr "SDL2-gamepadtoewijzing" + +#: lutris/sysoptions.py:526 msgid "" -"If you have installed the primus or bumblebee packages, select what launcher " -"will run the game with the command, activating your NVIDIA graphic chip for " -"high 3D performance. primusrun normally has better performance, butoptirun/" -"virtualgl works better for more games.Primus VK provide vulkan support under " -"bumblebee." +"SDL_GAMECONTROLLERCONFIG mapping string or path to a custom gamecontrollerdb." +"txt file containing mappings." msgstr "" -"Als je primus of bumblebee geïnstalleerd hebt, kun je kiezen welke starter " -"met welke opdracht moet worden uitgevoerd. Hierdoor kun je je NVIDIA-kaart " -"gebruiken voor zwaardere games. primusrun biedt doorgaans betere prestaties, " -"maar optirun/virtualgl werkt met meer games. Primus VK biedt Vulkan-" -"ondersteuning voor Bumblebee." +"SDL_GAMECONTROLLERCONFIG-toewijzing, in tekenreeks of locatie, naar een " +"aangepast gamecontrollerdb.txt-bestand dat de toewijzingen bevat." -#: lutris/sysoptions.py:349 -msgid "Vulkan ICD loader" -msgstr "Vulkan ICD-loader" - -#: lutris/sysoptions.py:351 -msgid "" -"The ICD loader is a library that is placed between a Vulkan application and " -"any number of Vulkan drivers, in order to support multiple drivers and the " -"instance-level functionality that works across these drivers." -msgstr "" -"De ICD-loader is een bibliotheek die tussen Vulkan-(stuur)programma's komt. " -"Zo worden meerdere stuurprogramma's en instanties ondersteund tussen " -"stuurprogramma's." - -#: lutris/sysoptions.py:359 -msgid "FPS counter (MangoHud)" -msgstr "FPS-teller (MangoHud)" - -#: lutris/sysoptions.py:362 -msgid "" -"Display the game's FPS + other information. Requires MangoHud to be " -"installed." -msgstr "" -"Toont de fps van een game, evenals andere technische informatie. MangoHud is " -"hiervoor vereist." - -#: lutris/sysoptions.py:371 -msgid "Limit the game's FPS to desired number" -msgstr "Stel een FPS-limiet in" - -#: lutris/sysoptions.py:378 -msgid "Enable Feral GameMode" -msgstr "Feral GameMode gebruiken" - -#: lutris/sysoptions.py:379 -msgid "Request a set of optimisations be temporarily applied to the host OS" -msgstr "Past tijdelijk een set optimalisaties toe op het hostsysteem" - -#: lutris/sysoptions.py:386 +#: lutris/sysoptions.py:535 msgid "Enable NVIDIA Prime Render Offload" msgstr "NVIDIA Prime render offload gebruiken" -#: lutris/sysoptions.py:387 +#: lutris/sysoptions.py:536 msgid "" "If you have the latest NVIDIA driver and the properly patched xorg-server " "(see https://download.nvidia.com/XFree86/Linux-x86_64/435.17/README/" @@ -5826,11 +6033,11 @@ msgstr "" "door deze optie in te schakelen. Dit past __NV_PRIME_RENDER_OFFLOAD=1 en " "__GLX_VENDOR_LIBRARY_NAME=nvidia toe." -#: lutris/sysoptions.py:398 +#: lutris/sysoptions.py:548 msgid "Use discrete graphics" msgstr "Toegepaste videokaart gebruiken" -#: lutris/sysoptions.py:400 +#: lutris/sysoptions.py:550 msgid "" "If you have open source graphic drivers (Mesa), selecting this option will " "run the game with the 'DRI_PRIME=1' environment variable, activating your " @@ -5840,46 +6047,43 @@ msgstr "" "deze optie met ‘DRI_PRIME=1’, waardoor je toegepaste videokaart (bijv. " "Nvidia) gebruikt wordt voor betere prestaties." -#: lutris/sysoptions.py:408 -msgid "SDL 1.2 Fullscreen Monitor" -msgstr "SDL 1.2 schermvullend scherm" +#: lutris/sysoptions.py:561 +msgid "Optimus launcher (NVIDIA Optimus laptops)" +msgstr "Optimus-starter (NVIDIA Optimus-laptops)" -#: lutris/sysoptions.py:412 +#: lutris/sysoptions.py:563 msgid "" -"Hint SDL 1.2 games to use a specific monitor when going fullscreen by " -"setting the SDL_VIDEO_FULLSCREEN environment variable" +"If you have installed the primus or bumblebee packages, select what launcher " +"will run the game with the command, activating your NVIDIA graphic chip for " +"high 3D performance. primusrun normally has better performance, butoptirun/" +"virtualgl works better for more games.Primus VK provide vulkan support under " +"bumblebee." msgstr "" -"Geeft door aan SDL 1.2-games dat een bepaald beeldscherm moet worden " -"gebruikt om de schermvullende weergave in te schakelen middels " -"SDL_VIDEO_FULLSCREEN" +"Als je primus of bumblebee geïnstalleerd hebt, kun je kiezen welke starter " +"met welke opdracht moet worden uitgevoerd. Hierdoor kun je je NVIDIA-kaart " +"gebruiken voor zwaardere games. primusrun biedt doorgaans betere prestaties, " +"maar optirun/virtualgl werkt met meer games. Primus VK biedt Vulkan-" +"ondersteuning voor Bumblebee." -#: lutris/sysoptions.py:419 -msgid "Turn off monitors except" -msgstr "Beeldschermen uitschakelen, behalve" +#: lutris/sysoptions.py:578 +msgid "Vulkan ICD loader" +msgstr "Vulkan ICD-loader" -#: lutris/sysoptions.py:424 +#: lutris/sysoptions.py:580 msgid "" -"Only keep the selected screen active while the game is running. \n" -"This is useful if you have a dual-screen setup, and are \n" -"having display issues when running a game in fullscreen." +"The ICD loader is a library that is placed between a Vulkan application and " +"any number of Vulkan drivers, in order to support multiple drivers and the " +"instance-level functionality that works across these drivers." msgstr "" -"Schakelt alleen het gekozen beeldscherm in zolang de game actief is.\n" -"Dit is nuttig als je meer dan één scherm hebt en problemen hebt\n" -"met schermvullende games." +"De ICD-loader is een bibliotheek die tussen Vulkan-(stuur)programma's komt. " +"Zo worden meerdere stuurprogramma's en instanties ondersteund tussen " +"stuurprogramma's." -#: lutris/sysoptions.py:432 -msgid "Switch resolution to" -msgstr "Resolutie instellen op" - -#: lutris/sysoptions.py:436 -msgid "Switch to this screen resolution while the game is running." -msgstr "Stel de resolutie hier op in zolang de game actief is." - -#: lutris/sysoptions.py:440 +#: lutris/sysoptions.py:588 msgid "CLI mode" msgstr "CLI-modus" -#: lutris/sysoptions.py:444 +#: lutris/sysoptions.py:592 msgid "" "Enable a terminal for text-based games. Only useful for ASCII based games. " "May cause issues with graphical games." @@ -5887,11 +6091,11 @@ msgstr "" "Gebruik een terminal bij tekstgebaseerde games (alleen nuttig bij ascii-" "games). Let op: dit kan problemen veroorzaken in grafische games." -#: lutris/sysoptions.py:449 +#: lutris/sysoptions.py:598 msgid "Text based games emulator" msgstr "Tekstgebaseerde game-emulator" -#: lutris/sysoptions.py:454 +#: lutris/sysoptions.py:603 msgid "" "The terminal emulator used with the CLI mode. Choose from the list of " "detected terminal apps or enter the terminal's command or path." @@ -5900,11 +6104,15 @@ msgstr "" "een lijst met geïnstalleerde programma's of voer de opdracht of locatie in. " "Let op: niet alle emulators werken." -#: lutris/sysoptions.py:461 +#: lutris/sysoptions.py:612 +msgid "Environment variables loaded at run time" +msgstr "De tezamen met de game toe te passen omgevingsvariabelen" + +#: lutris/sysoptions.py:618 msgid "Locale" msgstr "Taal" -#: lutris/sysoptions.py:467 +#: lutris/sysoptions.py:624 msgid "" "Can be used to force certain locale for an app. Fixes encoding issues in " "legacy software." @@ -5912,65 +6120,53 @@ msgstr "" "Kan worden gebruikt om een bepaalde taal in een game te gebruiken. Dit lost " "tekensetproblemen in oude software op." -#: lutris/sysoptions.py:473 -msgid "Environment variables loaded at run time" -msgstr "De tezamen met de game toe te passen omgevingsvariabelen" - -#: lutris/sysoptions.py:478 -msgid "AntiMicroX Profile" -msgstr "AntiMicroX-profiel" - -#: lutris/sysoptions.py:480 -msgid "Path to an AntiMicroX profile file" -msgstr "Locatie van een AntiMicroX-profielbestand" - -#: lutris/sysoptions.py:485 +#: lutris/sysoptions.py:630 msgid "Command prefix" msgstr "Opdrachtregelopties" -#: lutris/sysoptions.py:487 +#: lutris/sysoptions.py:632 msgid "" "Command line instructions to add in front of the game's execution command." msgstr "" "De opdrachtregelopties die vóór de game-opdracht moeten worden toegekend." -#: lutris/sysoptions.py:493 +#: lutris/sysoptions.py:639 msgid "Manual script" msgstr "Aangepast script" -#: lutris/sysoptions.py:495 +#: lutris/sysoptions.py:641 msgid "Script to execute from the game's contextual menu" msgstr "Het uit te voeren script middels het rechtermuisknopmenu van de game" -#: lutris/sysoptions.py:500 +#: lutris/sysoptions.py:647 msgid "Pre-launch script" msgstr "Voortijdig script" -#: lutris/sysoptions.py:502 +#: lutris/sysoptions.py:649 msgid "Script to execute before the game starts" msgstr "Het script dat moet worden uitgevoerd voordat de game start" -#: lutris/sysoptions.py:507 +#: lutris/sysoptions.py:655 msgid "Wait for pre-launch script completion" msgstr "Wachten tot voortijdig script is afgerond" -#: lutris/sysoptions.py:510 +#: lutris/sysoptions.py:658 msgid "Run the game only once the pre-launch script has exited" msgstr "Start de game alleen als het script is afgerond" -#: lutris/sysoptions.py:515 +#: lutris/sysoptions.py:664 msgid "Post-exit script" msgstr "Afsluitend script" -#: lutris/sysoptions.py:517 +#: lutris/sysoptions.py:666 msgid "Script to execute when the game exits" msgstr "Het script dat moet worden uitgevoerd nadat de game is afgesloten" -#: lutris/sysoptions.py:522 +#: lutris/sysoptions.py:672 msgid "Include processes" msgstr "In te sluiten deze processen" -#: lutris/sysoptions.py:524 +#: lutris/sysoptions.py:674 msgid "" "What processes to include in process monitoring. This is to override the " "built-in exclude list.\n" @@ -5982,11 +6178,11 @@ msgstr "" "De lijst is spatiegescheiden. Processen met spaties dienen voorzien te zijn " "van dubbele aanhalingstekens." -#: lutris/sysoptions.py:532 +#: lutris/sysoptions.py:683 msgid "Exclude processes" msgstr "Uit te sluiten processen" -#: lutris/sysoptions.py:534 +#: lutris/sysoptions.py:685 msgid "" "What processes to exclude in process monitoring. For example background " "processes that stick around after the game has been closed.\n" @@ -5999,11 +6195,11 @@ msgstr "" "De lijst is spatiegescheiden. Processen met spaties dienen voorzien te zijn " "van dubbele aanhalingstekens." -#: lutris/sysoptions.py:543 +#: lutris/sysoptions.py:695 msgid "Killswitch file" msgstr "Killswitch-bestand" -#: lutris/sysoptions.py:545 +#: lutris/sysoptions.py:697 msgid "" "Path to a file which will stop the game when deleted \n" "(usually /dev/input/js0 to stop the game on joystick unplugging)" @@ -6012,72 +6208,60 @@ msgstr "" "(doorgaans is dit /dev/input/js0 om het game stop te zetten bij het " "afkoppelen van joysticks)" -#: lutris/sysoptions.py:552 -msgid "SDL2 gamepad mapping" -msgstr "SDL2-gamepadtoewijzing" - -#: lutris/sysoptions.py:554 -msgid "" -"SDL_GAMECONTROLLERCONFIG mapping string or path to a custom gamecontrollerdb." -"txt file containing mappings." -msgstr "" -"SDL_GAMECONTROLLERCONFIG-toewijzing, in tekenreeks of locatie, naar een " -"aangepast gamecontrollerdb.txt-bestand dat de toewijzingen bevat." - -#: lutris/sysoptions.py:559 +#: lutris/sysoptions.py:705 msgid "Use Xephyr" msgstr "Xephyr gebruiken" -#: lutris/sysoptions.py:563 +#: lutris/sysoptions.py:709 msgid "8BPP (256 colors)" msgstr "8BPP (256 kleuren)" -#: lutris/sysoptions.py:564 +#: lutris/sysoptions.py:710 msgid "16BPP (65536 colors)" msgstr "16BPP (65536 kleuren)" -#: lutris/sysoptions.py:565 +#: lutris/sysoptions.py:711 msgid "24BPP (16M colors)" msgstr "24BPP (16M kleuren)" -#: lutris/sysoptions.py:569 +#: lutris/sysoptions.py:715 msgid "Run program in Xephyr to support 8BPP and 16BPP color modes" msgstr "" "Start een game met Xephyr om 8BPP- en 16BPP-kleurenmodi te kunnen gebruiken" -#: lutris/sysoptions.py:574 +#: lutris/sysoptions.py:721 msgid "Xephyr resolution" msgstr "Xephyr-resolutie" -#: lutris/sysoptions.py:576 +#: lutris/sysoptions.py:723 msgid "Screen resolution of the Xephyr server" msgstr "Schermresolutie van de Xephyr-server" -#: lutris/sysoptions.py:581 +#: lutris/sysoptions.py:729 msgid "Xephyr Fullscreen" msgstr "Xephyr schermvullend" -#: lutris/sysoptions.py:584 +#: lutris/sysoptions.py:732 msgid "Open Xephyr in fullscreen (at the desktop resolution)" msgstr "Xephyr op volledig scherm openen (op bureaubladresolutie)" #: lutris/util/strings.py:133 msgid "1 hour" -msgstr "" +msgstr "1 uur" #: lutris/util/strings.py:135 #, python-format msgid "%d hours" -msgstr "" +msgstr "%d uur" #: lutris/util/strings.py:141 msgid "1 minute" -msgstr "" +msgstr "1 minuut" #: lutris/util/strings.py:143 #, python-format msgid "%d minutes" -msgstr "" +msgstr "%d minuten" #: lutris/util/system.py:21 msgid "Documents" @@ -6175,6 +6359,46 @@ msgstr "" "De gekozen Wine-versie heeft geen ondersteuning voor Fsync.\n" "Kies een met fsync compatibele versie." +#, python-format +#~ msgid "Install %s" +#~ msgstr "%s installeren" + +#~ msgid "Cache" +#~ msgstr "Cache" + +#~ msgid "Joystick 2" +#~ msgstr "Joystick 2" + +#~ msgid "Auto: Intel Open Source (MESA: ANV)" +#~ msgstr "Automatisch: Intel Open Source (MESA: ANV)" + +#~ msgid "Auto: AMD RADV Open Source (MESA: RADV)" +#~ msgstr "Automatisch: AMD RADV Open Source (MESA: RADV)" + +#~ msgid "Auto: Nvidia Proprietary" +#~ msgstr "Automatisch: Nvidia (gesloten stuurprogramma)" + +#~ msgid "Auto: WARNING -- No Vulkan Loader detected!" +#~ msgstr "Automatisch: WAARSCHUWING -- er is geen Vulkan-loader aangetroffen!" + +#~ msgid "Unspecified (Use System Default)" +#~ msgstr "Niet-opgegeven (systeemstandaard)" + +#~ msgid "Enable gamescope" +#~ msgstr "Gamescope inschakelen" + +#~ msgid "Gamescope output resolution" +#~ msgstr "Gamescope-resolutie" + +#~ msgid "Resolution of the window on your desktop" +#~ msgstr "De resolutie van het venster op je werkblad" + +#~ msgid "Gamescope game resolution" +#~ msgstr "Gamescope-gameresolutie" + +#~ msgid "Resolution of the screen visible to the game" +#~ msgstr "De resolutie van het scherm die de game doorkrijgt" + #~ msgid "Launch a setup file from an optical drive or download" #~ msgstr "Start een installatiebestand vanaf een optische schijf of download" @@ -6418,9 +6642,6 @@ msgstr "" #~ msgid "platforms" #~ msgstr "platformen" -#~ msgid "Configure Runner" -#~ msgstr "Runner instellen" - #~ msgid "Remove Runner" #~ msgstr "Runner verwijderen" From 9b7f290799a171aa9b7b62f1ecb53d9f7635095c Mon Sep 17 00:00:00 2001 From: legluondunet Date: Thu, 27 Apr 2023 18:41:29 +0200 Subject: [PATCH 02/52] Update dosbox.py --- lutris/runners/dosbox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lutris/runners/dosbox.py b/lutris/runners/dosbox.py index 80563bd6f..c759de88f 100644 --- a/lutris/runners/dosbox.py +++ b/lutris/runners/dosbox.py @@ -15,7 +15,7 @@ class dosbox(Runner): platforms = [_("MS-DOS")] runnable_alone = True runner_executable = "dosbox/bin/dosbox" - require_libs = ["libopusfile.so.0", ] + require_libs = [] game_options = [ { "option": "main_file", From 20cea6fc49b3a05f3724cfb0619dad001b9b50cc Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Thu, 27 Apr 2023 18:37:10 -0400 Subject: [PATCH 03/52] Add none-check for format_version_tuple --- lutris/util/graphics/vkquery.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lutris/util/graphics/vkquery.py b/lutris/util/graphics/vkquery.py index 68837d73a..b9e359c25 100644 --- a/lutris/util/graphics/vkquery.py +++ b/lutris/util/graphics/vkquery.py @@ -367,4 +367,7 @@ def make_version_tuple(source_int): def format_version_tuple(version_tuple): - return "%s.%s.%s" % version_tuple + if version_tuple: + return "%s.%s.%s" % version_tuple + + return "(none)" From 25265b1caec54cbce33590bebad73d8b2fddbdfb Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Thu, 27 Apr 2023 19:14:25 -0400 Subject: [PATCH 04/52] Rework Vulkan version handling We've had a bunch of bugs from tuple wrangling errors, so let's rethink this. This version leaves versions as encoded ints, which we mostly just compare anyway. The device info dict becomes a list of named-tuples, and we treat them as objects, not tuples. We return lists of them, so we use list indexing instead of tuple deconstruction. We still return None for the Vulkan API version when Vulkan is not there, but I've tried to make sure this is *always* checked. --- lutris/startup.py | 26 ++++----- lutris/util/graphics/vkquery.py | 93 ++++++++++++++------------------- lutris/util/linux.py | 6 +-- lutris/util/wine/dxvk.py | 4 +- 4 files changed, 57 insertions(+), 72 deletions(-) diff --git a/lutris/startup.py b/lutris/startup.py index 12cb60a8b..f25077984 100644 --- a/lutris/startup.py +++ b/lutris/startup.py @@ -143,12 +143,12 @@ def check_vulkan(): logger.warning("Vulkan is not available or your system isn't Vulkan capable") else: required_api_version = REQUIRED_VULKAN_API_VERSION - library_api_version = vkquery.get_vulkan_api_version_tuple() + library_api_version = vkquery.get_vulkan_api_version() if library_api_version and library_api_version < required_api_version: logger.warning("Vulkan reports an API version of %s. " "%s is required for the latest DXVK.", - vkquery.format_version_tuple(library_api_version), - vkquery.format_version_tuple(library_api_version)) + vkquery.format_version(library_api_version), + vkquery.format_version(library_api_version)) setting = "dismiss-obsolete-vulkan-api-warning" if settings.read_setting(setting) != "True": DontShowAgainDialog( @@ -159,20 +159,20 @@ def check_vulkan(): "but to use the latest DXVK version, %s is required.\n\n" "DXVK 1.x will be used instead." ) % ( - vkquery.format_version_tuple(library_api_version), - vkquery.format_version_tuple(required_api_version) + vkquery.format_version(library_api_version), + vkquery.format_version(required_api_version) ) ) return - max_dev_name, max_dev_api_version = vkquery.get_best_device_info() + devices = vkquery.get_device_info() - if max_dev_api_version and max_dev_api_version < required_api_version: + if devices and devices[0].api_version < required_api_version: logger.warning("Vulkan reports that the '%s' device has API version of %s. " "%s is required for the latest DXVK.", - max_dev_name, - vkquery.format_version_tuple(max_dev_api_version), - vkquery.format_version_tuple(required_api_version)) + devices[0].name, + vkquery.format_version(devices[0].api_version), + vkquery.format_version(required_api_version)) setting = "dismiss-obsolete-vulkan-api-warning" if settings.read_setting(setting) != "True": DontShowAgainDialog( @@ -183,9 +183,9 @@ def check_vulkan(): "but to use the latest DXVK version, %s is required.\n\n" "DXVK 1.x will be used instead." ) % ( - max_dev_name, - vkquery.format_version_tuple(max_dev_api_version), - vkquery.format_version_tuple(required_api_version) + devices[0].name, + vkquery.format_version(devices[0].api_version), + vkquery.format_version(required_api_version) ) ) diff --git a/lutris/util/graphics/vkquery.py b/lutris/util/graphics/vkquery.py index b9e359c25..9bedb426d 100644 --- a/lutris/util/graphics/vkquery.py +++ b/lutris/util/graphics/vkquery.py @@ -2,6 +2,7 @@ # Vulkan detection by Patryk Obara (@dreamer) """Query Vulkan capabilities""" +from collections import namedtuple # Standard Library from ctypes import ( CDLL, POINTER, Structure, byref, c_char, c_char_p, c_float, c_int32, c_size_t, c_uint8, c_uint32, c_uint64, @@ -31,6 +32,8 @@ VkInstance = c_void_p # handle (struct ptr) VkPhysicalDevice = c_void_p # handle (struct ptr) VkDeviceSize = c_uint64 +DeviceInfo = namedtuple('DeviceInfo', 'name api_version') + def vk_make_version(major, minor, patch): """ @@ -38,7 +41,7 @@ def vk_make_version(major, minor, patch): https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#fundamentals-versionnum """ - return c_uint32((major << 22) | (minor << 12) | patch) + return (major << 22) | (minor << 12) | patch def vk_api_version_major(version): @@ -75,8 +78,8 @@ class VkApplicationInfo(Structure): super().__init__() self.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO self.pApplicationName = name.encode() - self.applicationVersion = vk_make_version(*version) - self.apiVersion = vk_make_version(1, 0, 0) + self.applicationVersion = c_uint32(vk_make_version(*version)) + self.apiVersion = c_uint32(vk_make_version(1, 0, 0)) class VkInstanceCreateInfo(Structure): @@ -262,10 +265,11 @@ def is_vulkan_supported(): @lru_cache(maxsize=None) -def get_vulkan_api_version_tuple(): +def get_vulkan_api_version(): """ Queries libvulkan to get the API version; if this library is missing - it returns None. Returns a tuple of (major, minor, patch) version numbers. + it returns None. Returns an encoded Vulkan version integer; use + vk_api_version_major() and like methods to parse it. """ try: vulkan = CDLL("libvulkan.so.1") @@ -276,98 +280,79 @@ def get_vulkan_api_version_tuple(): enumerate_instance_version = vulkan.vkEnumerateInstanceVersion except AttributeError: # Vulkan 1.0 did not have vkEnumerateInstanceVersion at all! - return 1, 0 + return vk_make_version(1, 0, 0) version = c_uint32(0) result = enumerate_instance_version(byref(version)) - if result == VK_SUCCESS: - return make_version_tuple(version.value) - - return None + return version.value if result == VK_SUCCESS else None def get_device_info(): """ - Returns a dictionary of the physical devices known to Vulkan, omitting software - rendered devices. The keys are the device names, and the values are their API - version tuples. + Returns a list of the physical devices known to Vulkan, represented as + (name, api_version) named-tuples and the api_version numbers are encoded, so + use vk_api_version_major() and friends to parse them. They are sorted so the + highest version device is first, and software rendering devices are omitted. """ try: vulkan = CDLL("libvulkan.so.1") except OSError: - return {} + return [] app_info = VkApplicationInfo("vkinfo", version=(0, 1, 0)) create_info = VkInstanceCreateInfo(app_info) instance = VkInstance() result = vulkan.vkCreateInstance(byref(create_info), 0, byref(instance)) if result != VK_SUCCESS: - return {} + return [] dev_count = c_uint32(0) result = vulkan.vkEnumeratePhysicalDevices(instance, byref(dev_count), 0) if result != VK_SUCCESS or dev_count.value <= 0: - return {} + return [] devices = (VkPhysicalDevice * dev_count.value)() result = vulkan.vkEnumeratePhysicalDevices(instance, byref(dev_count), byref(devices)) if result != VK_SUCCESS: - return {} + return [] getPhysicalDeviceProperties = vulkan.vkGetPhysicalDeviceProperties getPhysicalDeviceProperties.restype = None - getPhysicalDeviceProperties.argtypes = [VkPhysicalDevice, c_void_p] # pointer(VkPhysicalDeviceProperties)] + getPhysicalDeviceProperties.argtypes = [VkPhysicalDevice, c_void_p] - devices_dict = {} + device_info = [] for physical_device in devices: dev_props = VkPhysicalDeviceProperties() getPhysicalDeviceProperties(physical_device, byref(dev_props)) if dev_props.deviceType != VK_PHYSICAL_DEVICE_TYPE_CPU: name = dev_props.deviceName.decode("utf-8") - api_version = make_version_tuple(dev_props.apiVersion) - devices_dict[name] = api_version + device_info.append(DeviceInfo(name, dev_props.apiVersion)) vulkan.vkDestroyInstance(instance, 0) - return devices_dict - - -def get_best_device_info(): - """Returns the name and version tuple of the device with the highest - version; this is the best tuple from the get_device_info() method, so - the key element is the name, and the value element is a version tuple. - Go nested tuples! If there are no devices at all, this returns - (None, None), but still a tuple.""" - devices_dict = get_device_info() - if not devices_dict: - return None, None - by_version = sorted( - devices_dict.items(), - key=lambda t: t[1], - reverse=True - ) - return by_version[0] if by_version else (None, None) + return sorted(device_info, key=lambda t: t.api_version, reverse=True) @lru_cache(maxsize=None) -def get_expected_api_version_tuple(): +def get_expected_api_version(): """Returns the version tuple of the API version we expect to have; it is the least of the Vulkan library API version, and the best device's API version.""" - api_version = get_vulkan_api_version_tuple() - _best_dev_name, best_dev_version = get_best_device_info() - if best_dev_version: - return min(api_version, best_dev_version) + api_version = get_vulkan_api_version() + + if not api_version: + return None + + devices = get_device_info() + if devices: + return min(api_version, devices[0].api_version) + return api_version -def make_version_tuple(source_int): - major = vk_api_version_major(source_int) - minor = vk_api_version_minor(source_int) - patch = vk_api_version_patch(source_int) - return major, minor, patch - - -def format_version_tuple(version_tuple): - if version_tuple: - return "%s.%s.%s" % version_tuple +def format_version(version): + if version: + major = vk_api_version_major(version) + minor = vk_api_version_minor(version) + patch = vk_api_version_patch(version) + return "%s.%s.%s" % (major, minor, patch) return "(none)" diff --git a/lutris/util/linux.py b/lutris/util/linux.py index 9d11bfd8a..bf0a61a6d 100644 --- a/lutris/util/linux.py +++ b/lutris/util/linux.py @@ -496,12 +496,12 @@ def gather_system_info_str(): graphics_dict["Vendor"] = "Unable to obtain glxinfo" # check Vulkan support if vkquery.is_vulkan_supported(): - graphics_dict["Vulkan Version"] = vkquery.format_version_tuple(vkquery.get_vulkan_api_version_tuple()) + graphics_dict["Vulkan Version"] = vkquery.format_version(vkquery.get_vulkan_api_version()) graphics_dict["Vulkan Drivers"] = ", ".join({ - "%s (%s)" % (name, vkquery.format_version_tuple(version)) + "%s (%s)" % (name, vkquery.format_version(version)) for name, version - in vkquery.get_device_info().items() + in vkquery.get_device_info() }) else: graphics_dict["Vulkan"] = "Not Supported" diff --git a/lutris/util/wine/dxvk.py b/lutris/util/wine/dxvk.py index 76ef2ba5b..23d3eb60f 100644 --- a/lutris/util/wine/dxvk.py +++ b/lutris/util/wine/dxvk.py @@ -11,7 +11,7 @@ from lutris.util.log import logger from lutris.util.system import create_folder, execute, remove_folder from lutris.util.wine.dll_manager import DLLManager -REQUIRED_VULKAN_API_VERSION = 1, 3, 0 +REQUIRED_VULKAN_API_VERSION = vkquery.vk_make_version(1, 3, 0) class DXVKManager(DLLManager): @@ -20,7 +20,7 @@ class DXVKManager(DLLManager): versions_path = os.path.join(base_dir, "dxvk_versions.json") managed_dlls = ("dxgi", "d3d11", "d3d10core", "d3d9",) releases_url = "https://api.github.com/repos/lutris/dxvk/releases" - vulkan_api_version = vkquery.get_expected_api_version_tuple() + vulkan_api_version = vkquery.get_expected_api_version() def is_recommended_version(self, version): # DXVK 2.x and later require Vulkan 1.3, so if that iss lacking From 29181f9e4500dac634b7cec4de27c454b462c816 Mon Sep 17 00:00:00 2001 From: Tyemak <119242752+Tyemak@users.noreply.github.com> Date: Sat, 29 Apr 2023 00:16:53 +0300 Subject: [PATCH 05/52] Update ru.po MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Мелкие исправления и добавления --- po/ru.po | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/po/ru.po b/po/ru.po index d42642916..444c00b75 100644 --- a/po/ru.po +++ b/po/ru.po @@ -23,7 +23,7 @@ msgstr "Lutris" #: share/applications/net.lutris.Lutris.desktop:4 msgid "Video Game Preservation Platform" -msgstr "Платформа для сохранения видеоигр" +msgstr "Площадка для сохранения видеоигр" #: share/applications/net.lutris.Lutris.desktop:6 msgid "gaming;wine;emulator;" @@ -32,7 +32,7 @@ msgstr "gaming;wine;emulator;" #: share/metainfo/net.lutris.Lutris.metainfo.xml:11 #: share/lutris/ui/about-dialog.ui:18 msgid "Video game preservation platform" -msgstr "Платформа для сохранения видеоигр" +msgstr "Площадка для сохранения видеоигр" #: share/metainfo/net.lutris.Lutris.metainfo.xml:14 msgid "Main window" @@ -75,8 +75,8 @@ msgstr "" "или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Стандартной\n" "общественной лицензии GNU.\n" "\n" -"Вы должны были получить копию Стандартной общественной лицензии GNU\n" -"вместе с этой программой. Если это не так, см. .\n" #: share/lutris/ui/dialog-lutris-login.ui:8 @@ -126,7 +126,7 @@ msgstr "Масштаб:" #: share/lutris/ui/lutris-window.ui:345 msgid "Sort Ascending" -msgstr "Сортировать по возрастанию" +msgstr "Упорядочивать по возрастанию" #: share/lutris/ui/lutris-window.ui:360 lutris/gui/config/common.py:127 #: lutris/gui/views/list.py:48 lutris/gui/views/list.py:172 @@ -207,7 +207,7 @@ msgstr "Не удалось найти файл {}" #: lutris/game.py:256 msgid "This game has no executable set. The install process didn't finish properly." -msgstr "В этой игре нет исполняемого набора. Процесс установки не завершился должным образом." +msgstr "В этой игре нет исполняемого набора. Установка не завершилась должным образом." #: lutris/game.py:259 #, python-format @@ -217,7 +217,7 @@ msgstr "Файл %s не является исполняемым" #: lutris/game.py:261 #, python-format msgid "The path '%s' is not set. please set it in the options." -msgstr "Путь '%s' не установлен, пожалуйста установите его в опциях." +msgstr "Путь «%s» не установлен, пожалуйста установите его в опциях." #: lutris/game.py:263 #, python-format @@ -395,7 +395,7 @@ msgid "" "The folder doesn't exist." msgstr "" "Не удается открыть %s \n" -"Каталог не существует." +"Папка не существует." #. use primary configuration #: lutris/game_actions.py:335 @@ -405,15 +405,15 @@ msgstr "Удалить ярлык с рабочего стола" #: lutris/gui/addgameswindow.py:28 msgid "Search the Lutris website for installers" -msgstr "Найдите установщик на веб-сайте Lutris" +msgstr "Найдите установщик на сайте Lutris" #: lutris/gui/addgameswindow.py:29 msgid "Query our website for community installers" -msgstr "Запросите установщик на веб-сайте нашего сообщества" +msgstr "Запросите установщик на сайте нашего сообщества" #: lutris/gui/addgameswindow.py:35 msgid "Scan a folder for games" -msgstr "Сканировать папку на наличие игр" +msgstr "Проверить папку на наличие игр" #: lutris/gui/addgameswindow.py:36 msgid "Mass-import a folder of games" @@ -480,7 +480,7 @@ msgstr "Отмена" #: lutris/gui/addgameswindow.py:114 lutris/gui/config/boxes.py:439 msgid "Select folder" -msgstr "Выбрать каталог" +msgstr "Выбрать папку" #: lutris/gui/addgameswindow.py:123 #, fuzzy @@ -522,7 +522,7 @@ msgstr "" #: lutris/gui/addgameswindow.py:307 #, fuzzy msgid "Folder to scan" -msgstr "Выбрать каталог" +msgstr "Выбрать папку" #: lutris/gui/addgameswindow.py:313 msgid "" @@ -538,7 +538,7 @@ msgstr "" #: lutris/gui/addgameswindow.py:331 #, fuzzy msgid "You must select a folder to scan for games." -msgstr "Выбрать каталог" +msgstr "Выбрать папку" #: lutris/gui/addgameswindow.py:333 #, python-format @@ -562,7 +562,7 @@ msgstr "З_акрыть" #: lutris/gui/addgameswindow.py:409 #, fuzzy msgid "Game name" -msgstr "Информация об игре" +msgstr "Сведения об игре" #: lutris/gui/addgameswindow.py:425 msgid "" @@ -639,7 +639,7 @@ msgstr "" #: lutris/runners/snes9x.py:27 lutris/runners/vice.py:38 #: lutris/runners/yuzu.py:23 msgid "ROM file" -msgstr "Файл образа ПЗУ (ROM)" +msgstr "Файл образа ПЗУ" #: lutris/gui/addgameswindow.py:557 msgid "" @@ -654,7 +654,7 @@ msgstr "" #: lutris/gui/addgameswindow.py:576 msgid "You must select a ROM file to install." -msgstr "Вы должны выбрать файл ROM для установки." +msgstr "Вы должны выбрать файл ПЗУ для установки." #: lutris/gui/application.py:92 msgid "" @@ -1150,12 +1150,12 @@ msgstr "Скрывать текст за иконками" #: lutris/gui/config/sysinfo_box.py:36 msgid "Copy to clipboard" -msgstr "Копировать в буфер обмена" +msgstr "Скопировать в буфер обмена" #: lutris/gui/config/sysinfo_box.py:39 #, fuzzy msgid "System information" -msgstr "Информация о системе" +msgstr "Сведения о системе" #: lutris/gui/dialogs/cache.py:13 msgid "Cache configuration" @@ -1167,7 +1167,7 @@ msgstr "Путь к кэшу" #: lutris/gui/dialogs/cache.py:43 msgid "Set the folder for the cache path" -msgstr "Укажите каталог для кэша" +msgstr "Укажите папку для кэша" #: lutris/gui/dialogs/cache.py:55 msgid "" @@ -1183,7 +1183,7 @@ msgstr "" #: lutris/gui/dialogs/delegates.py:70 msgid "Runtime currently updating" -msgstr "В данный момент среда выполнения обновляется" +msgstr "На данное время среда исполнения обновляется" #: lutris/gui/dialogs/delegates.py:71 msgid "Game might not work as expected" @@ -1414,7 +1414,7 @@ msgstr "Пожалуйста, выберите файл" #: lutris/gui/dialogs/__init__.py:271 msgid "Checking for runtime updates, please wait…" -msgstr "" +msgstr "Проверка обновлений сред исполения, пожалуйста, подождите" #: lutris/gui/dialogs/__init__.py:309 #, python-format From 03c10701bfc4f5671e3fc57bb9a562e0b48d9640 Mon Sep 17 00:00:00 2001 From: Mathieu Comandon Date: Fri, 28 Apr 2023 21:40:26 -0700 Subject: [PATCH 06/52] Remove debug message for invalid environments --- lutris/util/process.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lutris/util/process.py b/lutris/util/process.py index f624c284b..20497be8c 100644 --- a/lutris/util/process.py +++ b/lutris/util/process.py @@ -113,10 +113,7 @@ class Process: """Return the process' environment variables""" environ_path = "/proc/{}/environ".format(self.pid) _environ_text = self._read_content(environ_path) - if not _environ_text: - return {} - if "=" not in _environ_text: - logger.debug("Invalid environment value '%s' (%s) in %s", _environ_text, len(_environ_text), environ_path) + if not _environ_text or "=" not in _environ_text: return {} return dict([line.split("=", 1) for line in _environ_text.split("\x00") if line]) From 9daa82a5892e62bbc99b8c29c63b427fa98ad90d Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Sat, 29 Apr 2023 18:18:37 +0200 Subject: [PATCH 07/52] Updated Dutch translation --- po/nl.po | 1960 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 1087 insertions(+), 873 deletions(-) diff --git a/po/nl.po b/po/nl.po index dbf0457a2..a40382403 100644 --- a/po/nl.po +++ b/po/nl.po @@ -3,8 +3,8 @@ msgid "" msgstr "" "Project-Id-Version: lutris\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-14 11:30+0100\n" -"PO-Revision-Date: 2023-02-16 14:16+0100\n" +"POT-Creation-Date: 2023-04-29 18:10+0200\n" +"PO-Revision-Date: 2023-04-29 18:18+0200\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: Dutch\n" "Language: nl\n" @@ -50,7 +50,7 @@ msgstr "" "en compatibiliteitslagen, hebben we één overzichtelijk venster voor al je " "games weten te creëren." -#: share/lutris/ui/about-dialog.ui:8 share/lutris/ui/lutris-window.ui:575 +#: share/lutris/ui/about-dialog.ui:8 share/lutris/ui/lutris-window.ui:589 msgid "About Lutris" msgstr "Over Lutris" @@ -110,7 +110,7 @@ msgstr "Gebruikersnaam" msgid "Search..." msgstr "Zoeken…" -#: share/lutris/ui/lutris-window.ui:147 lutris/gui/lutriswindow.py:481 +#: share/lutris/ui/lutris-window.ui:147 lutris/gui/lutriswindow.py:575 msgid "Search games" msgstr "Games doorzoeken" @@ -126,60 +126,64 @@ msgstr "Andere weergave" msgid "Zoom " msgstr "Zoom " -#: share/lutris/ui/lutris-window.ui:345 +#: share/lutris/ui/lutris-window.ui:334 +msgid "Sort Installed First" +msgstr "Geïnstalleerd bovenaan" + +#: share/lutris/ui/lutris-window.ui:348 msgid "Sort Ascending" msgstr "Oplopend sorteren" -#: share/lutris/ui/lutris-window.ui:360 lutris/gui/config/common.py:134 -#: lutris/gui/views/list.py:48 lutris/gui/views/list.py:172 +#: share/lutris/ui/lutris-window.ui:374 lutris/gui/config/common.py:137 +#: lutris/gui/views/list.py:51 lutris/gui/views/list.py:181 msgid "Name" msgstr "Naam" -#: share/lutris/ui/lutris-window.ui:375 lutris/gui/views/list.py:49 +#: share/lutris/ui/lutris-window.ui:389 lutris/gui/views/list.py:52 msgid "Year" msgstr "Jaar" -#: share/lutris/ui/lutris-window.ui:390 lutris/gui/views/list.py:52 +#: share/lutris/ui/lutris-window.ui:404 lutris/gui/views/list.py:55 msgid "Last Played" msgstr "Laatst gespeeld" -#: share/lutris/ui/lutris-window.ui:405 lutris/gui/views/list.py:54 +#: share/lutris/ui/lutris-window.ui:419 lutris/gui/views/list.py:57 msgid "Installed At" msgstr "Geïnstalleerd op" -#: share/lutris/ui/lutris-window.ui:420 lutris/gui/views/list.py:56 +#: share/lutris/ui/lutris-window.ui:434 lutris/gui/views/list.py:59 msgid "Play Time" msgstr "Speeltijd" -#: share/lutris/ui/lutris-window.ui:449 +#: share/lutris/ui/lutris-window.ui:463 msgid "_Installed Games Only" msgstr "Alleen ge_ïnstalleerde games" -#: share/lutris/ui/lutris-window.ui:464 +#: share/lutris/ui/lutris-window.ui:478 msgid "Show _Hidden Games" msgstr "Verborgen s_pellen tonen" -#: share/lutris/ui/lutris-window.ui:479 +#: share/lutris/ui/lutris-window.ui:493 msgid "Show Side _Panel" msgstr "Zij_paneel tonen" -#: share/lutris/ui/lutris-window.ui:494 +#: share/lutris/ui/lutris-window.ui:508 msgid "Add games" msgstr "Games toevoegen" -#: share/lutris/ui/lutris-window.ui:508 +#: share/lutris/ui/lutris-window.ui:522 msgid "Preferences" msgstr "Voorkeuren" -#: share/lutris/ui/lutris-window.ui:533 +#: share/lutris/ui/lutris-window.ui:547 msgid "Discord" msgstr "Discord" -#: share/lutris/ui/lutris-window.ui:547 +#: share/lutris/ui/lutris-window.ui:561 msgid "Lutris forums" msgstr "Lutris-forum" -#: share/lutris/ui/lutris-window.ui:561 +#: share/lutris/ui/lutris-window.ui:575 msgid "Make a donation" msgstr "Doneren" @@ -194,101 +198,18 @@ msgstr "" "systeem:\n" "{libs}" -#: lutris/game.py:281 -msgid "Error the runner is not installed" -msgstr "Foutmelding: runner is niet geïnstalleerd" - -#: lutris/game.py:283 -msgid "A bios file is required to run this game" -msgstr "Deze game vereist een bios-bestand" - -#: lutris/game.py:287 -msgid "The file {} could not be found" -msgstr "‘{}’ is niet aangetroffen" - -#: lutris/game.py:289 -msgid "" -"This game has no executable set. The install process didn't finish properly." -msgstr "" -"Er is geen uitvoerbaar bestand ingesteld omdat het installatieproces " -"onverwachts is afgebroken." - -#: lutris/game.py:292 -#, python-format -msgid "The file %s is not executable" -msgstr "‘%s’ is niet uitvoerbaar" - -#: lutris/game.py:294 -#, python-format -msgid "The path '%s' is not set. please set it in the options." -msgstr "‘%s’ is niet ingesteld. Stel deze locatie in in de opties." - -#: lutris/game.py:296 -#, python-format -msgid "Unhandled error: %s" -msgstr "Onverwachte foutmelding: %s" - -#: lutris/game.py:367 -msgid "Uninstall the game before deleting" -msgstr "Deïnstalleer de game alvorens hem te verwijderen" - -#: lutris/game.py:439 -msgid "Tried to launch a game that isn't installed." -msgstr "Je probeerde een niet-geïnstalleerde game te starten." - -#: lutris/game.py:441 lutris/game.py:544 -msgid "Invalid game configuration: Missing runner" -msgstr "Ongeldige gameconfiguratie: runner ontbreekt" - -#: lutris/game.py:473 -msgid "Unable to find Xephyr, install it or disable the Xephyr option" -msgstr "" -"Xephyr is niet aangetroffen. Installeer dit pakket of schakel de Xephyr-" -"optie uit." - -#: lutris/game.py:520 -#, python-format -msgid "" -"The selected terminal application could not be launched:\n" -"%s" -msgstr "" -"Het geselecteerde terminalprogramma kan niet worden uitgevoerd:\n" -"%s" - -#: lutris/game.py:777 -msgid "Error lauching the game:\n" -msgstr "De game kan niet worden gestart:\n" - -#: lutris/game.py:882 -#, python-format -msgid "" -"Error: Missing shared library.\n" -"\n" -"%s" -msgstr "" -"Foutmelding: ontbrekende gedeelde bibliotheek.\n" -"\n" -"%s" - -#: lutris/game.py:888 -msgid "" -"Error: A different Wine version is already using the same Wine prefix." -msgstr "" -"Foutmelding: een andere Wine-versie gebruikt reeds hetzelfde Wine-profiel." -"" - #. Local services don't show an install dialog, they can be launched directly -#: lutris/game_actions.py:49 lutris/gui/widgets/game_bar.py:202 -#: lutris/gui/widgets/game_bar.py:216 +#: lutris/game_actions.py:49 lutris/gui/widgets/game_bar.py:206 +#: lutris/gui/widgets/game_bar.py:220 msgid "Play" msgstr "Spelen" -#: lutris/game_actions.py:50 lutris/gui/widgets/game_bar.py:208 +#: lutris/game_actions.py:50 lutris/gui/widgets/game_bar.py:212 msgid "Stop" msgstr "Stoppen" #: lutris/game_actions.py:51 lutris/gui/dialogs/runner_install.py:210 -#: lutris/gui/installer/script_box.py:62 lutris/gui/widgets/game_bar.py:211 +#: lutris/gui/installer/script_box.py:62 lutris/gui/widgets/game_bar.py:215 msgid "Install" msgstr "Installeren" @@ -304,7 +225,7 @@ msgstr "Logboek tonen" msgid "Add installed game" msgstr "Geïnstalleerde game toevoegen" -#: lutris/game_actions.py:56 lutris/gui/widgets/sidebar.py:214 +#: lutris/game_actions.py:56 lutris/gui/widgets/sidebar.py:225 msgid "Configure" msgstr "Instellen" @@ -328,7 +249,7 @@ msgstr "Shadercache bijwerken" msgid "Browse files" msgstr "Bestanden verkennen" -#: lutris/game_actions.py:64 lutris/gui/installerwindow.py:385 +#: lutris/game_actions.py:64 lutris/gui/installerwindow.py:388 msgid "Create desktop shortcut" msgstr "Bureaubladsnelkoppeling maken" @@ -336,7 +257,7 @@ msgstr "Bureaubladsnelkoppeling maken" msgid "Delete desktop shortcut" msgstr "Bureaubladsnelkoppeling verwijderen" -#: lutris/game_actions.py:74 lutris/gui/installerwindow.py:389 +#: lutris/game_actions.py:74 lutris/gui/installerwindow.py:392 msgid "Create application menu shortcut" msgstr "Snelkoppeling maken in programmamenu" @@ -344,7 +265,7 @@ msgstr "Snelkoppeling maken in programmamenu" msgid "Delete application menu shortcut" msgstr "Snelkoppeling verwijderen uit programmamenu" -#: lutris/game_actions.py:84 lutris/gui/installerwindow.py:394 +#: lutris/game_actions.py:84 lutris/gui/installerwindow.py:397 msgid "Create steam shortcut" msgstr "Steam-snelkoppeling maken" @@ -408,79 +329,162 @@ msgstr "" msgid "Select shortcut target" msgstr "Kies een snelkoppelingsdoel" -#: lutris/gui/addgameswindow.py:27 +#: lutris/game.py:280 +msgid "Error the runner is not installed" +msgstr "Foutmelding: runner is niet geïnstalleerd" + +#: lutris/game.py:282 +msgid "A bios file is required to run this game" +msgstr "Deze game vereist een bios-bestand" + +#: lutris/game.py:286 +msgid "The file {} could not be found" +msgstr "‘{}’ is niet aangetroffen" + +#: lutris/game.py:288 +msgid "" +"This game has no executable set. The install process didn't finish properly." +msgstr "" +"Er is geen uitvoerbaar bestand ingesteld omdat het installatieproces " +"onverwachts is afgebroken." + +#: lutris/game.py:291 +#, python-format +msgid "The file %s is not executable" +msgstr "‘%s’ is niet uitvoerbaar" + +#: lutris/game.py:293 +#, python-format +msgid "The path '%s' is not set. please set it in the options." +msgstr "‘%s’ is niet ingesteld. Stel deze locatie in in de opties." + +#: lutris/game.py:295 +#, python-format +msgid "Unhandled error: %s" +msgstr "Onverwachte foutmelding: %s" + +#: lutris/game.py:402 +msgid "Uninstall the game before deleting" +msgstr "Deïnstalleer de game alvorens hem te verwijderen" + +#: lutris/game.py:474 +msgid "Tried to launch a game that isn't installed." +msgstr "Je probeerde een niet-geïnstalleerde game te starten." + +#: lutris/game.py:476 lutris/game.py:579 +msgid "Invalid game configuration: Missing runner" +msgstr "Ongeldige gameconfiguratie: runner ontbreekt" + +#: lutris/game.py:508 +msgid "Unable to find Xephyr, install it or disable the Xephyr option" +msgstr "" +"Xephyr is niet aangetroffen. Installeer dit pakket of schakel de Xephyr-" +"optie uit." + +#: lutris/game.py:555 +#, python-format +msgid "" +"The selected terminal application could not be launched:\n" +"%s" +msgstr "" +"Het geselecteerde terminalprogramma kan niet worden uitgevoerd:\n" +"%s" + +#: lutris/game.py:828 +msgid "Error lauching the game:\n" +msgstr "De game kan niet worden gestart:\n" + +#: lutris/game.py:933 +#, python-format +msgid "" +"Error: Missing shared library.\n" +"\n" +"%s" +msgstr "" +"Foutmelding: ontbrekende gedeelde bibliotheek.\n" +"\n" +"%s" + +#: lutris/game.py:939 +msgid "" +"Error: A different Wine version is already using the same Wine prefix." +msgstr "" +"Foutmelding: een andere Wine-versie gebruikt reeds hetzelfde Wine-profiel." +"" + +#: lutris/gui/addgameswindow.py:26 msgid "Search the Lutris website for installers" msgstr "Zoeken naar installatiewizards op Litrus-website" -#: lutris/gui/addgameswindow.py:28 +#: lutris/gui/addgameswindow.py:27 msgid "Query our website for community installers" msgstr "Doorzoek onze website op installatiewizards" -#: lutris/gui/addgameswindow.py:34 +#: lutris/gui/addgameswindow.py:33 msgid "Scan a folder for games" msgstr "Naar games zoeken in map" -#: lutris/gui/addgameswindow.py:35 +#: lutris/gui/addgameswindow.py:34 msgid "Mass-import a folder of games" msgstr "Importeer een map met meerdere games" -#: lutris/gui/addgameswindow.py:41 +#: lutris/gui/addgameswindow.py:40 msgid "Install a Windows game from an executable" msgstr "Installeer een Windows-game middels een uitvoerbaar bestand" -#: lutris/gui/addgameswindow.py:42 +#: lutris/gui/addgameswindow.py:41 msgid "Launch a Windows executable (.exe) installer" msgstr "Start een Windows-installatiebestand (.exe)" -#: lutris/gui/addgameswindow.py:48 +#: lutris/gui/addgameswindow.py:47 msgid "Install from a local install script" msgstr "Installeer middels een lokaal installatiescript" -#: lutris/gui/addgameswindow.py:49 +#: lutris/gui/addgameswindow.py:48 msgid "Run a YAML install script" msgstr "Voer een yaml-installatiescript uit" -#: lutris/gui/addgameswindow.py:55 +#: lutris/gui/addgameswindow.py:54 msgid "Import a ROM" msgstr "Rom importeren" -#: lutris/gui/addgameswindow.py:56 +#: lutris/gui/addgameswindow.py:55 msgid "Import a ROM that is known to Lutris" msgstr "Importeer een voor Lutris bekende rom" -#: lutris/gui/addgameswindow.py:62 +#: lutris/gui/addgameswindow.py:61 msgid "Add locally installed game" msgstr "Geïnstalleerde game toevoegen" -#: lutris/gui/addgameswindow.py:63 +#: lutris/gui/addgameswindow.py:62 msgid "Manually configure a game available locally" msgstr "Stel een lokale game handmatig in" -#: lutris/gui/addgameswindow.py:69 +#: lutris/gui/addgameswindow.py:68 msgid "Add games to Lutris" msgstr "Voeg games toe aan Lutris" #. Header bar buttons -#: lutris/gui/addgameswindow.py:90 lutris/gui/installerwindow.py:82 +#: lutris/gui/addgameswindow.py:89 lutris/gui/installerwindow.py:82 msgid "Back" msgstr "Terug" #. Continue Button -#: lutris/gui/addgameswindow.py:98 lutris/gui/addgameswindow.py:611 -#: lutris/gui/installerwindow.py:92 lutris/gui/installerwindow.py:902 +#: lutris/gui/addgameswindow.py:97 lutris/gui/addgameswindow.py:630 +#: lutris/gui/installerwindow.py:92 lutris/gui/installerwindow.py:905 msgid "_Continue" msgstr "_Doorgaan" #. Buttons -#: lutris/gui/addgameswindow.py:102 lutris/gui/addgameswindow.py:626 -#: lutris/gui/addgameswindow.py:629 lutris/gui/config/common.py:410 +#: lutris/gui/addgameswindow.py:101 lutris/gui/addgameswindow.py:645 +#: lutris/gui/addgameswindow.py:648 lutris/gui/config/common.py:412 #: lutris/gui/dialogs/runner_install.py:201 lutris/gui/installerwindow.py:89 -#: lutris/gui/installerwindow.py:956 +#: lutris/gui/installerwindow.py:959 #: lutris/gui/widgets/download_progress_box.py:95 msgid "Cancel" msgstr "Annuleren" -#: lutris/gui/addgameswindow.py:121 lutris/gui/config/boxes.py:486 +#: lutris/gui/addgameswindow.py:120 lutris/gui/config/boxes.py:517 msgid "Select folder" msgstr "Kies een map" @@ -561,7 +565,7 @@ msgstr "Aangetroffen games" msgid "No games found" msgstr "Er zijn geen games aangetroffen" -#: lutris/gui/addgameswindow.py:370 lutris/gui/installerwindow.py:956 +#: lutris/gui/addgameswindow.py:370 lutris/gui/installerwindow.py:959 msgid "_Close" msgstr "_Sluiten" @@ -591,36 +595,61 @@ msgstr "" "Als je de Lutris-identificatiecode van de game weet, voer deze dan in voor " "betere Lutris-integratie." -#: lutris/gui/addgameswindow.py:443 -msgid "32-bit Wine prefix" -msgstr "32-bit Wine-profiel" +#: lutris/gui/addgameswindow.py:441 +msgid "Installer preset:" +msgstr "Installatie-voorinstelling:" -#: lutris/gui/addgameswindow.py:452 +#: lutris/gui/addgameswindow.py:444 +msgid "Windows 10 64-bit (Default)" +msgstr "Windows 10 64-bit (standaard)" + +#: lutris/gui/addgameswindow.py:445 +#| msgid "Windows" +msgid "Windows 7 64-bit" +msgstr "Windows 7 64-bit" + +#: lutris/gui/addgameswindow.py:446 +msgid "Windows XP 32-bit" +msgstr "Windows XP 32-bit" + +#: lutris/gui/addgameswindow.py:447 +msgid "Windows XP + 3DFX 32-bit" +msgstr "Windows XP + 3DFX 32-bit" + +#: lutris/gui/addgameswindow.py:448 +msgid "Windows 98 32-bit" +msgstr "Windows 98 32-bit" + +#: lutris/gui/addgameswindow.py:449 +msgid "Windows 98 + 3DFX 32-bit" +msgstr "Windows 98 + 3DFX 32-bit" + +#: lutris/gui/addgameswindow.py:464 msgid "Select setup file" msgstr "Kies een installatiebestand" -#: lutris/gui/addgameswindow.py:454 lutris/gui/addgameswindow.py:535 -#: lutris/gui/addgameswindow.py:577 lutris/gui/installerwindow.py:939 +#: lutris/gui/addgameswindow.py:466 lutris/gui/addgameswindow.py:554 +#: lutris/gui/addgameswindow.py:596 lutris/gui/installerwindow.py:942 msgid "_Install" msgstr "_Installeren" -#: lutris/gui/addgameswindow.py:472 +#: lutris/gui/addgameswindow.py:485 msgid "You must provide a name for the game you are installing." msgstr "Voer de naam van de installeren game in." -#: lutris/gui/addgameswindow.py:488 +#: lutris/gui/addgameswindow.py:503 msgid "Setup file" msgstr "Installatiebestand" -#: lutris/gui/addgameswindow.py:497 +#: lutris/gui/addgameswindow.py:512 msgid "Select the setup file" msgstr "Kies een installatiebestand" -#: lutris/gui/addgameswindow.py:516 +#: lutris/gui/addgameswindow.py:535 msgid "Script file" msgstr "Scriptbestand" -#: lutris/gui/addgameswindow.py:522 +#: lutris/gui/addgameswindow.py:541 msgid "" "Lutris install scripts are YAML files that guide Lutris through the " "installation process.\n" @@ -639,16 +668,16 @@ msgstr "" "Als je op ‘Installeren’ klikt, dan wordt het installatievenster geopend en " "het script gestart." -#: lutris/gui/addgameswindow.py:541 +#: lutris/gui/addgameswindow.py:560 msgid "You must select a script file to install." msgstr "Kies een te installeren scriptbestand." -#: lutris/gui/addgameswindow.py:543 lutris/gui/addgameswindow.py:585 +#: lutris/gui/addgameswindow.py:562 lutris/gui/addgameswindow.py:604 #, python-format msgid "No file exists at '%s'." msgstr "Er is geen bestand in ‘%s’." -#: lutris/gui/addgameswindow.py:558 lutris/runners/atari800.py:36 +#: lutris/gui/addgameswindow.py:577 lutris/runners/atari800.py:36 #: lutris/runners/jzintv.py:19 lutris/runners/libretro.py:77 #: lutris/runners/mame.py:78 lutris/runners/mednafen.py:57 #: lutris/runners/mupen64plus.py:20 lutris/runners/o2em.py:45 @@ -658,7 +687,7 @@ msgstr "Er is geen bestand in ‘%s’." msgid "ROM file" msgstr "ROM-bestand" -#: lutris/gui/addgameswindow.py:564 +#: lutris/gui/addgameswindow.py:583 msgid "" "Lutris will identify a ROM via its MD5 hash and download game information " "from Lutris.net.\n" @@ -675,7 +704,7 @@ msgstr "" "\n" "Als je op ‘Installeren’ klikt, dan wordt het installatieproces gestart." -#: lutris/gui/addgameswindow.py:583 +#: lutris/gui/addgameswindow.py:602 msgid "You must select a ROM file to install." msgstr "Kies een te installeren rombestand." @@ -826,19 +855,19 @@ msgstr "Geen uitbreidingen aangetroffen" msgid "Add a new game" msgstr "Game toevoegen" -#: lutris/gui/config/boxes.py:62 +#: lutris/gui/config/boxes.py:64 msgid "No options available" msgstr "Geen beschikbare opties" -#: lutris/gui/config/boxes.py:133 +#: lutris/gui/config/boxes.py:125 msgid "Reset option to global or default config" msgstr "Optie terugzetten op globale of standaardwaarde" -#: lutris/gui/config/boxes.py:154 +#: lutris/gui/config/boxes.py:147 msgid "Default: " msgstr "Standaard: " -#: lutris/gui/config/boxes.py:158 +#: lutris/gui/config/boxes.py:151 msgid "" "(Italic indicates that this option is modified in a lower configuration " "level.)" @@ -846,39 +875,39 @@ msgstr "" "(cursieve tekst geeft aan dat deze optie op een lager configuratieniveau " "is ingesteld)" -#: lutris/gui/config/boxes.py:366 +#: lutris/gui/config/boxes.py:397 #, python-format msgid "%s (default)" msgstr "%s (standaard)" -#: lutris/gui/config/boxes.py:450 lutris/gui/widgets/common.py:50 +#: lutris/gui/config/boxes.py:481 lutris/gui/widgets/common.py:49 msgid "Select file" msgstr "Bestand kiezen" -#: lutris/gui/config/boxes.py:529 +#: lutris/gui/config/boxes.py:560 msgid "Add files" msgstr "Bestanden toevoegen" -#: lutris/gui/config/boxes.py:547 +#: lutris/gui/config/boxes.py:578 msgid "Files" msgstr "Bestanden" -#: lutris/gui/config/boxes.py:564 +#: lutris/gui/config/boxes.py:595 msgid "Select files" msgstr "Bestanden selecteren" -#: lutris/gui/config/boxes.py:567 +#: lutris/gui/config/boxes.py:598 msgid "_Add" msgstr "_Toevoegen" -#: lutris/gui/config/boxes.py:568 lutris/gui/dialogs/issue.py:72 -#: lutris/gui/dialogs/__init__.py:217 lutris/gui/dialogs/__init__.py:243 -#: lutris/gui/widgets/common.py:113 +#: lutris/gui/config/boxes.py:599 lutris/gui/dialogs/__init__.py:217 +#: lutris/gui/dialogs/__init__.py:243 lutris/gui/dialogs/issue.py:72 +#: lutris/gui/widgets/common.py:112 #: lutris/gui/widgets/download_progress_box.py:47 msgid "_Cancel" msgstr "_Annuleren" -#: lutris/gui/config/boxes.py:698 +#: lutris/gui/config/boxes.py:747 msgid "" "If modified, these options supersede the same options from the base runner " "configuration." @@ -886,7 +915,7 @@ msgstr "" "Als je dit aanpast, dan overschrijven deze opties die van de basis-" "runnerconfiguratie." -#: lutris/gui/config/boxes.py:719 +#: lutris/gui/config/boxes.py:768 msgid "" "If modified, these options supersede the same options from the base runner " "configuration, which themselves supersede the global preferences." @@ -894,7 +923,7 @@ msgstr "" "Als je dit aanpast, dan overschrijven deze opties die van de basis-" "runnerconfiguratie, welke dan weer de globale voorkeuren overschrijven." -#: lutris/gui/config/boxes.py:725 +#: lutris/gui/config/boxes.py:774 msgid "" "If modified, these options supersede the same options from the global " "preferences." @@ -902,109 +931,109 @@ msgstr "" "Als je dit aanpast, dan overschrijven deze opties die van de globale " "voorkeuren." -#: lutris/gui/config/common.py:28 +#: lutris/gui/config/common.py:31 msgid "Select a runner in the Game Info tab" msgstr "Kies een runner op het tabblad ‘Game-informatie’" -#: lutris/gui/config/common.py:130 +#: lutris/gui/config/common.py:133 msgid "Game info" msgstr "Game-informatie" -#: lutris/gui/config/common.py:146 +#: lutris/gui/config/common.py:149 msgid "Identifier" msgstr "Identificatie" -#: lutris/gui/config/common.py:155 lutris/gui/config/common.py:331 +#: lutris/gui/config/common.py:158 lutris/gui/config/common.py:336 msgid "Change" msgstr "Wijzigen" -#: lutris/gui/config/common.py:164 +#: lutris/gui/config/common.py:167 msgid "Directory" msgstr "Map" -#: lutris/gui/config/common.py:170 +#: lutris/gui/config/common.py:173 msgid "Move" msgstr "Verplaatsen" -#: lutris/gui/config/common.py:190 +#: lutris/gui/config/common.py:193 msgid "The default launch option will be used for this game" msgstr "De standaard opstartoptie wordt gebruikt voor deze game" -#: lutris/gui/config/common.py:192 +#: lutris/gui/config/common.py:195 #, python-format msgid "The '%s' launch option will be used for this game" msgstr "De ‘%s’-optie wordt gebruikt voor deze game" -#: lutris/gui/config/common.py:199 +#: lutris/gui/config/common.py:202 msgid "Reset" msgstr "Standaardwaarden" -#: lutris/gui/config/common.py:216 lutris/gui/views/list.py:50 +#: lutris/gui/config/common.py:220 lutris/gui/views/list.py:53 msgid "Runner" msgstr "Runner" -#: lutris/gui/config/common.py:230 +#: lutris/gui/config/common.py:234 msgid "Set custom cover art" msgstr "Eigen omslagfoto instellen" -#: lutris/gui/config/common.py:230 +#: lutris/gui/config/common.py:234 msgid "Remove custom cover art" msgstr "Eigen omslagfoto verwijderen" -#: lutris/gui/config/common.py:231 +#: lutris/gui/config/common.py:235 msgid "Set custom banner" msgstr "Eigen banier instellen" -#: lutris/gui/config/common.py:231 +#: lutris/gui/config/common.py:235 msgid "Remove custom banner" msgstr "Aangepaste banier verwijderen" -#: lutris/gui/config/common.py:232 +#: lutris/gui/config/common.py:236 msgid "Set custom icon" msgstr "Eigen pictogram instellen" -#: lutris/gui/config/common.py:232 +#: lutris/gui/config/common.py:236 msgid "Remove custom icon" msgstr "Aangepast pictogram verwijderen" -#: lutris/gui/config/common.py:265 +#: lutris/gui/config/common.py:269 msgid "Release year" msgstr "Jaar van uitgave" -#: lutris/gui/config/common.py:307 +#: lutris/gui/config/common.py:310 msgid "Select a runner from the list" msgstr "Kies een runner uit de lijst" -#: lutris/gui/config/common.py:315 +#: lutris/gui/config/common.py:319 msgid "Apply" msgstr "Toepassen" -#: lutris/gui/config/common.py:362 lutris/gui/config/common.py:367 -#: lutris/gui/config/common.py:370 +#: lutris/gui/config/common.py:364 lutris/gui/config/common.py:369 +#: lutris/gui/config/common.py:372 msgid "Game options" msgstr "Game-opties" -#: lutris/gui/config/common.py:374 lutris/gui/config/common.py:377 +#: lutris/gui/config/common.py:376 lutris/gui/config/common.py:379 msgid "Runner options" msgstr "Runner-opties" -#: lutris/gui/config/common.py:380 +#: lutris/gui/config/common.py:382 msgid "System options" msgstr "Systeemopties" -#: lutris/gui/config/common.py:413 +#: lutris/gui/config/common.py:415 msgid "Save" msgstr "Opslaan" -#: lutris/gui/config/common.py:425 +#: lutris/gui/config/common.py:427 msgid "Show advanced options" msgstr "Geavanceerde opties tonen" -#: lutris/gui/config/common.py:427 +#: lutris/gui/config/common.py:429 msgid "Advanced" msgstr "Geavanceerd" -#: lutris/gui/config/common.py:468 +#: lutris/gui/config/common.py:470 msgid "" "Are you sure you want to change the runner for this game ? This will reset " "the full configuration for this game and is not reversible." @@ -1013,35 +1042,35 @@ msgstr "" "de volledige configuratie van de game verwijderd. Dit kan niet ongedaan " "worden gemaakt." -#: lutris/gui/config/common.py:472 +#: lutris/gui/config/common.py:474 msgid "Confirm runner change" msgstr "Bevestigen" -#: lutris/gui/config/common.py:524 +#: lutris/gui/config/common.py:526 msgid "Runner not provided" msgstr "Geen runner opgegeven" -#: lutris/gui/config/common.py:527 +#: lutris/gui/config/common.py:529 msgid "Please fill in the name" msgstr "Voer de naam in" -#: lutris/gui/config/common.py:530 +#: lutris/gui/config/common.py:532 msgid "Steam AppID not provided" msgstr "Geen Steam AppId opgegeven" -#: lutris/gui/config/common.py:548 +#: lutris/gui/config/common.py:550 msgid "The following fields have invalid values: " msgstr "De volgende velden bevatten ongeldige waarden: " -#: lutris/gui/config/common.py:555 +#: lutris/gui/config/common.py:558 msgid "Current configuration is not valid, ignoring save request" msgstr "De huidige configuratie is ongeldig; het bewaarverzoek is genegeerd" -#: lutris/gui/config/common.py:594 +#: lutris/gui/config/common.py:593 msgid "Please choose a custom image" msgstr "Kies een aangepaste afbeelding" -#: lutris/gui/config/common.py:602 +#: lutris/gui/config/common.py:601 msgid "Images" msgstr "Afbeeldingen" @@ -1054,50 +1083,69 @@ msgstr "%s instellen" msgid "Minimize client when a game is launched" msgstr "Venster minimaliseren na starten van een game" -#: lutris/gui/config/preferences_box.py:12 -msgid "Hide text under icons (requires restart)" -msgstr "Tekst onder pictogrammen verbergen (herstart vereist)" +#: lutris/gui/config/preferences_box.py:12 lutris/gui/config/sysinfo_box.py:12 +msgid "Hide text under icons" +msgstr "Tekst onder pictogrammen verbergen" -#: lutris/gui/config/preferences_box.py:13 lutris/gui/config/sysinfo_box.py:13 +#: lutris/gui/config/preferences_box.py:13 +msgid "Hide badges on icons (Ctrl+p to toggle)" +msgstr "Emblemen op pictogrammen verbergen (Ctrl+P)" + +#: lutris/gui/config/preferences_box.py:14 lutris/gui/config/sysinfo_box.py:14 msgid "Show Tray Icon" msgstr "Systeemvakpictogram tonen" -#: lutris/gui/config/preferences_box.py:14 +#: lutris/gui/config/preferences_box.py:15 msgid "Use dark theme (requires dark theme variant for Gtk)" msgstr "Donker thema gebruiken (donker GTK-thema vereist)" -#: lutris/gui/config/preferences_box.py:15 +#: lutris/gui/config/preferences_box.py:16 msgid "Enable Discord Rich Presence for Available Games" msgstr "Discord-aanwezigheid tonen bij beschikbare games" -#: lutris/gui/config/preferences_box.py:30 +#: lutris/gui/config/preferences_box.py:36 msgid "Interface options" msgstr "Vormgevingsopties" -#: lutris/gui/config/preferences_dialog.py:18 +#: lutris/gui/config/preferences_dialog.py:22 msgid "Lutris settings" msgstr "Lutris-instellingen" -#: lutris/gui/config/preferences_dialog.py:27 +#: lutris/gui/config/preferences_dialog.py:34 msgid "Interface" msgstr "Vormgeving" -#: lutris/gui/config/preferences_dialog.py:28 lutris/gui/widgets/sidebar.py:292 +#: lutris/gui/config/preferences_dialog.py:35 lutris/gui/widgets/sidebar.py:305 msgid "Runners" msgstr "Runners" -#: lutris/gui/config/preferences_dialog.py:29 lutris/gui/widgets/sidebar.py:291 +#: lutris/gui/config/preferences_dialog.py:36 lutris/gui/widgets/sidebar.py:304 msgid "Sources" msgstr "Bronnen" -#: lutris/gui/config/preferences_dialog.py:30 +#: lutris/gui/config/preferences_dialog.py:37 msgid "Hardware information" msgstr "Hardware-informatie" -#: lutris/gui/config/preferences_dialog.py:31 +#: lutris/gui/config/preferences_dialog.py:38 msgid "Global options" msgstr "Algemene opties" +#: lutris/gui/config/runner_box.py:90 lutris/gui/widgets/sidebar.py:241 +#, python-format +msgid "Manage %s versions" +msgstr "%s-versies beheren" + +#: lutris/gui/config/runner_box.py:123 +#, python-format +msgid "Do you want to uninstall %s?" +msgstr "Weet je zeker dat je %s wilt deïnstalleren?" + +#: lutris/gui/config/runner_box.py:124 +#, python-format +msgid "This will remove %s and all associated data." +msgstr "Hierdoor wordt %s en alle bijbehorende gegevens verwijderd." + #: lutris/gui/config/runners_box.py:17 msgid "Add, remove or configure runners" msgstr "Runners toevoegen, verwijderen of instellen" @@ -1120,21 +1168,6 @@ msgstr "Er zijn geen overeenkomende runners" msgid "Search %s runners" msgstr "%s runners doorzoeken" -#: lutris/gui/config/runner_box.py:91 lutris/gui/widgets/sidebar.py:230 -#, python-format -msgid "Manage %s versions" -msgstr "%s-versies beheren" - -#: lutris/gui/config/runner_box.py:121 -#, python-format -msgid "Do you want to uninstall %s?" -msgstr "Weet je zeker dat je %s wilt deïnstalleren?" - -#: lutris/gui/config/runner_box.py:122 -#, python-format -msgid "This will remove %s and all associated data." -msgstr "Hierdoor wordt %s en alle bijbehorende gegevens verwijderd." - #: lutris/gui/config/services_box.py:18 msgid "Enable integrations with game sources" msgstr "Integratie met gamebronnen inschakelen" @@ -1147,15 +1180,15 @@ msgstr "" "Verkrijg toegang tot je gameverzamelingen uit verschillende bronnen. " "Herstart om de wijziging toe te passen." -#: lutris/gui/config/sysinfo_box.py:12 -msgid "Hide text under icons" -msgstr "Tekst onder pictogrammen verbergen" +#: lutris/gui/config/sysinfo_box.py:13 +msgid "Hide badges on icons" +msgstr "Emblemen op pictogrammen verbergen" -#: lutris/gui/config/sysinfo_box.py:36 +#: lutris/gui/config/sysinfo_box.py:40 msgid "Copy to clipboard" msgstr "Kopiëren naar klembord" -#: lutris/gui/config/sysinfo_box.py:39 +#: lutris/gui/config/sysinfo_box.py:43 msgid "System information" msgstr "Systeeminformatie" @@ -1203,45 +1236,148 @@ msgstr "Bezig met downloaden van bestand" msgid "Downloading %s" msgstr "Bezig met downloaden van %s" -#: lutris/gui/dialogs/game_import.py:100 +#: lutris/gui/dialogs/game_import.py:101 msgid "Launch" msgstr "Starten" -#: lutris/gui/dialogs/game_import.py:134 +#: lutris/gui/dialogs/game_import.py:135 msgid "Calculating checksum..." msgstr "Bezig met berekenen van controlesom…" -#: lutris/gui/dialogs/game_import.py:143 +#: lutris/gui/dialogs/game_import.py:144 msgid "Looking up checksum on Lutris.net..." msgstr "Bezig met opzoeken van controlesom op Lutris.net…" -#: lutris/gui/dialogs/game_import.py:146 +#: lutris/gui/dialogs/game_import.py:147 msgid "This ROM could not be identified." msgstr "Deze rom wordt niet herkend." -#: lutris/gui/dialogs/game_import.py:155 +#: lutris/gui/dialogs/game_import.py:156 msgid "Looking for installed game..." msgstr "Bezig met zoeken naar geïnstalleerde game…" -#: lutris/gui/dialogs/game_import.py:204 +#: lutris/gui/dialogs/game_import.py:205 #, python-format msgid "Failed to import a ROM: %s" msgstr "De rom kan niet worden geïmporteerd: ‘%s’" -#: lutris/gui/dialogs/game_import.py:223 +#: lutris/gui/dialogs/game_import.py:224 msgid "Game already installed in Lutris" msgstr "Deze game is al geïnstalleerd" -#: lutris/gui/dialogs/game_import.py:245 +#: lutris/gui/dialogs/game_import.py:246 #, python-format msgid "The platform '%s' is unknown to Lutris." msgstr "Het platform ‘%s’ wordt niet herkend door Lutris." -#: lutris/gui/dialogs/game_import.py:255 +#: lutris/gui/dialogs/game_import.py:256 #, python-format msgid "Lutris does not have a default installer for the '%s' platform." msgstr "Lutris heeft geen standaard installatiewizard voor het platform ‘%s’." +#: lutris/gui/dialogs/__init__.py:216 lutris/gui/dialogs/__init__.py:242 +#: lutris/gui/dialogs/issue.py:71 lutris/gui/widgets/common.py:112 +msgid "_OK" +msgstr "_Oké" + +#: lutris/gui/dialogs/__init__.py:233 +msgid "Please choose a file" +msgstr "Kies een bestand" + +#: lutris/gui/dialogs/__init__.py:265 +msgid "Checking for runtime updates, please wait…" +msgstr "Bezig met controleren op runtime-updates…" + +#: lutris/gui/dialogs/__init__.py:303 +#, python-format +msgid "%s is already installed" +msgstr "%s is al geïnstalleerd" + +#: lutris/gui/dialogs/__init__.py:314 +msgid "Launch game" +msgstr "Game starten" + +#: lutris/gui/dialogs/__init__.py:318 +msgid "Install the game again" +msgstr "Game opnieuw installeren" + +#: lutris/gui/dialogs/__init__.py:361 +msgid "Do not ask again for this game." +msgstr "Niet meer vragen bij deze game" + +#: lutris/gui/dialogs/__init__.py:420 +msgid "Login failed" +msgstr "Inloggen mislukt" + +#: lutris/gui/dialogs/__init__.py:430 +msgid "Install script for {}" +msgstr "Installatiescript van {}" + +#: lutris/gui/dialogs/__init__.py:485 +msgid "Do not display this message again." +msgstr "Niet meer tonen" + +#: lutris/gui/dialogs/__init__.py:505 +msgid "Wine is not installed on your system." +msgstr "Wine is niet geïnstalleerd." + +#: lutris/gui/dialogs/__init__.py:507 +msgid "" +"Having Wine installed on your system guarantees that Wine builds from Lutris " +"will have all required dependencies.\n" +"\n" +"Please follow the instructions given in the Lutris Wiki to install Wine." +msgstr "" +"Door Wine te installeren zorg je er voor dat Wine-games binnen Lutris alle " +"benodigde afhankelijkheden hebben.\n" +"\n" +"Ga naar de Lutris-wiki (Engels) om te lezen hoe je Wine " +"installeert." + +#: lutris/gui/dialogs/__init__.py:533 +#, python-format +msgid "Moving %s to %s..." +msgstr "Bezig met verplaatsen van %s naar %s…" + +#: lutris/gui/dialogs/__init__.py:561 +msgid "Humble Bundle Cookie Authentication" +msgstr "Humble Bundle-cookie-authenticatie" + +#: lutris/gui/dialogs/__init__.py:573 +msgid "" +"Humble Bundle Authentication via cookie import\n" +"\n" +"In Firefox\n" +"- Install the follwing extension: https://addons.mozilla.org/en-US/firefox/" +"addon/export-cookies-txt/\n" +"- Open a tab to humblebundle.com and make sure you are logged in.\n" +"- Click the cookie icon in the top right corner, next to the settings menu\n" +"- Check 'Prefix HttpOnly cookies' and click 'humblebundle.com'\n" +"- Open the generated file and paste the contents below. Click OK to finish.\n" +"- You can delete the cookies file generated by Firefox\n" +"- Optionally, open a support ticket to ask Humble Bundle to fix their " +"configuration." +msgstr "" +"Humble Bundle-authenticatie via cookie-import\n" +"\n" +"In Firefox\n" +"- Installeer de volgende add-on: https://addons.mozilla.org/nl-NL/firefox/" +"addon/export-cookies-txt/\n" +"- Open humblebundle.com op een nieuw tabblad en zorg dat je ingelogd bent;\n" +"- Klik rechtsboven op het cookiepictogram (naast de instellingen);\n" +"- Controleer ‘Prefix HttpOnly cookies’ en klik op ‘humblebundle.com’;\n" +"- Open het gegenereerde bestand, plak de inhoud ervan hieronder en klik op " +"oké;\n" +"- Verwijder het gegenereerde bestand;\n" +"- (Optioneel) Open een ondersteuningsticket en vraag Humble Bundle om hun " +"configuratie aan te passen." + #: lutris/gui/dialogs/issue.py:24 msgid "Submit an issue" msgstr "Probleem melden" @@ -1264,11 +1400,6 @@ msgstr "Op_slaan" msgid "Select a location to save the issue" msgstr "Kies een locatie om het probleem in op te slaan" -#: lutris/gui/dialogs/issue.py:71 lutris/gui/dialogs/__init__.py:216 -#: lutris/gui/dialogs/__init__.py:242 lutris/gui/widgets/common.py:113 -msgid "_OK" -msgstr "_Oké" - #: lutris/gui/dialogs/issue.py:88 #, python-format msgid "Issue saved in %s" @@ -1409,221 +1540,6 @@ msgstr "" msgid "Loading..." msgstr "Bezig met laden…" -#: lutris/gui/dialogs/__init__.py:233 -msgid "Please choose a file" -msgstr "Kies een bestand" - -#: lutris/gui/dialogs/__init__.py:265 -msgid "Checking for runtime updates, please wait…" -msgstr "Bezig met controleren op runtime-updates…" - -#: lutris/gui/dialogs/__init__.py:303 -#, python-format -msgid "%s is already installed" -msgstr "%s is al geïnstalleerd" - -#: lutris/gui/dialogs/__init__.py:314 -msgid "Launch game" -msgstr "Game starten" - -#: lutris/gui/dialogs/__init__.py:318 -msgid "Install the game again" -msgstr "Game opnieuw installeren" - -#: lutris/gui/dialogs/__init__.py:361 -msgid "Do not ask again for this game." -msgstr "Niet meer vragen bij deze game" - -#: lutris/gui/dialogs/__init__.py:420 -msgid "Login failed" -msgstr "Inloggen mislukt" - -#: lutris/gui/dialogs/__init__.py:430 -msgid "Install script for {}" -msgstr "Installatiescript van {}" - -#: lutris/gui/dialogs/__init__.py:485 -msgid "Do not display this message again." -msgstr "Niet meer tonen" - -#: lutris/gui/dialogs/__init__.py:505 -msgid "Wine is not installed on your system." -msgstr "Wine is niet geïnstalleerd." - -#: lutris/gui/dialogs/__init__.py:507 -msgid "" -"Having Wine installed on your system guarantees that Wine builds from Lutris " -"will have all required dependencies.\n" -"\n" -"Please follow the instructions given in the Lutris Wiki to install Wine." -msgstr "" -"Door Wine te installeren zorg je er voor dat Wine-games binnen Lutris alle " -"benodigde afhankelijkheden hebben.\n" -"\n" -"Ga naar de Lutris-wiki (Engels) om te lezen hoe je Wine " -"installeert." - -#: lutris/gui/dialogs/__init__.py:533 -#, python-format -msgid "Moving %s to %s..." -msgstr "Bezig met verplaatsen van %s naar %s…" - -#: lutris/gui/dialogs/__init__.py:561 -msgid "Humble Bundle Cookie Authentication" -msgstr "Humble Bundle-cookie-authenticatie" - -#: lutris/gui/dialogs/__init__.py:573 -msgid "" -"Humble Bundle Authentication via cookie import\n" -"\n" -"In Firefox\n" -"- Install the follwing extension: https://addons.mozilla.org/en-US/firefox/" -"addon/export-cookies-txt/\n" -"- Open a tab to humblebundle.com and make sure you are logged in.\n" -"- Click the cookie icon in the top right corner, next to the settings menu\n" -"- Check 'Prefix HttpOnly cookies' and click 'humblebundle.com'\n" -"- Open the generated file and paste the contents below. Click OK to finish.\n" -"- You can delete the cookies file generated by Firefox\n" -"- Optionally, open a support ticket to ask Humble Bundle to fix their " -"configuration." -msgstr "" -"Humble Bundle-authenticatie via cookie-import\n" -"\n" -"In Firefox\n" -"- Installeer de volgende add-on: https://addons.mozilla.org/nl-NL/firefox/" -"addon/export-cookies-txt/\n" -"- Open humblebundle.com op een nieuw tabblad en zorg dat je ingelogd bent;\n" -"- Klik rechtsboven op het cookiepictogram (naast de instellingen);\n" -"- Controleer ‘Prefix HttpOnly cookies’ en klik op ‘humblebundle.com’;\n" -"- Open het gegenereerde bestand, plak de inhoud ervan hieronder en klik op " -"oké;\n" -"- Verwijder het gegenereerde bestand;\n" -"- (Optioneel) Open een ondersteuningsticket en vraag Humble Bundle om hun " -"configuratie aan te passen." - -#: lutris/gui/installerwindow.py:115 -msgid "Configure download cache" -msgstr "Downloadcache instellen" - -#: lutris/gui/installerwindow.py:118 -msgid "Change where Lutris downloads game installer files." -msgstr "Geef aan waar installatiewizardbestanden moeten worden opgeslagen." - -#: lutris/gui/installerwindow.py:120 -msgid "View installer source" -msgstr "Installatiebron bekijken" - -#: lutris/gui/installerwindow.py:212 -msgid "Remove game files" -msgstr "Gamebestanden verwijderen" - -#: lutris/gui/installerwindow.py:224 -msgid "Are you sure you want to cancel the installation?" -msgstr "Weet je zeker dat je de installatie wilt afbreken?" - -#: lutris/gui/installerwindow.py:225 -msgid "Cancel installation?" -msgstr "Installatie afbreken?" - -#: lutris/gui/installerwindow.py:316 -#, python-format -msgid "Install %s" -msgstr "%s installeren" - -#: lutris/gui/installerwindow.py:339 -#, python-format -msgid "This game requires %s. Do you want to install it?" -msgstr "Deze game is afhankelijk van %s. Wil je het installeren?" - -#: lutris/gui/installerwindow.py:340 -msgid "Missing dependency" -msgstr "Ontbrekende afhankelijkheid" - -#: lutris/gui/installerwindow.py:349 -msgid "Installing {}" -msgstr "Bezig met installeren van {}" - -#: lutris/gui/installerwindow.py:355 -msgid "No installer available" -msgstr "Er is geen installatiewizard beschikbaar" - -#: lutris/gui/installerwindow.py:362 -#, python-format -msgid "Missing field \"%s\" in install script" -msgstr "Het veld ‘%s’ ontbreekt in het installatiescript" - -#: lutris/gui/installerwindow.py:402 -msgid "Select installation directory" -msgstr "Installatiemap kiezen" - -#: lutris/gui/installerwindow.py:418 -msgid "Preparing Lutris for installation" -msgstr "Bezig met voorbereiden van installatie" - -#: lutris/gui/installerwindow.py:507 -msgid "" -"This game has extra content. \n" -"Select which one you want and they will be available in the 'extras' folder " -"where the game is installed." -msgstr "" -"Deze game bevat aanvullende inhoud.\n" -"Kies de inhoud die je wilt toevoegen aan de ‘extras’-map in de " -"installatiemap." - -#: lutris/gui/installerwindow.py:600 -msgid "" -"Please review the files needed for the installation then click 'Continue'" -msgstr "" -"Neem de voor installatie benodigde bestanden door en klik vervolgens op " -"‘Doorgaan’" - -#: lutris/gui/installerwindow.py:608 -msgid "Downloading game data" -msgstr "Bezig met ophalen van gamegegevens" - -#: lutris/gui/installerwindow.py:627 -#, python-format -msgid "Unable to get files: %s" -msgstr "De bestanden kunnen niet worden opgehaald: %s" - -#: lutris/gui/installerwindow.py:641 -msgid "Installing game data" -msgstr "Bezig met installeren van gamegegevens" - -#: lutris/gui/installerwindow.py:784 -msgid "Autodetect" -msgstr "Automatisch detecteren" - -#: lutris/gui/installerwindow.py:789 -msgid "Browse…" -msgstr "Bladeren…" - -#: lutris/gui/installerwindow.py:796 -msgid "Eject" -msgstr "Uitwerpen" - -#: lutris/gui/installerwindow.py:809 -msgid "Select the folder where the disc is mounted" -msgstr "Kies de map waarin de schijf is aangekoppeld" - -#: lutris/gui/installerwindow.py:869 -msgid "_Launch" -msgstr "_Starten" - -#: lutris/gui/installerwindow.py:952 -msgid "_Abort" -msgstr "_Afbreken" - -#: lutris/gui/installerwindow.py:953 -msgid "Abort and revert the installation" -msgstr "Afbreken en installatie terugdraaien" - #: lutris/gui/installer/file_box.py:94 #, python-brace-format msgid "Steam game {appid}" @@ -1654,19 +1570,136 @@ msgstr "Cachebestand voor toekomstige installaties" msgid "Source:" msgstr "Bron:" -#: lutris/gui/lutriswindow.py:371 +#: lutris/gui/installerwindow.py:115 +msgid "Configure download cache" +msgstr "Downloadcache instellen" + +#: lutris/gui/installerwindow.py:118 +msgid "Change where Lutris downloads game installer files." +msgstr "Geef aan waar installatiewizardbestanden moeten worden opgeslagen." + +#: lutris/gui/installerwindow.py:120 +msgid "View installer source" +msgstr "Installatiebron bekijken" + +#: lutris/gui/installerwindow.py:215 +msgid "Remove game files" +msgstr "Gamebestanden verwijderen" + +#: lutris/gui/installerwindow.py:227 +msgid "Are you sure you want to cancel the installation?" +msgstr "Weet je zeker dat je de installatie wilt afbreken?" + +#: lutris/gui/installerwindow.py:228 +msgid "Cancel installation?" +msgstr "Installatie afbreken?" + +#: lutris/gui/installerwindow.py:319 +#, python-format +msgid "Install %s" +msgstr "%s installeren" + +#: lutris/gui/installerwindow.py:342 +#, python-format +msgid "This game requires %s. Do you want to install it?" +msgstr "Deze game is afhankelijk van %s. Wil je het installeren?" + +#: lutris/gui/installerwindow.py:343 +msgid "Missing dependency" +msgstr "Ontbrekende afhankelijkheid" + +#: lutris/gui/installerwindow.py:352 +msgid "Installing {}" +msgstr "Bezig met installeren van {}" + +#: lutris/gui/installerwindow.py:358 +msgid "No installer available" +msgstr "Er is geen installatiewizard beschikbaar" + +#: lutris/gui/installerwindow.py:365 +#, python-format +msgid "Missing field \"%s\" in install script" +msgstr "Het veld ‘%s’ ontbreekt in het installatiescript" + +#: lutris/gui/installerwindow.py:405 +msgid "Select installation directory" +msgstr "Installatiemap kiezen" + +#: lutris/gui/installerwindow.py:421 +msgid "Preparing Lutris for installation" +msgstr "Bezig met voorbereiden van installatie" + +#: lutris/gui/installerwindow.py:510 +msgid "" +"This game has extra content. \n" +"Select which one you want and they will be available in the 'extras' folder " +"where the game is installed." +msgstr "" +"Deze game bevat aanvullende inhoud.\n" +"Kies de inhoud die je wilt toevoegen aan de ‘extras’-map in de " +"installatiemap." + +#: lutris/gui/installerwindow.py:603 +msgid "" +"Please review the files needed for the installation then click 'Continue'" +msgstr "" +"Neem de voor installatie benodigde bestanden door en klik vervolgens op " +"‘Doorgaan’" + +#: lutris/gui/installerwindow.py:611 +msgid "Downloading game data" +msgstr "Bezig met ophalen van gamegegevens" + +#: lutris/gui/installerwindow.py:630 +#, python-format +msgid "Unable to get files: %s" +msgstr "De bestanden kunnen niet worden opgehaald: %s" + +#: lutris/gui/installerwindow.py:644 +msgid "Installing game data" +msgstr "Bezig met installeren van gamegegevens" + +#: lutris/gui/installerwindow.py:787 +msgid "Autodetect" +msgstr "Automatisch detecteren" + +#: lutris/gui/installerwindow.py:792 +msgid "Browse…" +msgstr "Bladeren…" + +#: lutris/gui/installerwindow.py:799 +msgid "Eject" +msgstr "Uitwerpen" + +#: lutris/gui/installerwindow.py:812 +msgid "Select the folder where the disc is mounted" +msgstr "Kies de map waarin de schijf is aangekoppeld" + +#: lutris/gui/installerwindow.py:872 +msgid "_Launch" +msgstr "_Starten" + +#: lutris/gui/installerwindow.py:955 +msgid "_Abort" +msgstr "_Afbreken" + +#: lutris/gui/installerwindow.py:956 +msgid "Abort and revert the installation" +msgstr "Afbreken en installatie terugdraaien" + +#: lutris/gui/lutriswindow.py:470 #, python-format msgid "Connect your %s account to access your games" msgstr "Koppel je %s-account om toegang te krijgen tot je games" -#: lutris/gui/lutriswindow.py:446 +#: lutris/gui/lutriswindow.py:540 #, python-format msgid "Add a game matching '%s' to your favorites to see it here." msgstr "" "Voeg een game die overeenkomt met ‘%s’ toe aan je favorieten om hem hier te " "tonen." -#: lutris/gui/lutriswindow.py:449 +#: lutris/gui/lutriswindow.py:543 #, python-format msgid "" "No installed games matching '%s' found. Press Ctrl+I to show uninstalled " @@ -1676,7 +1709,7 @@ msgstr "" "om verwijderde games te tonen." #. but not if missing! -#: lutris/gui/lutriswindow.py:451 +#: lutris/gui/lutriswindow.py:545 #, python-format msgid "" "No visible games matching '%s' found. Press Ctrl+H to show hidden games." @@ -1684,50 +1717,50 @@ msgstr "" "Er zijn geen games die overeenkomen met ‘%s’. Druk op Ctrl+H om verborgen " "games te tonen." -#: lutris/gui/lutriswindow.py:454 +#: lutris/gui/lutriswindow.py:548 #, python-format msgid "No games matching '%s' found " msgstr "Er zijn geen games die overeenkomen met “%s” " -#: lutris/gui/lutriswindow.py:457 +#: lutris/gui/lutriswindow.py:551 msgid "Add games to your favorites to see them here." msgstr "Voeg games toe aan je favorieten om ze hier te tonen." -#: lutris/gui/lutriswindow.py:459 +#: lutris/gui/lutriswindow.py:553 msgid "No installed games found. Press Ctrl+I to show uninstalled games." msgstr "" "Er zijn geen geïnstalleerde games aangetroffen. Druk op Ctrl+I om " "verwijderde games te tonen." #. but not if missing! -#: lutris/gui/lutriswindow.py:461 +#: lutris/gui/lutriswindow.py:555 msgid "No visible games found. Press Ctrl+H to show hidden games." msgstr "" "Er zijn geen zichtbare games. Druk op Ctrl+H om verborgen games te tonen." -#: lutris/gui/lutriswindow.py:469 +#: lutris/gui/lutriswindow.py:563 msgid "No games found" msgstr "Geen games aangetroffen" -#: lutris/gui/lutriswindow.py:477 +#: lutris/gui/lutriswindow.py:571 #, python-format msgid "Search %s games" msgstr "%s games doorzoeken" -#: lutris/gui/lutriswindow.py:479 +#: lutris/gui/lutriswindow.py:573 msgid "Search 1 game" msgstr "1 game doorzoeken" -#: lutris/gui/views/list.py:51 lutris/runners/dolphin.py:26 -#: lutris/runners/scummvm.py:185 +#: lutris/gui/views/list.py:54 lutris/runners/dolphin.py:28 +#: lutris/runners/scummvm.py:258 msgid "Platform" msgstr "Platform" -#: lutris/gui/widgets/common.py:83 +#: lutris/gui/widgets/common.py:82 msgid "Browse..." msgstr "Bladeren…" -#: lutris/gui/widgets/common.py:165 +#: lutris/gui/widgets/common.py:164 msgid "" "Warning! The selected path is located on a drive formatted by " "Windows.\n" @@ -1737,7 +1770,7 @@ msgstr "" "geformatteerde schijf.\n" "Games en programma's op Windows-schijven werken doorgaans niet." -#: lutris/gui/widgets/common.py:173 +#: lutris/gui/widgets/common.py:172 msgid "" "Warning! The selected path contains files. Installation might not " "work properly." @@ -1745,18 +1778,18 @@ msgstr "" "Waarschuwing: de gekozen locatie bevat bestanden - de installatie " "werkt mogelijk niet naar behoren." -#: lutris/gui/widgets/common.py:181 +#: lutris/gui/widgets/common.py:180 msgid "" "Warning The destination folder is not writable by the current user." msgstr "" "Waarschuwing: de doelmap is niet beschrijfbaar door de huidige " "gebruiker." -#: lutris/gui/widgets/common.py:302 +#: lutris/gui/widgets/common.py:301 msgid "Add" msgstr "Toevoegen" -#: lutris/gui/widgets/common.py:306 +#: lutris/gui/widgets/common.py:305 msgid "Delete" msgstr "Verwijderen" @@ -1773,7 +1806,7 @@ msgstr "Downloaden onderbroken" msgid "{downloaded:0.2f} / {size:0.2f}MB ({speed:0.2f}MB/s), {time} remaining" msgstr "{downloaded:0.2f} / {size:0.2f}MB ({speed:0.2f}MB/s), {time} resterend" -#: lutris/gui/widgets/game_bar.py:151 +#: lutris/gui/widgets/game_bar.py:170 #, python-format msgid "" "Platform:\n" @@ -1782,7 +1815,7 @@ msgstr "" "Platform:\n" "%s" -#: lutris/gui/widgets/game_bar.py:160 +#: lutris/gui/widgets/game_bar.py:179 #, python-format msgid "" "Time played:\n" @@ -1791,7 +1824,7 @@ msgstr "" "Speeltijd:\n" "%s" -#: lutris/gui/widgets/game_bar.py:169 +#: lutris/gui/widgets/game_bar.py:188 #, python-format msgid "" "Last played:\n" @@ -1800,56 +1833,60 @@ msgstr "" "Laatst gespeeld:\n" "%s" -#: lutris/gui/widgets/game_bar.py:205 +#: lutris/gui/widgets/game_bar.py:193 +msgid "Locate installed game" +msgstr "Geïnstalleerde game zoeken" + +#: lutris/gui/widgets/game_bar.py:209 msgid "Launching" msgstr "Bezig met starten" -#: lutris/gui/widgets/sidebar.py:133 lutris/gui/widgets/sidebar.py:169 -#: lutris/gui/widgets/sidebar.py:213 +#: lutris/gui/widgets/sidebar.py:144 lutris/gui/widgets/sidebar.py:180 +#: lutris/gui/widgets/sidebar.py:224 msgid "Run" msgstr "Starten" -#: lutris/gui/widgets/sidebar.py:136 lutris/gui/widgets/sidebar.py:170 +#: lutris/gui/widgets/sidebar.py:147 lutris/gui/widgets/sidebar.py:181 msgid "Reload" msgstr "Herladen" -#: lutris/gui/widgets/sidebar.py:171 +#: lutris/gui/widgets/sidebar.py:182 msgid "Disconnect" msgstr "Ontkoppelen" -#: lutris/gui/widgets/sidebar.py:172 +#: lutris/gui/widgets/sidebar.py:183 msgid "Connect" msgstr "Koppelen" -#: lutris/gui/widgets/sidebar.py:208 +#: lutris/gui/widgets/sidebar.py:219 msgid "Manage Versions" msgstr "Versies beheren" -#: lutris/gui/widgets/sidebar.py:290 +#: lutris/gui/widgets/sidebar.py:303 msgid "Library" msgstr "Verzameling" -#: lutris/gui/widgets/sidebar.py:293 +#: lutris/gui/widgets/sidebar.py:306 msgid "Platforms" msgstr "Platformen" -#: lutris/gui/widgets/sidebar.py:338 lutris/util/system.py:28 +#: lutris/gui/widgets/sidebar.py:350 lutris/util/system.py:28 msgid "Games" msgstr "Games" -#: lutris/gui/widgets/sidebar.py:347 +#: lutris/gui/widgets/sidebar.py:359 msgid "Recent" msgstr "Recent" -#: lutris/gui/widgets/sidebar.py:356 +#: lutris/gui/widgets/sidebar.py:368 msgid "Favorites" msgstr "Favorieten" -#: lutris/gui/widgets/sidebar.py:363 +#: lutris/gui/widgets/sidebar.py:375 msgid "Missing" msgstr "Ontbrekend" -#: lutris/gui/widgets/sidebar.py:371 +#: lutris/gui/widgets/sidebar.py:383 msgid "Running" msgstr "Actief" @@ -1996,19 +2033,6 @@ msgstr "Onjuiste waarde van write_file-modus: ‘%s’" msgid "install_or_extract only works with wine!" msgstr "install_or_extract werkt alléén i.c.m. Wine!" -#: lutris/installer/installer.py:161 -#, python-format -msgid "YOu are not authenticated to %s" -msgstr "Je bent niet geauthenticeerd door %s" - -#: lutris/installer/installer.py:200 -msgid "Game config key must be a string" -msgstr "De gameconfiguratiesleutel dient een tekenreeks te zijn" - -#: lutris/installer/installer.py:250 -msgid "Invalid 'game' section" -msgstr "Ongeldige ‘game’sectie" - #: lutris/installer/installer_file.py:34 #, python-format msgid "missing field `url` for file `%s`" @@ -2032,6 +2056,19 @@ msgstr "Ongeldige controlesom. Verwacht: (type:hash) " msgid " checksum mismatch " msgstr " De controlesom komt niet overeen" +#: lutris/installer/installer.py:162 +#, python-format +msgid "You are not authenticated to %s" +msgstr "Je bent niet geauthenticeerd door %s" + +#: lutris/installer/installer.py:201 +msgid "Game config key must be a string" +msgstr "De gameconfiguratiesleutel dient een tekenreeks te zijn" + +#: lutris/installer/installer.py:251 +msgid "Invalid 'game' section" +msgstr "Ongeldige ‘game’sectie" + #: lutris/installer/interpreter.py:86 msgid "This installer doesn't have a 'script' section" msgstr "De installatiewizard bevat geen ‘script’sectie" @@ -2057,21 +2094,21 @@ msgstr "Installeer eerst ‘{}’" msgid "Lutris does not have the necessary permissions to install to path:" msgstr "Lutris is niet bevoegd om de game te installeren in" -#: lutris/installer/interpreter.py:307 +#: lutris/installer/interpreter.py:310 #, python-format msgid "Invalid runner provided %s" msgstr "Ongeldige runner opgegeven bij %s" -#: lutris/installer/interpreter.py:345 +#: lutris/installer/interpreter.py:348 msgid "Installer commands are not formatted correctly" msgstr "De installatie-opdrachten zijn onjuist opgemaakt" -#: lutris/installer/interpreter.py:393 +#: lutris/installer/interpreter.py:396 #, python-format msgid "The command \"%s\" does not exist." msgstr "De opdracht ‘%s’ bestaat niet." -#: lutris/installer/interpreter.py:413 +#: lutris/installer/interpreter.py:416 #, python-format msgid "" "The executable at path %s can't be found, please check the destination " @@ -2082,7 +2119,7 @@ msgstr "" "bestemming.\n" "Sommige onderdelen van het installatieproces zijn niet correct afgerond." -#: lutris/installer/interpreter.py:418 +#: lutris/installer/interpreter.py:421 msgid "Installation completed!" msgstr "Installatie voltooid!" @@ -2156,7 +2193,9 @@ msgstr "Machine" #: lutris/runners/dosbox.py:83 lutris/runners/dosbox.py:91 #: lutris/runners/easyrpg.py:185 lutris/runners/easyrpg.py:193 #: lutris/runners/easyrpg.py:203 lutris/runners/easyrpg.py:214 -#: lutris/runners/easyrpg.py:225 lutris/runners/hatari.py:62 +#: lutris/runners/easyrpg.py:225 lutris/runners/fsuae.py:282 +#: lutris/runners/fsuae.py:289 lutris/runners/fsuae.py:298 +#: lutris/runners/fsuae.py:311 lutris/runners/hatari.py:62 #: lutris/runners/hatari.py:69 lutris/runners/hatari.py:77 #: lutris/runners/hatari.py:92 lutris/runners/jzintv.py:43 #: lutris/runners/jzintv.py:49 lutris/runners/mame.py:159 @@ -2165,11 +2204,20 @@ msgstr "Machine" #: lutris/runners/mednafen.py:81 lutris/runners/mednafen.py:95 #: lutris/runners/o2em.py:77 lutris/runners/o2em.py:84 #: lutris/runners/pico8.py:38 lutris/runners/pico8.py:45 -#: lutris/runners/scummvm.py:76 lutris/runners/scummvm.py:83 -#: lutris/runners/scummvm.py:91 lutris/runners/scummvm.py:104 -#: lutris/runners/scummvm.py:145 lutris/runners/scummvm.py:167 -#: lutris/runners/vice.py:57 lutris/runners/vice.py:64 -#: lutris/runners/vice.py:71 lutris/runners/vice.py:78 +#: lutris/runners/redream.py:27 lutris/runners/redream.py:33 +#: lutris/runners/scummvm.py:113 lutris/runners/scummvm.py:120 +#: lutris/runners/scummvm.py:128 lutris/runners/scummvm.py:141 +#: lutris/runners/scummvm.py:164 lutris/runners/scummvm.py:183 +#: lutris/runners/scummvm.py:198 lutris/runners/scummvm.py:222 +#: lutris/runners/scummvm.py:240 lutris/runners/snes9x.py:36 +#: lutris/runners/snes9x.py:43 lutris/runners/vice.py:57 +#: lutris/runners/vice.py:64 lutris/runners/vice.py:71 +#: lutris/runners/vice.py:78 lutris/runners/wine.py:199 +#: lutris/runners/wine.py:213 lutris/runners/wine.py:223 +#: lutris/runners/wine.py:236 lutris/runners/wine.py:245 +#: lutris/runners/wine.py:257 lutris/runners/wine.py:266 +#: lutris/runners/wine.py:277 lutris/runners/wine.py:286 +#: lutris/runners/wine.py:299 msgid "Graphics" msgstr "Grafisch" @@ -2179,8 +2227,8 @@ msgstr "Grafisch" #: lutris/runners/mednafen.py:75 lutris/runners/mupen64plus.py:28 #: lutris/runners/o2em.py:78 lutris/runners/osmose.py:34 #: lutris/runners/pcsx2.py:26 lutris/runners/pico8.py:39 -#: lutris/runners/redream.py:24 lutris/runners/reicast.py:41 -#: lutris/runners/scummvm.py:77 lutris/runners/snes9x.py:36 +#: lutris/runners/redream.py:28 lutris/runners/reicast.py:41 +#: lutris/runners/scummvm.py:114 lutris/runners/snes9x.py:37 #: lutris/runners/vice.py:58 lutris/runners/xemu.py:24 #: lutris/runners/yuzu.py:40 lutris/sysoptions.py:327 msgid "Fullscreen" @@ -2198,45 +2246,45 @@ msgstr "Het Atari800-biosarchief kan niet worden gedownload" msgid "Wine is not installed" msgstr "Wine is niet geïnstalleerd." -#: lutris/runners/dolphin.py:10 -msgid "GameCube and Wii emulator" -msgstr "GameCube- en Wii-emulator" - -#: lutris/runners/dolphin.py:11 lutris/services/dolphin.py:28 -msgid "Dolphin" -msgstr "Dolphin" - -#: lutris/runners/dolphin.py:12 lutris/runners/dolphin.py:27 +#: lutris/runners/dolphin.py:8 lutris/runners/dolphin.py:29 msgid "Nintendo GameCube" msgstr "Nintendo GameCube" -#: lutris/runners/dolphin.py:12 lutris/runners/dolphin.py:27 +#: lutris/runners/dolphin.py:8 lutris/runners/dolphin.py:29 msgid "Nintendo Wii" msgstr "Nintendo Wii" -#: lutris/runners/dolphin.py:21 lutris/runners/pcsx2.py:18 +#: lutris/runners/dolphin.py:12 +msgid "GameCube and Wii emulator" +msgstr "GameCube- en Wii-emulator" + +#: lutris/runners/dolphin.py:13 lutris/services/dolphin.py:29 +msgid "Dolphin" +msgstr "Dolphin" + +#: lutris/runners/dolphin.py:23 lutris/runners/pcsx2.py:18 #: lutris/runners/xemu.py:17 msgid "ISO file" msgstr "ISO-bestand" -#: lutris/runners/dolphin.py:34 lutris/runners/pcsx2.py:38 +#: lutris/runners/dolphin.py:36 lutris/runners/pcsx2.py:38 #: lutris/runners/rpcs3.py:23 msgid "No GUI" msgstr "Geen gebruikersomgeving" -#: lutris/runners/dolphin.py:36 +#: lutris/runners/dolphin.py:38 msgid "Disable the graphical user interface." msgstr "Schakelt de gebruikersomgeving uit." -#: lutris/runners/dolphin.py:41 +#: lutris/runners/dolphin.py:43 msgid "Batch" msgstr "Reeks" -#: lutris/runners/dolphin.py:44 +#: lutris/runners/dolphin.py:46 msgid "Exit Dolphin with emulator." msgstr "Dolphin met emulator afsluiten." -#: lutris/runners/dolphin.py:50 +#: lutris/runners/dolphin.py:52 msgid "Custom Global User Directory" msgstr "Aangepaste gebruikersmap" @@ -2314,11 +2362,11 @@ msgstr "Game schermvullend starten" msgid "Tells DOSBox to launch the game in fullscreen." msgstr "Geef door aan DOSBox dat de game schermvullend moet worden gestart." -#: lutris/runners/dosbox.py:92 lutris/runners/scummvm.py:105 +#: lutris/runners/dosbox.py:92 lutris/runners/scummvm.py:142 msgid "Graphic scaler" msgstr "Grafische schaling" -#: lutris/runners/dosbox.py:97 lutris/runners/scummvm.py:123 +#: lutris/runners/dosbox.py:97 lutris/runners/scummvm.py:159 msgid "" "The algorithm used to scale up the game's base resolution, resulting in " "different visual styles. " @@ -2344,7 +2392,7 @@ msgstr "Speel games die gemaakt zijn met RPG Maker 2000/2003" #: lutris/runners/easyrpg.py:12 lutris/runners/flatpak.py:18 #: lutris/runners/linux.py:15 lutris/runners/linux.py:17 -#: lutris/runners/scummvm.py:14 lutris/runners/steam.py:31 +#: lutris/runners/scummvm.py:49 lutris/runners/steam.py:31 #: lutris/runners/zdoom.py:15 msgid "Linux" msgstr "Linux" @@ -2379,8 +2427,9 @@ msgid "Disable auto detection of the simulated engine." msgstr "Schakel automatische detectie van de gesimuleerde aandrijving uit." #: lutris/runners/easyrpg.py:41 lutris/runners/fsuae.py:156 -#: lutris/runners/mame.py:178 lutris/runners/wine.py:84 -#: lutris/runners/wine.py:432 +#: lutris/runners/mame.py:178 lutris/runners/scummvm.py:187 +#: lutris/runners/scummvm.py:202 lutris/runners/scummvm.py:226 +#: lutris/runners/wine.py:84 lutris/runners/wine.py:432 msgid "Auto" msgstr "Automatisch" @@ -2587,7 +2636,7 @@ msgstr "" "Schakel uit om verticale synchronisatie uit te schakelen het fps-limiet aan " "te houden. VSync wordt mogelijk niet op alle platformen ondersteund." -#: lutris/runners/easyrpg.py:215 lutris/sysoptions.py:441 +#: lutris/runners/easyrpg.py:215 lutris/sysoptions.py:453 msgid "FPS limit" msgstr "FPS-limiet" @@ -2747,7 +2796,7 @@ msgstr "" "De map waarin de opdracht dient te worden uitgevoerd. Let op: dit dient een " "map binnen de sandbox te zijn." -#: lutris/runners/flatpak.py:81 lutris/sysoptions.py:611 +#: lutris/runners/flatpak.py:81 lutris/sysoptions.py:623 msgid "Environment variables" msgstr "Omgevingsvariabelen" @@ -2952,35 +3001,44 @@ msgstr "" "Bestanden die eindigen op '.hdf' worden aangekoppeld als harde schijven. ISO-" "bestanden kunnen worden gebruikt voor Amiga CD32 en CDTV." -#: lutris/runners/fsuae.py:236 +#: lutris/runners/fsuae.py:236 lutris/runners/fsuae.py:243 +#: lutris/runners/fsuae.py:355 lutris/runners/fsuae.py:366 +msgid "Media" +msgstr "Media" + +#: lutris/runners/fsuae.py:238 msgid "Additionnal floppies" msgstr "Aanvullende diskettes" -#: lutris/runners/fsuae.py:238 +#: lutris/runners/fsuae.py:240 msgid "The additional floppy disk image(s)." msgstr "De aanvullende diskette(s)." -#: lutris/runners/fsuae.py:241 +#: lutris/runners/fsuae.py:244 msgid "CD-ROM image" msgstr "CD-ROM-schijfkopie" -#: lutris/runners/fsuae.py:243 +#: lutris/runners/fsuae.py:246 msgid "CD-ROM image to use on non CD32/CDTV models" msgstr "De te gebruiken cd-rom-schijfkopie voor niet-CD32/CDTV-modellen" -#: lutris/runners/fsuae.py:250 +#: lutris/runners/fsuae.py:253 msgid "Amiga model" msgstr "Amiga-model" -#: lutris/runners/fsuae.py:254 +#: lutris/runners/fsuae.py:257 msgid "Specify the Amiga model you want to emulate." msgstr "Kies het te emuleren Amiga-model." -#: lutris/runners/fsuae.py:258 +#: lutris/runners/fsuae.py:261 lutris/runners/fsuae.py:274 +msgid "Kickstart" +msgstr "Kickstart" + +#: lutris/runners/fsuae.py:262 msgid "Kickstart ROMs location" msgstr "Kickstart-romlocatie" -#: lutris/runners/fsuae.py:261 +#: lutris/runners/fsuae.py:265 msgid "" "Choose the folder containing original Amiga Kickstart ROMs. Refer to FS-UAE " "documentation to find how to acquire them. Without these, FS-UAE uses a " @@ -2990,23 +3048,23 @@ msgstr "" "UAE-documentatie om ze te vinden. Zonder deze roms gebruikt FS-UAE een " "meegeleverde vervangende rom, welke minder compatibel is met Amiga-software." -#: lutris/runners/fsuae.py:270 +#: lutris/runners/fsuae.py:275 msgid "Extended Kickstart location" msgstr "Uitgebreide Kickstart-locatie" -#: lutris/runners/fsuae.py:273 +#: lutris/runners/fsuae.py:278 msgid "Location of extended Kickstart used for CD32" msgstr "Locatie van de uitgebreide Kickstart, zoals gebruikt door CD32" -#: lutris/runners/fsuae.py:277 +#: lutris/runners/fsuae.py:283 msgid "Fullscreen (F12 + S to switch)" msgstr "Schermvullend (druk op F12 + S om te schakelen)" -#: lutris/runners/fsuae.py:283 lutris/runners/o2em.py:85 +#: lutris/runners/fsuae.py:290 lutris/runners/o2em.py:85 msgid "Scanlines display style" msgstr "Weergavestijl van scanlijnen" -#: lutris/runners/fsuae.py:286 lutris/runners/o2em.py:87 +#: lutris/runners/fsuae.py:293 lutris/runners/o2em.py:87 msgid "" "Activates a display filter adding scanlines to imitate the displays of " "yesteryear." @@ -3014,11 +3072,36 @@ msgstr "" "Schakelt een filter in dat scanlijnen toont om prehistorische schermen na te " "bootsen." -#: lutris/runners/fsuae.py:291 +#: lutris/runners/fsuae.py:299 +msgid "Graphics Card" +msgstr "Grafische kaart" + +#: lutris/runners/fsuae.py:305 +msgid "" +"Use this option to enable a graphics card. This option is none by default, " +"in which case only chipset graphics (OCS/ECS/AGA) support is available." +msgstr "" +"Geef aan of je een grafische kaart wilt gebruiken. Deze optie staat " +"standaard op ‘geen’, waardoor alleen grafische chipseteigenschappen (OCS/ECS/" +"AGA) beschikbaar zijn." + +#: lutris/runners/fsuae.py:312 +msgid "Graphics Card RAM" +msgstr "RAM-geheugen van grafische kaart" + +#: lutris/runners/fsuae.py:318 +msgid "" +"Override the amount of graphics memory on the graphics card. The 0 MB option " +"is not really valid, but exists for user interface reasons." +msgstr "" +"Dwing het geheugen van de grafische kaart af. De optie ‘0 MB’ is ongeldig, " +"maar bestaat omwille van gebruikersomgevingsredenen." + +#: lutris/runners/fsuae.py:324 msgid "CPU" msgstr "CPU" -#: lutris/runners/fsuae.py:296 +#: lutris/runners/fsuae.py:329 msgid "" "Use this option to override the CPU model in the emulated Amiga. All Amiga " "models imply a default CPU model, so you only need to use this option if you " @@ -3028,19 +3111,19 @@ msgstr "" "Amiga. Alle Amiga-modellen gebruiken een standaard cpu-model, dus gebruik " "deze optie niet te allen tijde." -#: lutris/runners/fsuae.py:302 +#: lutris/runners/fsuae.py:335 msgid "Fast Memory" msgstr "Snel geheugen" -#: lutris/runners/fsuae.py:307 +#: lutris/runners/fsuae.py:340 msgid "Specify how much Fast Memory the Amiga model should have." msgstr "Geef aan hoeveel snel geheugen het Amiga-model moet hebben." -#: lutris/runners/fsuae.py:311 +#: lutris/runners/fsuae.py:344 msgid "Zorro III RAM" msgstr "Zorro III-werkgeheugen" -#: lutris/runners/fsuae.py:316 +#: lutris/runners/fsuae.py:349 msgid "" "Override the amount of Zorro III Fast memory, specified in KB. Must be a " "multiple of 1024. The default value depends on [amiga_model]. Requires a " @@ -3051,11 +3134,11 @@ msgstr "" "van [amiga_model]. Een processor met een 32-bit adresseerbare bus is vereist " "(bijv. het A1200/020-model)." -#: lutris/runners/fsuae.py:322 +#: lutris/runners/fsuae.py:356 msgid "Floppy Drive Volume" msgstr "Diskettestation" -#: lutris/runners/fsuae.py:327 +#: lutris/runners/fsuae.py:361 msgid "" "Set volume to 0 to disable floppy drive clicks when the drive is empty. Max " "volume is 100." @@ -3063,11 +3146,11 @@ msgstr "" "Stel in op 0 om diskettekliks uit te schakelen als de schijflade leeg is. " "Max. 100 toegestaan." -#: lutris/runners/fsuae.py:332 +#: lutris/runners/fsuae.py:367 msgid "Floppy Drive Speed" msgstr "Diskettesnelheid" -#: lutris/runners/fsuae.py:338 +#: lutris/runners/fsuae.py:373 msgid "" "Set the speed of the emulated floppy drives, in percent. For example, you " "can specify 800 to get an 8x increase in speed. Use 0 to specify turbo mode. " @@ -3079,40 +3162,15 @@ msgstr "" "specificeren. Turbomodus leidt tot het onmiddellijk afronden van " "diskettehandelingen. Dit is op de meeste modellen 100." -#: lutris/runners/fsuae.py:346 -msgid "Graphics Card" -msgstr "Grafische kaart" - -#: lutris/runners/fsuae.py:352 -msgid "" -"Use this option to enable a graphics card. This option is none by default, " -"in which case only chipset graphics (OCS/ECS/AGA) support is available." -msgstr "" -"Geef aan of je een grafische kaart wilt gebruiken. Deze optie staat " -"standaard op ‘geen’, waardoor alleen grafische chipseteigenschappen (OCS/ECS/" -"AGA) beschikbaar zijn." - -#: lutris/runners/fsuae.py:358 -msgid "Graphics Card RAM" -msgstr "RAM-geheugen van grafische kaart" - -#: lutris/runners/fsuae.py:364 -msgid "" -"Override the amount of graphics memory on the graphics card. The 0 MB option " -"is not really valid, but exists for user interface reasons." -msgstr "" -"Dwing het geheugen van de grafische kaart af. De optie ‘0 MB’ is ongeldig, " -"maar bestaat omwille van gebruikersomgevingsredenen." - -#: lutris/runners/fsuae.py:370 +#: lutris/runners/fsuae.py:381 msgid "JIT Compiler" msgstr "JIT-compilatie" -#: lutris/runners/fsuae.py:377 +#: lutris/runners/fsuae.py:388 msgid "Feral GameMode" msgstr "Feral GameMode" -#: lutris/runners/fsuae.py:381 +#: lutris/runners/fsuae.py:392 msgid "" "Automatically uses Feral GameMode daemon if available. Set to true to " "disable the feature." @@ -3120,11 +3178,11 @@ msgstr "" "Gebruikt automatisch Feral GameMode als deze beschikbaar is. Kies ‘true’ om " "uit te schakelen." -#: lutris/runners/fsuae.py:386 +#: lutris/runners/fsuae.py:397 msgid "CPU governor warning" msgstr "CPU-governorwaarschuwing" -#: lutris/runners/fsuae.py:391 +#: lutris/runners/fsuae.py:402 msgid "" "Warn if running with a CPU governor other than performance. Set to true to " "disable the warning." @@ -3132,7 +3190,7 @@ msgstr "" "Toon een waarschuwing als de cpu-governor is ingesteld op een andere waarde " "dan ‘performance’. Kies ‘true’ om uit te schakelen." -#: lutris/runners/fsuae.py:396 +#: lutris/runners/fsuae.py:407 msgid "UAE bsdsocket.library" msgstr "UAE bsdsocket.library" @@ -3144,7 +3202,7 @@ msgstr "Hatari" msgid "Atari ST computers emulator" msgstr "Atari ST-emulator" -#: lutris/runners/hatari.py:15 +#: lutris/runners/hatari.py:15 lutris/runners/scummvm.py:213 msgid "Atari ST" msgstr "Atari ST" @@ -3167,7 +3225,7 @@ msgstr "" msgid "Floppy Disk B" msgstr "Diskette B" -#: lutris/runners/hatari.py:45 lutris/runners/redream.py:73 +#: lutris/runners/hatari.py:45 lutris/runners/redream.py:79 #: lutris/runners/zdoom.py:75 msgid "None" msgstr "Geen" @@ -3177,7 +3235,7 @@ msgid "Keyboard" msgstr "Toetsenbord" #: lutris/runners/hatari.py:45 lutris/runners/o2em.py:39 -#: lutris/runners/scummvm.py:193 +#: lutris/runners/scummvm.py:266 msgid "Joystick" msgstr "Joystick" @@ -3236,7 +3294,6 @@ msgid "Joysticks" msgstr "Joysticks" #: lutris/runners/hatari.py:105 -#| msgid "Joystick 1" msgid "Joystick 0" msgstr "Joystick 0" @@ -3339,14 +3396,14 @@ msgid "The game's main executable file" msgstr "Het globale uitvoerbare bestand" #: lutris/runners/linux.py:31 lutris/runners/mame.py:124 -#: lutris/runners/scummvm.py:31 lutris/runners/steam.py:49 +#: lutris/runners/scummvm.py:66 lutris/runners/steam.py:49 #: lutris/runners/steam.py:101 lutris/runners/wine.py:56 #: lutris/runners/zdoom.py:27 msgid "Arguments" msgstr "Opdrachtregelopties" #: lutris/runners/linux.py:32 lutris/runners/mame.py:125 -#: lutris/runners/scummvm.py:32 +#: lutris/runners/scummvm.py:67 msgid "Command line arguments used when launching the game" msgstr "De tezamen met de game uit te voeren opdrachtregelopties" @@ -3545,7 +3602,8 @@ msgstr "Past een CRT-effert toe op het scherm. Vereist: OpenGL-renderer." msgid "Video backend" msgstr "Videoback-end" -#: lutris/runners/mame.py:182 lutris/runners/vice.py:80 +#: lutris/runners/mame.py:182 lutris/runners/scummvm.py:188 +#: lutris/runners/vice.py:80 msgid "Software" msgstr "Software" @@ -3903,15 +3961,15 @@ msgstr "" "De gamedata, ook wel bekend als rom.\n" "Ondersteunde rom-formaten: sms en gg, evenals met zip ingepakte roms." -#: lutris/runners/pcsx2.py:8 +#: lutris/runners/pcsx2.py:10 msgid "PCSX2" msgstr "PCSX2" -#: lutris/runners/pcsx2.py:9 +#: lutris/runners/pcsx2.py:11 msgid "PlayStation 2 emulator" msgstr "PlayStation 2-emulator" -#: lutris/runners/pcsx2.py:10 +#: lutris/runners/pcsx2.py:12 msgid "Sony PlayStation 2" msgstr "Sony PlayStation 2" @@ -4005,113 +4063,113 @@ msgstr "" "De gamedata.\n" "Ondersteunde formaten: GDI, CDI, CHD" -#: lutris/runners/redream.py:28 +#: lutris/runners/redream.py:34 msgid "Aspect Ratio" msgstr "Beeldverhouding" -#: lutris/runners/redream.py:29 +#: lutris/runners/redream.py:35 msgid "4:3" msgstr "4:3" -#: lutris/runners/redream.py:29 +#: lutris/runners/redream.py:35 lutris/runners/scummvm.py:230 msgid "Stretch" msgstr "Uitgerekt" -#: lutris/runners/redream.py:35 +#: lutris/runners/redream.py:41 msgid "Region" msgstr "Regio" -#: lutris/runners/redream.py:36 +#: lutris/runners/redream.py:42 msgid "USA" msgstr "VS" -#: lutris/runners/redream.py:36 +#: lutris/runners/redream.py:42 msgid "Europe" msgstr "Europa" -#: lutris/runners/redream.py:36 +#: lutris/runners/redream.py:42 msgid "Japan" msgstr "Japan" -#: lutris/runners/redream.py:42 +#: lutris/runners/redream.py:48 msgid "System Language" msgstr "Systeemtaal" -#: lutris/runners/redream.py:44 +#: lutris/runners/redream.py:50 msgid "English" msgstr "Engels" -#: lutris/runners/redream.py:45 +#: lutris/runners/redream.py:51 msgid "German" msgstr "Duits" -#: lutris/runners/redream.py:46 +#: lutris/runners/redream.py:52 msgid "French" msgstr "Frans" -#: lutris/runners/redream.py:47 +#: lutris/runners/redream.py:53 msgid "Spanish" msgstr "Spaans" -#: lutris/runners/redream.py:48 +#: lutris/runners/redream.py:54 msgid "Italian" msgstr "Italiaans" -#: lutris/runners/redream.py:49 +#: lutris/runners/redream.py:55 msgid "Japanese" msgstr "Japans" -#: lutris/runners/redream.py:58 +#: lutris/runners/redream.py:64 msgid "NTSC" msgstr "NTSC" -#: lutris/runners/redream.py:59 +#: lutris/runners/redream.py:65 msgid "PAL" msgstr "PAL" -#: lutris/runners/redream.py:60 +#: lutris/runners/redream.py:66 msgid "PAL-M (Brazil)" msgstr "PAL-M (Brazilië)" -#: lutris/runners/redream.py:61 +#: lutris/runners/redream.py:67 msgid "PAL-N (Argentina, Paraguay, Uruguay)" msgstr "PAL-N (Argentinië, Paraguay, Uruguay)" -#: lutris/runners/redream.py:68 +#: lutris/runners/redream.py:74 msgid "Time Sync" msgstr "Tijdsynchronisatie" -#: lutris/runners/redream.py:70 +#: lutris/runners/redream.py:76 msgid "Audio and video" msgstr "Audio en video" -#: lutris/runners/redream.py:71 lutris/runners/scummvm.py:222 -#: lutris/runners/scummvm.py:230 lutris/runners/scummvm.py:237 -#: lutris/runners/scummvm.py:259 lutris/runners/scummvm.py:272 -#: lutris/runners/scummvm.py:292 lutris/runners/scummvm.py:300 -#: lutris/runners/scummvm.py:308 lutris/runners/scummvm.py:316 -#: lutris/runners/scummvm.py:323 lutris/runners/scummvm.py:331 -#: lutris/runners/scummvm.py:340 lutris/runners/scummvm.py:350 +#: lutris/runners/redream.py:77 lutris/runners/scummvm.py:295 +#: lutris/runners/scummvm.py:303 lutris/runners/scummvm.py:310 +#: lutris/runners/scummvm.py:332 lutris/runners/scummvm.py:345 +#: lutris/runners/scummvm.py:365 lutris/runners/scummvm.py:373 +#: lutris/runners/scummvm.py:381 lutris/runners/scummvm.py:389 +#: lutris/runners/scummvm.py:396 lutris/runners/scummvm.py:404 +#: lutris/runners/scummvm.py:413 lutris/runners/scummvm.py:423 msgid "Audio" msgstr "Audio" -#: lutris/runners/redream.py:72 +#: lutris/runners/redream.py:78 msgid "Video" msgstr "Video" -#: lutris/runners/redream.py:81 +#: lutris/runners/redream.py:87 msgid "Internal Video Resolution Scale" msgstr "Interne videoresolutie" -#: lutris/runners/redream.py:94 +#: lutris/runners/redream.py:100 msgid "Only available in premium version." msgstr "Alleen beschikbaar in de premium-versie." -#: lutris/runners/redream.py:101 +#: lutris/runners/redream.py:107 msgid "Do you want to select a premium license file?" msgstr "Wil je een premium-licentiebestand kiezen?" -#: lutris/runners/redream.py:102 lutris/runners/redream.py:103 +#: lutris/runners/redream.py:108 lutris/runners/redream.py:109 msgid "Use premium version?" msgstr "Wil je de premium-versie gebruiken?" @@ -4129,7 +4187,6 @@ msgstr "" #: lutris/runners/reicast.py:47 lutris/runners/reicast.py:55 #: lutris/runners/reicast.py:63 lutris/runners/reicast.py:71 -#| msgid "Gamepad 1" msgid "Gamepads" msgstr "Gamepads" @@ -4180,7 +4237,7 @@ msgid "The runner could not find a command to apply the configuration to." msgstr "" "De runner kan geen opdracht vinden om de instellingen op toe te passen." -#: lutris/runners/runner.py:452 +#: lutris/runners/runner.py:451 msgid "" "The required runner is not installed.\n" "Do you wish to install it now?" @@ -4188,19 +4245,19 @@ msgstr "" "De vereiste runner is niet geïnstalleerd.\n" "Wil je deze nu installeren?" -#: lutris/runners/runner.py:454 +#: lutris/runners/runner.py:453 msgid "Required runner unavailable" msgstr "Vereiste runner is niet beschikbaar" -#: lutris/runners/runner.py:536 +#: lutris/runners/runner.py:537 msgid "Failed to retrieve {} ({}) information" msgstr "De informatie over {} ({}) kan niet worden opgehaald" -#: lutris/runners/runner.py:563 +#: lutris/runners/runner.py:564 msgid "Failed to extract {}" msgstr "{} kan niet worden uitgepakt" -#: lutris/runners/runner.py:568 +#: lutris/runners/runner.py:569 msgid "Failed to extract {}: {}" msgstr "{} kan niet worden uitgepakt: {}" @@ -4236,31 +4293,42 @@ msgstr "Titelsleutels" msgid "File containing the title keys." msgstr "Het bestand dat de titelsleutels bevat." -#: lutris/runners/scummvm.py:12 +#: lutris/runners/scummvm.py:28 +msgid "Warning Scalers may not work with OpenGL rendering." +msgstr "" +"Waarschuwing: schaling werkt mogelijk niet met OpenGL-rendering." + +#: lutris/runners/scummvm.py:40 +#, python-format +msgid "Warning The '%s' scaler does not work with a scale factor of %s." +msgstr "" +"Waarschuwing: de schaling ‘%s’ werkt niet in combinatie met factor %s." + +#: lutris/runners/scummvm.py:47 msgid "Engine for point-and-click games." msgstr "Hiermee kun je verschillende soorten point-and-clickgames spelen." -#: lutris/runners/scummvm.py:13 lutris/services/scummvm.py:10 +#: lutris/runners/scummvm.py:48 lutris/services/scummvm.py:10 msgid "ScummVM" msgstr "ScummVM" -#: lutris/runners/scummvm.py:21 +#: lutris/runners/scummvm.py:56 msgid "Game identifier" msgstr "Game-identificatie" -#: lutris/runners/scummvm.py:26 +#: lutris/runners/scummvm.py:61 msgid "Game files location" msgstr "Locatie van gamebestanden" -#: lutris/runners/scummvm.py:84 +#: lutris/runners/scummvm.py:121 msgid "Enable subtitles" msgstr "Ondertiteling tonen" -#: lutris/runners/scummvm.py:92 +#: lutris/runners/scummvm.py:129 msgid "Aspect ratio correction" msgstr "Beeldverhoudingscorrectie" -#: lutris/runners/scummvm.py:96 +#: lutris/runners/scummvm.py:133 msgid "" "Most games supported by ScummVM were made for VGA display modes using " "rectangular pixels. Activating this option for these games will preserve the " @@ -4270,19 +4338,126 @@ msgstr "" "rechthoekige pixels. Schakel deze optie in om games in de oorspronkelijke " "4:3-beeldverhouding te spelen." -#: lutris/runners/scummvm.py:146 +#: lutris/runners/scummvm.py:165 +msgid "Scale factor" +msgstr "Vergrotingsfactor" + +#: lutris/runners/scummvm.py:176 +msgid "" +"Changes the resolution of the game. For example, a 2x scale will take a " +"320x200 resolution game and scale it up to 640x400. " +msgstr "" +"Wijzig de resolutie van de game. Voorbeeld: 2x maakt van een 320x200-game " +"een 640x400-game. " + +#: lutris/runners/scummvm.py:184 +msgid "Renderer" +msgstr "Renderer" + +#: lutris/runners/scummvm.py:189 +#| msgid "OpenGL shaders" +msgid "OpenGL" +msgstr "OpenGL" + +#: lutris/runners/scummvm.py:190 +msgid "OpenGL (with shaders)" +msgstr "OpenGL (met shaders)" + +#: lutris/runners/scummvm.py:194 +msgid "Changes the rendering method used for 3D games." +msgstr "Wijzig de renderingmethode van 3D-games." + +#: lutris/runners/scummvm.py:199 msgid "Render mode" msgstr "Rendermodus" -#: lutris/runners/scummvm.py:163 -msgid "Changes how the game is rendered." -msgstr "Geef aan hoe de game gerendered moet worden." +#: lutris/runners/scummvm.py:203 +msgid "Hercules (Green)" +msgstr "Hercules (groen)" -#: lutris/runners/scummvm.py:168 +#: lutris/runners/scummvm.py:204 +msgid "Hercules (Amber)" +msgstr "Hercules (amber)" + +#: lutris/runners/scummvm.py:205 +msgid "CGA" +msgstr "CGA" + +#: lutris/runners/scummvm.py:206 +msgid "EGA" +msgstr "EGA" + +#: lutris/runners/scummvm.py:207 +msgid "VGA" +msgstr "VGA" + +#: lutris/runners/scummvm.py:208 +#| msgid "Amiga 500" +msgid "Amiga" +msgstr "Amiga" + +#: lutris/runners/scummvm.py:209 +msgid "FM Towns" +msgstr "FM Towns" + +#: lutris/runners/scummvm.py:210 +msgid "PC-9821" +msgstr "PC-9821" + +#: lutris/runners/scummvm.py:211 +msgid "PC-9801" +msgstr "PC-9801" + +#: lutris/runners/scummvm.py:212 +msgid "Apple IIgs" +msgstr "Apple IIgs" + +#: lutris/runners/scummvm.py:214 +msgid "Macintosh" +msgstr "Macintosh" + +#: lutris/runners/scummvm.py:218 +msgid "" +"Changes the graphics hardware the game will target, if the game supports " +"this." +msgstr "" +"Wijzig de door de game gebruikte grafische hardware (indien ondersteund)." + +#: lutris/runners/scummvm.py:223 +msgid "Stretch mode" +msgstr "Uitrekken" + +#: lutris/runners/scummvm.py:227 +msgid "Center" +msgstr "Centreren" + +#: lutris/runners/scummvm.py:228 +msgid "Pixel Perfect" +msgstr "Tot op de pixel" + +#: lutris/runners/scummvm.py:229 +msgid "Even Pixels" +msgstr "Gelijkmatige pixels" + +#: lutris/runners/scummvm.py:231 +msgid "Fit" +msgstr "Inpassen" + +#: lutris/runners/scummvm.py:232 +msgid "Fit (force aspect ratio)" +msgstr "Inpassen (beeldverhouding afdwingen)" + +#: lutris/runners/scummvm.py:236 +msgid "Changes how the game is placed when the window is resized." +msgstr "" +"Geef aan hoe de game geplaatst moet worden na het wijzigen van de " +"vensterafmetingen." + +#: lutris/runners/scummvm.py:241 msgid "Filtering" msgstr "Filteren" -#: lutris/runners/scummvm.py:170 +#: lutris/runners/scummvm.py:243 msgid "" "Uses bilinear interpolation instead of nearest neighbor resampling for the " "aspect ratio correction and stretch mode." @@ -4290,15 +4465,15 @@ msgstr "" "Gebruik bilineaire interpolatie in plaats van ‘nearest neighbor resampling’ " "voor de beeldverhoudingscorrectie en vergrootmodus." -#: lutris/runners/scummvm.py:177 +#: lutris/runners/scummvm.py:250 msgid "Data directory" msgstr "Datamap" -#: lutris/runners/scummvm.py:179 +#: lutris/runners/scummvm.py:252 msgid "Defaults to share/scummvm if unspecified." msgstr "Standaard is dit share/scummvm." -#: lutris/runners/scummvm.py:186 +#: lutris/runners/scummvm.py:259 msgid "" "Specifes platform of game. Allowed values: 2gs, 3do, acorn, amiga, atari, " "c64, fmtowns, nes, mac, pc pc98, pce, segacd, wii, windows" @@ -4307,24 +4482,24 @@ msgstr "" "acorn, amiga, atari, c64, fmtowns, nes, mac, pc pc98, pce, segacd, wii, " "windows" -#: lutris/runners/scummvm.py:194 +#: lutris/runners/scummvm.py:267 msgid "Enables joystick input (default: 0 = first joystick)" msgstr "Schakel joystickinvoer in (standaard: 0 = eerste joystick)" -#: lutris/runners/scummvm.py:200 +#: lutris/runners/scummvm.py:273 msgid "Language" msgstr "Taal" -#: lutris/runners/scummvm.py:201 +#: lutris/runners/scummvm.py:274 msgid "" "Selects language (en, de, fr, it, pt, es, jp, zh, kr, se, gb, hb, ru, cz)" msgstr "Kies een taal (en, de, fr, it, pt, es, jp, zh, kr, se, gb, hb, ru, cz)" -#: lutris/runners/scummvm.py:207 +#: lutris/runners/scummvm.py:280 msgid "Engine speed" msgstr "Aandrijvingssnelheid" -#: lutris/runners/scummvm.py:208 +#: lutris/runners/scummvm.py:281 msgid "" "Sets frames per second limit (0 - 100) for Grim Fandango or Escape from " "Monkey Island (default: 60)." @@ -4332,53 +4507,53 @@ msgstr "" "Stel het aantal frames per seconde in (0 - 100) van Grim Fandango of Escape " "from Monkey Island (standaard: 60)." -#: lutris/runners/scummvm.py:215 +#: lutris/runners/scummvm.py:288 msgid "Talk speed" msgstr "Voorleessnelheid" -#: lutris/runners/scummvm.py:216 +#: lutris/runners/scummvm.py:289 msgid "Sets talk speed for games (default: 60)" msgstr "Stel de voorleessnelheid van games in (standaard: 60)" -#: lutris/runners/scummvm.py:223 +#: lutris/runners/scummvm.py:296 msgid "Music tempo" msgstr "Muzieksnelheid" -#: lutris/runners/scummvm.py:224 +#: lutris/runners/scummvm.py:297 msgid "Sets music tempo (in percent, 50-200) for SCUMM games (default: 100)" msgstr "" "Stel het tempo in (in procent - 50-200) van SCUMM-games (standaard: 100)" -#: lutris/runners/scummvm.py:231 +#: lutris/runners/scummvm.py:304 msgid "Digital iMuse tempo" msgstr "Digital iMuse-tempo" -#: lutris/runners/scummvm.py:232 +#: lutris/runners/scummvm.py:305 msgid "Sets internal Digital iMuse tempo (10 - 100) per second (default: 10)" msgstr "" "Stel het interne Digital iMuse-tempo (10-100) per seconde in (standaard: 10)" -#: lutris/runners/scummvm.py:238 +#: lutris/runners/scummvm.py:311 msgid "Music driver" msgstr "Muziekstuurprogramma" -#: lutris/runners/scummvm.py:254 +#: lutris/runners/scummvm.py:327 msgid "Specifies the device ScummVM uses to output audio." msgstr "Kies het apparaat dat ScummVM moet gebruiken voor audio-uitvoer." -#: lutris/runners/scummvm.py:260 +#: lutris/runners/scummvm.py:333 msgid "Output rate" msgstr "Uitvoersnelheid" -#: lutris/runners/scummvm.py:267 +#: lutris/runners/scummvm.py:340 msgid "Selects output sample rate in Hz." msgstr "Kies de uitvoer-samplesnelheid (in HZ)." -#: lutris/runners/scummvm.py:273 +#: lutris/runners/scummvm.py:346 msgid "OPL driver" msgstr "OPL-stuurprogramma" -#: lutris/runners/scummvm.py:285 +#: lutris/runners/scummvm.py:358 msgid "" "Chooses which emulator is used by ScummVM when the AdLib emulator is chosen " "as the Preferred device." @@ -4386,60 +4561,60 @@ msgstr "" "Geef aan welke emulator gebruikt dient te worden door ScummVM als de AdLib-" "emulator is ingesteld als voorkeursapparaat." -#: lutris/runners/scummvm.py:293 +#: lutris/runners/scummvm.py:366 msgid "Music volume" msgstr "Muziekvolume" -#: lutris/runners/scummvm.py:294 +#: lutris/runners/scummvm.py:367 msgid "Sets the music volume, 0-255 (default: 192)" msgstr "Stel het volumeniveau in, tussen 0 en 255 (standaard: 192)" -#: lutris/runners/scummvm.py:301 +#: lutris/runners/scummvm.py:374 msgid "SFX volume" msgstr "Geluidseffectenvolume" -#: lutris/runners/scummvm.py:302 +#: lutris/runners/scummvm.py:375 msgid "Sets the sfx volume, 0-255 (default: 192)" msgstr "Stel het volumeniveau in, tussen 0 en 255 (standaard: 192)" -#: lutris/runners/scummvm.py:309 +#: lutris/runners/scummvm.py:382 msgid "Speech volume" msgstr "Voorleesvolume" -#: lutris/runners/scummvm.py:310 +#: lutris/runners/scummvm.py:383 msgid "Sets the speech volume, 0-255 (default: 192)" msgstr "Stel het volumeniveau in, tussen 0 en 255 (standaard: 192)" -#: lutris/runners/scummvm.py:317 +#: lutris/runners/scummvm.py:390 msgid "MIDI gain" msgstr "MIDI-versterking" -#: lutris/runners/scummvm.py:318 +#: lutris/runners/scummvm.py:391 msgid "Sets the gain for MIDI playback. 0-1000 (default: 100)" msgstr "" "Stel de versterking van MIDI-muziek in, tussen 0 en 1000 (standaard: 100)" -#: lutris/runners/scummvm.py:325 +#: lutris/runners/scummvm.py:398 msgid "Soundfont" msgstr "Soundfont" -#: lutris/runners/scummvm.py:326 +#: lutris/runners/scummvm.py:399 msgid "Specifies the path to a soundfont file." msgstr "De locatie van een soundfontbestand." -#: lutris/runners/scummvm.py:332 +#: lutris/runners/scummvm.py:405 msgid "Mixed AdLib/MIDI mode" msgstr "Gedeelde AdLib-/MIDI-modus" -#: lutris/runners/scummvm.py:335 +#: lutris/runners/scummvm.py:408 msgid "Combines MIDI music with AdLib sound effects." msgstr "Combineert MIDI-muziek met AdLib-geluidseffecten." -#: lutris/runners/scummvm.py:341 +#: lutris/runners/scummvm.py:414 msgid "True Roland MT-32" msgstr "True Roland MT-32" -#: lutris/runners/scummvm.py:344 +#: lutris/runners/scummvm.py:417 msgid "" "Tells ScummVM that the MIDI device is an actual Roland MT-32, LAPC-I, CM-64, " "CM-32L, CM-500 or other MT-32 device." @@ -4447,11 +4622,11 @@ msgstr "" "Geeft door aan ScummVM dat het MIDI-apparaat een Roland MT-32, LAPC-I, " "CM-64, CM-32L, CM-500 of ander MT-32-apparaat is." -#: lutris/runners/scummvm.py:351 +#: lutris/runners/scummvm.py:424 msgid "Enable Roland GS" msgstr "Roland GS gebruiken" -#: lutris/runners/scummvm.py:354 +#: lutris/runners/scummvm.py:427 msgid "" "Tells ScummVM that the MIDI device is a GS device that has an MT-32 map, " "such as an SC-55, SC-88 or SC-8820." @@ -4459,47 +4634,47 @@ msgstr "" "Geeft door aan ScummVM dat het MIDI-apparaat een GS-apparaat is dat beschikt " "over een MT-32-kaart, zoals een SC-55, SC-88 or SC-8820." -#: lutris/runners/scummvm.py:361 +#: lutris/runners/scummvm.py:434 msgid "Use alternate intro" msgstr "Alternatieve introductie tonen" -#: lutris/runners/scummvm.py:362 +#: lutris/runners/scummvm.py:435 msgid "Uses alternative intro for CD versions" msgstr "Toon een alternatieve introductie van cd-versies" -#: lutris/runners/scummvm.py:368 +#: lutris/runners/scummvm.py:441 msgid "Copy protection" msgstr "Kopieerbeveiliging" -#: lutris/runners/scummvm.py:369 +#: lutris/runners/scummvm.py:442 msgid "Enables copy protection" msgstr "Schakel kopieerbeveiliging in" -#: lutris/runners/scummvm.py:375 +#: lutris/runners/scummvm.py:448 msgid "Demo mode" msgstr "Demomodus" -#: lutris/runners/scummvm.py:376 +#: lutris/runners/scummvm.py:449 msgid "Starts demo mode of Maniac Mansion or The 7th Guest" msgstr "Start de demomodus van Maniac Mansion of The 7th Guest" -#: lutris/runners/scummvm.py:382 lutris/runners/scummvm.py:390 +#: lutris/runners/scummvm.py:455 lutris/runners/scummvm.py:463 msgid "Debugging" msgstr "Foutopsporing" -#: lutris/runners/scummvm.py:383 +#: lutris/runners/scummvm.py:456 msgid "Debug level" msgstr "Foutopsporingsniveau" -#: lutris/runners/scummvm.py:384 +#: lutris/runners/scummvm.py:457 msgid "Sets debug verbosity level" msgstr "Stel het foutopsporingsniveau in" -#: lutris/runners/scummvm.py:391 +#: lutris/runners/scummvm.py:464 msgid "Debug flags" msgstr "Foutopsporingsopties" -#: lutris/runners/scummvm.py:392 +#: lutris/runners/scummvm.py:465 msgid "Enables engine specific debug flags" msgstr "Stel specifieke foutopsporingsopties in" @@ -4511,11 +4686,11 @@ msgstr "Super Nintendo-emulator" msgid "Snes9x" msgstr "Snes9x" -#: lutris/runners/snes9x.py:45 +#: lutris/runners/snes9x.py:44 msgid "Maintain aspect ratio (4:3)" msgstr "Beeldverhouding behouden (4:3)" -#: lutris/runners/snes9x.py:49 +#: lutris/runners/snes9x.py:47 msgid "" "Super Nintendo games were made for 4:3 screens with rectangular pixels, but " "modern screens have square pixels, which results in a vertically squeezed " @@ -4525,7 +4700,7 @@ msgstr "" "rechthoekige pixels, maar moderne schermen hebben vierkante pixels. Schakel " "deze optie in om games in de oorspronkelijke pixelverhouding te spelen." -#: lutris/runners/snes9x.py:59 +#: lutris/runners/snes9x.py:57 msgid "Sound driver" msgstr "Audiostuurprogramma" @@ -4971,10 +5146,6 @@ msgstr "Geïnstalleerde winetricks gebruiken" msgid "Switch on to use /usr/bin/winetricks for winetricks." msgstr "Gebruik /usr/bin/winetricks als winetricks-opdracht." -#: lutris/runners/wine.py:199 lutris/runners/wine.py:213 -msgid "DXVK" -msgstr "DXVK" - #: lutris/runners/wine.py:200 msgid "Enable DXVK" msgstr "DXVK gebruiken" @@ -4991,10 +5162,6 @@ msgstr "" msgid "DXVK version" msgstr "DXVK-versie" -#: lutris/runners/wine.py:223 lutris/runners/wine.py:236 -msgid "VKD3D" -msgstr "VKD3D" - #: lutris/runners/wine.py:224 msgid "Enable VKD3D" msgstr "VKD3D gebruiken" @@ -5011,10 +5178,6 @@ msgstr "" msgid "VKD3D version" msgstr "VKD3D-versie" -#: lutris/runners/wine.py:245 lutris/runners/wine.py:257 -msgid "D3D Extras" -msgstr "D3D-extra's" - #: lutris/runners/wine.py:246 msgid "Enable D3D Extras" msgstr "D3D-extra's gebruiken" @@ -5031,10 +5194,6 @@ msgstr "" msgid "D3D Extras version" msgstr "Versie van D3D-extra's" -#: lutris/runners/wine.py:266 lutris/runners/wine.py:277 -msgid "DXVK-NVAPI / DLSS" -msgstr "DXVX-NVAPI/DLSS" - #: lutris/runners/wine.py:267 msgid "Enable DXVK-NVAPI / DLSS" msgstr "DXVX-NVAPI/DLSS gebruiken" @@ -5048,11 +5207,6 @@ msgstr "" msgid "DXVK NVAPI version" msgstr "DXVK-NVAPI-versie" -#: lutris/runners/wine.py:286 lutris/runners/wine.py:299 -#| msgid "Enable dgvoodoo2" -msgid "dgvoodoo2" -msgstr "dgvoodoo2" - #: lutris/runners/wine.py:287 msgid "Enable dgvoodoo2" msgstr "dgvoodoo2 inschakelen" @@ -5143,7 +5297,6 @@ msgstr "" "Vereist: Lutris Wine 7.2 of hoger, of elke andere compatibele Wine-versie.\n" #: lutris/runners/wine.py:368 lutris/runners/wine.py:380 -#| msgid "Virtual Boy" msgid "Virtual Desktop" msgstr "Virtueel bureaublad" @@ -5200,7 +5353,7 @@ msgstr "" msgid "Mouse Warp Override" msgstr "Automatische cursorplaatsing" -#: lutris/runners/wine.py:412 lutris/sysoptions.py:275 +#: lutris/runners/wine.py:412 msgid "Enable" msgstr "Inschakelen" @@ -5291,10 +5444,10 @@ msgstr "Wine-mappen in sandbox plaatsen" #: lutris/runners/wine.py:490 msgid "" "Do not use $HOME for desktop integration folders.\n" -"By default, it use the directories in the confined Windows environment." +"By default, it will use the directories in the confined Windows environment." msgstr "" "Gebruik $HOME niet voor burueabladintegratiemappen.\n" -"Standaard worden de mappen uit het Wine-profiel gebruikt." +"Standaard worden de mappen uit de Windowsomgeving gebruikt." #: lutris/runners/wine.py:499 msgid "Sandbox directory" @@ -5332,7 +5485,7 @@ msgstr "Winetricks" msgid "Wine Control Panel" msgstr "Wine-configuratiescherm" -#: lutris/runners/wine.py:697 +#: lutris/runners/wine.py:705 msgid "Select an EXE or MSI file" msgstr "Kies een exe- of msi-bestand" @@ -5446,27 +5599,27 @@ msgstr "" "laden. Het bestand moet een wad-mappenlijst bevatten, anders start de game " "niet." -#: lutris/services/amazon.py:59 lutris/services/amazon.py:643 +#: lutris/services/amazon.py:62 lutris/services/amazon.py:658 msgid "Amazon Prime Gaming" msgstr "Amazon Prime Gaming" -#: lutris/services/amazon.py:180 +#: lutris/services/amazon.py:171 msgid "No Amazon user data available, please log in again" msgstr "Er zijn geen Amazon-profielgegevens beschikbaar - log opnieuw in" -#: lutris/services/amazon.py:245 +#: lutris/services/amazon.py:236 msgid "Unable to register device, please log in again" msgstr "Het apparaat kan niet worden geregistreerd - log opnieuw in" -#: lutris/services/amazon.py:260 +#: lutris/services/amazon.py:251 msgid "Invalid token info found, please log in again" msgstr "De toegangssleutel is ongeldig - log opnieuw in" -#: lutris/services/amazon.py:294 +#: lutris/services/amazon.py:285 msgid "Unable to refresh token, please log in again" msgstr "De toegangssleutel kan niet worden vernieuwd - log opnieuw in" -#: lutris/services/amazon.py:439 +#: lutris/services/amazon.py:440 msgid "" "Unable to get game manifest info, please check your Amazon credentials and " "internet connectivity" @@ -5474,7 +5627,7 @@ msgstr "" "Er kan geen manifestinformatie worden opgehaald. Controleer je Amazon-" "inloggegevens en internetverbinding." -#: lutris/services/amazon.py:457 +#: lutris/services/amazon.py:458 msgid "" "Unable to get game manifest, please check your Amazon credentials and " "internet connectivity" @@ -5482,7 +5635,7 @@ msgstr "" "Er kan geen manifestinformatie worden opgehaald. Controleer je Amazon-" "inloggegevens en internetverbinding." -#: lutris/services/amazon.py:473 +#: lutris/services/amazon.py:474 msgid "" "Unknown compression algorithm found in manifest, please check your Amazon " "credentials and internet connectivity" @@ -5490,7 +5643,7 @@ msgstr "" "Het compressie-algoritme is niet aangetroffen in de manifestinformatie. " "Controleer je Amazon-inloggegevens en internetverbinding." -#: lutris/services/amazon.py:504 +#: lutris/services/amazon.py:515 msgid "" "Unable to get the patches of game, please check your Amazon credentials and " "internet connectivity" @@ -5498,7 +5651,7 @@ msgstr "" "Er kunnen geen patches worden opgehaald. Controleer je Amazon-inloggegevens " "en internetverbinding." -#: lutris/services/amazon.py:562 +#: lutris/services/amazon.py:575 msgid "" "Unable to get fuel.json file, please check your Amazon credentials and " "internet connectivity" @@ -5506,16 +5659,16 @@ msgstr "" "Er kan geen fuel.json-bestand worden opgehaald. Controleer je Amazon-" "inloggegevens en internetverbinding." -#: lutris/services/amazon.py:572 -msgid "Invalid JSON response from Amazon APIs" -msgstr "Ongeldig json-antwoord van de Amazon-api's" +#: lutris/services/amazon.py:587 +msgid "Invalid response from Amazon APIs" +msgstr "Ongeldig antwoord van de Amazon-api's" -#: lutris/services/amazon.py:630 +#: lutris/services/amazon.py:645 #, python-format msgid "Installing file: %s" msgstr "Bezig met installeren van bestand: %s" -#: lutris/services/base.py:327 +#: lutris/services/base.py:352 #, python-format msgid "" "This service requires a game launcher. The following steps will install it.\n" @@ -5533,7 +5686,7 @@ msgstr "Battle.net" msgid "Epic Games Store" msgstr "Epic Games Store" -#: lutris/services/flathub.py:57 +#: lutris/services/flathub.py:58 msgid "Flathub" msgstr "Flathub" @@ -5541,20 +5694,20 @@ msgstr "Flathub" msgid "GOG" msgstr "GOG" -#: lutris/services/gog.py:304 lutris/services/gog.py:306 +#: lutris/services/gog.py:297 lutris/services/gog.py:299 #, python-format msgid "The download of '%s' failed." msgstr "‘%s’ kan niet worden gedownload." -#: lutris/services/gog.py:434 +#: lutris/services/gog.py:427 msgid "Couldn't load the download links for this game" msgstr "De downloadlinks kunnen niet worden geladen" -#: lutris/services/gog.py:480 +#: lutris/services/gog.py:473 msgid "Unable to determine correct file to launch installer" msgstr "Er kan geen installatiewizardbestand worden vastgesteld" -#: lutris/services/gog.py:487 +#: lutris/services/gog.py:480 msgid "Couldn't load the downloads for this game" msgstr "De downloads kunnen niet worden geladen" @@ -5562,11 +5715,11 @@ msgstr "De downloads kunnen niet worden geladen" msgid "Humble Bundle" msgstr "Humble Bundle" -#: lutris/services/humblebundle.py:85 +#: lutris/services/humblebundle.py:84 msgid "Workaround for Humble Bundle authentication" msgstr "Tussenoplossing voor Humble Bundle-authenticatie" -#: lutris/services/humblebundle.py:86 +#: lutris/services/humblebundle.py:85 msgid "" "Humble Bundle is restricting API calls from software like Lutris and " "GameHub.\n" @@ -5579,11 +5732,11 @@ msgstr "" "Er is echter een tussenoplossing in de vorm van het kopiëren van cookies uit " "Firefox. Wil je dit nu doen?" -#: lutris/services/humblebundle.py:247 +#: lutris/services/humblebundle.py:239 msgid "The download URL for the game could not be determined." msgstr "De download-url kan niet worden bepaald." -#: lutris/services/humblebundle.py:249 +#: lutris/services/humblebundle.py:241 msgid "No game found on Humble Bundle" msgstr "Geen game aangetroffen op Humble Bundle" @@ -5592,7 +5745,7 @@ msgstr "Geen game aangetroffen op Humble Bundle" msgid "itch.io" msgstr "itch.io" -#: lutris/services/lutris.py:123 +#: lutris/services/lutris.py:116 #, python-format msgid "Lutris has no installers for %s. Try using a different service instead." msgstr "" @@ -5602,11 +5755,7 @@ msgstr "" msgid "Origin" msgstr "Origin" -#: lutris/services/steamwindows.py:25 -msgid "Steam for Windows" -msgstr "Steam voor Windows" - -#: lutris/services/steam.py:105 +#: lutris/services/steam.py:100 msgid "" "Failed to load games. Check that your profile is set to public during the " "sync." @@ -5614,6 +5763,10 @@ msgstr "" "De games kunnen niet worden geladen. Controleer of je profiel is ingesteld " "op ‘Openbaar’." +#: lutris/services/steamwindows.py:25 +msgid "Steam for Windows" +msgstr "Steam voor Windows" + #: lutris/services/ubisoft.py:82 msgid "Ubisoft Connect" msgstr "Ubisoft Connect" @@ -5648,7 +5801,7 @@ msgstr "" "href='%s'>installatiehandleiding (Engels)" #: lutris/startup.py:126 -msgid "Missing vulkan libraries" +msgid "Missing Vulkan libraries" msgstr "Ontbrekende Vulkan-bibliotheken" #: lutris/startup.py:128 @@ -5668,7 +5821,41 @@ msgstr "" msgid " and " msgstr " en " -#: lutris/startup.py:200 +#: lutris/startup.py:156 +msgid "Obsolete Vulkan libraries" +msgstr "Verouderde Vulkan-bibliotheken" + +#: lutris/startup.py:158 +#, python-format +msgid "" +"Lutris has detected that Vulkan API version %s is installed, but to use the " +"latest DXVK version, %s is required.\n" +"\n" +"DXVK 1.x will be used instead." +msgstr "" +"Lutris heeft Vulkan-api-versie %s aangetroffen, maar de nieuwste DXVK-versie " +"werkt alleen in combinatie met %s.\n" +"\n" +"In plaats daarvan wordt DXVK 1.x gebruikt." + +#: lutris/startup.py:180 +msgid "Obsolete Vulkan driver support" +msgstr "Verouderd Vulkan-stuurprogramma" + +#: lutris/startup.py:182 +#, python-format +msgid "" +"Lutris has detected that the best device available ('%s') supports Vulkan " +"API %s, but to use the latest DXVK version, %s is required.\n" +"\n" +"DXVK 1.x will be used instead." +msgstr "" +"Lutris heeft vastgesteld dat het beste beschikbare apparaat (‘%s’) slechts " +"Vulkan-api %s ondersteund. De nieuwste DXVK-versie vereist echter %s.\n" +"\n" +"In plaats daarvan wordt DXVK 1.x gebruikt." + +#: lutris/startup.py:244 #, python-format msgid "" "Failed to open database file in %s. Try renaming this file and relaunch " @@ -5690,7 +5877,7 @@ msgid "System" msgstr "Systeem" #: lutris/sysoptions.py:62 lutris/sysoptions.py:71 lutris/sysoptions.py:82 -#: lutris/sysoptions.py:708 +#: lutris/sysoptions.py:720 msgid "Off" msgstr "Uit" @@ -5730,6 +5917,10 @@ msgid "" msgstr "" "Geef voorrang aan systeembibliotheken, ook als de runtime is ingeschakeld." +#: lutris/sysoptions.py:275 +msgid "Enable Gamescope" +msgstr "Gamescope inschakelen" + #: lutris/sysoptions.py:278 msgid "" "Use gamescope to draw the game window isolated from your desktop.\n" @@ -5837,19 +6028,35 @@ msgstr "" "\n" "Blanco: uitgeschakeld" -#: lutris/sysoptions.py:363 +#: lutris/sysoptions.py:362 +msgid "Custom Settings" +msgstr "Aangepaste instellingen" + +#: lutris/sysoptions.py:366 +msgid "" +"Set additional flags for gamescope (if available).\n" +"See 'gamescope --help' for a full list of options.\n" +"\n" +"Empty String: Disabled" +msgstr "" +"Stel aanvullende gamescope-opties in (indien beschikbaar).\n" +"Voer ‘gamescope --help’ uit om de volledige optielijst te tonen.\n" +"\n" +"Blanco: uitgeschakeld" + +#: lutris/sysoptions.py:375 msgid "Restrict number of cores used" msgstr "Aantal kernen beperken" -#: lutris/sysoptions.py:365 +#: lutris/sysoptions.py:377 msgid "Restrict the game to a maximum number of CPU cores." msgstr "Beperkt de game tot het gebruik van een maximumaantal cpu-kernen." -#: lutris/sysoptions.py:371 +#: lutris/sysoptions.py:383 msgid "Restrict number of cores to" msgstr "Aantal kernen beperken tot" -#: lutris/sysoptions.py:373 +#: lutris/sysoptions.py:385 msgid "" "Maximum number of CPU cores to be used, if 'Restrict number of cores used' " "is turned on." @@ -5857,19 +6064,19 @@ msgstr "" "Beperkt de game tot het gebruik van een maximumaantal cpu-kernen als ‘Aantal " "kernen beperken’ is ingeschakeld." -#: lutris/sysoptions.py:381 +#: lutris/sysoptions.py:393 msgid "Enable Feral GameMode" msgstr "Feral GameMode gebruiken" -#: lutris/sysoptions.py:382 +#: lutris/sysoptions.py:394 msgid "Request a set of optimisations be temporarily applied to the host OS" msgstr "Past tijdelijk een set optimalisaties toe op het hostsysteem" -#: lutris/sysoptions.py:388 +#: lutris/sysoptions.py:400 msgid "FPS counter (MangoHud)" msgstr "FPS-teller (MangoHud)" -#: lutris/sysoptions.py:391 +#: lutris/sysoptions.py:403 msgid "" "Display the game's FPS + other information. Requires MangoHud to be " "installed." @@ -5877,11 +6084,11 @@ msgstr "" "Toont de fps van een game, evenals andere technische informatie. MangoHud is " "hiervoor vereist." -#: lutris/sysoptions.py:397 +#: lutris/sysoptions.py:409 msgid "Restore resolution on game exit" msgstr "Resolutie herstellen na beëindigen van game" -#: lutris/sysoptions.py:399 +#: lutris/sysoptions.py:411 msgid "" "Some games don't restore your screen resolution when \n" "closed or when they crash. This is when this option comes \n" @@ -5891,11 +6098,11 @@ msgstr "" "worden afgesloten of crashen. Met deze optie wordt de\n" "resolutie altijd hersteld." -#: lutris/sysoptions.py:408 +#: lutris/sysoptions.py:420 msgid "Restore gamma on game exit" msgstr "Gamma herstellen na beëindigen van game" -#: lutris/sysoptions.py:410 +#: lutris/sysoptions.py:422 msgid "" "Some games don't correctly restores gamma on exit, making your display too " "bright. Select this option to correct it." @@ -5903,11 +6110,11 @@ msgstr "" "Sommige gamels herstellen het gamma niet als ze worden afgesloten, waardoor " "je helderheid te hoog staat. Kruis deze optie aan om dat te voorkomen." -#: lutris/sysoptions.py:416 +#: lutris/sysoptions.py:428 msgid "Disable desktop effects" msgstr "Bureaubladeffecten uitschakelen" -#: lutris/sysoptions.py:420 +#: lutris/sysoptions.py:432 msgid "" "Disable desktop effects while game is running, reducing stuttering and " "increasing performance" @@ -5915,11 +6122,11 @@ msgstr "" "Schakel bureaubladeffecten uit zolang de game actief is, om lag en traagheid " "te voorkomen" -#: lutris/sysoptions.py:426 +#: lutris/sysoptions.py:438 msgid "Disable screen saver" msgstr "Schermbeveiliging uitschakelen" -#: lutris/sysoptions.py:431 +#: lutris/sysoptions.py:443 msgid "" "Disable the screen saver while a game is running. Requires the screen " "saver's functionality to be exposed over DBus." @@ -5927,15 +6134,15 @@ msgstr "" "Schakel de schermbeveiliging uit tijdens het games van een game. Hiervoor " "dient de functionaliteit te worden doorgegeven middels DBus." -#: lutris/sysoptions.py:443 +#: lutris/sysoptions.py:455 msgid "Limit the game's FPS to desired number" msgstr "Stel een FPS-limiet in" -#: lutris/sysoptions.py:449 +#: lutris/sysoptions.py:461 msgid "SDL 1.2 Fullscreen Monitor" msgstr "SDL 1.2 schermvullend scherm" -#: lutris/sysoptions.py:453 +#: lutris/sysoptions.py:465 msgid "" "Hint SDL 1.2 games to use a specific monitor when going fullscreen by " "setting the SDL_VIDEO_FULLSCREEN environment variable" @@ -5944,11 +6151,11 @@ msgstr "" "gebruikt om de schermvullende weergave in te schakelen middels " "SDL_VIDEO_FULLSCREEN" -#: lutris/sysoptions.py:461 +#: lutris/sysoptions.py:473 msgid "Turn off monitors except" msgstr "Beeldschermen uitschakelen, behalve" -#: lutris/sysoptions.py:466 +#: lutris/sysoptions.py:478 msgid "" "Only keep the selected screen active while the game is running. \n" "This is useful if you have a dual-screen setup, and are \n" @@ -5958,27 +6165,27 @@ msgstr "" "Dit is nuttig als je meer dan één scherm hebt en problemen hebt\n" "met schermvullende games." -#: lutris/sysoptions.py:475 +#: lutris/sysoptions.py:487 msgid "Switch resolution to" msgstr "Resolutie instellen op" -#: lutris/sysoptions.py:479 +#: lutris/sysoptions.py:491 msgid "Switch to this screen resolution while the game is running." msgstr "Stel de resolutie hier op in zolang de game actief is." -#: lutris/sysoptions.py:485 +#: lutris/sysoptions.py:497 msgid "Reset PulseAudio" msgstr "PulseAudio herstarten" -#: lutris/sysoptions.py:489 +#: lutris/sysoptions.py:501 msgid "Restart PulseAudio before launching the game." msgstr "Herstart PulseAudio voordat de game start." -#: lutris/sysoptions.py:495 +#: lutris/sysoptions.py:507 msgid "Reduce PulseAudio latency" msgstr "PulseAudio-vertraging verminderen" -#: lutris/sysoptions.py:499 +#: lutris/sysoptions.py:511 msgid "" "Set the environment variable PULSE_LATENCY_MSEC=60 to improve audio quality " "on some games" @@ -5986,28 +6193,28 @@ msgstr "" "Stelt de omgevingsvariabel PULSE_LATENCY_MSEC=60 in om de audiokwaliteit van " "sommige games te verbeteren" -#: lutris/sysoptions.py:506 +#: lutris/sysoptions.py:518 msgid "Switch to US keyboard layout" msgstr "Overschakelen naar Amerikaanse toetsenbordindeling" -#: lutris/sysoptions.py:509 +#: lutris/sysoptions.py:521 msgid "Switch to US keyboard QWERTY layout while game is running" msgstr "" "Schakel over naar de Amerikaanse QWERTY-indeling zolang de game actief is" -#: lutris/sysoptions.py:515 +#: lutris/sysoptions.py:527 msgid "AntiMicroX Profile" msgstr "AntiMicroX-profiel" -#: lutris/sysoptions.py:517 +#: lutris/sysoptions.py:529 msgid "Path to an AntiMicroX profile file" msgstr "Locatie van een AntiMicroX-profielbestand" -#: lutris/sysoptions.py:524 +#: lutris/sysoptions.py:536 msgid "SDL2 gamepad mapping" msgstr "SDL2-gamepadtoewijzing" -#: lutris/sysoptions.py:526 +#: lutris/sysoptions.py:538 msgid "" "SDL_GAMECONTROLLERCONFIG mapping string or path to a custom gamecontrollerdb." "txt file containing mappings." @@ -6015,11 +6222,11 @@ msgstr "" "SDL_GAMECONTROLLERCONFIG-toewijzing, in tekenreeks of locatie, naar een " "aangepast gamecontrollerdb.txt-bestand dat de toewijzingen bevat." -#: lutris/sysoptions.py:535 +#: lutris/sysoptions.py:547 msgid "Enable NVIDIA Prime Render Offload" msgstr "NVIDIA Prime render offload gebruiken" -#: lutris/sysoptions.py:536 +#: lutris/sysoptions.py:548 msgid "" "If you have the latest NVIDIA driver and the properly patched xorg-server " "(see https://download.nvidia.com/XFree86/Linux-x86_64/435.17/README/" @@ -6033,11 +6240,11 @@ msgstr "" "door deze optie in te schakelen. Dit past __NV_PRIME_RENDER_OFFLOAD=1 en " "__GLX_VENDOR_LIBRARY_NAME=nvidia toe." -#: lutris/sysoptions.py:548 +#: lutris/sysoptions.py:560 msgid "Use discrete graphics" msgstr "Toegepaste videokaart gebruiken" -#: lutris/sysoptions.py:550 +#: lutris/sysoptions.py:562 msgid "" "If you have open source graphic drivers (Mesa), selecting this option will " "run the game with the 'DRI_PRIME=1' environment variable, activating your " @@ -6047,11 +6254,11 @@ msgstr "" "deze optie met ‘DRI_PRIME=1’, waardoor je toegepaste videokaart (bijv. " "Nvidia) gebruikt wordt voor betere prestaties." -#: lutris/sysoptions.py:561 +#: lutris/sysoptions.py:573 msgid "Optimus launcher (NVIDIA Optimus laptops)" msgstr "Optimus-starter (NVIDIA Optimus-laptops)" -#: lutris/sysoptions.py:563 +#: lutris/sysoptions.py:575 msgid "" "If you have installed the primus or bumblebee packages, select what launcher " "will run the game with the command, activating your NVIDIA graphic chip for " @@ -6065,11 +6272,11 @@ msgstr "" "maar optirun/virtualgl werkt met meer games. Primus VK biedt Vulkan-" "ondersteuning voor Bumblebee." -#: lutris/sysoptions.py:578 +#: lutris/sysoptions.py:590 msgid "Vulkan ICD loader" msgstr "Vulkan ICD-loader" -#: lutris/sysoptions.py:580 +#: lutris/sysoptions.py:592 msgid "" "The ICD loader is a library that is placed between a Vulkan application and " "any number of Vulkan drivers, in order to support multiple drivers and the " @@ -6079,11 +6286,11 @@ msgstr "" "Zo worden meerdere stuurprogramma's en instanties ondersteund tussen " "stuurprogramma's." -#: lutris/sysoptions.py:588 +#: lutris/sysoptions.py:600 msgid "CLI mode" msgstr "CLI-modus" -#: lutris/sysoptions.py:592 +#: lutris/sysoptions.py:604 msgid "" "Enable a terminal for text-based games. Only useful for ASCII based games. " "May cause issues with graphical games." @@ -6091,11 +6298,11 @@ msgstr "" "Gebruik een terminal bij tekstgebaseerde games (alleen nuttig bij ascii-" "games). Let op: dit kan problemen veroorzaken in grafische games." -#: lutris/sysoptions.py:598 +#: lutris/sysoptions.py:610 msgid "Text based games emulator" msgstr "Tekstgebaseerde game-emulator" -#: lutris/sysoptions.py:603 +#: lutris/sysoptions.py:615 msgid "" "The terminal emulator used with the CLI mode. Choose from the list of " "detected terminal apps or enter the terminal's command or path." @@ -6104,15 +6311,15 @@ msgstr "" "een lijst met geïnstalleerde programma's of voer de opdracht of locatie in. " "Let op: niet alle emulators werken." -#: lutris/sysoptions.py:612 +#: lutris/sysoptions.py:624 msgid "Environment variables loaded at run time" msgstr "De tezamen met de game toe te passen omgevingsvariabelen" -#: lutris/sysoptions.py:618 +#: lutris/sysoptions.py:630 msgid "Locale" msgstr "Taal" -#: lutris/sysoptions.py:624 +#: lutris/sysoptions.py:636 msgid "" "Can be used to force certain locale for an app. Fixes encoding issues in " "legacy software." @@ -6120,53 +6327,53 @@ msgstr "" "Kan worden gebruikt om een bepaalde taal in een game te gebruiken. Dit lost " "tekensetproblemen in oude software op." -#: lutris/sysoptions.py:630 +#: lutris/sysoptions.py:642 msgid "Command prefix" msgstr "Opdrachtregelopties" -#: lutris/sysoptions.py:632 +#: lutris/sysoptions.py:644 msgid "" "Command line instructions to add in front of the game's execution command." msgstr "" "De opdrachtregelopties die vóór de game-opdracht moeten worden toegekend." -#: lutris/sysoptions.py:639 +#: lutris/sysoptions.py:651 msgid "Manual script" msgstr "Aangepast script" -#: lutris/sysoptions.py:641 +#: lutris/sysoptions.py:653 msgid "Script to execute from the game's contextual menu" msgstr "Het uit te voeren script middels het rechtermuisknopmenu van de game" -#: lutris/sysoptions.py:647 +#: lutris/sysoptions.py:659 msgid "Pre-launch script" msgstr "Voortijdig script" -#: lutris/sysoptions.py:649 +#: lutris/sysoptions.py:661 msgid "Script to execute before the game starts" msgstr "Het script dat moet worden uitgevoerd voordat de game start" -#: lutris/sysoptions.py:655 +#: lutris/sysoptions.py:667 msgid "Wait for pre-launch script completion" msgstr "Wachten tot voortijdig script is afgerond" -#: lutris/sysoptions.py:658 +#: lutris/sysoptions.py:670 msgid "Run the game only once the pre-launch script has exited" msgstr "Start de game alleen als het script is afgerond" -#: lutris/sysoptions.py:664 +#: lutris/sysoptions.py:676 msgid "Post-exit script" msgstr "Afsluitend script" -#: lutris/sysoptions.py:666 +#: lutris/sysoptions.py:678 msgid "Script to execute when the game exits" msgstr "Het script dat moet worden uitgevoerd nadat de game is afgesloten" -#: lutris/sysoptions.py:672 +#: lutris/sysoptions.py:684 msgid "Include processes" msgstr "In te sluiten deze processen" -#: lutris/sysoptions.py:674 +#: lutris/sysoptions.py:686 msgid "" "What processes to include in process monitoring. This is to override the " "built-in exclude list.\n" @@ -6178,11 +6385,11 @@ msgstr "" "De lijst is spatiegescheiden. Processen met spaties dienen voorzien te zijn " "van dubbele aanhalingstekens." -#: lutris/sysoptions.py:683 +#: lutris/sysoptions.py:695 msgid "Exclude processes" msgstr "Uit te sluiten processen" -#: lutris/sysoptions.py:685 +#: lutris/sysoptions.py:697 msgid "" "What processes to exclude in process monitoring. For example background " "processes that stick around after the game has been closed.\n" @@ -6195,11 +6402,11 @@ msgstr "" "De lijst is spatiegescheiden. Processen met spaties dienen voorzien te zijn " "van dubbele aanhalingstekens." -#: lutris/sysoptions.py:695 +#: lutris/sysoptions.py:707 msgid "Killswitch file" msgstr "Killswitch-bestand" -#: lutris/sysoptions.py:697 +#: lutris/sysoptions.py:709 msgid "" "Path to a file which will stop the game when deleted \n" "(usually /dev/input/js0 to stop the game on joystick unplugging)" @@ -6208,57 +6415,57 @@ msgstr "" "(doorgaans is dit /dev/input/js0 om het game stop te zetten bij het " "afkoppelen van joysticks)" -#: lutris/sysoptions.py:705 +#: lutris/sysoptions.py:717 msgid "Use Xephyr" msgstr "Xephyr gebruiken" -#: lutris/sysoptions.py:709 +#: lutris/sysoptions.py:721 msgid "8BPP (256 colors)" msgstr "8BPP (256 kleuren)" -#: lutris/sysoptions.py:710 +#: lutris/sysoptions.py:722 msgid "16BPP (65536 colors)" msgstr "16BPP (65536 kleuren)" -#: lutris/sysoptions.py:711 +#: lutris/sysoptions.py:723 msgid "24BPP (16M colors)" msgstr "24BPP (16M kleuren)" -#: lutris/sysoptions.py:715 +#: lutris/sysoptions.py:727 msgid "Run program in Xephyr to support 8BPP and 16BPP color modes" msgstr "" "Start een game met Xephyr om 8BPP- en 16BPP-kleurenmodi te kunnen gebruiken" -#: lutris/sysoptions.py:721 +#: lutris/sysoptions.py:733 msgid "Xephyr resolution" msgstr "Xephyr-resolutie" -#: lutris/sysoptions.py:723 +#: lutris/sysoptions.py:735 msgid "Screen resolution of the Xephyr server" msgstr "Schermresolutie van de Xephyr-server" -#: lutris/sysoptions.py:729 +#: lutris/sysoptions.py:741 msgid "Xephyr Fullscreen" msgstr "Xephyr schermvullend" -#: lutris/sysoptions.py:732 +#: lutris/sysoptions.py:744 msgid "Open Xephyr in fullscreen (at the desktop resolution)" msgstr "Xephyr op volledig scherm openen (op bureaubladresolutie)" -#: lutris/util/strings.py:133 +#: lutris/util/strings.py:135 msgid "1 hour" msgstr "1 uur" -#: lutris/util/strings.py:135 +#: lutris/util/strings.py:137 #, python-format msgid "%d hours" msgstr "%d uur" -#: lutris/util/strings.py:141 +#: lutris/util/strings.py:143 msgid "1 minute" msgstr "1 minuut" -#: lutris/util/strings.py:143 +#: lutris/util/strings.py:145 #, python-format msgid "%d minutes" msgstr "%d minuten" @@ -6292,25 +6499,25 @@ msgstr "Projecten" msgid "Ubisoft authentication has been lost: %s" msgstr "De Ubisoft-authenticatie is verdwenen: %s" -#: lutris/util/wine/dll_manager.py:63 +#: lutris/util/wine/dll_manager.py:71 msgid "Manual" msgstr "Handmatig" -#: lutris/util/wine/wine.py:360 lutris/util/wine/wine.py:398 -#: lutris/util/wine/wine.py:418 +#: lutris/util/wine/wine.py:362 lutris/util/wine/wine.py:400 +#: lutris/util/wine/wine.py:420 msgid "Launch anyway and do not show this message again." msgstr "Tóch starten en dit bericht niet meer tonen" -#: lutris/util/wine/wine.py:362 lutris/util/wine/wine.py:400 -#: lutris/util/wine/wine.py:420 +#: lutris/util/wine/wine.py:364 lutris/util/wine/wine.py:402 +#: lutris/util/wine/wine.py:422 msgid "Enable anyway and do not show this message again." msgstr "Tóch inschakelen en dit bericht niet meer tonen" -#: lutris/util/wine/wine.py:367 +#: lutris/util/wine/wine.py:369 msgid "Vulkan is not installed or is not supported by your system" msgstr "Vulkan is niet geïnstalleerd of wordt niet ondersteund door je systeem" -#: lutris/util/wine/wine.py:369 +#: lutris/util/wine/wine.py:371 msgid "" "If you have compatible hardware, please follow the installation procedures " "as described in\n" @@ -6321,7 +6528,7 @@ msgstr "" "How-to:-DXVK " "(https://github.com/lutris/lutris/wiki/How-to:-DXVK) (Engels)" -#: lutris/util/wine/wine.py:381 +#: lutris/util/wine/wine.py:383 msgid "" "Your limits are not set correctly. Please increase them as described here: " "How-to:-" @@ -6331,7 +6538,7 @@ msgstr "" "How-to:-Esync " "(https://github.com/lutris/lutris/wiki/How-to:-Esync) (Engels)" -#: lutris/util/wine/wine.py:390 +#: lutris/util/wine/wine.py:392 msgid "" "Your kernel is not patched for fsync. Please get a patched kernel to use " "fsync." @@ -6339,11 +6546,11 @@ msgstr "" "Je kernel is niet gepatcht met fsync. Installeer een met fsync gepatchte " "kernel." -#: lutris/util/wine/wine.py:404 lutris/util/wine/wine.py:424 +#: lutris/util/wine/wine.py:406 lutris/util/wine/wine.py:426 msgid "Incompatible Wine version detected" msgstr "Incompatibele Wine-versie aangetroffen" -#: lutris/util/wine/wine.py:406 +#: lutris/util/wine/wine.py:408 msgid "" "The Wine build you have selected does not support Esync.\n" "Please switch to an Esync-capable version." @@ -6351,7 +6558,7 @@ msgstr "" "De gekozen Wine-versie heeft geen ondersteuning voor Esync.\n" "Kies een met esync compatibele versie." -#: lutris/util/wine/wine.py:426 +#: lutris/util/wine/wine.py:428 msgid "" "The Wine build you have selected does not support Fsync.\n" "Please switch to an Fsync-capable version." @@ -6359,6 +6566,28 @@ msgstr "" "De gekozen Wine-versie heeft geen ondersteuning voor Fsync.\n" "Kies een met fsync compatibele versie." +#~ msgid "32-bit Wine prefix" +#~ msgstr "32-bit Wine-profiel" + +#~ msgid "Hide text under icons (requires restart)" +#~ msgstr "Tekst onder pictogrammen verbergen (herstart vereist)" + +#~ msgid "DXVK" +#~ msgstr "DXVK" + +#~ msgid "VKD3D" +#~ msgstr "VKD3D" + +#~ msgid "D3D Extras" +#~ msgstr "D3D-extra's" + +#~ msgid "DXVK-NVAPI / DLSS" +#~ msgstr "DXVX-NVAPI/DLSS" + +#~| msgid "Enable dgvoodoo2" +#~ msgid "dgvoodoo2" +#~ msgstr "dgvoodoo2" + #, python-format #~ msgid "Install %s" #~ msgstr "%s installeren" @@ -6384,9 +6613,6 @@ msgstr "" #~ msgid "Unspecified (Use System Default)" #~ msgstr "Niet-opgegeven (systeemstandaard)" -#~ msgid "Enable gamescope" -#~ msgstr "Gamescope inschakelen" - #~ msgid "Gamescope output resolution" #~ msgstr "Gamescope-resolutie" @@ -6426,12 +6652,6 @@ msgstr "" #~ msgid "Enable subtitles (if the game has voice)" #~ msgstr "Ondertiteling gebruiken (als de game over spraak beschikt)" -#~ msgid "Renderer" -#~ msgstr "Renderer" - -#~ msgid "OpenGL shaders" -#~ msgstr "OpenGL-shaders" - #~ msgid "Display FPS information" #~ msgstr "FPS-informatie tonen" @@ -6557,9 +6777,6 @@ msgstr "" #~ msgid "Remove game data (through Wine Steam)" #~ msgstr "Speldata verwijderen (middels Wine Steam)" -#~ msgid "Custom Steam location" -#~ msgstr "Aangepaste Steam-locatie" - #~ msgid "" #~ "Choose a folder containing Steam.exe\n" #~ "By default, Lutris will look for a Windows Steam installation into ~/." @@ -6719,9 +6936,6 @@ msgstr "" #~ "Start Steam op met STEAM_RUNTIME=0. Zorg er voor dat je de Lutris Runtime " #~ "uitschakelt en de vereiste bibliotheken geïnstalleerd zijn." -#~ msgid "Keep aspect ratio" -#~ msgstr "Beeldverhouding behouden" - #~ msgid "Enable Gallium Nine" #~ msgstr "Gallium Nine gebruiken" From a9fc07a3cb2f4f590c0180b79047463d352ea9f7 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sun, 30 Apr 2023 08:10:57 -0400 Subject: [PATCH 08/52] Clear media cache less aggressively We get a lot of calls to render one media that is already visible- GTK is trying to hot highlight it. To avoid blowing the cache over that, we'll only do the cycling thing if we've loaded a media. --- lutris/gui/widgets/cellrenderers.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/lutris/gui/widgets/cellrenderers.py b/lutris/gui/widgets/cellrenderers.py index 9b6748b81..4d35fd64d 100644 --- a/lutris/gui/widgets/cellrenderers.py +++ b/lutris/gui/widgets/cellrenderers.py @@ -39,6 +39,7 @@ class GridViewCellRendererImage(Gtk.CellRenderer): self._is_installed = True self.cached_surfaces_new = {} self.cached_surfaces_old = {} + self.cached_surfaces_loaded = 0 self.cycle_cache_idle_id = None self.cached_surface_generation = 0 @@ -215,9 +216,15 @@ class GridViewCellRendererImage(Gtk.CellRenderer): We call this at idle time after rendering a cell; this should keep all the surfaces rendered at that time, so during scrolling the visible media are kept and scrolling is smooth. - At other times we may discard almost all surfaces, saving memory.""" - self.cached_surfaces_old = self.cached_surfaces_new - self.cached_surfaces_new = {} + At other times we may discard almost all surfaces, saving memory. + + We skip clearing anything if no surfaces have been loaded; this happens if drawing was + serviced entirely from cache. GTK may have redrawn just one image or something, so + let's not disturb the cache for that.""" + if self.cached_surfaces_loaded > 0: + self.cached_surfaces_old = self.cached_surfaces_new + self.cached_surfaces_new = {} + self.cached_surfaces_loaded = 0 self.cycle_cache_idle_id = None def get_cached_surface_by_path(self, widget, path, size=None, preserve_aspect_ratio=True): @@ -239,6 +246,8 @@ class GridViewCellRendererImage(Gtk.CellRenderer): if not surface: surface = self.get_surface_by_path(widget, path, size, preserve_aspect_ratio) + if surface: + self.cached_surfaces_loaded += 1 self.cached_surfaces_new[key] = surface return surface From 3d8caf55a46c5dc198133677c597fec10105864b Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sun, 30 Apr 2023 08:16:28 -0400 Subject: [PATCH 09/52] Cache missing media as well No sense it re-querying the disk every time. --- lutris/gui/widgets/cellrenderers.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lutris/gui/widgets/cellrenderers.py b/lutris/gui/widgets/cellrenderers.py index 4d35fd64d..08e85ab55 100644 --- a/lutris/gui/widgets/cellrenderers.py +++ b/lutris/gui/widgets/cellrenderers.py @@ -238,14 +238,15 @@ class GridViewCellRendererImage(Gtk.CellRenderer): key = widget, path, size, preserve_aspect_ratio - surface = self.cached_surfaces_new.get(key) - if surface: - return surface + if key in self.cached_surfaces_new: + return self.cached_surfaces_new[key] - surface = self.cached_surfaces_old.get(key) - - if not surface: + if key in self.cached_surfaces_old: + surface = self.cached_surfaces_old[key] + else: surface = self.get_surface_by_path(widget, path, size, preserve_aspect_ratio) + # We cache missing surfaces too, but only a successful load trigger + # cache cycling if surface: self.cached_surfaces_loaded += 1 From c3ed3143318fe250b176dc2bd85e129c38ae43a5 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Wed, 10 May 2023 17:11:00 -0400 Subject: [PATCH 10/52] Suppress errors from vulkaninfo --- lutris/sysoptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lutris/sysoptions.py b/lutris/sysoptions.py index b4f3afff9..7180730be 100644 --- a/lutris/sysoptions.py +++ b/lutris/sysoptions.py @@ -117,7 +117,7 @@ def get_vulkan_gpu(icd_files, prime): subprocess_env["DRI_PRIME"] = "1" infocmd = "vulkaninfo --summary | grep deviceName | head -n 1 | tr -s '[:blank:]' | cut -d ' ' -f 3-" - with subprocess.Popen(infocmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + with subprocess.Popen(infocmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, env=subprocess_env) as infoget: result = infoget.communicate()[0].decode("utf-8").strip() if "Failed to detect any valid GPUs" in result or "ERROR: [Loader Message]" in result: From e025e4d4406e9aefebabb6e6c136681851151b51 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Wed, 10 May 2023 19:38:58 -0400 Subject: [PATCH 11/52] Preload Vulkan GPU Names 'vulkaninfo' can be slow. So we spawn threads to run it and let functools.lru_cache cache the names. Hopefully this will be faster by running the queries in parallel, and anyway Lutris can continue until you actually visit the 'System Options' page in configuration. You might block then but I expect it'll be a win. Any errors during preload are ignored, but you can encounter them in your configuration dialog later. The logic for this all is moved to system.py, away from the GUI. Also, say 'Not Found' for GPUs that aren't there, when vulkaninfo is found. --- lutris/startup.py | 4 +- lutris/sysoptions.py | 149 +++-------------------------------------- lutris/util/system.py | 150 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 163 insertions(+), 140 deletions(-) diff --git a/lutris/startup.py b/lutris/startup.py index f25077984..4884e016f 100644 --- a/lutris/startup.py +++ b/lutris/startup.py @@ -20,11 +20,12 @@ from lutris.runtime import RuntimeUpdater from lutris.scanners.lutris import build_path_cache from lutris.services import DEFAULT_SERVICES from lutris.services.lutris import sync_media +from lutris.util.display import USE_DRI_PRIME from lutris.util.graphics import drivers, vkquery from lutris.util.linux import LINUX_SYSTEM from lutris.util.log import logger from lutris.util.steam.shortcut import update_all_artwork -from lutris.util.system import create_folder +from lutris.util.system import create_folder, preload_vulkan_gpu_names from lutris.util.wine.d3d_extras import D3DExtrasManager from lutris.util.wine.dgvoodoo2 import dgvoodoo2Manager from lutris.util.wine.dxvk import REQUIRED_VULKAN_API_VERSION, DXVKManager @@ -219,6 +220,7 @@ def run_all_checks(): check_libs() check_vulkan() check_gnome() + preload_vulkan_gpu_names(USE_DRI_PRIME) fill_missing_platforms() build_path_cache() diff --git a/lutris/sysoptions.py b/lutris/sysoptions.py index 7180730be..e3f8e2f16 100644 --- a/lutris/sysoptions.py +++ b/lutris/sysoptions.py @@ -1,30 +1,12 @@ """Options list for system config.""" -import functools -import glob import os -import re -import shutil -import subprocess from collections import OrderedDict from gettext import gettext as _ from lutris import runners from lutris.util import linux, system from lutris.util.display import DISPLAY_MANAGER, SCREEN_SAVER_INHIBITOR, USE_DRI_PRIME -from lutris.util.log import logger - -# vulkan dirs used by distros or containers that aren't from: -# https://github.com/KhronosGroup/Vulkan-Loader/blob/v1.3.235/docs/LoaderDriverInterface.md#driver-discovery-on-linux -# don't include the /vulkan suffix -FALLBACK_VULKAN_DATA_DIRS = [ - "/usr/local/etc", # standard site-local location - "/usr/local/share", # standard site-local location - "/etc", # standard location - "/usr/share", # standard location - "/usr/lib/x86_64-linux-gnu/GL", # Flatpak GL extension - "/usr/lib/i386-linux-gnu/GL", # Flatpak GL32 extension - "/opt/amdgpu-pro/etc" # AMD GPU Pro - TkG -] +from lutris.util.system import get_vk_icd_file_sets, get_vulkan_gpu_name def get_resolution_choices(): @@ -89,128 +71,17 @@ def get_optirun_choices(): return choices -# cache this to avoid calling vulkaninfo repeatedly, shouldn't change at runtime -@functools.lru_cache -def get_vulkan_gpus(icd_files): - """Runs vulkaninfo to determine the default and DRI_PRIME gpu if available""" - - if not shutil.which("vulkaninfo"): - logger.warning("vulkaninfo not available, unable to list GPUs") - return "Unknown GPU" - - gpu = get_vulkan_gpu(icd_files, False) - if USE_DRI_PRIME: - prime_gpu = get_vulkan_gpu(icd_files, True) - if prime_gpu != gpu: - gpu += f" (Discrete GPU: {prime_gpu})" - return gpu - - -def get_vulkan_gpu(icd_files, prime): - """Runs vulkaninfo to find the primary GPU""" - - subprocess_env = dict(os.environ) - if icd_files: - subprocess_env["VK_DRIVER_FILES"] = icd_files - subprocess_env["VK_ICD_FILENAMES"] = icd_files - if prime: - subprocess_env["DRI_PRIME"] = "1" - - infocmd = "vulkaninfo --summary | grep deviceName | head -n 1 | tr -s '[:blank:]' | cut -d ' ' -f 3-" - with subprocess.Popen(infocmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, - env=subprocess_env) as infoget: - result = infoget.communicate()[0].decode("utf-8").strip() - if "Failed to detect any valid GPUs" in result or "ERROR: [Loader Message]" in result: - return "No GPU" - # Shorten result to just the friendly name of the GPU - # vulkaninfo returns Vendor Friendly Name (Chip Developer Name) - # AMD Radeon Pro W6800 (RADV NAVI21) -> AMD Radeon Pro W6800 - return re.sub(r"\s*\(.*?\)", "", result) - - -def get_vk_icd_files(): - """Returns available vulkan ICD files in the same search order as vulkan-loader""" - all_icd_search_paths = [] - - def add_icd_search_path(paths): - if paths: - # unixy env vars with multiple paths are : delimited - for path in paths.split(":"): - path = os.path.join(path, "vulkan") - if os.path.exists(path) and path not in all_icd_search_paths: - all_icd_search_paths.append(path) - - # Must match behavior of - # https://github.com/KhronosGroup/Vulkan-Loader/blob/v1.3.235/docs/LoaderDriverInterface.md#driver-discovery-on-linux - # (or a newer version of the same standard) - - # 1.a XDG_CONFIG_HOME or ~/.config if unset - add_icd_search_path(os.getenv("XDG_CONFIG_HOME") or (f"{os.getenv('HOME')}/.config")) - # 1.b XDG_CONFIG_DIRS - add_icd_search_path(os.getenv("XDG_CONFIG_DIRS") or "/etc/xdg") - - # 2, 3 SYSCONFDIR and EXTRASYSCONFDIR - # Compiled in default has both the same - add_icd_search_path("/etc") - - # 4 XDG_DATA_HOME - add_icd_search_path(os.getenv("XDG_DATA_HOME") or (f"{os.getenv('HOME')}/.local/share")) - - # 5 XDG_DATA_DIRS or fall back to /usr/local/share and /usr/share - add_icd_search_path(os.getenv("XDG_DATA_DIRS") or "/usr/local/share:/usr/share") - - # FALLBACK - # dirs that aren't from the loader spec are searched last - for fallback_dir in FALLBACK_VULKAN_DATA_DIRS: - add_icd_search_path(fallback_dir) - - all_icd_files = [] - - for data_dir in all_icd_search_paths: - path = os.path.join(data_dir, "icd.d", "*.json") - # sort here as directory enumeration order is not guaranteed in linux - # so it's consistent every time - icd_files = sorted(glob.glob(path)) - if icd_files: - all_icd_files += icd_files - - return all_icd_files - - def get_vk_icd_choices(): """Return available Vulkan ICD loaders""" - intel = [] - amdradv = [] - nvidia = [] - amdvlk = [] - amdvlkpro = [] # fallback in case any ICDs don't match a known type - unknown = [] + icd_file_sets = get_vk_icd_file_sets() - all_icd_files = get_vk_icd_files() - - # Add loaders for each vendor - for loader in all_icd_files: - if "intel" in loader: - intel.append(loader) - elif "radeon" in loader: - amdradv.append(loader) - elif "nvidia" in loader: - nvidia.append(loader) - elif "amd" in loader: - if "pro" in loader: - amdvlkpro.append(loader) - else: - amdvlk.append(loader) - else: - unknown.append(loader) - - intel_files = ":".join(intel) - amdradv_files = ":".join(amdradv) - nvidia_files = ":".join(nvidia) - amdvlk_files = ":".join(amdvlk) - amdvlkpro_files = ":".join(amdvlkpro) - unknown_files = ":".join(unknown) + intel_files = ":".join(icd_file_sets["intel"]) + amdradv_files = ":".join(icd_file_sets["amdradv"]) + nvidia_files = ":".join(icd_file_sets["nvidia"]) + amdvlk_files = ":".join(icd_file_sets["amdvlk"]) + amdvlkpro_files = ":".join(icd_file_sets["amdvlkpro"]) + unknown_files = ":".join(icd_file_sets["unknown"]) # default choice should always be blank so the env var gets left as is # This ensures Lutris doesn't change the vulkan loader behavior unless you select @@ -230,10 +101,10 @@ def get_vk_icd_choices(): choices.append(("AMDVLK Open source", amdvlk_files)) if amdvlkpro_files: choices.append(("AMDGPU-PRO Proprietary", amdvlkpro_files)) - if unknown: + if unknown_files: choices.append(("Unknown Vendor", unknown_files)) - choices = [(prefix + ": " + get_vulkan_gpus(files), files) for prefix, files in choices] + choices = [(prefix + ": " + get_vulkan_gpu_name(files, USE_DRI_PRIME), files) for prefix, files in choices] return choices diff --git a/lutris/util/system.py b/lutris/util/system.py index de34843c8..3ecd58f5b 100644 --- a/lutris/util/system.py +++ b/lutris/util/system.py @@ -1,4 +1,5 @@ """System utilities""" +import glob import hashlib import os import re @@ -8,12 +9,15 @@ import stat import string import subprocess import zipfile +from collections import defaultdict +from functools import lru_cache from gettext import gettext as _ from pathlib import Path from gi.repository import Gio, GLib from lutris import settings +from lutris.util.jobs import AsyncCall from lutris.util.log import logger # Home folders that should never get deleted. @@ -28,6 +32,19 @@ PROTECTED_HOME_FOLDERS = ( _("Games") ) +# vulkan dirs used by distros or containers that aren't from: +# https://github.com/KhronosGroup/Vulkan-Loader/blob/v1.3.235/docs/LoaderDriverInterface.md#driver-discovery-on-linux +# don't include the /vulkan suffix +FALLBACK_VULKAN_DATA_DIRS = [ + "/usr/local/etc", # standard site-local location + "/usr/local/share", # standard site-local location + "/etc", # standard location + "/usr/share", # standard location + "/usr/lib/x86_64-linux-gnu/GL", # Flatpak GL extension + "/usr/lib/i386-linux-gnu/GL", # Flatpak GL32 extension + "/opt/amdgpu-pro/etc" # AMD GPU Pro - TkG +] + def execute(command, env=None, cwd=None, log_errors=False, quiet=False, shell=False, timeout=None): """ @@ -544,3 +561,136 @@ def set_keyboard_layout(layout): with subprocess.Popen(setxkbmap_command, env=os.environ, stdout=xkbcomp.stdin) as setxkbmap: setxkbmap.communicate() xkbcomp.communicate() + + +def preload_vulkan_gpu_names(use_dri_prime): + """Runs threads to load the GPU data from vulkan info for each ICD file set, + and one for the default 'unspecified' info. The results are cached by @lru_cache, + so we can just ignore them here.""" + + try: + all_files = [":".join(fs) for fs in get_vk_icd_file_sets().values()] + all_files.append("") + for files in all_files: + # ignore any errors from get_vulkan_gpu_name + AsyncCall(get_vulkan_gpu_name, None, files, use_dri_prime, daemon=True) + except Exception as ex: + logger.exception("Failed to preload Vulkan GPU Names: %s", str(ex)) + + +# cache this to avoid calling vulkaninfo repeatedly, shouldn't change at runtime +@lru_cache +def get_vulkan_gpu_name(icd_files, use_dri_prime): + """Runs vulkaninfo to determine the default and DRI_PRIME gpu if available, + returns 'Not Found' if the GPU is not found or 'Unknown GPU' if vulkaninfo + is not available.""" + + def fetch_vulkan_gpu_name(prime): + """Runs vulkaninfo to find the primary GPU""" + subprocess_env = dict(os.environ) + if icd_files: + subprocess_env["VK_DRIVER_FILES"] = icd_files + subprocess_env["VK_ICD_FILENAMES"] = icd_files + if prime: + subprocess_env["DRI_PRIME"] = "1" + + infocmd = "vulkaninfo --summary | grep deviceName | head -n 1 | tr -s '[:blank:]' | cut -d ' ' -f 3-" + with subprocess.Popen(infocmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, + env=subprocess_env) as infoget: + result = infoget.communicate()[0].decode("utf-8").strip() + + if "Failed to detect any valid GPUs" in result or "ERROR: [Loader Message]" in result: + return "No GPU" + + # Shorten result to just the friendly name of the GPU + # vulkaninfo returns Vendor Friendly Name (Chip Developer Name) + # AMD Radeon Pro W6800 (RADV NAVI21) -> AMD Radeon Pro W6800 + return re.sub(r"\s*\(.*?\)", "", result) + + if not shutil.which("vulkaninfo"): + logger.warning("vulkaninfo not available, unable to list GPUs") + return "Unknown GPU" + + gpu = fetch_vulkan_gpu_name(False) + + if use_dri_prime: + prime_gpu = fetch_vulkan_gpu_name(True) + if prime_gpu != gpu: + gpu += f" (Discrete GPU: {prime_gpu})" + + return gpu or "Not Found" + + +def get_vk_icd_file_sets(): + """Returns the vulkan ICD files in a default-dict of lists; the keys are the separate + drivers, 'intel', 'amdradv', 'amdvlkpro', 'amdvlk', 'nvidia', and 'unknown'.""" + + def get_vk_icd_files(): + """Returns available vulkan ICD files in the same search order as vulkan-loader, + but in a single list""" + all_icd_search_paths = [] + + def add_icd_search_path(paths): + if paths: + # unixy env vars with multiple paths are : delimited + for path in paths.split(":"): + path = os.path.join(path, "vulkan") + if os.path.exists(path) and path not in all_icd_search_paths: + all_icd_search_paths.append(path) + + # Must match behavior of + # https://github.com/KhronosGroup/Vulkan-Loader/blob/v1.3.235/docs/LoaderDriverInterface.md#driver-discovery-on-linux + # (or a newer version of the same standard) + + # 1.a XDG_CONFIG_HOME or ~/.config if unset + add_icd_search_path(os.getenv("XDG_CONFIG_HOME") or (f"{os.getenv('HOME')}/.config")) + # 1.b XDG_CONFIG_DIRS + add_icd_search_path(os.getenv("XDG_CONFIG_DIRS") or "/etc/xdg") + + # 2, 3 SYSCONFDIR and EXTRASYSCONFDIR + # Compiled in default has both the same + add_icd_search_path("/etc") + + # 4 XDG_DATA_HOME + add_icd_search_path(os.getenv("XDG_DATA_HOME") or (f"{os.getenv('HOME')}/.local/share")) + + # 5 XDG_DATA_DIRS or fall back to /usr/local/share and /usr/share + add_icd_search_path(os.getenv("XDG_DATA_DIRS") or "/usr/local/share:/usr/share") + + # FALLBACK + # dirs that aren't from the loader spec are searched last + for fallback_dir in FALLBACK_VULKAN_DATA_DIRS: + add_icd_search_path(fallback_dir) + + all_icd_files = [] + + for data_dir in all_icd_search_paths: + path = os.path.join(data_dir, "icd.d", "*.json") + # sort here as directory enumeration order is not guaranteed in linux + # so it's consistent every time + icd_files = sorted(glob.glob(path)) + if icd_files: + all_icd_files += icd_files + + return all_icd_files + + sets = defaultdict(list) + all_icd_files = get_vk_icd_files() + + # Add loaders for each vendor + for loader in all_icd_files: + if "intel" in loader: + sets["intel"].append(loader) + elif "radeon" in loader: + sets["amdradv"].append(loader) + elif "nvidia" in loader: + sets["nvidia"].append(loader) + elif "amd" in loader: + if "pro" in loader: + sets["amdvlkpro"].append(loader) + else: + sets["amdvlk"].append(loader) + else: + sets["unknown"].append(loader) + + return sets From e4ae3d7193da777ebb370603a9e20c435f725300 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Wed, 10 May 2023 19:51:16 -0400 Subject: [PATCH 12/52] Add some error handling for the option widget generation An exception here will be logged, and then we'll move on to the next option. That way you can configure other settings, even if one is broken. --- lutris/gui/config/boxes.py | 173 +++++++++++++++++++------------------ lutris/util/system.py | 2 +- 2 files changed, 89 insertions(+), 86 deletions(-) diff --git a/lutris/gui/config/boxes.py b/lutris/gui/config/boxes.py index 7fb74babb..6a13b9c54 100644 --- a/lutris/gui/config/boxes.py +++ b/lutris/gui/config/boxes.py @@ -84,103 +84,106 @@ class ConfigBox(VBox): # Go thru all options. for option in self.options: - if "scope" in option: - if self.config_section not in option["scope"]: - continue - option_key = option["option"] - value = self.config.get(option_key) + try: + if "scope" in option: + if self.config_section not in option["scope"]: + continue + option_key = option["option"] + value = self.config.get(option_key) - if callable(option.get("choices")) and option["type"] != "choice_with_search": - option["choices"] = option["choices"]() - if callable(option.get("condition")): - option["condition"] = option["condition"]() + if callable(option.get("choices")) and option["type"] != "choice_with_search": + option["choices"] = option["choices"]() + if callable(option.get("condition")): + option["condition"] = option["condition"]() - if option.get("section") != current_section: - current_section = option.get("section") - if current_section: - frame = ConfigBox.SectionFrame(current_section) - current_vbox = frame.vbox - self.pack_start(frame, False, False, 0) - else: - current_vbox = self + if option.get("section") != current_section: + current_section = option.get("section") + if current_section: + frame = ConfigBox.SectionFrame(current_section) + current_vbox = frame.vbox + self.pack_start(frame, False, False, 0) + else: + current_vbox = self - self.wrapper = Gtk.Box() - self.wrapper.set_spacing(12) - self.wrapper.set_margin_bottom(6) - self.wrappers[option_key] = self.wrapper + self.wrapper = Gtk.Box() + self.wrapper.set_spacing(12) + self.wrapper.set_margin_bottom(6) + self.wrappers[option_key] = self.wrapper - # Set tooltip's "Default" part - default = option.get("default") - self.tooltip_default = default if isinstance(default, str) else None + # Set tooltip's "Default" part + default = option.get("default") + self.tooltip_default = default if isinstance(default, str) else None - # Generate option widget - self.option_widget = None - self.call_widget_generator(option, option_key, value, default) + # Generate option widget + self.option_widget = None + self.call_widget_generator(option, option_key, value, default) - # Reset button - reset_btn = Gtk.Button.new_from_icon_name("edit-undo-symbolic", Gtk.IconSize.MENU) - reset_btn.set_valign(Gtk.Align.CENTER) - reset_btn.set_margin_bottom(6) - reset_btn.set_relief(Gtk.ReliefStyle.NONE) - reset_btn.set_tooltip_text(_("Reset option to global or default config")) - reset_btn.connect( - "clicked", - self.on_reset_button_clicked, - option, - self.option_widget, - self.wrapper, - ) - self.reset_buttons[option_key] = reset_btn - - placeholder = Gtk.Box() - placeholder.set_size_request(32, 32) - - if option_key not in self.raw_config: - reset_btn.set_visible(False) - reset_btn.set_no_show_all(True) - placeholder.pack_start(reset_btn, False, False, 0) - - # Tooltip - helptext = option.get("help") - if isinstance(self.tooltip_default, str): - helptext = helptext + "\n\n" if helptext else "" - helptext += _("Default: ") + _(self.tooltip_default) - if value != default and option_key not in self.raw_config: - helptext = helptext + "\n\n" if helptext else "" - helptext += _( - "(Italic indicates that this option is " - "modified in a lower configuration level.)" + # Reset button + reset_btn = Gtk.Button.new_from_icon_name("edit-undo-symbolic", Gtk.IconSize.MENU) + reset_btn.set_valign(Gtk.Align.CENTER) + reset_btn.set_margin_bottom(6) + reset_btn.set_relief(Gtk.ReliefStyle.NONE) + reset_btn.set_tooltip_text(_("Reset option to global or default config")) + reset_btn.connect( + "clicked", + self.on_reset_button_clicked, + option, + self.option_widget, + self.wrapper, ) - if helptext: - self.wrapper.props.has_tooltip = True - self.wrapper.connect("query-tooltip", self.on_query_tooltip, helptext) + self.reset_buttons[option_key] = reset_btn - hbox = Gtk.Box(visible=True) - option_container = hbox - hbox.set_margin_left(18) - hbox.pack_end(placeholder, False, False, 5) - # Grey out option if condition unmet - if "condition" in option and not option["condition"]: - hbox.set_sensitive(False) + placeholder = Gtk.Box() + placeholder.set_size_request(32, 32) - hbox.pack_start(self.wrapper, True, True, 0) + if option_key not in self.raw_config: + reset_btn.set_visible(False) + reset_btn.set_no_show_all(True) + placeholder.pack_start(reset_btn, False, False, 0) - if "warning" in option: - option_container = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, visible=True) - option_container.pack_start(hbox, False, False, 0) - warning = ConfigBox.WarningBox(option["warning"]) - warning.set_margin_left(18) - warning.set_margin_right(18) - warning.set_margin_bottom(6) - warning.update_warning(self.config) - self.warning_boxes[option_key] = warning - option_container.pack_start(warning, False, False, 0) + # Tooltip + helptext = option.get("help") + if isinstance(self.tooltip_default, str): + helptext = helptext + "\n\n" if helptext else "" + helptext += _("Default: ") + _(self.tooltip_default) + if value != default and option_key not in self.raw_config: + helptext = helptext + "\n\n" if helptext else "" + helptext += _( + "(Italic indicates that this option is " + "modified in a lower configuration level.)" + ) + if helptext: + self.wrapper.props.has_tooltip = True + self.wrapper.connect("query-tooltip", self.on_query_tooltip, helptext) - # Hide if advanced - if option.get("advanced"): - option_container.get_style_context().add_class("advanced") + hbox = Gtk.Box(visible=True) + option_container = hbox + hbox.set_margin_left(18) + hbox.pack_end(placeholder, False, False, 5) + # Grey out option if condition unmet + if "condition" in option and not option["condition"]: + hbox.set_sensitive(False) - current_vbox.pack_start(option_container, False, False, 0) + hbox.pack_start(self.wrapper, True, True, 0) + + if "warning" in option: + option_container = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, visible=True) + option_container.pack_start(hbox, False, False, 0) + warning = ConfigBox.WarningBox(option["warning"]) + warning.set_margin_left(18) + warning.set_margin_right(18) + warning.set_margin_bottom(6) + warning.update_warning(self.config) + self.warning_boxes[option_key] = warning + option_container.pack_start(warning, False, False, 0) + + # Hide if advanced + if option.get("advanced"): + option_container.get_style_context().add_class("advanced") + + current_vbox.pack_start(option_container, False, False, 0) + except Exception as ex: + logger.exception("Failed to generate option widget for '%s': %s", option.get("option"), ex) self.show_all() show_advanced = settings.read_setting("show_advanced_options") == "True" diff --git a/lutris/util/system.py b/lutris/util/system.py index 3ecd58f5b..8fbc6afc2 100644 --- a/lutris/util/system.py +++ b/lutris/util/system.py @@ -575,7 +575,7 @@ def preload_vulkan_gpu_names(use_dri_prime): # ignore any errors from get_vulkan_gpu_name AsyncCall(get_vulkan_gpu_name, None, files, use_dri_prime, daemon=True) except Exception as ex: - logger.exception("Failed to preload Vulkan GPU Names: %s", str(ex)) + logger.exception("Failed to preload Vulkan GPU Names: %s", ex) # cache this to avoid calling vulkaninfo repeatedly, shouldn't change at runtime From 46f36fe2825d55d5108601c132b6620ed3dcdcb1 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Thu, 11 May 2023 17:38:47 -0400 Subject: [PATCH 13/52] Handle when there's no default display or primary monitor- just assume 96 DPI in that case. It beats crashing! --- lutris/util/display.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lutris/util/display.py b/lutris/util/display.py index a9625cc30..eb9591da9 100644 --- a/lutris/util/display.py +++ b/lutris/util/display.py @@ -38,10 +38,13 @@ def get_default_dpi(): """Computes the DPI to use for the primary monitor which we pass to WINE.""" display = Gdk.Display.get_default() - monitor = display.get_primary_monitor() - scale = monitor.get_scale_factor() - dpi = 96 * scale - return int(dpi) + if display: + monitor = display.get_primary_monitor() + if monitor: + scale = monitor.get_scale_factor() + dpi = 96 * scale + return int(dpi) + return 96 def restore_gamma(): From 313c7a3c5f0ab3b36269f8910cce37b723288cda Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Thu, 11 May 2023 17:41:00 -0400 Subject: [PATCH 14/52] Also, let's not take an exception for the 'auto' DPI case. No point to it. --- lutris/runners/wine.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index 03bce2691..999e2b1ef 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -817,10 +817,11 @@ class wine(Runner): explicit_dpi = self.runner_config.get("ExplicitDpi") if explicit_dpi == "auto": explicit_dpi = None - try: - explicit_dpi = int(explicit_dpi) - except: - explicit_dpi = None + else: + try: + explicit_dpi = int(explicit_dpi) + except: + explicit_dpi = None return explicit_dpi or get_default_dpi() return None From 4a8311be886f6a0a6d951ad89a08216000580eaf Mon Sep 17 00:00:00 2001 From: legluondunet Date: Mon, 1 May 2023 11:03:35 +0200 Subject: [PATCH 15/52] json.py --> launching runners from left panel in "alone mode" modify json.py code to enable JSON runners to be directly launch from left panel. --- lutris/runners/json.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lutris/runners/json.py b/lutris/runners/json.py index a87fe933e..c929ad419 100644 --- a/lutris/runners/json.py +++ b/lutris/runners/json.py @@ -31,6 +31,7 @@ class JsonRunner(Runner): self.system_options_override = self._json_data.get("system_options_override", []) self.entry_point_option = self._json_data.get("entry_point_option", "main_file") self.download_url = self._json_data.get("download_url") + self.runnable_alone = self._json_data.get("runnable_alone") def play(self): """Return a launchable command constructed from the options""" From c95498e5292882944e9ad115686cd53ab50c62c6 Mon Sep 17 00:00:00 2001 From: legluondunet Date: Mon, 1 May 2023 20:52:37 +0200 Subject: [PATCH 16/52] citra.json --> AppImage does not need extra libs --- share/lutris/json/citra.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/lutris/json/citra.json b/share/lutris/json/citra.json index 18686cbc3..d3f92adf5 100644 --- a/share/lutris/json/citra.json +++ b/share/lutris/json/citra.json @@ -2,7 +2,7 @@ "human_name": "Citra", "description": "Nintendo 3DS emulator", "platforms": ["Nintendo 3DS"], - "require_libs": ["libQt5OpenGL.so.5", "libQt5Widgets.so.5", "libQt5Multimedia.so.5"], + "require_libs": [], "runner_executable": "citra/citra-qt", "runnable_alone": true, "game_options": [ From 1d6cecdb9365e42eb7e8ff0e3e3756ac3abedf25 Mon Sep 17 00:00:00 2001 From: legluondunet Date: Sat, 29 Apr 2023 05:58:39 +0200 Subject: [PATCH 17/52] add LD_LIBRARY_PATH to dosbox.py --- lutris/runners/dosbox.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/lutris/runners/dosbox.py b/lutris/runners/dosbox.py index c759de88f..4751adcfc 100644 --- a/lutris/runners/dosbox.py +++ b/lutris/runners/dosbox.py @@ -7,6 +7,7 @@ from gettext import gettext as _ from lutris.runners.commands.dosbox import dosexec, makeconfig # NOQA pylint: disable=unused-import from lutris.runners.runner import Runner from lutris.util import system +from lutris import settings class dosbox(Runner): @@ -14,7 +15,7 @@ class dosbox(Runner): description = _("MS-DOS emulator") platforms = [_("MS-DOS")] runnable_alone = True - runner_executable = "dosbox/bin/dosbox" + runner_executable = "dosbox/dosbox" require_libs = [] game_options = [ { @@ -119,7 +120,24 @@ class dosbox(Runner): @property def main_file(self): return self.make_absolute(self.game_config.get("main_file")) + + @property + def libs_dir(self): + path = os.path.join(settings.RUNNER_DIR, "dosbox/lib") + return path if system.path_exists(path) else "" + def get_command(self): + return [ + self.get_executable(), + ] + + def get_run_data(self): + env = self.get_env() + env["LD_LIBRARY_PATH"] = os.pathsep.join(filter(None, [ + self.libs_dir, + env.get("LD_LIBRARY_PATH")])) + return {"env": env, "command": self.get_command()} + @property def working_dir(self): """Return the working directory to use when running the game.""" @@ -162,4 +180,4 @@ class dosbox(Runner): if args: command.extend(args) - return {"command": command} + return {"command": command, "ld_library_path": self.libs_dir} From 624864df0c5aafb0c75ead52c661aaaf1dc49eb7 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sat, 22 Apr 2023 08:54:21 -0400 Subject: [PATCH 18/52] Replace Vulkan not supported dialogs with warnings in the configuration UI --- lutris/runners/wine.py | 68 ++++++++++++++++++++++++++++++++---------- lutris/startup.py | 32 +------------------- 2 files changed, 53 insertions(+), 47 deletions(-) diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index 999e2b1ef..72f6abf3c 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -4,6 +4,8 @@ import os import shlex from gettext import gettext as _ +from lutris.util.graphics import vkquery + from lutris import runtime, settings from lutris.gui.dialogs import FileDialog from lutris.runners.commands.wine import ( # noqa: F401 pylint: disable=unused-import @@ -13,14 +15,13 @@ from lutris.runners.commands.wine import ( # noqa: F401 pylint: disable=unused- from lutris.runners.runner import Runner from lutris.util import system from lutris.util.display import DISPLAY_MANAGER, get_default_dpi -from lutris.util.graphics.vkquery import is_vulkan_supported from lutris.util.jobs import thread_safe_call from lutris.util.log import logger from lutris.util.steam.config import get_steam_dir from lutris.util.strings import parse_version, split_arguments from lutris.util.wine.d3d_extras import D3DExtrasManager from lutris.util.wine.dgvoodoo2 import dgvoodoo2Manager -from lutris.util.wine.dxvk import DXVKManager +from lutris.util.wine.dxvk import DXVKManager, REQUIRED_VULKAN_API_VERSION from lutris.util.wine.dxvk_nvapi import DXVKNVAPIManager from lutris.util.wine.extract_icon import PEFILE_AVAILABLE, ExtractIcon from lutris.util.wine.prefix import DEFAULT_DLL_OVERRIDES, WinePrefixManager, find_prefix @@ -36,6 +37,49 @@ DEFAULT_WINE_PREFIX = "~/.wine" MIN_SAFE_VERSION = "7.0" # Wine installers must run with at least this version +def _get_dxvk_warning(config): + if config.get("dxvk") and not vkquery.is_vulkan_supported(): + return _("Vulkan is not installed or is not supported by your system") + + return None + + +def _get_dxvk_version_warning(config): + if config.get("dxvk") and vkquery.is_vulkan_supported(): + version = config.get("dxvk_version") + if version and not version.startswith("v1."): + required_api_version = REQUIRED_VULKAN_API_VERSION + library_api_version = vkquery.get_vulkan_api_version_tuple() + if library_api_version and library_api_version < required_api_version: + return _("Lutris has detected that Vulkan API version %s is installed, " + "but to use the latest DXVK version, %s is required." + ) % ( + vkquery.format_version_tuple(library_api_version), + vkquery.format_version_tuple(required_api_version) + ) + + max_dev_name, max_dev_api_version = vkquery.get_best_device_info() + + if max_dev_api_version and max_dev_api_version < required_api_version: + return _("Lutris has detected that the best device available ('%s') supports Vulkan API %s, " + "but to use the latest DXVK version, %s is required." + ) % ( + max_dev_name, + vkquery.format_version_tuple(max_dev_api_version), + vkquery.format_version_tuple(required_api_version) + ) + + return None + + +def _get_vkd3d_warning(config): + if config.get("vkd3d"): + if not vkquery.is_vulkan_supported(): + return _("Vulkan is not installed or is not supported by your system") + + return None + + class wine(Runner): description = _("Runs Windows games") human_name = _("Wine") @@ -158,13 +202,6 @@ class wine(Runner): return widget, option, response - def dxvk_vulkan_callback(widget, option, config): - response = True - if not is_vulkan_supported(): - if not thread_safe_call(display_vulkan_error): - response = False - return widget, option, response - self.runner_options = [ { "option": "version", @@ -198,10 +235,9 @@ class wine(Runner): "option": "dxvk", "section": _("Graphics"), "label": _("Enable DXVK"), - "type": "extended_bool", - "callback": dxvk_vulkan_callback, - "callback_on": True, + "type": "bool", "default": True, + "warning": _get_dxvk_warning, "active": True, "help": _( "Use DXVK to " @@ -216,15 +252,15 @@ class wine(Runner): "type": "choice_with_entry", "choices": DXVKManager().version_choices, "default": DXVKManager().version, + "warning": _get_dxvk_version_warning }, { "option": "vkd3d", "section": _("Graphics"), "label": _("Enable VKD3D"), - "type": "extended_bool", - "callback": dxvk_vulkan_callback, - "callback_on": True, + "type": "bool", + "warning": _get_vkd3d_warning, "default": True, "active": True, "help": _( @@ -990,7 +1026,7 @@ class wine(Runner): if using_dxvk: # Set this to 1 to enable access to more RAM for 32bit applications launch_info["env"]["WINE_LARGE_ADDRESS_AWARE"] = "1" - if not is_vulkan_supported(): + if not vkquery.is_vulkan_supported(): if not display_vulkan_error(on_launch=True): return {"error": "VULKAN_NOT_FOUND"} diff --git a/lutris/startup.py b/lutris/startup.py index 4884e016f..9e86184cc 100644 --- a/lutris/startup.py +++ b/lutris/startup.py @@ -149,22 +149,7 @@ def check_vulkan(): logger.warning("Vulkan reports an API version of %s. " "%s is required for the latest DXVK.", vkquery.format_version(library_api_version), - vkquery.format_version(library_api_version)) - setting = "dismiss-obsolete-vulkan-api-warning" - if settings.read_setting(setting) != "True": - DontShowAgainDialog( - setting, - _("Obsolete Vulkan libraries"), - secondary_message=_( - "Lutris has detected that Vulkan API version %s is installed, " - "but to use the latest DXVK version, %s is required.\n\n" - "DXVK 1.x will be used instead." - ) % ( - vkquery.format_version(library_api_version), - vkquery.format_version(required_api_version) - ) - ) - return + vkquery.format_version(required_api_version)) devices = vkquery.get_device_info() @@ -174,21 +159,6 @@ def check_vulkan(): devices[0].name, vkquery.format_version(devices[0].api_version), vkquery.format_version(required_api_version)) - setting = "dismiss-obsolete-vulkan-api-warning" - if settings.read_setting(setting) != "True": - DontShowAgainDialog( - setting, - _("Obsolete Vulkan driver support"), - secondary_message=_( - "Lutris has detected that the best device available ('%s') supports Vulkan API %s, " - "but to use the latest DXVK version, %s is required.\n\n" - "DXVK 1.x will be used instead." - ) % ( - devices[0].name, - vkquery.format_version(devices[0].api_version), - vkquery.format_version(required_api_version) - ) - ) def check_gnome(): From eedbe567159edb0864a586dbab750355e172acaa Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sat, 22 Apr 2023 09:13:25 -0400 Subject: [PATCH 19/52] Provide a warning for unsupported ESYNC. The dialog that appears on game start is still there. The new warning is very like the dialog, but reformatted a bit - not exactly the same. --- lutris/runners/wine.py | 125 ++++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 64 deletions(-) diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index 72f6abf3c..f2d9229e3 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -37,49 +37,6 @@ DEFAULT_WINE_PREFIX = "~/.wine" MIN_SAFE_VERSION = "7.0" # Wine installers must run with at least this version -def _get_dxvk_warning(config): - if config.get("dxvk") and not vkquery.is_vulkan_supported(): - return _("Vulkan is not installed or is not supported by your system") - - return None - - -def _get_dxvk_version_warning(config): - if config.get("dxvk") and vkquery.is_vulkan_supported(): - version = config.get("dxvk_version") - if version and not version.startswith("v1."): - required_api_version = REQUIRED_VULKAN_API_VERSION - library_api_version = vkquery.get_vulkan_api_version_tuple() - if library_api_version and library_api_version < required_api_version: - return _("Lutris has detected that Vulkan API version %s is installed, " - "but to use the latest DXVK version, %s is required." - ) % ( - vkquery.format_version_tuple(library_api_version), - vkquery.format_version_tuple(required_api_version) - ) - - max_dev_name, max_dev_api_version = vkquery.get_best_device_info() - - if max_dev_api_version and max_dev_api_version < required_api_version: - return _("Lutris has detected that the best device available ('%s') supports Vulkan API %s, " - "but to use the latest DXVK version, %s is required." - ) % ( - max_dev_name, - vkquery.format_version_tuple(max_dev_api_version), - vkquery.format_version_tuple(required_api_version) - ) - - return None - - -def _get_vkd3d_warning(config): - if config.get("vkd3d"): - if not vkquery.is_vulkan_supported(): - return _("Vulkan is not installed or is not supported by your system") - - return None - - class wine(Runner): description = _("Runs Windows games") human_name = _("Wine") @@ -172,21 +129,6 @@ class wine(Runner): version_choices.append((label, version)) return version_choices - def esync_limit_callback(widget, option, config): - limits_set = is_esync_limit_set() - wine_path = self.get_path_for_version(config["version"]) - wine_ver = is_version_esync(wine_path) - response = True - - if not wine_ver: - response = thread_safe_call(esync_display_version_warning) - - if not limits_set: - thread_safe_call(esync_display_limit_warning) - response = False - - return widget, option, response - def fsync_support_callback(widget, option, config): fsync_supported = is_fsync_supported() wine_path = self.get_path_for_version(config["version"]) @@ -237,7 +179,7 @@ class wine(Runner): "label": _("Enable DXVK"), "type": "bool", "default": True, - "warning": _get_dxvk_warning, + "warning": self._get_dxvk_warning, "active": True, "help": _( "Use DXVK to " @@ -252,7 +194,7 @@ class wine(Runner): "type": "choice_with_entry", "choices": DXVKManager().version_choices, "default": DXVKManager().version, - "warning": _get_dxvk_version_warning + "warning": self._get_dxvk_version_warning }, { @@ -260,7 +202,7 @@ class wine(Runner): "section": _("Graphics"), "label": _("Enable VKD3D"), "type": "bool", - "warning": _get_vkd3d_warning, + "warning": self._get_vkd3d_warning, "default": True, "active": True, "help": _( @@ -342,9 +284,8 @@ class wine(Runner): { "option": "esync", "label": _("Enable Esync"), - "type": "extended_bool", - "callback": esync_limit_callback, - "callback_on": True, + "type": "bool", + "warning": self._get_esync_warning, "active": True, "default": True, "help": _( @@ -1133,3 +1074,59 @@ class wine(Runner): logger.exception("Failed to extract exe icon: %s", err) return False + + def _get_dxvk_warning(self, config): + if config.get("dxvk") and not vkquery.is_vulkan_supported(): + return _("Vulkan is not installed or is not supported by your system") + + return None + + def _get_dxvk_version_warning(self, config): + if config.get("dxvk") and vkquery.is_vulkan_supported(): + version = config.get("dxvk_version") + if version and not version.startswith("v1."): + required_api_version = REQUIRED_VULKAN_API_VERSION + library_api_version = vkquery.get_vulkan_api_version_tuple() + if library_api_version and library_api_version < required_api_version: + return _("Lutris has detected that Vulkan API version %s is installed, " + "but to use the latest DXVK version, %s is required." + ) % ( + vkquery.format_version_tuple(library_api_version), + vkquery.format_version_tuple(required_api_version) + ) + + max_dev_name, max_dev_api_version = vkquery.get_best_device_info() + + if max_dev_api_version and max_dev_api_version < required_api_version: + return _("Lutris has detected that the best device available ('%s') supports Vulkan API %s, " + "but to use the latest DXVK version, %s is required." + ) % ( + max_dev_name, + vkquery.format_version_tuple(max_dev_api_version), + vkquery.format_version_tuple(required_api_version) + ) + + return None + + def _get_esync_warning(self, config): + if config.get("esync"): + limits_set = is_esync_limit_set() + wine_path = self.get_path_for_version(config["version"]) + wine_ver = is_version_esync(wine_path) + + if not wine_ver: + return _("Warning The Wine build you have selected does not support Esync") + + if not limits_set: + return _("Warning Your limits are not set correctly. Please increase them as described here:\n" + "" + "How-to-Esync (https://github.com/lutris/docs/blob/master/HowToEsync.md)") + + return None + + def _get_vkd3d_warning(self, config): + if config.get("vkd3d"): + if not vkquery.is_vulkan_supported(): + return _("Vulkan is not installed or is not supported by your system") + + return None From 6b466f033effa17d3cf1d8eca2956c40dc857bd3 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sat, 22 Apr 2023 09:18:15 -0400 Subject: [PATCH 20/52] And also a warning for FSYNC Once again, the pre-run dialog remains. --- lutris/runners/wine.py | 44 ++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index f2d9229e3..efda7cb42 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -129,21 +129,6 @@ class wine(Runner): version_choices.append((label, version)) return version_choices - def fsync_support_callback(widget, option, config): - fsync_supported = is_fsync_supported() - wine_path = self.get_path_for_version(config["version"]) - wine_ver = is_version_fsync(wine_path) - response = True - - if not wine_ver: - response = thread_safe_call(fsync_display_version_warning) - - if not fsync_supported: - thread_safe_call(fsync_display_support_warning) - response = False - - return widget, option, response - self.runner_options = [ { "option": "version", @@ -297,10 +282,9 @@ class wine(Runner): { "option": "fsync", "label": _("Enable Fsync"), - "type": "extended_bool", + "type": "bool", "default": is_fsync_supported(), - "callback": fsync_support_callback, - "callback_on": True, + "warning": self._get_fsync_warning, "active": True, "help": _( "Enable futex-based synchronization (fsync). " @@ -1108,6 +1092,13 @@ class wine(Runner): return None + def _get_vkd3d_warning(self, config): + if config.get("vkd3d"): + if not vkquery.is_vulkan_supported(): + return _("Vulkan is not installed or is not supported by your system") + + return None + def _get_esync_warning(self, config): if config.get("esync"): limits_set = is_esync_limit_set() @@ -1124,9 +1115,16 @@ class wine(Runner): return None - def _get_vkd3d_warning(self, config): - if config.get("vkd3d"): - if not vkquery.is_vulkan_supported(): - return _("Vulkan is not installed or is not supported by your system") + def _get_fsync_warning(self, config): + if config.get("fsync"): + fsync_supported = is_fsync_supported() + wine_path = self.get_path_for_version(config["version"]) + wine_ver = is_version_fsync(wine_path) - return None + if not wine_ver: + return _("Warning The Wine build you have selected does not support Fsync.") + + if not fsync_supported: + return _("Warning Your kernel is not patched for fsync.") + + return None From 0a0180d38dc98a4a14f1aa66784145fb6c914d41 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sat, 22 Apr 2023 09:21:25 -0400 Subject: [PATCH 21/52] Remove 'extended_bool' config option type We hates it. We hates it forever! --- lutris/gui/config/boxes.py | 44 -------------------------------------- lutris/runners/wine.py | 1 - 2 files changed, 45 deletions(-) diff --git a/lutris/gui/config/boxes.py b/lutris/gui/config/boxes.py index 6a13b9c54..859ebb6df 100644 --- a/lutris/gui/config/boxes.py +++ b/lutris/gui/config/boxes.py @@ -9,11 +9,9 @@ from gi.repository import Gdk, Gtk # Lutris Modules from lutris import settings, sysoptions -from lutris.gui.dialogs import ErrorDialog from lutris.gui.widgets.common import EditableGrid, FileChooserEntry, Label, VBox from lutris.gui.widgets.searchable_combobox import SearchableCombobox from lutris.runners import InvalidRunner, import_runner -from lutris.util.jobs import AsyncCall from lutris.util.log import logger @@ -274,9 +272,6 @@ class ConfigBox(VBox): elif option_type == "bool": self.generate_checkbox(option, value) self.tooltip_default = "Enabled" if default else "Disabled" - elif option_type == "extended_bool": - self.generate_checkbox_with_callback(option, value) - self.tooltip_default = "Enabled" if default else "Disabled" elif option_type == "range": self.generate_range(option_key, option["min"], option["max"], option["label"], value) elif option_type == "string": @@ -320,49 +315,10 @@ class ConfigBox(VBox): self.wrapper.pack_start(switch, False, False, 0) self.option_widget = switch - # Checkbox with callback - def generate_checkbox_with_callback(self, option, value=None): - """Generate a checkbox. With callback""" - - label = Label(option["label"]) - self.wrapper.pack_start(label, False, False, 0) - - checkbox = Gtk.Switch() - checkbox.set_sensitive(option["active"] is True) - if value is True: - checkbox.set_active(value) - - checkbox.connect("notify::active", self._on_toggle_with_callback, option) - checkbox.set_valign(Gtk.Align.CENTER) - self.wrapper.pack_start(checkbox, False, False, 0) - self.option_widget = checkbox - def checkbox_toggle(self, widget, _gparam, option_name): """Action for the checkbox's toggled signal.""" self.option_changed(widget, option_name, widget.get_active()) - def _on_toggle_with_callback(self, widget, _gparam, option): - """Action for the checkbox's toggled signal. With callback method""" - - option_name = option["option"] - callback = option["callback"] - callback_on = option.get("callback_on") - if widget.get_active() == callback_on or callback_on is None: - AsyncCall(callback, self._on_callback_finished, widget, option, self.config) - else: - self.option_changed(widget, option_name, widget.get_active()) - - def _on_callback_finished(self, result, error): - if error: - ErrorDialog(str(error), parent=self.get_toplevel()) - return - - widget, option, response = result - if response: - self.option_changed(widget, option["option"], widget.get_active()) - else: - widget.set_active(False) - # Entry def generate_entry(self, option_name, label, value=None, option_size=None): """Generate an entry box.""" diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index efda7cb42..8e07f815f 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -15,7 +15,6 @@ from lutris.runners.commands.wine import ( # noqa: F401 pylint: disable=unused- from lutris.runners.runner import Runner from lutris.util import system from lutris.util.display import DISPLAY_MANAGER, get_default_dpi -from lutris.util.jobs import thread_safe_call from lutris.util.log import logger from lutris.util.steam.config import get_steam_dir from lutris.util.strings import parse_version, split_arguments From 4af2a92e577dbe2ce54bf755656923d65eb1abb7 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sat, 22 Apr 2023 11:01:43 -0400 Subject: [PATCH 22/52] Move warning functions out of the runner class Python is mostly ref-counted, so it's best to avoid creating cycles. Also, it's safer to get all the config settings we need from the config we're given, not a runner's config. --- lutris/runners/wine.py | 192 ++++++++++++++++++++++------------------- 1 file changed, 103 insertions(+), 89 deletions(-) diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index 8e07f815f..fc9311711 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -36,6 +36,103 @@ DEFAULT_WINE_PREFIX = "~/.wine" MIN_SAFE_VERSION = "7.0" # Wine installers must run with at least this version +def _get_dxvk_warning(config): + if config.get("dxvk") and not vkquery.is_vulkan_supported(): + return _("Vulkan is not installed or is not supported by your system") + + return None + + +def _get_dxvk_version_warning(config): + if config.get("dxvk") and vkquery.is_vulkan_supported(): + version = config.get("dxvk_version") + if version and not version.startswith("v1."): + required_api_version = REQUIRED_VULKAN_API_VERSION + library_api_version = vkquery.get_vulkan_api_version_tuple() + if library_api_version and library_api_version < required_api_version: + return _("Lutris has detected that Vulkan API version %s is installed, " + "but to use the latest DXVK version, %s is required." + ) % ( + vkquery.format_version_tuple(library_api_version), + vkquery.format_version_tuple(required_api_version) + ) + + max_dev_name, max_dev_api_version = vkquery.get_best_device_info() + + if max_dev_api_version and max_dev_api_version < required_api_version: + return _("Lutris has detected that the best device available ('%s') supports Vulkan API %s, " + "but to use the latest DXVK version, %s is required." + ) % ( + max_dev_name, + vkquery.format_version_tuple(max_dev_api_version), + vkquery.format_version_tuple(required_api_version) + ) + + return None + + +def _get_vkd3d_warning(config): + if config.get("vkd3d"): + if not vkquery.is_vulkan_supported(): + return _("Vulkan is not installed or is not supported by your system") + + return None + + +def _get_path_for_version(config, version=None): + """Return the absolute path of a wine executable for a given version, + or the configured version if you don't ask for a version.""" + if not version: + version = config["version"] + + if version in WINE_PATHS: + return system.find_executable(WINE_PATHS[version]) + if "Proton" in version: + for proton_path in get_proton_paths(): + if os.path.isfile(os.path.join(proton_path, version, "dist/bin/wine")): + return os.path.join(proton_path, version, "dist/bin/wine") + if os.path.isfile(os.path.join(proton_path, version, "files/bin/wine")): + return os.path.join(proton_path, version, "files/bin/wine") + if version.startswith("PlayOnLinux"): + version, arch = version.split()[1].rsplit("-", 1) + return os.path.join(POL_PATH, "wine", "linux-" + arch, version, "bin/wine") + if version == "custom": + return config.get("custom_wine_path", "") + return os.path.join(WINE_DIR, version, "bin/wine") + + +def _get_esync_warning(config): + if config.get("esync"): + limits_set = is_esync_limit_set() + wine_path = _get_path_for_version(config) + wine_ver = is_version_esync(wine_path) + + if not wine_ver: + return _("Warning The Wine build you have selected does not support Esync") + + if not limits_set: + return _("Warning Your limits are not set correctly. Please increase them as described here:\n" + "" + "How-to-Esync (https://github.com/lutris/docs/blob/master/HowToEsync.md)") + + return None + + +def _get_fsync_warning(config): + if config.get("fsync"): + fsync_supported = is_fsync_supported() + wine_path = _get_path_for_version(config) + wine_ver = is_version_fsync(wine_path) + + if not wine_ver: + return _("Warning The Wine build you have selected does not support Fsync.") + + if not fsync_supported: + return _("Warning Your kernel is not patched for fsync.") + + return None + + class wine(Runner): description = _("Runs Windows games") human_name = _("Wine") @@ -163,7 +260,7 @@ class wine(Runner): "label": _("Enable DXVK"), "type": "bool", "default": True, - "warning": self._get_dxvk_warning, + "warning": _get_dxvk_warning, "active": True, "help": _( "Use DXVK to " @@ -178,7 +275,7 @@ class wine(Runner): "type": "choice_with_entry", "choices": DXVKManager().version_choices, "default": DXVKManager().version, - "warning": self._get_dxvk_version_warning + "warning": _get_dxvk_version_warning }, { @@ -186,7 +283,7 @@ class wine(Runner): "section": _("Graphics"), "label": _("Enable VKD3D"), "type": "bool", - "warning": self._get_vkd3d_warning, + "warning": _get_vkd3d_warning, "default": True, "active": True, "help": _( @@ -269,7 +366,7 @@ class wine(Runner): "option": "esync", "label": _("Enable Esync"), "type": "bool", - "warning": self._get_esync_warning, + "warning": _get_esync_warning, "active": True, "default": True, "help": _( @@ -283,7 +380,7 @@ class wine(Runner): "label": _("Enable Fsync"), "type": "bool", "default": is_fsync_supported(), - "warning": self._get_fsync_warning, + "warning": _get_fsync_warning, "active": True, "help": _( "Enable futex-based synchronization (fsync). " @@ -548,20 +645,7 @@ class wine(Runner): def get_path_for_version(self, version): """Return the absolute path of a wine executable for a given version""" - if version in WINE_PATHS: - return system.find_executable(WINE_PATHS[version]) - if "Proton" in version: - for proton_path in get_proton_paths(): - if os.path.isfile(os.path.join(proton_path, version, "dist/bin/wine")): - return os.path.join(proton_path, version, "dist/bin/wine") - if os.path.isfile(os.path.join(proton_path, version, "files/bin/wine")): - return os.path.join(proton_path, version, "files/bin/wine") - if version.startswith("PlayOnLinux"): - version, arch = version.split()[1].rsplit("-", 1) - return os.path.join(POL_PATH, "wine", "linux-" + arch, version, "bin/wine") - if version == "custom": - return self.runner_config.get("custom_wine_path", "") - return os.path.join(WINE_DIR, version, "bin/wine") + return _get_path_for_version(self.runner_config, version) def resolve_config_path(self, path, relative_to=None): # Resolve paths with tolerance for Windows-isms; @@ -1057,73 +1141,3 @@ class wine(Runner): logger.exception("Failed to extract exe icon: %s", err) return False - - def _get_dxvk_warning(self, config): - if config.get("dxvk") and not vkquery.is_vulkan_supported(): - return _("Vulkan is not installed or is not supported by your system") - - return None - - def _get_dxvk_version_warning(self, config): - if config.get("dxvk") and vkquery.is_vulkan_supported(): - version = config.get("dxvk_version") - if version and not version.startswith("v1."): - required_api_version = REQUIRED_VULKAN_API_VERSION - library_api_version = vkquery.get_vulkan_api_version_tuple() - if library_api_version and library_api_version < required_api_version: - return _("Lutris has detected that Vulkan API version %s is installed, " - "but to use the latest DXVK version, %s is required." - ) % ( - vkquery.format_version_tuple(library_api_version), - vkquery.format_version_tuple(required_api_version) - ) - - max_dev_name, max_dev_api_version = vkquery.get_best_device_info() - - if max_dev_api_version and max_dev_api_version < required_api_version: - return _("Lutris has detected that the best device available ('%s') supports Vulkan API %s, " - "but to use the latest DXVK version, %s is required." - ) % ( - max_dev_name, - vkquery.format_version_tuple(max_dev_api_version), - vkquery.format_version_tuple(required_api_version) - ) - - return None - - def _get_vkd3d_warning(self, config): - if config.get("vkd3d"): - if not vkquery.is_vulkan_supported(): - return _("Vulkan is not installed or is not supported by your system") - - return None - - def _get_esync_warning(self, config): - if config.get("esync"): - limits_set = is_esync_limit_set() - wine_path = self.get_path_for_version(config["version"]) - wine_ver = is_version_esync(wine_path) - - if not wine_ver: - return _("Warning The Wine build you have selected does not support Esync") - - if not limits_set: - return _("Warning Your limits are not set correctly. Please increase them as described here:\n" - "" - "How-to-Esync (https://github.com/lutris/docs/blob/master/HowToEsync.md)") - - return None - - def _get_fsync_warning(self, config): - if config.get("fsync"): - fsync_supported = is_fsync_supported() - wine_path = self.get_path_for_version(config["version"]) - wine_ver = is_version_fsync(wine_path) - - if not wine_ver: - return _("Warning The Wine build you have selected does not support Fsync.") - - if not fsync_supported: - return _("Warning Your kernel is not patched for fsync.") - - return None From 3058ac6d68daf423f48e85b989ca9b2648a76b8c Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Thu, 27 Apr 2023 19:24:09 -0400 Subject: [PATCH 23/52] Correct rebase errors --- lutris/runners/wine.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index fc9311711..5c7f59fd8 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -48,24 +48,24 @@ def _get_dxvk_version_warning(config): version = config.get("dxvk_version") if version and not version.startswith("v1."): required_api_version = REQUIRED_VULKAN_API_VERSION - library_api_version = vkquery.get_vulkan_api_version_tuple() + library_api_version = vkquery.get_vulkan_api_version() if library_api_version and library_api_version < required_api_version: return _("Lutris has detected that Vulkan API version %s is installed, " "but to use the latest DXVK version, %s is required." ) % ( - vkquery.format_version_tuple(library_api_version), - vkquery.format_version_tuple(required_api_version) + vkquery.format_version(library_api_version), + vkquery.format_version(required_api_version) ) - max_dev_name, max_dev_api_version = vkquery.get_best_device_info() + devices = vkquery.get_device_info() - if max_dev_api_version and max_dev_api_version < required_api_version: + if devices and devices[0].api_version < required_api_version: return _("Lutris has detected that the best device available ('%s') supports Vulkan API %s, " "but to use the latest DXVK version, %s is required." ) % ( - max_dev_name, - vkquery.format_version_tuple(max_dev_api_version), - vkquery.format_version_tuple(required_api_version) + devices[0].name, + vkquery.format_version(devices[0].api_version), + vkquery.format_version(required_api_version) ) return None From a9a8eaba7a3082f531d371aed8f370c5c00858b2 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sat, 29 Apr 2023 14:53:45 -0400 Subject: [PATCH 24/52] Add bolded 'Warning' to DXVK/Vulkan warnings --- lutris/runners/wine.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index 5c7f59fd8..4c2852349 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -50,7 +50,7 @@ def _get_dxvk_version_warning(config): required_api_version = REQUIRED_VULKAN_API_VERSION library_api_version = vkquery.get_vulkan_api_version() if library_api_version and library_api_version < required_api_version: - return _("Lutris has detected that Vulkan API version %s is installed, " + return _("Warning Lutris has detected that Vulkan API version %s is installed, " "but to use the latest DXVK version, %s is required." ) % ( vkquery.format_version(library_api_version), @@ -60,7 +60,7 @@ def _get_dxvk_version_warning(config): devices = vkquery.get_device_info() if devices and devices[0].api_version < required_api_version: - return _("Lutris has detected that the best device available ('%s') supports Vulkan API %s, " + return _("Warning Lutris has detected that the best device available ('%s') supports Vulkan API %s, " "but to use the latest DXVK version, %s is required." ) % ( devices[0].name, @@ -74,7 +74,7 @@ def _get_dxvk_version_warning(config): def _get_vkd3d_warning(config): if config.get("vkd3d"): if not vkquery.is_vulkan_supported(): - return _("Vulkan is not installed or is not supported by your system") + return _("Warning Vulkan is not installed or is not supported by your system") return None From 4bd280083ccdb489052c15d2a5fbcb7a0a2ee9a2 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sat, 15 Apr 2023 07:57:10 -0400 Subject: [PATCH 25/52] Add caching for all the GridViewCellRendererText sizing methods. Well, not do_get_size; it appears to never be called and is deprecated. Caching the height and width results per text improves resize performance, where the sizes of all cells are required very frequently, and this shouldn't be too big a cache - all game names that are in view are the keys, and the values are little tuples. But I'm expecting thousands of games not millions. We clear this cache when switching views, and when styles (ie, fonts) change. --- lutris/gui/views/grid.py | 17 +++++--- lutris/gui/widgets/cellrenderers.py | 60 ++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/lutris/gui/views/grid.py b/lutris/gui/views/grid.py index bfb588eaf..18213a69e 100644 --- a/lutris/gui/views/grid.py +++ b/lutris/gui/views/grid.py @@ -29,17 +29,18 @@ class GameGridView(Gtk.IconView, GameView): self.image_renderer = None self.set_item_padding(1) if hide_text: - self.cell_renderer = None + self.text_renderer = None else: - self.cell_renderer = GridViewCellRendererText() - self.pack_end(self.cell_renderer, False) - self.add_attribute(self.cell_renderer, "markup", COL_NAME) + self.text_renderer = GridViewCellRendererText() + self.pack_end(self.text_renderer, False) + self.add_attribute(self.text_renderer, "markup", COL_NAME) self.set_game_store(store) self.connect_signals() self.connect("item-activated", self.on_item_activated) self.connect("selection-changed", self.on_selection_changed) + self.connect("style-updated", self.on_style_updated) def set_game_store(self, game_store): self.game_store = game_store @@ -53,9 +54,9 @@ class GameGridView(Gtk.IconView, GameView): self.image_renderer.media_width = size[0] self.image_renderer.media_height = size[1] - if self.cell_renderer: + if self.text_renderer: cell_width = max(size[0], self.min_width) - self.cell_renderer.set_width(cell_width) + self.text_renderer.set_width(cell_width) @property def show_badges(self): @@ -104,3 +105,7 @@ class GameGridView(Gtk.IconView, GameView): selected_items = self.get_selected_item() if selected_items: self.emit("game-selected", selected_items) + + def on_style_updated(self, widget): + if self.text_renderer: + self.text_renderer.clear_caches() diff --git a/lutris/gui/widgets/cellrenderers.py b/lutris/gui/widgets/cellrenderers.py index 08e85ab55..913edde00 100644 --- a/lutris/gui/widgets/cellrenderers.py +++ b/lutris/gui/widgets/cellrenderers.py @@ -12,7 +12,8 @@ from lutris.gui.widgets.utils import ( class GridViewCellRendererText(Gtk.CellRendererText): - """CellRendererText adjusted for grid view display, removes extra padding""" + """CellRendererText adjusted for grid view display, removes extra padding + and caches cell metrics for improved resize performance.""" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -20,9 +21,66 @@ class GridViewCellRendererText(Gtk.CellRendererText): self.props.wrap_mode = Pango.WrapMode.WORD self.props.xalign = 0.5 self.props.yalign = 0 + self.fixed_width = None + self.cached_height = {} + self.cached_width = {} def set_width(self, width): + self.fixed_width = width self.props.wrap_width = width + self.clear_caches() + + def clear_caches(self): + self.cached_height.clear() + self.cached_width.clear() + + def do_get_preferred_width(self, widget): + text = self.props.text + if self.fixed_width and text in self.cached_width: + return self.cached_width[text] + + width = Gtk.CellRendererText.do_get_preferred_width(self, widget) + + if self.fixed_width: + self.cached_width[text] = width + + return width + + def do_get_preferred_width_for_height(self, widget, width): + text = self.props.text + if self.fixed_width and text in self.cached_width: + return self.cached_width[text] + + width = Gtk.CellRendererText.do_get_preferred_width_for_height(self, widget, width) + + if self.fixed_width: + self.cached_width[text] = width + + return width + + def do_get_preferred_height(self, widget): + text = self.props.text + if self.fixed_width and text in self.cached_height: + return self.cached_height[text] + + height = Gtk.CellRendererText.do_get_preferred_height(self, widget) + + if self.fixed_width: + self.cached_height[text] = height + + return height + + def do_get_preferred_height_for_width(self, widget, width): + text = self.props.text + if self.fixed_width and text in self.cached_height: + return self.cached_height[text] + + height = Gtk.CellRendererText.do_get_preferred_height_for_width(self, widget, width) + + if self.fixed_width: + self.cached_height[text] = height + + return height class GridViewCellRendererImage(Gtk.CellRenderer): From e272eca4c45dc5eac94f24457c48a0f09e2174e9 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Fri, 14 Apr 2023 16:35:11 -0400 Subject: [PATCH 26/52] Adds a check to see if the media is 'bright', and picks brighter colors for badges. It actually checks the four pixels at the corner of the bottom badge; if all are 'bright'- meaning all their color channels are >=128- then we invert the fore and back colors for all the badges on that media. This makes them blend in better, but still firmly favors dark coloration. --- lutris/gui/widgets/cellrenderers.py | 76 +++++++++++++++++++++++------ 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/lutris/gui/widgets/cellrenderers.py b/lutris/gui/widgets/cellrenderers.py index 913edde00..9378b4ac8 100644 --- a/lutris/gui/widgets/cellrenderers.py +++ b/lutris/gui/widgets/cellrenderers.py @@ -174,15 +174,14 @@ class GridViewCellRendererImage(Gtk.CellRenderer): if surface: x, y = self.get_media_position(surface, cell_area) - surface_width = get_surface_size(surface)[0] if alpha >= 1: self.render_media(cr, widget, surface, x, y) - self.render_platforms(cr, widget, x + surface_width, cell_area) + self.render_platforms(cr, widget, surface, x, cell_area) else: cr.push_group() self.render_media(cr, widget, surface, x, y) - self.render_platforms(cr, widget, x + surface_width, cell_area) + self.render_platforms(cr, widget, surface, x, cell_area) cr.pop_group_to_source() cr.paint_with_alpha(alpha) @@ -191,6 +190,45 @@ class GridViewCellRendererImage(Gtk.CellRenderer): if not self.cycle_cache_idle_id: self.cycle_cache_idle_id = GLib.idle_add(self.cycle_cache) + @staticmethod + def is_bright_corner(surface, corner_size): + """Tests several pixels near the corner of the surface where the badges + are drawn. If all are 'bright', we'll render the badges differently. This + means all 4 components must be at least 128/255.""" + surface_format = surface.get_format() + + # We only use the ARGB32 format, so we just give up + # for anything else. + if surface_format != cairo.FORMAT_ARGB32: # pylint:disable=no-member + return False + + pixel_width = surface.get_width() + pixel_height = surface.get_height() + + def is_bright_pixel(x, y): + # Checks if a pixel is 'bright'; this does not care + # if the pixel is big or little endian- it just checks + # all four channels. + if 0 <= x < pixel_width and 0 <= y < pixel_height: + stride = surface.get_stride() + data = surface.get_data() + + offset = (y * stride) + x * 4 + pixel = data[offset: offset + 4] + + for channel in pixel: + if channel < 128: + return False + return True + return False + + return ( + is_bright_pixel(pixel_width - 1, pixel_height - 1) + and is_bright_pixel(pixel_width - corner_size[0], pixel_height - 1) + and is_bright_pixel(pixel_width - 1, pixel_height - corner_size[1]) + and is_bright_pixel(pixel_width - corner_size[0], pixel_height - corner_size[1]) + ) + def get_media_position(self, surface, cell_area): """Computes the position of the upper left corner where we will render a surface within the cell area.""" @@ -221,7 +259,7 @@ class GridViewCellRendererImage(Gtk.CellRenderer): cr.rectangle(x, y, width, height) cr.fill() - def render_platforms(self, cr, widget, media_right, cell_area): + def render_platforms(self, cr, widget, surface, surface_x, cell_area): """Renders the stack of platform icons. They appear lined up vertically to the right of 'media_right', if that will fit in 'cell_area'.""" platform = self.platform @@ -235,23 +273,33 @@ class GridViewCellRendererImage(Gtk.CellRenderer): icon_paths = [get_runtime_icon_path(p + "-symbolic") for p in platforms] icon_paths = [path for path in icon_paths if path] if icon_paths: - self.render_badge_stack(cr, widget, icon_paths, icon_size, media_right, cell_area) + self.render_badge_stack(cr, widget, surface, surface_x, icon_paths, icon_size, cell_area) - def render_badge_stack(self, cr, widget, icon_paths, icon_size, media_right, cell_area): + def render_badge_stack(self, cr, widget, surface, surface_x, icon_paths, icon_size, cell_area): """Renders a vertical stack of badges, placed at the edge of the media, off to the right of 'media_right' if this will fit in the 'cell_area'. The icons in icon_paths are drawn from top to bottom, and spaced to fit in 'cell_area', even if they overlap because of this.""" - def render_badge(badge_x, badge_y, path): - cr.rectangle(badge_x, badge_y, icon_size[0], icon_size[0]) - cr.set_source_rgba(0.2, 0.2, 0.2, 0.6) - cr.fill() - - icon = self.get_cached_surface_by_path(widget, path, size=icon_size) - cr.set_source_rgba(0.8, 0.8, 0.8, 0.6) - cr.mask_surface(icon, badge_x, badge_y) badge_width = icon_size[0] badge_height = icon_size[1] + on_bright_surface = GridViewCellRendererImage.is_bright_corner(surface, (badge_width, badge_height)) + + alpha = 0.6 + bright_color = 0.8, 0.8, 0.8 + dark_color = 0.2, 0.2, 0.2 + back_color = bright_color if on_bright_surface else dark_color + fore_color = dark_color if on_bright_surface else bright_color + + def render_badge(badge_x, badge_y, path): + cr.rectangle(badge_x, badge_y, icon_size[0], icon_size[0]) + cr.set_source_rgba(back_color[0], back_color[1], back_color[2], alpha) + cr.fill() + + icon = self.get_cached_surface_by_path(widget, path, size=icon_size) + cr.set_source_rgba(fore_color[0], fore_color[1], fore_color[2], alpha) + cr.mask_surface(icon, badge_x, badge_y) + + media_right = surface_x + get_surface_size(surface)[0] x = media_right - badge_width spacing = (cell_area.height - badge_height * len(icon_paths)) / max(1, len(icon_paths) - 1) From 4290084e5409e083d4ff16f564912e4a91a7963d Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sat, 29 Apr 2023 15:04:19 -0400 Subject: [PATCH 27/52] Scale metrics for sample the corner color of media If we are using higher resolution surfaces, we should sample more pixels in. --- lutris/gui/widgets/cellrenderers.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lutris/gui/widgets/cellrenderers.py b/lutris/gui/widgets/cellrenderers.py index 9378b4ac8..7b931ab39 100644 --- a/lutris/gui/widgets/cellrenderers.py +++ b/lutris/gui/widgets/cellrenderers.py @@ -202,6 +202,11 @@ class GridViewCellRendererImage(Gtk.CellRenderer): if surface_format != cairo.FORMAT_ARGB32: # pylint:disable=no-member return False + # Scale the corner according to the surface's scale factor - + # normally the same as our UI scale factor. + device_scale_x, device_scale_y = surface.get_device_scale() + corner_pixel_width = int(corner_size[0] * device_scale_x) + corner_pixel_height = int(corner_size[1] * device_scale_y) pixel_width = surface.get_width() pixel_height = surface.get_height() @@ -224,9 +229,9 @@ class GridViewCellRendererImage(Gtk.CellRenderer): return ( is_bright_pixel(pixel_width - 1, pixel_height - 1) - and is_bright_pixel(pixel_width - corner_size[0], pixel_height - 1) - and is_bright_pixel(pixel_width - 1, pixel_height - corner_size[1]) - and is_bright_pixel(pixel_width - corner_size[0], pixel_height - corner_size[1]) + and is_bright_pixel(pixel_width - corner_pixel_width, pixel_height - 1) + and is_bright_pixel(pixel_width - 1, pixel_height - corner_pixel_height) + and is_bright_pixel(pixel_width - corner_pixel_width, pixel_height - corner_pixel_height) ) def get_media_position(self, surface, cell_area): From e2036a05504a351c1e0a9f5c33320d98957ea6bf Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Thu, 11 May 2023 18:24:15 -0400 Subject: [PATCH 28/52] Enable sidebar 'run' button for PPSSPP. Resolves #4849 --- share/lutris/json/ppsspp.json | 1 + 1 file changed, 1 insertion(+) diff --git a/share/lutris/json/ppsspp.json b/share/lutris/json/ppsspp.json index e9ba5b404..432702e8f 100644 --- a/share/lutris/json/ppsspp.json +++ b/share/lutris/json/ppsspp.json @@ -3,6 +3,7 @@ "description": "Sony PSP emulator", "platforms": ["Sony PlayStation Portable"], "runner_executable": "ppsspp/PPSSPPSDL", + "runnable_alone": true, "game_options": [ { "option": "main_file", From 8297b2cd2d599ff46e8bcc7a655d58fa3ac376d7 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Thu, 11 May 2023 18:29:39 -0400 Subject: [PATCH 29/52] Placate flake8! Also suppress bogus pylints. --- lutris/gui/widgets/cellrenderers.py | 8 ++++---- lutris/runners/dosbox.py | 10 +++++----- lutris/runners/wine.py | 7 ++++--- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/lutris/gui/widgets/cellrenderers.py b/lutris/gui/widgets/cellrenderers.py index 7b931ab39..4dbd69464 100644 --- a/lutris/gui/widgets/cellrenderers.py +++ b/lutris/gui/widgets/cellrenderers.py @@ -35,7 +35,7 @@ class GridViewCellRendererText(Gtk.CellRendererText): self.cached_width.clear() def do_get_preferred_width(self, widget): - text = self.props.text + text = self.props.text # pylint:disable=no-member if self.fixed_width and text in self.cached_width: return self.cached_width[text] @@ -47,7 +47,7 @@ class GridViewCellRendererText(Gtk.CellRendererText): return width def do_get_preferred_width_for_height(self, widget, width): - text = self.props.text + text = self.props.text # pylint:disable=no-member if self.fixed_width and text in self.cached_width: return self.cached_width[text] @@ -59,7 +59,7 @@ class GridViewCellRendererText(Gtk.CellRendererText): return width def do_get_preferred_height(self, widget): - text = self.props.text + text = self.props.text # pylint:disable=no-member if self.fixed_width and text in self.cached_height: return self.cached_height[text] @@ -71,7 +71,7 @@ class GridViewCellRendererText(Gtk.CellRendererText): return height def do_get_preferred_height_for_width(self, widget, width): - text = self.props.text + text = self.props.text # pylint:disable=no-member if self.fixed_width and text in self.cached_height: return self.cached_height[text] diff --git a/lutris/runners/dosbox.py b/lutris/runners/dosbox.py index 4751adcfc..3351bc9f0 100644 --- a/lutris/runners/dosbox.py +++ b/lutris/runners/dosbox.py @@ -120,7 +120,7 @@ class dosbox(Runner): @property def main_file(self): return self.make_absolute(self.game_config.get("main_file")) - + @property def libs_dir(self): path = os.path.join(settings.RUNNER_DIR, "dosbox/lib") @@ -129,15 +129,15 @@ class dosbox(Runner): def get_command(self): return [ self.get_executable(), - ] - + ] + def get_run_data(self): env = self.get_env() env["LD_LIBRARY_PATH"] = os.pathsep.join(filter(None, [ self.libs_dir, env.get("LD_LIBRARY_PATH")])) - return {"env": env, "command": self.get_command()} - + return {"env": env, "command": self.get_command()} + @property def working_dir(self): """Return the working directory to use when running the game.""" diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index 4c2852349..dea8db8ac 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -60,9 +60,10 @@ def _get_dxvk_version_warning(config): devices = vkquery.get_device_info() if devices and devices[0].api_version < required_api_version: - return _("Warning Lutris has detected that the best device available ('%s') supports Vulkan API %s, " - "but to use the latest DXVK version, %s is required." - ) % ( + return _( + "Warning Lutris has detected that the best device available ('%s') supports Vulkan API %s, " + "but to use the latest DXVK version, %s is required." + ) % ( devices[0].name, vkquery.format_version(devices[0].api_version), vkquery.format_version(required_api_version) From a0512ef76b7f7501953e82198ae9e061106484f8 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Thu, 11 May 2023 19:11:06 -0400 Subject: [PATCH 30/52] Correct changelog We no longer aggressively warn for old Vulkan drivers. --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index b3724ecf3..249d7bb07 100644 --- a/debian/changelog +++ b/debian/changelog @@ -21,7 +21,7 @@ lutris (0.5.13) jammy; urgency=medium * Improve detection of DOSBox games on GOG * Added "Unspecified" Vulkan ICD option * Removed ResidualVM (now merged into ScummVM) - * Detect obsolete Vulkan drivers, warn and default to DXVK 1.x for them + * Detect obsolete Vulkan drivers and default to DXVK 1.x for them * Improved High-DPI support for custom media * Performance improvements From 50a27df8406ac36afce6d40002cc4bf1c6f46ddf Mon Sep 17 00:00:00 2001 From: Mathieu Comandon Date: Thu, 11 May 2023 16:17:26 -0700 Subject: [PATCH 31/52] Formatting fixes --- lutris/runners/dosbox.py | 2 +- lutris/runners/wine.py | 5 ++--- lutris/services/amazon.py | 12 +++++++----- lutris/services/egs.py | 25 +++++++++++++++---------- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/lutris/runners/dosbox.py b/lutris/runners/dosbox.py index 3351bc9f0..d90a7b435 100644 --- a/lutris/runners/dosbox.py +++ b/lutris/runners/dosbox.py @@ -3,11 +3,11 @@ import os import shlex from gettext import gettext as _ +from lutris import settings # Lutris Modules from lutris.runners.commands.dosbox import dosexec, makeconfig # NOQA pylint: disable=unused-import from lutris.runners.runner import Runner from lutris.util import system -from lutris import settings class dosbox(Runner): diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index dea8db8ac..36a66c6f6 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -4,8 +4,6 @@ import os import shlex from gettext import gettext as _ -from lutris.util.graphics import vkquery - from lutris import runtime, settings from lutris.gui.dialogs import FileDialog from lutris.runners.commands.wine import ( # noqa: F401 pylint: disable=unused-import @@ -15,12 +13,13 @@ from lutris.runners.commands.wine import ( # noqa: F401 pylint: disable=unused- from lutris.runners.runner import Runner from lutris.util import system from lutris.util.display import DISPLAY_MANAGER, get_default_dpi +from lutris.util.graphics import vkquery from lutris.util.log import logger from lutris.util.steam.config import get_steam_dir from lutris.util.strings import parse_version, split_arguments from lutris.util.wine.d3d_extras import D3DExtrasManager from lutris.util.wine.dgvoodoo2 import dgvoodoo2Manager -from lutris.util.wine.dxvk import DXVKManager, REQUIRED_VULKAN_API_VERSION +from lutris.util.wine.dxvk import REQUIRED_VULKAN_API_VERSION, DXVKManager from lutris.util.wine.dxvk_nvapi import DXVKNVAPIManager from lutris.util.wine.extract_icon import PEFILE_AVAILABLE, ExtractIcon from lutris.util.wine.prefix import DEFAULT_DLL_OVERRIDES, WinePrefixManager, find_prefix diff --git a/lutris/services/amazon.py b/lutris/services/amazon.py index 9739ef483..1d438eef7 100644 --- a/lutris/services/amazon.py +++ b/lutris/services/amazon.py @@ -532,11 +532,13 @@ class AmazonService(OnlineService): hashes.append(file_hash) files.append({"path": file.path.decode().replace("\\", "/"), "size": file.size, "url": None}) - hashpairs.append(dict( - sourceHash=None, - targetHash=dict(value=file_hash, - algorithm=HashAlgorithm.get_name(file.hash.algorithm)), - )) + hashpairs.append({ + 'sourceHash': None, + 'targetHash': { + 'value': file_hash, + 'algorithm': HashAlgorithm.get_name(file.hash.algorithm) + } + }) for __, directory in enumerate(package.dirs): if directory.path is not None: directories.append(directory.path.decode().replace("\\", "/")) diff --git a/lutris/services/egs.py b/lutris/services/egs.py index b27e1c4cc..7096d5e3e 100644 --- a/lutris/services/egs.py +++ b/lutris/services/egs.py @@ -221,18 +221,23 @@ class EpicGamesStoreService(OnlineService): def start_session(self, exchange_code=None, authorization_code=None): if exchange_code: - params = dict(grant_type='exchange_code', - exchange_code=exchange_code, - token_type='eg1') + params = { + 'grant_type': 'exchange_code', + 'exchange_code': exchange_code, + 'token_type': 'eg1' + } elif authorization_code: - params = dict(grant_type='authorization_code', - code=authorization_code, - token_type='eg1') + params = { + 'grant_type': 'authorization_code', + 'code': authorization_code, + 'token_type': 'eg1' + } else: - params = dict(grant_type='refresh_token', - refresh_token=self.session_data["refresh_token"], - - token_type='eg1') + params = { + 'grant_type': 'refresh_token', + 'refresh_token': self.session_data["refresh_token"], + 'token_type': 'eg1' + } response = self.session.post( 'https://account-public-service-prod03.ol.epicgames.com/account/api/oauth/token', From 641d17638f4548667339877c60c5c31f72cf3074 Mon Sep 17 00:00:00 2001 From: 7HEPOW <35022098+7HEPOW@users.noreply.github.com> Date: Thu, 27 Apr 2023 20:05:00 +0200 Subject: [PATCH 32/52] Update pcsx2.py to command line of PCSX2 1.7+ - Corrected command line switches from double dashes to single dashes (e.g. -nogui instead of --nogui) - Removed --configpath and --configfile as they've been removed and replaced by per game configuration files created through the game properties in the PCSX2 GUI Rebased my code base to latest code as suggested by legluondunet in the initial PR https://github.com/lutris/lutris/pull/4828#issuecomment-1524778484 Tested with a local install of PCSX2 1.7.3753 and updated nightly 1.7.4433 --- lutris/runners/pcsx2.py | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/lutris/runners/pcsx2.py b/lutris/runners/pcsx2.py index 0f20546c7..ab5be2605 100644 --- a/lutris/runners/pcsx2.py +++ b/lutris/runners/pcsx2.py @@ -11,7 +11,7 @@ class pcsx2(Runner): description = _("PlayStation 2 emulator") platforms = [_("Sony PlayStation 2")] runnable_alone = True - runner_executable = "pcsx2/PCSX2" + runner_executable = "pcsx2/pcsx2-qt" game_options = [{ "option": "main_file", "type": "file", @@ -37,19 +37,7 @@ class pcsx2(Runner): "type": "bool", "label": _("No GUI"), "default": False - }, - { - "option": "config_file", - "type": "file", - "label": _("Custom config file"), - "advanced": True, - }, - { - "option": "config_path", - "type": "directory_chooser", - "label": _("Custom config path"), - "advanced": True, - }, + } ] # PCSX2 currently uses an AppImage, no need for the runtime. @@ -59,15 +47,11 @@ class pcsx2(Runner): arguments = [self.get_executable()] if self.runner_config.get("fullscreen"): - arguments.append("--fullscreen") + arguments.append("-fullscreen") if self.runner_config.get("full_boot"): - arguments.append("--fullboot") + arguments.append("-slowboot") if self.runner_config.get("nogui"): - arguments.append("--nogui") - if self.runner_config.get("config_file"): - arguments.append("--cfg={}".format(self.runner_config["config_file"])) - if self.runner_config.get("config_path"): - arguments.append("--cfgpath={}".format(self.runner_config["config_path"])) + arguments.append("-nogui") iso = self.game_config.get("main_file") or "" if not system.path_exists(iso): From e8c32d75648955da04c2a4561113c7e164a7564a Mon Sep 17 00:00:00 2001 From: 7HEPOW <35022098+7HEPOW@users.noreply.github.com> Date: Sun, 30 Apr 2023 11:15:39 +0200 Subject: [PATCH 33/52] Update pcsx2.py Reverted executable file name --- lutris/runners/pcsx2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lutris/runners/pcsx2.py b/lutris/runners/pcsx2.py index ab5be2605..8a7036a29 100644 --- a/lutris/runners/pcsx2.py +++ b/lutris/runners/pcsx2.py @@ -11,7 +11,7 @@ class pcsx2(Runner): description = _("PlayStation 2 emulator") platforms = [_("Sony PlayStation 2")] runnable_alone = True - runner_executable = "pcsx2/pcsx2-qt" + runner_executable = "pcsx2/PCSX2" game_options = [{ "option": "main_file", "type": "file", From 3a2cb3c3115a9bffd9f3cf799d4ff09beecfe315 Mon Sep 17 00:00:00 2001 From: Mathieu Comandon Date: Thu, 11 May 2023 19:38:09 -0700 Subject: [PATCH 34/52] Add build dependencies in Makefile --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index f3b27a457..106b4d425 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,9 @@ github-ppa: -p"gpg --batch --passphrase "${PPA_GPG_PASSPHRASE}" --pinentry-mode loopback" \ --lintian-opts --suppress-tags malformed-debian-changelog-version +build-deps-ubuntu: + sudo apt install devscripts debhelper dh-python meson + build: gbp buildpackage --git-debian-branch=${GITBRANCH} From 30aef1e47307d420df39d63d73ade249ce33dce7 Mon Sep 17 00:00:00 2001 From: Mathieu Comandon Date: Thu, 11 May 2023 19:39:05 -0700 Subject: [PATCH 35/52] Update email address in changelog --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 249d7bb07..3d4575214 100644 --- a/debian/changelog +++ b/debian/changelog @@ -25,7 +25,7 @@ lutris (0.5.13) jammy; urgency=medium * Improved High-DPI support for custom media * Performance improvements - -- Mathieu Comandon Fri, 10 Feb 2023 13:15:40 -0800 + -- Mathieu Comandon Fri, 10 Feb 2023 13:15:40 -0800 lutris (0.5.12) jammy; urgency=medium From 4d93ca2fdee5b75757f90e53090b41eefc89757b Mon Sep 17 00:00:00 2001 From: Mathieu Comandon Date: Thu, 11 May 2023 20:14:15 -0700 Subject: [PATCH 36/52] Prevent key error on loading MAME games --- lutris/scanners/lutris.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lutris/scanners/lutris.py b/lutris/scanners/lutris.py index 9bb239b6a..0fdffff02 100644 --- a/lutris/scanners/lutris.py +++ b/lutris/scanners/lutris.py @@ -109,7 +109,7 @@ def get_path_from_config(game): logger.warning("Game %s has no configuration", game) return "" # Skip MAME roms referenced by their ID - if game.runner_name == "mame" and "." not in game.config.game_config["main_file"]: + if game.runner_name == "mame" and "." not in game.config.game_config.get("main_file"): return for key in ["exe", "main_file", "iso", "rom", "disk-a", "path", "files"]: if key in game.config.game_config: From 2e8c96573b2afd5e79293d1920261af90ff27140 Mon Sep 17 00:00:00 2001 From: Mathieu Comandon Date: Thu, 11 May 2023 20:31:05 -0700 Subject: [PATCH 37/52] Prevent parse error if cache file is empty --- lutris/scanners/lutris.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lutris/scanners/lutris.py b/lutris/scanners/lutris.py index 0fdffff02..803492322 100644 --- a/lutris/scanners/lutris.py +++ b/lutris/scanners/lutris.py @@ -176,7 +176,10 @@ def remove_from_path_cache(game): def get_path_cache(): """Return the contents of the path cache file""" with open(GAME_PATH_CACHE_PATH, encoding="utf-8") as cache_file: - return json.load(cache_file) + try: + return json.load(cache_file) + except json.JSONDecodeError: + return {} def get_missing_game_ids(): From b3fba46819f65db81211f933a651a1ef097f7773 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Fri, 12 May 2023 04:32:21 -0400 Subject: [PATCH 38/52] Fix fix for main_file presence in get_path_from_config() ''"." not in None' raises an exception, so get() is not what we want here. I've redone the check assuming that if main_file is missing, it is not an ID. The later loop will wind up skipping it. --- lutris/scanners/lutris.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lutris/scanners/lutris.py b/lutris/scanners/lutris.py index 803492322..52cb9c8df 100644 --- a/lutris/scanners/lutris.py +++ b/lutris/scanners/lutris.py @@ -108,12 +108,16 @@ def get_path_from_config(game): if not game.config: logger.warning("Game %s has no configuration", game) return "" + game_config = game.config.game_config + # Skip MAME roms referenced by their ID - if game.runner_name == "mame" and "." not in game.config.game_config.get("main_file"): - return + if game.runner_name == "mame": + if "main_file" in game_config and "." not in game_config["main_file"]: + return "" + for key in ["exe", "main_file", "iso", "rom", "disk-a", "path", "files"]: - if key in game.config.game_config: - path = game.config.game_config[key] + if key in game_config: + path = game_config[key] if key == "files": path = path[0] if not path.startswith("/"): From 32d44671f4df9f805fe09424856143a5e9b88486 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sun, 14 May 2023 06:13:04 -0400 Subject: [PATCH 39/52] Warning when falling back to system WINE prefix Also, do *not* configure that prefix with DLLs and registry keys. We skip doing that for safety, if we are falling back to the default prefix; you can still specify that prefix explicitly to get the old behavior. --- lutris/runners/wine.py | 96 ++++++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 40 deletions(-) diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index 36a66c6f6..8eefd2dc3 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -574,14 +574,26 @@ class wine(Runner): @property def prefix_path(self): - """Return the absolute path of the Wine prefix""" + """Return the absolute path of the Wine prefix. Falls back to default WINE prefix.""" + _prefix_path = self._get_raw_prefix_path() + if not _prefix_path: + logger.warning("No WINE prefix provided, falling back to system default WINE prefix.") + _prefix_path = DEFAULT_WINE_PREFIX + return os.path.expanduser(_prefix_path) + + @property + def prefix_path_if_provided(self): + """Return the absolute path of the Wine prefix, if known. None if not.""" + _prefix_path = self._get_raw_prefix_path() + if _prefix_path: + return os.path.expanduser(_prefix_path) + + def _get_raw_prefix_path(self): _prefix_path = self.game_config.get("prefix") or os.environ.get("WINEPREFIX") if not _prefix_path and self.game_config.get("exe"): # Find prefix from game if we have one _prefix_path = find_prefix(self.game_exe) - if not _prefix_path: - _prefix_path = DEFAULT_WINE_PREFIX - return os.path.expanduser(_prefix_path) + return _prefix_path @property def game_exe(self): @@ -824,35 +836,37 @@ class wine(Runner): def set_regedit_keys(self): """Reset regedit keys according to config.""" - prefix_manager = WinePrefixManager(self.prefix_path) - # Those options are directly changed with the prefix manager and skip - # any calls to regedit. - managed_keys = { - "ShowCrashDialog": prefix_manager.set_crash_dialogs, - "Desktop": prefix_manager.set_virtual_desktop, - "WineDesktop": prefix_manager.set_desktop_size, - } + prefix = self.prefix_path_if_provided + if prefix: + prefix_manager = WinePrefixManager(prefix) + # Those options are directly changed with the prefix manager and skip + # any calls to regedit. + managed_keys = { + "ShowCrashDialog": prefix_manager.set_crash_dialogs, + "Desktop": prefix_manager.set_virtual_desktop, + "WineDesktop": prefix_manager.set_desktop_size, + } - for key, path in self.reg_keys.items(): - value = self.runner_config.get(key) or "auto" - if not value or value == "auto" and key not in managed_keys: - prefix_manager.clear_registry_subkeys(path, key) - elif key in self.runner_config: - if key in managed_keys: - # Do not pass fallback 'auto' value to managed keys - if value == "auto": - value = None - managed_keys[key](value) - continue - # Convert numeric strings to integers so they are saved as dword - if value.isdigit(): - value = int(value) + for key, path in self.reg_keys.items(): + value = self.runner_config.get(key) or "auto" + if not value or value == "auto" and key not in managed_keys: + prefix_manager.clear_registry_subkeys(path, key) + elif key in self.runner_config: + if key in managed_keys: + # Do not pass fallback 'auto' value to managed keys + if value == "auto": + value = None + managed_keys[key](value) + continue + # Convert numeric strings to integers so they are saved as dword + if value.isdigit(): + value = int(value) - prefix_manager.set_registry_key(path, key, value) + prefix_manager.set_registry_key(path, key, value) - # We always configure the DPI, because if the user turns off DPI scaling, but it - # had been on the only way to implement that is to save 96 DPI into the registry. - prefix_manager.set_dpi(self.get_dpi()) + # We always configure the DPI, because if the user turns off DPI scaling, but it + # had been on the only way to implement that is to save 96 DPI into the registry. + prefix_manager.set_dpi(self.get_dpi()) def get_dpi(self): """Return the DPI to be used by Wine; returns None to allow Wine's own @@ -898,17 +912,19 @@ class wine(Runner): ] managers = {} + prefix = self.prefix_path_if_provided - for manager_class, enabled_option, version_option in manager_classes: - enabled = bool(self.runner_config.get(enabled_option)) - version = self.runner_config.get(version_option) - if enabled or not enabled_only: - manager = manager_class( - self.prefix_path, - arch=self.wine_arch, - version=version - ) - managers[manager] = enabled + if prefix: + for manager_class, enabled_option, version_option in manager_classes: + enabled = bool(self.runner_config.get(enabled_option)) + version = self.runner_config.get(version_option) + if enabled or not enabled_only: + manager = manager_class( + prefix, + arch=self.wine_arch, + version=version + ) + managers[manager] = enabled return managers From e83e3f054c54da93b77f38f10cd8263e278ff0d0 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sun, 14 May 2023 06:26:45 -0400 Subject: [PATCH 40/52] Provide the prefix, working_dir and arch to the implicit runner in wineexec. There's now a way to override these settings, but we only use it when wineexec creates a runner. This runner has no config, and would fall back on the default (system!) prefix without this commit. That's not nice at all can't be controlled by the user. The main effect of this commit is that DLLs and registry keys get applied to the game's prefix before running a WINE installer. I think this is more likely to make the installer work, but in any case reconfiguring the system default wineprefix (~/.wine) to install in some other prefix is quite antisocial. --- lutris/runners/commands/wine.py | 2 +- lutris/runners/wine.py | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lutris/runners/commands/wine.py b/lutris/runners/commands/wine.py index 975fa0e21..60621d635 100644 --- a/lutris/runners/commands/wine.py +++ b/lutris/runners/commands/wine.py @@ -247,7 +247,7 @@ def wineexec( # noqa: C901 exclude_processes = shlex.split(exclude_processes) if not runner: - runner = import_runner("wine")() + runner = import_runner("wine")(prefix=prefix, working_dir=working_dir, wine_arch=arch) if not wine_path: wine_path = runner.get_executable() diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index 8eefd2dc3..41ea0051b 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -203,8 +203,11 @@ class wine(Runner): "wineboot.exe", ) - def __init__(self, config=None): # noqa: C901 + def __init__(self, config=None, prefix=None, working_dir=None, wine_arch=None): # noqa: C901 super().__init__(config) + self._prefix = prefix + self._working_dir = working_dir + self._wine_arch = wine_arch self.dll_overrides = DEFAULT_DLL_OVERRIDES.copy() # we'll modify this, so we better copy it def get_wine_version_choices(): @@ -589,7 +592,7 @@ class wine(Runner): return os.path.expanduser(_prefix_path) def _get_raw_prefix_path(self): - _prefix_path = self.game_config.get("prefix") or os.environ.get("WINEPREFIX") + _prefix_path = self._prefix or self.game_config.get("prefix") or os.environ.get("WINEPREFIX") if not _prefix_path and self.game_config.get("exe"): # Find prefix from game if we have one _prefix_path = find_prefix(self.game_exe) @@ -613,9 +616,9 @@ class wine(Runner): @property def working_dir(self): """Return the working directory to use when running the game.""" - option = self.game_config.get("working_dir") - if option: - return option + _working_dir = self._working_dir or self.game_config.get("working_dir") + if _working_dir: + return _working_dir if self.game_exe: game_dir = os.path.dirname(self.game_exe) if os.path.isdir(game_dir): @@ -632,7 +635,7 @@ class wine(Runner): """Return the wine architecture. Get it from the config or detect it from the prefix""" - arch = self.game_config.get("arch") or "auto" + arch = self._wine_arch or self.game_config.get("arch") or "auto" if arch not in ("win32", "win64"): arch = detect_arch(self.prefix_path, self.get_executable()) return arch From 31f327b50e9f3b652bf9b365824594a86a22343f Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sun, 14 May 2023 06:32:29 -0400 Subject: [PATCH 41/52] Update PCSX2 unit test The switches have all changed, and config-file support is gone entirely. --- tests/runners/test_pcsx2.py | 40 ++++++------------------------------- 1 file changed, 6 insertions(+), 34 deletions(-) diff --git a/tests/runners/test_pcsx2.py b/tests/runners/test_pcsx2.py index d0b0e1e7a..5b4b52fb0 100644 --- a/tests/runners/test_pcsx2.py +++ b/tests/runners/test_pcsx2.py @@ -28,7 +28,7 @@ class TestPCSX2Runner(unittest.TestCase): mock_config.game_config = {'main_file': main_file} mock_config.runner_config = {'fullscreen': True} self.runner.config = mock_config - expected = {'command': [self.runner.get_executable(), '--fullscreen', main_file]} + expected = {'command': [self.runner.get_executable(), '-fullscreen', main_file]} self.assertEqual(self.runner.play(), expected) @patch('lutris.util.system.path_exists') @@ -39,7 +39,7 @@ class TestPCSX2Runner(unittest.TestCase): mock_config.game_config = {'main_file': main_file} mock_config.runner_config = {'full_boot': True} self.runner.config = mock_config - expected = {'command': [self.runner.get_executable(), '--fullboot', main_file]} + expected = {'command': [self.runner.get_executable(), '-slowboot', main_file]} self.assertEqual(self.runner.play(), expected) @patch('lutris.util.system.path_exists') @@ -50,47 +50,19 @@ class TestPCSX2Runner(unittest.TestCase): mock_config.game_config = {'main_file': main_file} mock_config.runner_config = {'nogui': True} self.runner.config = mock_config - expected = {'command': [self.runner.get_executable(), '--nogui', main_file]} - self.assertEqual(self.runner.play(), expected) - - @patch('lutris.util.system.path_exists') - def test_play_cfg_set(self, mock_path_exists): - main_file = '/valid/path/to/iso' - config_file = '/valid/path/to/cfg' - cfg_arg = '--cfg=' + config_file - mock_path_exists.return_value = True - mock_config = MagicMock() - mock_config.game_config = {'main_file': main_file} - mock_config.runner_config = {'config_file': config_file} - self.runner.config = mock_config - expected = {'command': [self.runner.get_executable(), cfg_arg, main_file]} - self.assertEqual(self.runner.play(), expected) - - @patch('lutris.util.system.path_exists') - def test_play_cfgpath_set(self, mock_path_exists): - main_file = '/valid/path/to/iso' - config_path = '/valid/path/to/cfgpath' - cfgpath_arg = '--cfgpath=' + config_path - mock_path_exists.return_value = True - mock_config = MagicMock() - mock_config.game_config = {'main_file': main_file} - mock_config.runner_config = {'config_path': config_path} - self.runner.config = mock_config - expected = {'command': [self.runner.get_executable(), cfgpath_arg, main_file]} + expected = {'command': [self.runner.get_executable(), '-nogui', main_file]} self.assertEqual(self.runner.play(), expected) @patch('lutris.util.system.path_exists') def test_play(self, mock_path_exists): main_file = '/valid/path/to/iso' - config_path = '/valid/path/to/cfgpath' - cfgpath_arg = '--cfgpath=' + config_path mock_path_exists.return_value = True mock_config = MagicMock() mock_config.game_config = {'main_file': main_file} mock_config.runner_config = { - 'config_path': config_path, 'fullscreen': False, 'nogui': True, - 'full_boot': True, 'config_file': '', + 'fullscreen': False, 'nogui': True, + 'full_boot': True, } self.runner.config = mock_config - expected = {'command': [self.runner.get_executable(), '--fullboot', '--nogui', cfgpath_arg, main_file]} + expected = {'command': [self.runner.get_executable(), '-slowboot', '-nogui', main_file]} self.assertEqual(self.runner.play(), expected) From c6db1e46f29fa5cd2da72b887aec095b9d1c5feb Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sun, 14 May 2023 06:38:33 -0400 Subject: [PATCH 42/52] Further defensive code for prelaunch() Disable most of prelaunch() when the prefix is falling back to the system default. We'll only create it if it is missing. I don't think it was really doing anything anymore, but better to be safe. --- lutris/runners/wine.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index 41ea0051b..2f2f84589 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -892,15 +892,17 @@ class wine(Runner): logger.warning("No valid prefix detected in %s, creating one...", self.prefix_path) create_prefix(self.prefix_path, wine_path=self.get_executable(), arch=self.wine_arch, runner=self) - prefix_manager = WinePrefixManager(self.prefix_path) - if self.runner_config.get("autoconf_joypad", False): - prefix_manager.configure_joypads() - prefix_manager.create_user_symlinks() - self.sandbox(prefix_manager) - self.set_regedit_keys() + prefix = self.prefix_path_if_provided + if prefix: + prefix_manager = WinePrefixManager(prefix) + if self.runner_config.get("autoconf_joypad", False): + prefix_manager.configure_joypads() + prefix_manager.create_user_symlinks() + self.sandbox(prefix_manager) + self.set_regedit_keys() - for manager, enabled in self.get_dll_managers().items(): - manager.setup(enabled) + for manager, enabled in self.get_dll_managers().items(): + manager.setup(enabled) def get_dll_managers(self, enabled_only=False): """Returns the DLL managers in a dict; the keys are the managers themselves, From 8e928437056ce3935399748f880f1cfb322b2cd5 Mon Sep 17 00:00:00 2001 From: Mathieu Comandon Date: Sun, 14 May 2023 20:16:57 -0700 Subject: [PATCH 43/52] Remove BS error messages --- lutris/services/amazon.py | 9 ++++----- lutris/services/gog.py | 2 +- lutris/services/humblebundle.py | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lutris/services/amazon.py b/lutris/services/amazon.py index 1d438eef7..e4874b1b0 100644 --- a/lutris/services/amazon.py +++ b/lutris/services/amazon.py @@ -437,7 +437,7 @@ class AmazonService(OnlineService): if not response: logger.error("There was an error getting game manifest: %s", game_id) raise UnavailableGameError(_( - "Unable to get game manifest info, please check your Amazon credentials and internet connectivity")) + "Unable to get game manifest info")) return response @@ -455,7 +455,7 @@ class AmazonService(OnlineService): except HTTPError as ex: logger.error("Failed http request %s", url) raise UnavailableGameError(_( - "Unable to get game manifest, please check your Amazon credentials and internet connectivity")) from ex + "Unable to get game manifest")) from ex content = request.content @@ -471,8 +471,7 @@ class AmazonService(OnlineService): else: logger.error("Unknown compression algorithm found in manifest") raise UnavailableGameError(_( - "Unknown compression algorithm found in manifest, " - "please check your Amazon credentials and internet connectivity")) + "Unknown compression algorithm found in manifest")) manifest = Manifest() manifest.decode(raw_manifest) @@ -574,7 +573,7 @@ class AmazonService(OnlineService): except HTTPError as ex: logger.error("Failed http request %s", fuel_url) raise UnavailableGameError(_( - "Unable to get fuel.json file, please check your Amazon credentials and internet connectivity")) from ex + "Unable to get fuel.json file, please check your Amazon credentials")) from ex try: res_yaml_text = request.text diff --git a/lutris/services/gog.py b/lutris/services/gog.py index 6903fab9e..f8c46b7da 100644 --- a/lutris/services/gog.py +++ b/lutris/services/gog.py @@ -226,7 +226,7 @@ class GOGService(OnlineService): request.get() except HTTPError: logger.error( - "Failed to request %s, check your GOG credentials and internet connectivity", + "Failed to request %s, check your GOG credentials", url, ) return diff --git a/lutris/services/humblebundle.py b/lutris/services/humblebundle.py index d2cfc3f10..9156b17f8 100644 --- a/lutris/services/humblebundle.py +++ b/lutris/services/humblebundle.py @@ -133,7 +133,7 @@ class HumbleBundleService(OnlineService): request.get() except HTTPError: logger.error( - "Failed to request %s, check your Humble Bundle credentials and internet connectivity", + "Failed to request %s, check your Humble Bundle credentials", url, ) return From a661a04e76351c9d864597aad1f69a16d9dd6168 Mon Sep 17 00:00:00 2001 From: Mathieu Comandon Date: Sun, 14 May 2023 23:25:57 -0700 Subject: [PATCH 44/52] Refine empty label based on library content --- lutris/database/games.py | 5 +++++ lutris/gui/lutriswindow.py | 11 +++++++---- lutris/scanners/lutris.py | 1 + 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/lutris/database/games.py b/lutris/database/games.py index 3b8813fd6..0c68048c0 100644 --- a/lutris/database/games.py +++ b/lutris/database/games.py @@ -246,3 +246,8 @@ def get_unusued_game_name(game_name): assigned_name = f"{game_name} {assigned_index}" return assigned_name + +def get_game_count(param, value): + res = sql.db_select(settings.PGA_DB, "games", fields=("COUNT(id)",), condition=(param, value)) + if res: + return res[0]["COUNT(id)"] \ No newline at end of file diff --git a/lutris/gui/lutriswindow.py b/lutris/gui/lutriswindow.py index d7622f6d4..760a66c10 100644 --- a/lutris/gui/lutriswindow.py +++ b/lutris/gui/lutriswindow.py @@ -535,13 +535,15 @@ class LutrisWindow(Gtk.ApplicationWindow, def show_empty_label(self): """Display a label when the view is empty""" filter_text = self.filters.get("text") + has_uninstalled_games = games_db.get_game_count("installed", "0") + has_hidden_games = games_db.get_game_count("hidden", "1") if filter_text: if self.filters.get("category") == "favorite": self.show_label(_("Add a game matching '%s' to your favorites to see it here.") % filter_text) - elif self.filters.get("installed"): + elif self.filters.get("installed") and has_uninstalled_games: self.show_label( _("No installed games matching '%s' found. Press Ctrl+I to show uninstalled games.") % filter_text) - elif self.filters.get("hidden") is False: # but not if missing! + elif self.filters.get("hidden") is False and has_hidden_games: # but not if missing! self.show_label(_("No visible games matching '%s' found. Press Ctrl+H to show hidden games.") % filter_text) else: @@ -549,14 +551,15 @@ class LutrisWindow(Gtk.ApplicationWindow, else: if self.filters.get("category") == "favorite": self.show_label(_("Add games to your favorites to see them here.")) - elif self.filters.get("installed"): + elif self.filters.get("installed") and has_uninstalled_games: self.show_label(_("No installed games found. Press Ctrl+I to show uninstalled games.")) - elif self.filters.get("hidden") is False: # but not if missing! + elif self.filters.get("hidden") is False and has_hidden_games: # but not if missing! self.show_label(_("No visible games found. Press Ctrl+H to show hidden games.")) elif ( not self.filters.get("runner") and not self.filters.get("service") and not self.filters.get("platform") + and not self.filters.get("dynamic_category") ): self.show_splash() else: diff --git a/lutris/scanners/lutris.py b/lutris/scanners/lutris.py index 52cb9c8df..dd0f3f281 100644 --- a/lutris/scanners/lutris.py +++ b/lutris/scanners/lutris.py @@ -188,6 +188,7 @@ def get_path_cache(): def get_missing_game_ids(): """Return a list of IDs for games that can't be found""" + logger.debug("Checking for missing games") missing_ids = [] for game_id, path in get_path_cache().items(): if not os.path.exists(path): From 9813ac14c428e93fa1aa713d2d01e1682a27e542 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Mon, 15 May 2023 03:46:48 -0400 Subject: [PATCH 45/52] Warning for Wine games with no prefix at all --- lutris/runners/wine.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index 2f2f84589..9586b1fe2 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -35,6 +35,13 @@ DEFAULT_WINE_PREFIX = "~/.wine" MIN_SAFE_VERSION = "7.0" # Wine installers must run with at least this version +def _get_prefix_warning(config): + if not config.get("prefix"): + return _("Some Wine configuration options cannot be applied without an explicit prefix.") + + return None + + def _get_dxvk_warning(config): if config.get("dxvk") and not vkquery.is_vulkan_supported(): return _("Vulkan is not installed or is not supported by your system") @@ -168,6 +175,7 @@ class wine(Runner): "option": "prefix", "type": "directory_chooser", "label": _("Wine prefix"), + "warning": _get_prefix_warning, "help": _( 'The prefix used by Wine.\n' "It's a directory containing a set of files and " From 1a4c31163c4e52015d8dec770c342edfac7a78b9 Mon Sep 17 00:00:00 2001 From: Mathieu Comandon Date: Tue, 16 May 2023 10:44:21 -0700 Subject: [PATCH 46/52] Handle file not found errors while creating game folder --- lutris/installer/interpreter.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lutris/installer/interpreter.py b/lutris/installer/interpreter.py index 9391127a7..164e2e395 100644 --- a/lutris/installer/interpreter.py +++ b/lutris/installer/interpreter.py @@ -223,7 +223,11 @@ class ScriptInterpreter(GObject.Object, CommandsMixin): _("Lutris does not have the necessary permissions to install to path:"), self.target_path, ) from err - + except FileNotFoundError as err: + raise ScriptingError( + _("Path %s not found, unable to create game folder. Is the disk mounted?"), + self.target_path, + ) from err def get_runners_to_install(self): """Check if the runner is installed before starting the installation Install the required runner(s) if necessary. This should handle runner From 8241e2c3a71a7decb9670031ee6ceedd0d33e7ac Mon Sep 17 00:00:00 2001 From: Mathieu Comandon Date: Tue, 16 May 2023 11:59:36 -0700 Subject: [PATCH 47/52] Update release date and contact email --- AUTHORS | 4 ++-- CONTRIBUTING.md | 8 +++++--- debian/changelog | 2 +- debian/control | 2 +- debian/copyright | 6 +++--- lutris/database/games.py | 3 ++- lutris/gui/application.py | 2 +- setup.py | 2 +- share/metainfo/net.lutris.Lutris.metainfo.xml | 4 ++-- 9 files changed, 18 insertions(+), 15 deletions(-) diff --git a/AUTHORS b/AUTHORS index 0aa827840..9b45bcb68 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,8 +1,8 @@ -Copyright (C) 2010-2022 Mathieu Comandon +Copyright (C) 2009 Mathieu Comandon Contributors: - Mathieu Comandon + Mathieu Comandon Pascal Reinhard (Xodetaetl) Daniel J (@djazz) Tom Todd diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 10efd3110..8a7261f1b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,10 @@ Contributing to Lutris ====================== +IMPORTANT! + +If you contribute to Lutris on a somewhat regular basis, be sure to add yourself to the AUTHORS file! + Finding features to work on --------------------------- @@ -19,9 +23,7 @@ issues](https://github.com/lutris/lutris/issues?q=is%3Aissue+is%3Aopen+label%3A% that can't be reproduced on the developers setup. Other issues, tagged [need help](https://github.com/lutris/lutris/issues?q=is%3Aissue+is%3Aopen+label%3A%22need+help%22) might be a bit more technical to resolve but you can always have a look and see -if they fit your area of expertise. Also, while not fully ready, we do -appreciate receiving translations for other languages, support for i18n will -come in a future update. +if they fit your area of expertise. Note that Lutris is not a playground or a toy project. One cannot submit new features that aren't on the roadmap and submit a pull request for them without diff --git a/debian/changelog b/debian/changelog index 3d4575214..72cb85094 100644 --- a/debian/changelog +++ b/debian/changelog @@ -25,7 +25,7 @@ lutris (0.5.13) jammy; urgency=medium * Improved High-DPI support for custom media * Performance improvements - -- Mathieu Comandon Fri, 10 Feb 2023 13:15:40 -0800 + -- Mathieu Comandon Fri, 16 May 2023 13:15:40 -0800 lutris (0.5.12) jammy; urgency=medium diff --git a/debian/control b/debian/control index ba81029ce..80e52a53b 100644 --- a/debian/control +++ b/debian/control @@ -1,7 +1,7 @@ Source: lutris Section: games Priority: optional -Maintainer: Mathieu Comandon +Maintainer: Mathieu Comandon Build-Depends: debhelper-compat (= 12), appstream, dh-sequence-python3, diff --git a/debian/copyright b/debian/copyright index 372a012d7..7cbd60a6b 100644 --- a/debian/copyright +++ b/debian/copyright @@ -1,16 +1,16 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: lutris -Upstream-Contact: Mathieu Comandon +Upstream-Contact: Mathieu Comandon Upstream-Source: https://github.com/lutris Files: * -Copyright: 2009 Mathieu Comandon +Copyright: 2009 Mathieu Comandon License: GPL-3.0-or-later On Debian systems, the complete text of the General Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". Files: share/metainfo/net.lutris.Lutris.metainfo.xml -Copyright: Lutris Team +Copyright: Lutris Team License: CC0-1.0 On Debian systems, the complete text of the CC0-1.0 license can be found in "/usr/share/common-licenses/CC0-1.0". diff --git a/lutris/database/games.py b/lutris/database/games.py index 0c68048c0..ede0a7af4 100644 --- a/lutris/database/games.py +++ b/lutris/database/games.py @@ -247,7 +247,8 @@ def get_unusued_game_name(game_name): return assigned_name + def get_game_count(param, value): res = sql.db_select(settings.PGA_DB, "games", fields=("COUNT(id)",), condition=(param, value)) if res: - return res[0]["COUNT(id)"] \ No newline at end of file + return res[0]["COUNT(id)"] diff --git a/lutris/gui/application.py b/lutris/gui/application.py index c4cc82617..de02abab4 100644 --- a/lutris/gui/application.py +++ b/lutris/gui/application.py @@ -1,6 +1,6 @@ # pylint: disable=wrong-import-position # -# Copyright (C) 2009 Mathieu Comandon +# Copyright (C) 2009 Mathieu Comandon # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/setup.py b/setup.py index df249e04f..a2553471f 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ setup( version=VERSION, license='GPL-3', author='Mathieu Comandon', - author_email='strider@strycore.com', + author_email='mathieucomandon@gmail.com', packages=[ 'lutris', 'lutris.database', diff --git a/share/metainfo/net.lutris.Lutris.metainfo.xml b/share/metainfo/net.lutris.Lutris.metainfo.xml index 93aee5e5d..0b7c41e97 100644 --- a/share/metainfo/net.lutris.Lutris.metainfo.xml +++ b/share/metainfo/net.lutris.Lutris.metainfo.xml @@ -6,7 +6,7 @@ CC0-1.0 lutris Lutris Team - strider@strycore.com + mathieucomandon@gmail.com Lutris Video game preservation platform @@ -24,7 +24,7 @@ https://github.com/lutris/lutris/issues net.lutris.Lutris.desktop - + From 555daa3c7bed1f9efbff97530ec8f5a402893e72 Mon Sep 17 00:00:00 2001 From: Mathieu Comandon Date: Tue, 16 May 2023 13:12:20 -0700 Subject: [PATCH 48/52] Try with non quoted passphrase (quoted in secrets) --- .github/scripts/build-ubuntu.sh | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/scripts/build-ubuntu.sh b/.github/scripts/build-ubuntu.sh index c7ab0599e..4147b71d3 100755 --- a/.github/scripts/build-ubuntu.sh +++ b/.github/scripts/build-ubuntu.sh @@ -74,7 +74,7 @@ if [[ -z $PPA_GPG_KEY_ID ]]; then PPA_GPG_KEY_ID=$(echo "${PPA_GPG_PRIVATE_KEY}" | gpg --import-options show-only --import | sed -n '2s/^\s*//p') export PPA_GPG_KEY_ID echo "${PPA_GPG_KEY_ID}" - echo "${PPA_GPG_PRIVATE_KEY}" | gpg --batch --passphrase "${PPA_GPG_PASSPHRASE}" --import + echo "${PPA_GPG_PRIVATE_KEY}" | gpg --batch --passphrase ${PPA_GPG_PASSPHRASE} --import echo "::endgroup::" # May as well since we don't need after at this point. diff --git a/Makefile b/Makefile index 106b4d425..85f3f295b 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ github-ppa: # so that _must_ be the last parameter. echo "y" | debuild -S \ -k"${PPA_GPG_KEY_ID}" \ - -p"gpg --batch --passphrase "${PPA_GPG_PASSPHRASE}" --pinentry-mode loopback" \ + -p"gpg --batch --passphrase ${PPA_GPG_PASSPHRASE} --pinentry-mode loopback" \ --lintian-opts --suppress-tags malformed-debian-changelog-version build-deps-ubuntu: From 1fd460b8e38f9ab1c7bcdaf3452dd3e03e304f1a Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Wed, 17 May 2023 19:27:02 -0400 Subject: [PATCH 49/52] Back off no-Wine-prefix warning some I made this a very simple test at the last minute before the release for a missing Wine prefix, but it warns too much. Many games get no prefix by default, but the prefix can be deduced. So, this rephrases the warning and also hides it if a prefix can be found from the 'exe' of the game. Deducing the prefix from $WINEPREFIX does not count; you can't rely on that, so you should put the prefix in the game config. Also, let's display exceptions from the warning function as the warning; just so an error happening in there doesn't break the configuration more than need be. --- lutris/gui/config/boxes.py | 12 ++++++++---- lutris/installer/interpreter.py | 1 + lutris/runners/wine.py | 10 +++++++--- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/lutris/gui/config/boxes.py b/lutris/gui/config/boxes.py index 859ebb6df..bac369c80 100644 --- a/lutris/gui/config/boxes.py +++ b/lutris/gui/config/boxes.py @@ -203,10 +203,14 @@ class ConfigBox(VBox): self.pack_start(self.warning_label, False, False, 0) def update_warning(self, config): - if callable(self.warning): - text = self.warning(config) - else: - text = self.warning + try: + if callable(self.warning): + text = self.warning(config) + else: + text = self.warning + except Exception as err: + logger.exception("Unable to generate configuration warning: %s", err) + text = str(err) if text: self.warning_label.set_markup(str(text)) diff --git a/lutris/installer/interpreter.py b/lutris/installer/interpreter.py index 164e2e395..d83ba4ea9 100644 --- a/lutris/installer/interpreter.py +++ b/lutris/installer/interpreter.py @@ -228,6 +228,7 @@ class ScriptInterpreter(GObject.Object, CommandsMixin): _("Path %s not found, unable to create game folder. Is the disk mounted?"), self.target_path, ) from err + def get_runners_to_install(self): """Check if the runner is installed before starting the installation Install the required runner(s) if necessary. This should handle runner diff --git a/lutris/runners/wine.py b/lutris/runners/wine.py index 9586b1fe2..df31a06a6 100644 --- a/lutris/runners/wine.py +++ b/lutris/runners/wine.py @@ -36,10 +36,14 @@ MIN_SAFE_VERSION = "7.0" # Wine installers must run with at least this version def _get_prefix_warning(config): - if not config.get("prefix"): - return _("Some Wine configuration options cannot be applied without an explicit prefix.") + if config.get("prefix"): + return None - return None + exe = config.get("exe") + if exe and find_prefix(exe): + return None + + return _("Some Wine configuration options cannot be applied, if no prefix can be found.") def _get_dxvk_warning(config): From 4d4d7f6319b0a0b63c5c23728dea50be8eca0dc7 Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Thu, 18 May 2023 17:00:13 -0400 Subject: [PATCH 50/52] Handle obsolete runners more safely. Resolves #4863 In case one winds up in the sidebar, it will have no actions. --- lutris/gui/widgets/sidebar.py | 7 ++++++- lutris/runners/__init__.py | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lutris/gui/widgets/sidebar.py b/lutris/gui/widgets/sidebar.py index b54260ebc..00e962207 100644 --- a/lutris/gui/widgets/sidebar.py +++ b/lutris/gui/widgets/sidebar.py @@ -15,6 +15,7 @@ from lutris.gui.dialogs import ErrorDialog from lutris.gui.dialogs.runner_install import RunnerInstallDialog from lutris.gui.widgets.utils import has_stock_icon from lutris.installer.interpreter import ScriptInterpreter +from lutris.runners import InvalidRunner from lutris.services import SERVICES from lutris.services.base import AuthTokenExpired, BaseService @@ -212,7 +213,11 @@ class RunnerSidebarRow(SidebarRow): # Creation is delayed because only installed runners can be imported # and all visible boxes should be installed. - self.runner = runners.import_runner(self.id)() + try: + self.runner = runners.import_runner(self.id)() + except InvalidRunner: + return entries + if self.runner.multiple_versions: entries.append(( "system-software-install-symbolic", diff --git a/lutris/runners/__init__.py b/lutris/runners/__init__.py index 0f5cb1e7f..fb59191b2 100644 --- a/lutris/runners/__init__.py +++ b/lutris/runners/__init__.py @@ -120,7 +120,10 @@ def get_runner_human_name(runner_name): names.""" if runner_name: if runner_name not in _cached_runner_human_names: - _cached_runner_human_names[runner_name] = import_runner(runner_name)().human_name + try: + _cached_runner_human_names[runner_name] = import_runner(runner_name)().human_name + except InvalidRunner: + _cached_runner_human_names[runner_name] = runner_name # an obsolete runner return _cached_runner_human_names[runner_name] return "" From ada7f28d56370c32d83fc93e0a4d113f087ea61b Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sat, 20 May 2023 03:31:24 -0400 Subject: [PATCH 51/52] Add dependency on python3-gi-cairo everywhere it seems to matter. Resolves #4857. It seems to me that Debian requires an extra package for PyCairo, but RPM and PIP based installs do not. That's strange, but at least this much seems to be needed. --- .travis.yml | 1 + INSTALL.rst | 4 ++-- debian/control | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ec50a82bb..f30d3fb79 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,7 @@ addons: - libdbus-1-dev - python3-yaml - python3-gi + - python3-gi-cairo - python3-pil - python3-setproctitle - python3-distro diff --git a/INSTALL.rst b/INSTALL.rst index 94d5cc756..395f0aff8 100644 --- a/INSTALL.rst +++ b/INSTALL.rst @@ -12,7 +12,7 @@ Lutris manually, it requires the following components: * Python >= 3.7 * PyGObject - * PyGObject bindings for: Gtk, Gdk, GnomeDesktop, Webkit2, Notify + * PyGObject bindings for: Gtk, Gdk, Cairo, GnomeDesktop, Webkit2, Notify * python3-requests * python3-pillow * python3-yaml @@ -40,7 +40,7 @@ games themselves we recommend you install the following packages: To install all those dependencies (except for Wine and graphics drivers) on Ubuntu based systems, you can run:: - sudo apt install python3-yaml python3-requests python3-pil python3-gi \ + sudo apt install python3-yaml python3-requests python3-pil python3-gi python3-gi-cairo \ gir1.2-gtk-3.0 gir1.2-gnomedesktop-3.0 gir1.2-webkit2-4.0 \ gir1.2-notify-0.7 psmisc cabextract unzip p7zip curl fluid-soundfont-gs \ x11-xserver-utils python3-evdev libc6-i386 lib32gcc1 libgirepository1.0-dev \ diff --git a/debian/control b/debian/control index 80e52a53b..f8bcab09e 100644 --- a/debian/control +++ b/debian/control @@ -21,6 +21,7 @@ Depends: ${misc:Depends}, python3-requests, python3-pil, python3-gi, + python3-gi-cairo, python3-setproctitle, python3-magic, python3-distro, From b2044a227b5eaec7d3cbedb6922509d7632ef66b Mon Sep 17 00:00:00 2001 From: Daniel Johnson Date: Sun, 21 May 2023 06:01:03 -0400 Subject: [PATCH 52/52] Oh my. ErrorDialog(str(err)) is no good- we need gtk_safe() here! Error messages can and do contain things in angle brackets, and Pango reacts badly to that. The fix is to pass the exception itself in as the error. ErrorDialog detects that this is an exception and uses gtk_safe(). Many examples of str(error) become just error. A few rename; I've checked these, and in these cases the text is not used as markup, I think. --- lutris/gui/addgameswindow.py | 4 ++-- lutris/gui/application.py | 2 +- lutris/gui/config/boxes.py | 3 ++- lutris/gui/config/common.py | 2 +- lutris/gui/config/runner_box.py | 2 +- lutris/gui/dialogs/__init__.py | 15 +++++++++++---- lutris/gui/installerwindow.py | 2 +- lutris/gui/lutriswindow.py | 6 +++--- lutris/gui/widgets/searchable_combobox.py | 2 +- lutris/gui/widgets/sidebar.py | 4 ++-- lutris/installer/interpreter.py | 2 +- lutris/util/display.py | 2 +- 12 files changed, 27 insertions(+), 19 deletions(-) diff --git a/lutris/gui/addgameswindow.py b/lutris/gui/addgameswindow.py index d3d0a5be7..8a7b5b4e8 100644 --- a/lutris/gui/addgameswindow.py +++ b/lutris/gui/addgameswindow.py @@ -160,7 +160,7 @@ class AddGamesWindow(ModelessDialog): # pylint: disable=too-many-public-methods self.destroy() def on_watched_error(self, error): - ErrorDialog(str(error), parent=self) + ErrorDialog(error, parent=self) # Initial Page @@ -370,7 +370,7 @@ class AddGamesWindow(ModelessDialog): # pylint: disable=too-many-public-methods self.display_cancel_button(label=_("_Close")) if error: - ErrorDialog(str(error), parent=self) + ErrorDialog(error, parent=self) self.stack.navigation_reset() return diff --git a/lutris/gui/application.py b/lutris/gui/application.py index de02abab4..7f68a9ca3 100644 --- a/lutris/gui/application.py +++ b/lutris/gui/application.py @@ -767,7 +767,7 @@ class Application(Gtk.Application): def on_watched_error(self, error): if self.window: - ErrorDialog(str(error), parent=self.window) + ErrorDialog(error, parent=self.window) @staticmethod def get_lutris_action(url): diff --git a/lutris/gui/config/boxes.py b/lutris/gui/config/boxes.py index bac369c80..e4fcb1ce8 100644 --- a/lutris/gui/config/boxes.py +++ b/lutris/gui/config/boxes.py @@ -13,6 +13,7 @@ from lutris.gui.widgets.common import EditableGrid, FileChooserEntry, Label, VBo from lutris.gui.widgets.searchable_combobox import SearchableCombobox from lutris.runners import InvalidRunner, import_runner from lutris.util.log import logger +from lutris.util.strings import gtk_safe class ConfigBox(VBox): @@ -210,7 +211,7 @@ class ConfigBox(VBox): text = self.warning except Exception as err: logger.exception("Unable to generate configuration warning: %s", err) - text = str(err) + text = gtk_safe(err) if text: self.warning_label.set_markup(str(text)) diff --git a/lutris/gui/config/common.py b/lutris/gui/config/common.py index 37e6646b6..305834f8a 100644 --- a/lutris/gui/config/common.py +++ b/lutris/gui/config/common.py @@ -645,4 +645,4 @@ class GameDialogCommon(ModelessDialog, DialogInstallUIDelegate): self._set_image(image_type, self.image_buttons[image_type]) def on_watched_error(self, error): - dialogs.ErrorDialog(str(error), parent=self) + dialogs.ErrorDialog(error, parent=self) diff --git a/lutris/gui/config/runner_box.py b/lutris/gui/config/runner_box.py index 1b8d10220..30d0b2bd5 100644 --- a/lutris/gui/config/runner_box.py +++ b/lutris/gui/config/runner_box.py @@ -144,4 +144,4 @@ class RunnerBox(Gtk.Box): self.action_alignment.add(self.get_action_button()) def on_watched_error(self, error): - ErrorDialog(str(error), parent=self.get_toplevel()) + ErrorDialog(error, parent=self.get_toplevel()) diff --git a/lutris/gui/dialogs/__init__.py b/lutris/gui/dialogs/__init__.py index 0433ccb5e..829ee2a90 100644 --- a/lutris/gui/dialogs/__init__.py +++ b/lutris/gui/dialogs/__init__.py @@ -15,7 +15,7 @@ from lutris.migrations import migrate from lutris.util import datapath from lutris.util.jobs import AsyncCall from lutris.util.log import logger - +from lutris.util.strings import gtk_safe class Dialog(Gtk.Dialog): @@ -168,11 +168,18 @@ class WarningDialog(Gtk.MessageDialog): class ErrorDialog(Gtk.MessageDialog): """Display an error message.""" - def __init__(self, message, secondary=None, parent=None): + def __init__(self, error, secondary=None, parent=None): super().__init__(buttons=Gtk.ButtonsType.OK, parent=parent) + + # Some errors contain < and > and lok like markup, but aren't- + # we'll need to protect the message box against this + message = gtk_safe(error) if isinstance(error, BaseException) else str(error) + # Gtk doesn't wrap long labels containing no space correctly # the length of the message is limited to avoid display issues + self.set_markup(message[:256]) + if secondary: self.format_secondary_text(secondary[:256]) @@ -285,7 +292,7 @@ class LutrisInitDialog(Gtk.Dialog): def init_cb(self, _result, error): if error: - ErrorDialog(str(error), parent=self) + ErrorDialog(error, parent=self) self.destroy() def on_response(self, _widget, response): @@ -551,7 +558,7 @@ class MoveDialog(ModelessDialog): def on_game_moved(self, _result, error): if error: - ErrorDialog(str(error), parent=self) + ErrorDialog(error, parent=self) self.emit("game-moved") self.destroy() diff --git a/lutris/gui/installerwindow.py b/lutris/gui/installerwindow.py index 0adc84a44..14cf90a22 100644 --- a/lutris/gui/installerwindow.py +++ b/lutris/gui/installerwindow.py @@ -252,7 +252,7 @@ class InstallerWindow(ModelessDialog, ) def on_watched_error(self, error): - ErrorDialog(str(error), parent=self) + ErrorDialog(error, parent=self) self.stack.navigation_reset() def set_status(self, text): diff --git a/lutris/gui/lutriswindow.py b/lutris/gui/lutriswindow.py index 760a66c10..744999185 100644 --- a/lutris/gui/lutriswindow.py +++ b/lutris/gui/lutriswindow.py @@ -794,7 +794,7 @@ class LutrisWindow(Gtk.ApplicationWindow, def _service_reloaded_cb(self, error): if error: - dialogs.ErrorDialog(str(error), parent=self) + dialogs.ErrorDialog(error, parent=self) def on_service_logout(self, service): if self.service and service.id == self.service.id: @@ -877,7 +877,7 @@ class LutrisWindow(Gtk.ApplicationWindow, def on_game_unhandled_error(self, game, error): """Called when a game has sent the 'game-error' signal""" - dialogs.ErrorDialog(str(error), parent=self) + dialogs.ErrorDialog(error, parent=self) return True @GtkTemplate.Callback @@ -1057,4 +1057,4 @@ class LutrisWindow(Gtk.ApplicationWindow, game.emit("game-install") def on_watched_error(self, error): - dialogs.ErrorDialog(str(error), parent=self) + dialogs.ErrorDialog(error, parent=self) diff --git a/lutris/gui/widgets/searchable_combobox.py b/lutris/gui/widgets/searchable_combobox.py index ff7aadb2a..f85d6803f 100644 --- a/lutris/gui/widgets/searchable_combobox.py +++ b/lutris/gui/widgets/searchable_combobox.py @@ -76,7 +76,7 @@ class SearchableCombobox(Gtk.Bin): def _populate_combobox_choices_cb(self, _result, error): if error: - ErrorDialog(str(error), parent=self.get_toplevel()) + ErrorDialog(error, parent=self.get_toplevel()) @staticmethod def _on_combobox_scroll(combobox, _event): diff --git a/lutris/gui/widgets/sidebar.py b/lutris/gui/widgets/sidebar.py index 00e962207..94ecbec53 100644 --- a/lutris/gui/widgets/sidebar.py +++ b/lutris/gui/widgets/sidebar.py @@ -167,7 +167,7 @@ class ServiceSidebarRow(SidebarRow): self.service.logout() self.service.login(parent=self.get_toplevel()) else: - ErrorDialog(str(error), parent=self.get_toplevel()) + ErrorDialog(error, parent=self.get_toplevel()) GLib.timeout_add(2000, self.enable_refresh_button) def enable_refresh_button(self): @@ -248,7 +248,7 @@ class RunnerSidebarRow(SidebarRow): runner=self.runner, parent=self.get_toplevel()) def on_watched_error(self, error): - dialogs.ErrorDialog(str(error), parent=self.get_toplevel()) + dialogs.ErrorDialog(error, parent=self.get_toplevel()) class SidebarHeader(Gtk.Box): diff --git a/lutris/installer/interpreter.py b/lutris/installer/interpreter.py index d83ba4ea9..bc67c2884 100644 --- a/lutris/installer/interpreter.py +++ b/lutris/installer/interpreter.py @@ -40,7 +40,7 @@ class ScriptInterpreter(GObject.Object, CommandsMixin): def report_error(self, error): """Called to report an error during installation. The installation will then stop.""" - logger.exception("Error during installation: %s", str(error)) + logger.exception("Error during installation: %s", error) def report_status(self, status): """Called to report the current activity of the installer.""" diff --git a/lutris/util/display.py b/lutris/util/display.py index eb9591da9..cc66888c0 100644 --- a/lutris/util/display.py +++ b/lutris/util/display.py @@ -392,7 +392,7 @@ def _get_screen_saver_inhibitor(): inhibitor.set_dbus_iface(name, path, interface) except GLib.Error as err: logger.warning("Failed to set up a DBus proxy for name %s, path %s, " - "interface %s: %s", name, path, interface, str(err)) + "interface %s: %s", name, path, interface, err) return inhibitor