From 922c2e1734beaa391af98a08c789ec6f32482209 Mon Sep 17 00:00:00 2001 From: matellush <202132988+matellush@users.noreply.github.com> Date: Sat, 4 Jul 2026 22:39:46 +0200 Subject: [PATCH] fix: Improve installation and settings UX --- .../Features/LinuxDolphinInstallerTests.cs | 84 ++++++++++++++++--- .../Features/Settings/SettingsTests.cs | 23 +++-- .../DolphinInstaller/LinuxDolphinInstaller.cs | 42 ++++++++-- .../DolphinInstaller/LinuxProcessService.cs | 18 +++- .../Features/Settings/SettingsManager.cs | 11 +-- WheelWizard/Resources/Languages/cs.yml | 8 +- WheelWizard/Resources/Languages/de.yml | 48 ++++++++--- WheelWizard/Resources/Languages/en.yml | 48 ++++++++--- WheelWizard/Resources/Languages/es.yml | 26 ++++-- WheelWizard/Resources/Languages/fi.yml | 32 +++++-- WheelWizard/Resources/Languages/fr.yml | 28 +++++-- WheelWizard/Resources/Languages/it.yml | 30 +++++-- WheelWizard/Resources/Languages/ja.yml | 30 +++++-- WheelWizard/Resources/Languages/ko.yml | 30 +++++-- WheelWizard/Resources/Languages/nl.yml | 30 +++++-- WheelWizard/Resources/Languages/pt.yml | 30 +++++-- WheelWizard/Resources/Languages/ru.yml | 21 +++-- WheelWizard/Resources/Languages/tr.yml | 30 +++++-- .../Launcher/Helpers/DolphinLaunchHelper.cs | 56 ++++++++----- WheelWizard/Services/PathManager.cs | 25 +----- WheelWizard/Views/Layout.axaml | 5 +- WheelWizard/Views/Layout.axaml.cs | 7 +- .../Pages/Settings/WhWzSettings.axaml.cs | 16 ++-- 23 files changed, 477 insertions(+), 201 deletions(-) diff --git a/WheelWizard.Test/Features/LinuxDolphinInstallerTests.cs b/WheelWizard.Test/Features/LinuxDolphinInstallerTests.cs index 8cef2545..fb95aa3b 100644 --- a/WheelWizard.Test/Features/LinuxDolphinInstallerTests.cs +++ b/WheelWizard.Test/Features/LinuxDolphinInstallerTests.cs @@ -17,9 +17,9 @@ public LinuxDolphinInstallerTests() } [Fact] - public void IsDolphinInstalledInFlatpak_ReturnsTrue_WhenFlatpakInfoExitCodeIsZero() + public void IsDolphinInstalledInFlatpak_ReturnsTrue_WhenFlatpakListHasDolphin() { - _processService.Run("flatpak", "info org.DolphinEmu.dolphin-emu").Returns(Ok(0)); + _processService.Run("flatpak", "list --app --columns=application", out var stdOut, out _).Returns(Ok(0)).AndDoes(callInfo => callInfo[2] = "Application ID\norg.DolphinEmu.dolphin-emu\n"); var result = _installer.IsDolphinInstalledInFlatpak(); @@ -27,9 +27,19 @@ public void IsDolphinInstalledInFlatpak_ReturnsTrue_WhenFlatpakInfoExitCodeIsZer } [Fact] - public void IsDolphinInstalledInFlatpak_ReturnsFalse_WhenFlatpakInfoExitCodeIsNonZero() + public void IsDolphinInstalledInFlatpak_ReturnsFalse_WhenFlatpakListHasNoDolphin() { - _processService.Run("flatpak", "info org.DolphinEmu.dolphin-emu").Returns(Ok(1)); + _processService.Run("flatpak", "list --app --columns=application", out var stdOut, out _).Returns(Ok(0)).AndDoes(callInfo => callInfo[2] = "Application ID\n"); + + var result = _installer.IsDolphinInstalledInFlatpak(); + + Assert.False(result); + } + + [Fact] + public void IsDolphinInstalledInFlatpak_ReturnsFalse_WhenFlatpakListFails() + { + _processService.Run("flatpak", "list --app --columns=application", out _, out _).Returns(Ok(1)); var result = _installer.IsDolphinInstalledInFlatpak(); @@ -77,13 +87,53 @@ public async Task InstallFlatpak_ReturnsSuccess_WhenInstallCompletesAndCommandBe Assert.True(result.IsSuccess); } + [Fact] + public async Task InstallFlatpakDolphin_ReturnsFailure_WhenDolphinRemoteCommandFails() + { + _commandEnvironment.IsCommandAvailable("flatpak").Returns(true); + _processService + .Run("flatpak", "remote-add --if-not-exists --user dolphin https://flatpak.dolphin-emu.org/releases.flatpakrepo") + .Returns(Ok(1)); + _processService + .Run("flatpak", "remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo") + .Returns(Ok(0)); + + var result = await _installer.InstallFlatpakDolphin(); + + Assert.True(result.IsFailure); + Assert.Contains("exit code 1", result.Error.Message); + } + + [Fact] + public async Task InstallFlatpakDolphin_ReturnsFailure_WhenFlathubRemoteCommandFails() + { + _commandEnvironment.IsCommandAvailable("flatpak").Returns(true); + _processService + .Run("flatpak", "remote-add --if-not-exists --user dolphin https://flatpak.dolphin-emu.org/releases.flatpakrepo") + .Returns(Ok(0)); + _processService + .Run("flatpak", "remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo") + .Returns(Ok(1)); + + var result = await _installer.InstallFlatpakDolphin(); + + Assert.True(result.IsFailure); + Assert.Contains("exit code 1", result.Error.Message); + } + [Fact] public async Task InstallFlatpakDolphin_ReturnsFailure_WhenDolphinInstallCommandFails() { _commandEnvironment.IsCommandAvailable("flatpak").Returns(true); _processService - .RunWithProgressAsync("pkexec", "flatpak --system install -y org.DolphinEmu.dolphin-emu", Arg.Any?>()) - .Returns(Task.FromResult>(Ok(1))); + .Run("flatpak", "remote-add --if-not-exists --user dolphin https://flatpak.dolphin-emu.org/releases.flatpakrepo") + .Returns(Ok(0)); + _processService + .Run("flatpak", "remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo") + .Returns(Ok(0)); + _processService + .RunWithProgressAsync("flatpak", "install --user -y dolphin org.DolphinEmu.dolphin-emu", Arg.Any?>()) + .Returns(Task.FromResult(Ok(1))); var result = await _installer.InstallFlatpakDolphin(); @@ -96,8 +146,14 @@ public async Task InstallFlatpakDolphin_ReturnsFailure_WhenWarmupLaunchFails() { _commandEnvironment.IsCommandAvailable("flatpak").Returns(true); _processService - .RunWithProgressAsync("pkexec", "flatpak --system install -y org.DolphinEmu.dolphin-emu", Arg.Any?>()) - .Returns(Task.FromResult>(Ok(0))); + .Run("flatpak", "remote-add --if-not-exists --user dolphin https://flatpak.dolphin-emu.org/releases.flatpakrepo") + .Returns(Ok(0)); + _processService + .Run("flatpak", "remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo") + .Returns(Ok(0)); + _processService + .RunWithProgressAsync("flatpak", "install --user -y dolphin org.DolphinEmu.dolphin-emu", Arg.Any?>()) + .Returns(Task.FromResult(Ok(0))); _processService .LaunchAndStopAsync("flatpak", "run org.DolphinEmu.dolphin-emu", TimeSpan.FromSeconds(4)) .Returns(Task.FromResult(Fail("Launch failed"))); @@ -113,11 +169,17 @@ public async Task InstallFlatpakDolphin_ReturnsSuccess_WhenInstallAndWarmupSucce { _commandEnvironment.IsCommandAvailable("flatpak").Returns(true); _processService - .RunWithProgressAsync("pkexec", "flatpak --system install -y org.DolphinEmu.dolphin-emu", Arg.Any?>()) - .Returns(Task.FromResult>(Ok(0))); + .Run("flatpak", "remote-add --if-not-exists --user dolphin https://flatpak.dolphin-emu.org/releases.flatpakrepo") + .Returns(Ok(0)); + _processService + .Run("flatpak", "remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo") + .Returns(Ok(0)); + _processService + .RunWithProgressAsync("flatpak", "install --user -y dolphin org.DolphinEmu.dolphin-emu", Arg.Any?>()) + .Returns(Task.FromResult(Ok(0))); _processService .LaunchAndStopAsync("flatpak", "run org.DolphinEmu.dolphin-emu", TimeSpan.FromSeconds(4)) - .Returns(Task.FromResult(Ok())); + .Returns(Task.FromResult(Ok())); var result = await _installer.InstallFlatpakDolphin(); diff --git a/WheelWizard.Test/Features/Settings/SettingsTests.cs b/WheelWizard.Test/Features/Settings/SettingsTests.cs index adc21e8c..80dd7fb3 100644 --- a/WheelWizard.Test/Features/Settings/SettingsTests.cs +++ b/WheelWizard.Test/Features/Settings/SettingsTests.cs @@ -20,7 +20,7 @@ public class SettingsManagerTests [Fact] public void Get_Throws_WhenRequestedTypeDoesNotMatchSettingType() { - var manager = CreateManager(new MockFileSystem(), out _, out _, out _); + var manager = CreateManager(new MockFileSystem(), out _, out _); Assert.Throws(() => manager.Get(manager.WW_LANGUAGE)); } @@ -28,7 +28,7 @@ public void Get_Throws_WhenRequestedTypeDoesNotMatchSettingType() [Fact] public void Set_Throws_WhenProvidedValueIsNull() { - var manager = CreateManager(new MockFileSystem(), out _, out _, out _); + var manager = CreateManager(new MockFileSystem(), out _, out _); Assert.Throws(() => manager.Set(manager.WW_LANGUAGE, null!)); } @@ -36,7 +36,7 @@ public void Set_Throws_WhenProvidedValueIsNull() [Fact] public void Set_ReturnsFalse_WhenValidationFails() { - var manager = CreateManager(new MockFileSystem(), out _, out _, out _); + var manager = CreateManager(new MockFileSystem(), out _, out _); var result = manager.Set(manager.FOCUSED_USER, 99, skipSave: true); @@ -49,7 +49,7 @@ public void Set_ReturnsFalse_WhenValidationFails() [InlineData(2.01)] public void SavedWindowScale_RejectsValuesOutsideBounds(double scale) { - var manager = CreateManager(new MockFileSystem(), out _, out _, out _); + var manager = CreateManager(new MockFileSystem(), out _, out _); var result = manager.Set(manager.SAVED_WINDOW_SCALE, scale, skipSave: true); @@ -62,7 +62,7 @@ public void SavedWindowScale_RejectsValuesOutsideBounds(double scale) [InlineData(2.01)] public void WindowScalePreview_RejectsValuesOutsideBounds(double scale) { - var manager = CreateManager(new MockFileSystem(), out _, out _, out _); + var manager = CreateManager(new MockFileSystem(), out _, out _); var result = manager.Set(manager.WINDOW_SCALE, scale, skipSave: true); @@ -73,7 +73,7 @@ public void WindowScalePreview_RejectsValuesOutsideBounds(double scale) [Fact] public void ValidateCorePathSettings_ReturnsAllExpectedIssues_WhenDefaultsAreInvalid() { - var manager = CreateManager(new RealFileSystem(), out _, out _, out _); + var manager = CreateManager(new RealFileSystem(), out _, out _); #pragma warning disable CS0618 SettingsRuntime.Initialize(manager); #pragma warning restore CS0618 @@ -91,7 +91,7 @@ public void ValidateCorePathSettings_ReturnsAllExpectedIssues_WhenDefaultsAreInv public void PathsSetupCorrectly_ReturnsTrue_WhenCorePathsAreValid() { var fileSystem = new MockFileSystem(); - var manager = CreateManager(fileSystem, out _, out _, out _); + var manager = CreateManager(fileSystem, out _, out _); var userFolderPath = $"/wheelwizard-user-{Guid.NewGuid():N}"; var gameFilePath = Path.Combine(userFolderPath, "game.iso"); var dolphinLocation = SettingsTestUtils.GetValidDolphinLocation(fileSystem); @@ -110,7 +110,7 @@ public void PathsSetupCorrectly_ReturnsTrue_WhenCorePathsAreValid() [Fact] public void LoadSettings_CallsUnderlyingManagersOnlyOnce() { - var manager = CreateManager(new MockFileSystem(), out var whWzManager, out var dolphinManager, out _); + var manager = CreateManager(new MockFileSystem(), out var whWzManager, out var dolphinManager); manager.LoadSettings(); manager.LoadSettings(); @@ -122,16 +122,13 @@ public void LoadSettings_CallsUnderlyingManagersOnlyOnce() private static SettingsManager CreateManager( IFileSystem fileSystem, out IWhWzSettingManager whWzSettingManager, - out IDolphinSettingManager dolphinSettingManager, - out ILinuxDolphinInstaller linuxDolphinInstaller + out IDolphinSettingManager dolphinSettingManager ) { whWzSettingManager = Substitute.For(); dolphinSettingManager = Substitute.For(); - linuxDolphinInstaller = Substitute.For(); - linuxDolphinInstaller.IsDolphinInstalledInFlatpak().Returns(true); - return new SettingsManager(whWzSettingManager, dolphinSettingManager, linuxDolphinInstaller, fileSystem); + return new SettingsManager(whWzSettingManager, dolphinSettingManager, fileSystem); } } diff --git a/WheelWizard/Features/DolphinInstaller/LinuxDolphinInstaller.cs b/WheelWizard/Features/DolphinInstaller/LinuxDolphinInstaller.cs index c2b3a9be..46ea14ee 100644 --- a/WheelWizard/Features/DolphinInstaller/LinuxDolphinInstaller.cs +++ b/WheelWizard/Features/DolphinInstaller/LinuxDolphinInstaller.cs @@ -14,13 +14,22 @@ public sealed class LinuxDolphinInstaller(ILinuxCommandEnvironment commandEnviro { public bool IsDolphinInstalledInFlatpak() { - var processResult = processService.Run("flatpak", "info org.DolphinEmu.dolphin-emu"); - return processResult.IsSuccess && processResult.Value == 0; + const string dolphinAppId = "org.DolphinEmu.dolphin-emu"; + var processResult = processService.Run("flatpak", "list --app --columns=application", out var stdOut, out _); + + return processResult.IsSuccess && processResult.Value == 0 && stdOut + .Split('\n') + .Any(line => line == dolphinAppId); } public bool IsDolphinInstalledNative() { - return commandEnvironment.IsCommandAvailable("dolphin-emu"); + if (!commandEnvironment.IsCommandAvailable("dolphin-emu")) + { + return false; + } + var processResult = processService.Run("dolphin-emu", "--version"); + return processResult.IsSuccess && processResult.Value == 0; } public bool IsFlatpakInstalled() @@ -62,17 +71,34 @@ public async Task InstallFlatpakDolphin(IProgress? progres return installFlatpakResult; } + var addRemoteResult = processService.Run( + "flatpak", + "remote-add --if-not-exists --user dolphin https://flatpak.dolphin-emu.org/releases.flatpakrepo" + ); + if (addRemoteResult.IsFailure) + return addRemoteResult.Error; + + if (addRemoteResult.Value != 0) + return Fail($"Adding the Dolphin Flatpak remote failed with exit code {addRemoteResult.Value}."); + + addRemoteResult = processService.Run( + "flatpak", + "remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo" + ); + if (addRemoteResult.IsFailure) + return addRemoteResult.Error; + + if (addRemoteResult.Value != 0) + return Fail($"Adding the Flathub Flatpak remote failed with exit code {addRemoteResult.Value}."); + var installDolphinResult = await processService.RunWithProgressAsync( - "pkexec", - "flatpak --system install -y org.DolphinEmu.dolphin-emu", + "flatpak", + "install --user -y dolphin org.DolphinEmu.dolphin-emu", progress ); if (installDolphinResult.IsFailure) return installDolphinResult.Error; - if (installDolphinResult.Value is 126 or 127) - return Fail("You need to be an administrator to install Dolphin via Flatpak."); - if (installDolphinResult.Value != 0) return Fail($"Dolphin installation failed with exit code {installDolphinResult.Value}."); diff --git a/WheelWizard/Features/DolphinInstaller/LinuxProcessService.cs b/WheelWizard/Features/DolphinInstaller/LinuxProcessService.cs index f1c53112..12455c16 100644 --- a/WheelWizard/Features/DolphinInstaller/LinuxProcessService.cs +++ b/WheelWizard/Features/DolphinInstaller/LinuxProcessService.cs @@ -5,6 +5,7 @@ namespace WheelWizard.DolphinInstaller; public interface ILinuxProcessService { + OperationResult Run(string fileName, string arguments, out string stdOut, out string stdErr); OperationResult Run(string fileName, string arguments); Task> RunWithProgressAsync(string fileName, string arguments, IProgress? progress = null); Task LaunchAndStopAsync(string fileName, string arguments, TimeSpan duration); @@ -12,9 +13,11 @@ public interface ILinuxProcessService public sealed class LinuxProcessService : ILinuxProcessService { - public OperationResult Run(string fileName, string arguments) + public OperationResult Run(string fileName, string arguments, out string stdOut, out string stdErr) { - return TryCatch( + var localStdOut = ""; + var localStdErr = ""; + var result = TryCatch( () => { var processInfo = new ProcessStartInfo @@ -31,11 +34,22 @@ public OperationResult Run(string fileName, string arguments) if (process == null) return -1; + localStdOut = process.StandardOutput.ReadToEnd(); + localStdErr = process.StandardError.ReadToEnd(); process.WaitForExit(); return process.ExitCode; }, $"Failed to run process: {fileName} {arguments}" ); + + stdOut = localStdOut; + stdErr = localStdErr; + return result; + } + + public OperationResult Run(string fileName, string arguments) + { + return Run(fileName, arguments, out _, out _); } public async Task> RunWithProgressAsync(string fileName, string arguments, IProgress? progress = null) diff --git a/WheelWizard/Features/Settings/SettingsManager.cs b/WheelWizard/Features/Settings/SettingsManager.cs index 02c131fa..7f2f929a 100644 --- a/WheelWizard/Features/Settings/SettingsManager.cs +++ b/WheelWizard/Features/Settings/SettingsManager.cs @@ -12,7 +12,6 @@ public class SettingsManager : ISettingsManager { private readonly IWhWzSettingManager _whWzSettingManager; private readonly IDolphinSettingManager _dolphinSettingManager; - private readonly ILinuxDolphinInstaller _linuxDolphinInstaller; private readonly IFileSystem _fileSystem; private readonly Setting _dolphinCompilationMode; @@ -27,13 +26,11 @@ public class SettingsManager : ISettingsManager public SettingsManager( IWhWzSettingManager whWzSettingManager, IDolphinSettingManager dolphinSettingManager, - ILinuxDolphinInstaller linuxDolphinInstaller, IFileSystem fileSystem ) { _whWzSettingManager = whWzSettingManager; _dolphinSettingManager = dolphinSettingManager; - _linuxDolphinInstaller = linuxDolphinInstaller; _fileSystem = fileSystem; #region WhWz settings @@ -48,12 +45,6 @@ IFileSystem fileSystem if (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX) { - if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - return EnvHelper.IsValidUnixCommand(pathOrCommand); - - if (PathManager.IsFlatpakDolphinFilePath(pathOrCommand) && !_linuxDolphinInstaller.IsDolphinInstalledInFlatpak()) - return false; - return EnvHelper.IsValidUnixCommand(pathOrCommand); } @@ -99,7 +90,7 @@ IFileSystem fileSystem return false; // `~/.dolphin-emu` would be used if it exists - if (!PathManager.IsFlatpakDolphinFilePath() && _fileSystem.Directory.Exists(PathManager.LinuxDolphinLegacyFolderPath)) + if (!PathManager.IsFlatpakDolphinFilePath(dolphinLocation) && _fileSystem.Directory.Exists(PathManager.LinuxDolphinLegacyFolderPath)) return false; return true; diff --git a/WheelWizard/Resources/Languages/cs.yml b/WheelWizard/Resources/Languages/cs.yml index a976b7df..b0a3f440 100644 --- a/WheelWizard/Resources/Languages/cs.yml +++ b/WheelWizard/Resources/Languages/cs.yml @@ -161,7 +161,9 @@ cs: rooms: "Místnosti" miis: "Miiy" text: - made_by_string: "Vytvořili: {$1} \\n a {$2}" + made_by_string: | + Vytvořili: {$1} + a {$2} thanks_translators: "Díky moc všem překladatelům:" wh_wz_translation_percentage: "Překlady pro tento jazyk jsou z {$1}% kompletní" powered_gamebanana: "Poháněno společností GameBanana" @@ -241,10 +243,10 @@ cs: rr_to_old: extra: "Tvoje verze Retro Rewind je moc stará na aktualizaci. Chtěl bys znovu nainstalovat Retro Rewind?" title: "Verze Retro Rewind je moc stará." - rr_not_determent: + rr_not_determined: title: "Stáhnout Retro Rewind" extra: "Tvojí verzi Retro Rewind se nepodařilo určit. Chtěl bys si stáhnout Retro Rewind?" - dolphin_flatpack: + dolphin_flatpak: title: "Instalace Dolphin Flatpak" install_mod: title: "Chceš stáhnout a nainstalovat mod: {$1}?" diff --git a/WheelWizard/Resources/Languages/de.yml b/WheelWizard/Resources/Languages/de.yml index bdc74448..42de2ea9 100644 --- a/WheelWizard/Resources/Languages/de.yml +++ b/WheelWizard/Resources/Languages/de.yml @@ -167,7 +167,9 @@ de: mii_editor: "Mii Maker" mii_carousel: "Mii Preview" text: - made_by_string: "Erstellt von: {$1} \\n und {$2}" + made_by_string: | + Erstellt von: {$1} + und {$2} thanks_translators: "Vielen Dank an alle Übersetzer:" wh_wz_translation_percentage: "Übersetzungen für diese Sprache sind {$1}% abgeschlossen" powered_gamebanana: "Von GameBanana unterstützt" @@ -242,10 +244,24 @@ de: extra: "Diese Änderung wird in {$1} zurückgesetzt, außer du wendest die Änderung an." move_data: title: "Wheel Wizard Daten verschieben?" - extra: "Wheel Wizard wird seine Datein nach\\n{$1}\\nverschieben. Das könnte eine Weile dauern." + extra: | + Wheel Wizard wird seine Dateien nach + + {$1} + + verschieben. Das könnte eine Weile dauern. dolphin_found: title: "Dolphin Emulator Ordner gefunden" - extra: "Wenn du nicht weißt, was das alles bedeutet, klick einfach auf „Ja“ :) \\nDolphin Emulator-Ordner gefunden. Möchtest du diesen Ordner verwenden?" + extra: | + Wenn du nicht weißt, was das alles bedeutet, klick einfach auf „Ja“ :) + + Dolphin Emulator-Ordner gefunden. Möchtest du diesen Ordner verwenden? + dolphin_program_found: + title: "Dolphin Emulator gefunden" + extra: | + Wenn du nicht weißt, was das alles bedeutet, klick einfach auf „Ja“ :) + + Dolphin Emulator gefunden. Möchtest du Folgendes verwenden? new_version_wh_wz: title: "Wheel Wizard Update verfügbar" extra: "Version {$1} von Wheel Wizard ist verfügbar (derzeit für {$2}). Möchtest du jetzt updaten?" @@ -261,12 +277,12 @@ de: rr_to_old: extra: "Deine Version von Retro Rewind ist zu alt zum Aktualisieren. Möchtest du Retro Rewind neu installieren?" title: "Retro Rewind-Version ist zu alt." - rr_not_determent: + rr_not_determined: title: "Installiere Retro Rewind" extra: "Deine Version von Retro Rewind konnte nicht ermittelt werden. Möchtest du Retro Rewind herunterladen?" - dolphin_flatpack: + dolphin_flatpak: title: "Dolphin Flatpak Installation" - extra: "Die Flatpak Dolphin Version scheint nicht installiert zu sein. Möchtest du sie von uns installieren lassen (ganzes System)?" + extra: "Die Flatpak Dolphin Version scheint nicht installiert zu sein. Möchtest du sie von uns installieren lassen (für deinen eigenen Benutzer)?" install_mod: title: "Du bist dabei das Spiel ohne Mods zu starten. Möchtest du deinen My-Stuff Ordner leeren?" search_mod: "Nach Mods suchen..." @@ -301,8 +317,14 @@ de: extra: "Es ist nicht möglich gerade nach Updates zu suchen. Du bist vielleicht nicht mit dem Internet verbunden oder der Server hat gerade Schwierigkeiten." unable_update_wh_wz: extra: - reason_network: "Es kann nicht überprüft werden, ob Wheel Wizard auf dem neuesten Stand ist. \\nMöglicherweise treten derzeit Netzwerkprobleme auf." - reason_location: "Wheel Wizard kann nicht aktualisiert werden. Bitte stelle sicher, dass sich die Anwendung in einem Ordner befindet, in den geschrieben werden kann.\\n Der aktuelle Ordner konnte nicht gefunden werden." + reason_network: | + Es kann nicht überprüft werden, ob Wheel Wizard auf dem neuesten Stand ist. + + Möglicherweise treten derzeit Netzwerkprobleme auf. + reason_location: | + Wheel Wizard kann nicht aktualisiert werden. Bitte stelle sicher, dass sich die Anwendung in einem Ordner befindet, in den geschrieben werden kann. + + Der aktuelle Ordner konnte nicht gefunden werden. title: "Wheel Wizard konnte nicht aktualisiert werden." no_connect_server: extra: "Es konnte keine Verbindung zum Server hergestellt werden. Bitte versuche es später noch einmal." @@ -340,7 +362,10 @@ de: extra: failed_update_delete: "Dateien für das Update konnten nicht gelöscht werden. Abbruch." failed_update_apply: "Das Update konnte nicht installiert werden. Abbruch." - invalid_file_path: "Ungültiger Dateipfad wurde erkannt. Bitte kontaktiere die Entwickler. \\n Server-Fehler: {$1}" + invalid_file_path: | + Ungültiger Dateipfad wurde erkannt. Bitte kontaktiere die Entwickler. + + Server-Fehler: {$1} title: "Über das RR Update" restart_admin_fail: extra: "Neustart mit Admin-Rechten fehlgeschlagen." @@ -365,7 +390,10 @@ de: title: "Einstellungen erfolgreich gespeichert!" data_folder_moved: title: "Datenordner aktualisiert." - extra: "Wheel WIzard's Daten sind jetzt gespeichert in:\\n{$1}" + extra: | + Wheel Wizard's Daten sind jetzt gespeichert in: + + {$1} rr_up_to_date: title: "Retro Rewind ist auf dem neuesten Stand." mii_changed: "Mii erfolgreich geändert." diff --git a/WheelWizard/Resources/Languages/en.yml b/WheelWizard/Resources/Languages/en.yml index 8fb59e52..35b91dea 100644 --- a/WheelWizard/Resources/Languages/en.yml +++ b/WheelWizard/Resources/Languages/en.yml @@ -171,7 +171,9 @@ en: mii_editor: "Mii Editor" mii_carousel: "Mii Carousel" text: - made_by_string: "Made by: {$1} \\n And {$2}" + made_by_string: | + Made by: {$1} + and {$2} thanks_translators: "Thanks a lot to all the translators:" wh_wz_translation_percentage: "Translations for this language are {$1}% complete" powered_gamebanana: "Powered By GameBanana" @@ -261,10 +263,24 @@ en: extra: "This change will revert in {$1} unless you decide to keep the change." move_data: title: "Move Wheel Wizard data?" - extra: "Wheel Wizard will move its files to:\\n{$1}\\nThis may take a while depending on the amount of data." + extra: | + Wheel Wizard will move its files to: + + {$1} + + This may take a while depending on the amount of data. dolphin_found: title: "Dolphin Emulator Folder Found" - extra: "If you dont know what all of this means, just click yes :) \\nDolphin Emulator folder found. Would you like to use this folder?" + extra: | + If you don't know what all of this means, just click yes :) + + Dolphin Emulator folder found. Would you like to use this folder? + dolphin_program_found: + title: "Dolphin Emulator Found" + extra: | + If you don't know what all of this means, just click yes :) + + Dolphin Emulator found. Would you like to use this? new_version_wh_wz: title: "Wheel Wizard Update Available" extra: "Version {$1} of Wheel Wizard is available (currently on {$2}). Do you want to update now?" @@ -280,12 +296,12 @@ en: rr_to_old: extra: "Your version of Retro Rewind is too old to update. Would you like to reinstall Retro Rewind?" title: "The Retro Rewind version is too old." - rr_not_determent: + rr_not_determined: title: "Download Retro Rewind" extra: "Your version of Retro Rewind could not be determined. Would you like to download Retro Rewind?" - dolphin_flatpack: + dolphin_flatpak: title: "Dolphin Flatpak Installation" - extra: "The Flatpak version of Dolphin Emulator does not appear to be installed. Would you like us to install it (system-wide)?" + extra: "The Flatpak version of Dolphin Emulator does not appear to be installed. Would you like us to install it (for your own user)?" install_mod: title: "Do you want to donwload and install the mod: {$1}?" search_mod: "Search for mods..." @@ -324,8 +340,14 @@ en: extra: "Can't check for updates right now. You might not be connected to the internet or the server might be down." unable_update_wh_wz: extra: - reason_network: "Unable to check if Wheel Wizard is up to date. \\nYou might be experiencing network issues." - reason_location: "Unable to update Wheel Wizard. Please ensure the application is located in a folder that can be written to.\\n Could not find current folder." + reason_network: | + Unable to check if Wheel Wizard is up to date. + + You might be experiencing network issues. + reason_location: | + Unable to update Wheel Wizard. Please ensure the application is located in a folder that can be written to. + + Could not find current folder. title: "Unable to update Wheel Wizard." no_connect_server: extra: "Could not connect to the server. Please try again later." @@ -365,7 +387,10 @@ en: extra: failed_update_delete: "Failed to delete files for the update. Aborting." failed_update_apply: "Failed to apply an update. Aborting." - invalid_file_path: "Invalid file path detected. Please contact the developers.\\n Server error: {$1}" + invalid_file_path: | + Invalid file path detected. Please contact the developers. + + Server error: {$1} title: "Aborting RR Update" restart_admin_fail: extra: "Failed to restart with administrator rights." @@ -390,7 +415,10 @@ en: title: "Settings saved successfully!" data_folder_moved: title: "Data folder updated" - extra: "Wheel Wizard data is now stored in:\\n{$1}" + extra: | + Wheel Wizard data is now stored in: + + {$1} rr_up_to_date: title: "Retro Rewind is up to date." mii_changed: "Mii changed successfully" diff --git a/WheelWizard/Resources/Languages/es.yml b/WheelWizard/Resources/Languages/es.yml index 6bfb5a33..2ae4e778 100644 --- a/WheelWizard/Resources/Languages/es.yml +++ b/WheelWizard/Resources/Languages/es.yml @@ -155,7 +155,9 @@ es: rooms: "Salas" miis: "Miis" text: - made_by_string: "Hecho por: {$1} y {$2}" + made_by_string: | + Hecho por: {$1} + y {$2} thanks_translators: "Muchas gracias a todos los traductores:" wh_wz_translation_percentage: "La traducción de este idioma está a un {$1}%." hover: @@ -222,7 +224,10 @@ es: extra: "Este cambio se revertira en {$1} a menos de que decidas de quedarte con este cambio." dolphin_found: title: "Carpeta del Emulador Dolphin encontrado" - extra: "Ante la duda, solo marque si\\n. Carpeta del emulador Dolphin encontrado. ¿Desea usar esta carpeta?" + extra: | + Ante la duda, solo marque si. + + Carpeta del emulador Dolphin encontrado. ¿Desea usar esta carpeta? new_version_wh_wz: title: "Actualización de Wheel Wizard disponible" extra: "La version {$1} de WheelWizzard está disponible (Actualmente en {$2}). ¿Desea actualizar ahora?" @@ -238,7 +243,7 @@ es: rr_to_old: extra: "Tu versión de Retro Rewind es muy antigua para actualizar. ¿Desea reinstalar Retro Rewind?" title: "La version de Retro Rewind es muy antigua." - rr_not_determent: + rr_not_determined: title: "Instalar Retro Rewind" extra: "No se pudo determinar tu versión de Retro Rewind. ¿Desea instalar Retro Rewind?" message_warning: @@ -263,8 +268,14 @@ es: extra: "No se pueden buscar actualizaciones en este momento. Es posible que no tengas conexión a internet o que el servidor esté inactivo." unable_update_wh_wz: extra: - reason_network: "Incapaz de confirmar la actualidad de su versión de Wheel Wizard.\\n Podrías estar experimentando problemas de conexión." - reason_location: "Incapaz de actualizar Wheel Wizard. Asegurate que la aplicación esta ubicada en una carpeta que se puede editar.\\n No se encontró la carpeta actual." + reason_network: | + Incapaz de confirmar la actualidad de su versión de Wheel Wizard. + + Podrías estar experimentando problemas de conexión. + reason_location: | + Incapaz de actualizar Wheel Wizard. Asegurate que la aplicación esta ubicada en una carpeta que se puede editar. + + No se encontró la carpeta actual. title: "No se pudo actualizar Wheel Wizard." no_connect_server: extra: "No se pudo conectar al servidor. Intente de nuevo más tarde" @@ -289,7 +300,10 @@ es: extra: failed_update_delete: "Error al borrar archivos para la actualización. Cancelando" failed_update_apply: "Error al aplicar una actualización. Cancelando." - invalid_file_path: "Se detectó una ruta de archivo no válida. Contacte a los desarrolladores.\\n Error del servidor: {$1}" + invalid_file_path: | + Se detectó una ruta de archivo no válida. Contacte a los desarrolladores. + + Error del servidor: {$1} title: "Abortando actualización de RR" restart_admin_fail: extra: "Error al reinstalar con derechos de administrador." diff --git a/WheelWizard/Resources/Languages/fi.yml b/WheelWizard/Resources/Languages/fi.yml index 4cc0c7be..6cc031b1 100644 --- a/WheelWizard/Resources/Languages/fi.yml +++ b/WheelWizard/Resources/Languages/fi.yml @@ -167,7 +167,9 @@ fi: mii_editor: "Mii-editori" mii_carousel: "Miin katselu" text: - made_by_string: "Tehnyt: {$1}\\n ja {$2}" + made_by_string: | + Tehnyt: {$1} + ja {$2} thanks_translators: "Suuret kiitokset kaikille kääntäjille:" wh_wz_translation_percentage: "Tämän kielen käännökset ovat {$1} % valmiita." powered_gamebanana: "Palvelun tarjoaa GameBanana" @@ -244,7 +246,10 @@ fi: extra: "Muutos perutaan {$1} kuluttua, ellet aio pitää muutosta." dolphin_found: title: "Dolphin-emulaattorin kansio löytyi" - extra: "Jos et tiedä, mitä kaikki tarkoittaa, paina vain 'Kyllä' :)\\nDolphin-emulaattorin kansio löytyi. Haluatko käyttää tätä kansiota?" + extra: | + Jos et tiedä, mitä kaikki tarkoittaa, paina vain 'Kyllä' :) + + Dolphin-emulaattorin kansio löytyi. Haluatko käyttää tätä kansiota? new_version_wh_wz: title: "Wheel Wizard -päivitys saatavilla" extra: "Wheel Wizardin versio {$1} on saatavilla (nykyinen versio: {$2}). Haluatko päivittää heti?" @@ -260,14 +265,14 @@ fi: rr_to_old: extra: |- Retro Rewind -versiosi on liian vanha päivittämiseen. Haluatko asentaa Retro Rewindin uudelleen? - + title: "Retro Rewind -versio on liian vanha." - rr_not_determent: + rr_not_determined: title: "Lataa Retro Rewind" extra: "Retro Rewind -versiotasi ei voitu määrittää. Haluatko ladata Retro Rewindin?" - dolphin_flatpack: + dolphin_flatpak: title: "Dolphin Flatpakin asennus" - extra: "Dolphin-emulaattorin Flatpak-versio ei näytä olevan asennettuna. Haluatko, että asennamme sen järjestelmällesi?" + extra: "Dolphin-emulaattorin Flatpak-versio ei näytä olevan asennettuna. Haluatko, että asennamme sen vain omalle käyttäjätilillesi?" install_mod: title: "Haluatko ladata ja asentaa modin: {$1}?" search_mod: "Haetaan modeja..." @@ -296,8 +301,14 @@ fi: extra: "Päivityksiä ei voi tarkistaa juuri nyt. Internet-yhteyttä ei ole tai palvelimessa on ongelma." unable_update_wh_wz: extra: - reason_network: "Ei voitu tarkistaa, onko Wheel Wizard ajan tasalla.\\nSyynä saattaa olla verkkoyhteysongelmat." - reason_location: "Wheel Wizardia ei voi päivittää. Varmista, että sovellus sijaitsee kansiossa, johon voi kirjoittaa tietoja.\\nNykyistä kansiota ei löytynyt." + reason_network: | + Ei voitu tarkistaa, onko Wheel Wizard ajan tasalla. + + Syynä saattaa olla verkkoyhteysongelmat. + reason_location: | + Wheel Wizardia ei voi päivittää. Varmista, että sovellus sijaitsee kansiossa, johon voi kirjoittaa tietoja. + + Nykyistä kansiota ei löytynyt. title: "Wheel Wizardia ei voi päivittää." no_connect_server: extra: "Yhdistäminen palvelimelle epäonnistui. Yritä myöhemmin uudelleen." @@ -333,7 +344,10 @@ fi: extra: failed_update_delete: "Tiedostojen poistaminen päivitystä varten epäonnistui. Perutaan." failed_update_apply: "Päivityksen käyttöönotto epäonnistui. Perutaan." - invalid_file_path: "Virheellinen polku. Ota yhteyttä kehittäjiin.\\n Palvelinvirhe: {$1}" + invalid_file_path: | + Virheellinen polku. Ota yhteyttä kehittäjiin. + + Palvelinvirhe: {$1} title: "Perutaan RR-päivitys" restart_admin_fail: extra: "Käynnistäminen järjestelmänvalvojan oikeuksilla epäonnistui." diff --git a/WheelWizard/Resources/Languages/fr.yml b/WheelWizard/Resources/Languages/fr.yml index 950d71e3..2ea9a36f 100644 --- a/WheelWizard/Resources/Languages/fr.yml +++ b/WheelWizard/Resources/Languages/fr.yml @@ -167,7 +167,9 @@ fr: mii_editor: "Éditeur de Mii" mii_carousel: "Vue d'ensemble du Mii" text: - made_by_string: "Fait par: {$1} \\n et {$2}" + made_by_string: | + Fait par: {$1} + et {$2} thanks_translators: "Merci à tous les traducteurs:" wh_wz_translation_percentage: "La traduction pour cette langue est fini à {$1}%" powered_gamebanana: "Contribué par GameBanana" @@ -244,7 +246,10 @@ fr: extra: "Cette modification va être rétablie dans {$1} sauf si vous choisissez de garder cette modification." dolphin_found: title: "Dossier Dolphin Emulator trouvé" - extra: "Si vous ne savez pas ce que tous cela veut dire, juste cliquez sur oui :) \\nDossier Dolphin Emulator trouvé. Voulez-vous utilser ce dossier ? " + extra: | + Si vous ne savez pas ce que tous cela veut dire, juste cliquez sur oui :) + + Dossier Dolphin Emulator trouvé. Voulez-vous utilser ce dossier ? new_version_wh_wz: title: "Mise à jour Wheel Wizard disponible !" extra: "La version {$1} de Wheel Wizard est disponible (Version actuelle: {$2}). Voulez-vous mettre à jour maintenant ? " @@ -262,12 +267,12 @@ fr: Votre version de Retro Rewind est trop vieille pour être mis à jour. Voulez-vous réinstaller Retro Rewind ? title: "Votre version de Retro Rewind est trop vieille." - rr_not_determent: + rr_not_determined: title: "Télécharger Retro Rewind " extra: |- Votre version de Retro Rewind n'a pas pu être déterminée. Voulez-vous installer Retro Rewind ? - dolphin_flatpack: + dolphin_flatpak: title: "Installation de Dolphin Flatpak..." extra: "La version Flatpak de Dolphin Emulator ne semble pas être installée. Veuillez-vous qu'on vous l'installe ?" install_mod: @@ -298,8 +303,14 @@ fr: extra: "Impossibilité de vérifier les mises à jour actuellement. Vous n'êtes probablement pas connecté à internet ou le serveur est probablement en maintenance" unable_update_wh_wz: extra: - reason_network: "Impossible de vérifier si Wheel Wizard est mis à jour. \\nVous pourrez expérimenter des problèmes d'internet." - reason_location: "Impossible de mettre à jour Wheel Wizard. Veuillez bien vérifier que l'application se trouve dans un dossier qui peut être écrit. \\n N'a pas pu trouver le dossier actuel." + reason_network: | + Impossible de vérifier si Wheel Wizard est mis à jour. + + Vous pourrez expérimenter des problèmes d'internet. + reason_location: | + Impossible de mettre à jour Wheel Wizard. Veuillez bien vérifier que l'application se trouve dans un dossier qui peut être écrit. + + N'a pas pu trouver le dossier actuel. title: "Impossible de mettre à jour Wheel Wizard. " no_connect_server: extra: "N'a pas pu de se connecter au serveur. Veuillez réessayer plus tard." @@ -335,7 +346,10 @@ fr: extra: failed_update_delete: "Échec de la désinstallation de fichiers pour la mise à jour. Annulation" failed_update_apply: "Échec d'application de la mise à jour. Annulation." - invalid_file_path: "Chemin vers un fichier incorrect. Veuillez contacter les développeurs de Wheel Wizard.\\n Erreur Serveur: {$1}" + invalid_file_path: | + Chemin vers un fichier incorrect. Veuillez contacter les développeurs de Wheel Wizard. + + Erreur Serveur: {$1} title: "Anuller la mise à jour de RR" restart_admin_fail: extra: "Échec du redémarrage avec les droits d'administrateur." diff --git a/WheelWizard/Resources/Languages/it.yml b/WheelWizard/Resources/Languages/it.yml index 56ef1157..7dd4dbfa 100644 --- a/WheelWizard/Resources/Languages/it.yml +++ b/WheelWizard/Resources/Languages/it.yml @@ -167,7 +167,9 @@ it: mii_editor: "Creatore Mii" mii_carousel: "Visualizzatore Mii" text: - made_by_string: "Fatto da: {$1} \\n e {$2}" + made_by_string: | + Fatto da: {$1} + e {$2} thanks_translators: "Grazie a tutti i traduttori:" wh_wz_translation_percentage: "Traduzioni per questa lingua sono complete al {$1}%" powered_gamebanana: "Offerto da GameBanana" @@ -244,7 +246,10 @@ it: extra: "Questa modifica si ripristinerà in {$1} a meno che tu decida di mantenerla." dolphin_found: title: "Cartella dell'Emulatore Dolphin trovata" - extra: "Se non sai cosa ciò vuol dire, clicca su sì :) \\nCartella dell'Emulatore Dolphin trovata. Vuoi usare questa cartella?" + extra: | + Se non sai cosa ciò vuol dire, clicca su sì :) + + Cartella dell'Emulatore Dolphin trovata. Vuoi usare questa cartella? new_version_wh_wz: title: "Aggiornamento di Wheel Wizard disponibile" extra: "La versione {$1} di Wheel Wizard è disponibile (al momento è {$2}). Vuoi aggiornare ora?" @@ -260,12 +265,12 @@ it: rr_to_old: extra: "La tua versione di Retro Rewind è troppo vecchia per essere aggiornata. Vuoi reinstallare Retro Rewind?" title: "La versione di Retro Rewind è datata." - rr_not_determent: + rr_not_determined: title: "Scarica Retro Rewind" extra: "La tua versione di Retro Rewind non può essere determinata. Vuoi scaricare Retro Rewind?" - dolphin_flatpack: + dolphin_flatpak: title: "Installazione di Dolphin tramite Flatpak" - extra: "La versione Flatpak dell'emulatore Dolphin non sembra essere installata. Vuoi che venga installata nel tuo sistema?" + extra: "La versione Flatpak dell'emulatore Dolphin non sembra essere installata. Vuoi che venga installata per il tuo account?" install_mod: title: "Vuoi scaricare ed installare la mod: {$1}?" search_mod: "Cercando delle mod..." @@ -294,8 +299,14 @@ it: extra: "Impossibile verificare gli aggiornamenti in questo momento. Potresti non avere una connessione ad internet oppure il server potrebbe essere offline." unable_update_wh_wz: extra: - reason_network: "Impossibile verificare se Wheel Wizard è aggiornato. \\nPotresti avere problemi di connessione." - reason_location: "Impossibile aggiornare Wheel Wizard. Assicurati che l'applicazione si trovi in una cartella con diritti di scrittura. \\nNon è possibile trovare la cartella attuale." + reason_network: | + Impossibile verificare se Wheel Wizard è aggiornato. + + Potresti avere problemi di connessione. + reason_location: | + Impossibile aggiornare Wheel Wizard. Assicurati che l'applicazione si trovi in una cartella con diritti di scrittura. + + Non è possibile trovare la cartella attuale. title: "Impossibile aggiornare Wheel Wizard." no_connect_server: extra: "Impossibile connettersi al server. Riprova più tardi." @@ -331,7 +342,10 @@ it: extra: failed_update_delete: "Fallito il cancellamento dei file dell'aggiornamento. Annullamento." failed_update_apply: "Fallita l'applicazione di un aggiornamento. Annullamento." - invalid_file_path: "Incontrato un percorso file invalido. Contatta gli sviluppatori.\\n Errore server: {$1}" + invalid_file_path: | + Incontrato un percorso file invalido. Contatta gli sviluppatori. + + Errore server: {$1} title: "Annullando l'aggiornamento di RR" restart_admin_fail: extra: "Errore riavviando con diritti di amministratore." diff --git a/WheelWizard/Resources/Languages/ja.yml b/WheelWizard/Resources/Languages/ja.yml index 85e4e0a3..4cf52a9c 100644 --- a/WheelWizard/Resources/Languages/ja.yml +++ b/WheelWizard/Resources/Languages/ja.yml @@ -167,7 +167,9 @@ ja: mii_editor: "Miiエディター" mii_carousel: "Miiスライダー" text: - made_by_string: "作成者: {$1} \\nと {$2}" + made_by_string: | + 作成者: {$1} + と {$2} thanks_translators: "すべての翻訳者さんに感謝します:" wh_wz_translation_percentage: "この言語の翻訳は{$1}%完了しています" powered_gamebanana: "GameBananaによって提供されています" @@ -244,7 +246,10 @@ ja: extra: "変更の保存を選択しないと、この変更は{$1}で変更前に戻ります" dolphin_found: title: "Dolphinエミュレーターのフォルダーが見つかりました" - extra: "意味がよく分からなければ、「はい」をクリックしてください。\\nDolphinエミュレーターのフォルダーが見つかりました。このフォルダーを使用しますか?" + extra: | + 意味がよく分からなければ、「はい」をクリックしてください。 + + Dolphinエミュレーターのフォルダーが見つかりました。このフォルダーを使用しますか? new_version_wh_wz: title: "Wheel Wizardのアップデートがあります" extra: "Wheel Wizardのバージョン{$1} (現在のバージョンは{$2}) が利用できます。すぐにアップデートしますか?" @@ -260,12 +265,12 @@ ja: rr_to_old: extra: "Retro Rewindのバージョンが古すぎるため更新できません。Retro Rewindを再インストールしますか?" title: "Retro Rewindのバージョンが古すぎます" - rr_not_determent: + rr_not_determined: title: "Retro Rewindをダウンロードする" extra: "Retro Rewindのバージョンを判別できませんでした。Retro Rewindを再インストールしますか?" - dolphin_flatpack: + dolphin_flatpak: title: "Dolphin flatpakバージョンのインストール" - extra: "Dolphinエミュレーターのflatpakバージョンがインストールされていないようです。システム全体にインストールしますか?" + extra: "Dolphinエミュレーターのflatpakバージョンがインストールされていないようです。私たちが(あなたのアカウントのみに)インストールしてもよろしいですか?" install_mod: title: "Modのダウンロードとインストールを行いますか: {$1}?" search_mod: "Modを検索しています..." @@ -296,8 +301,14 @@ ja: extra: "現在アップデートを確認できません。インターネットに接続されていないか、サーバーがダウンしている可能性があります" unable_update_wh_wz: extra: - reason_network: "Wheel Wizardが最新かどうか確認できません。\\nネットワークの問題が発生している可能性があります。" - reason_location: "Wheel Wizardが更新できません。アプリが書き込み可能なフォルダーにあることを確認してください。\\n現在のフォルダーが見つかりません。" + reason_network: | + Wheel Wizardが最新かどうか確認できません。 + + ネットワークの問題が発生している可能性があります。 + reason_location: | + Wheel Wizardが更新できません。アプリが書き込み可能なフォルダーにあることを確認してください。 + + 現在のフォルダーが見つかりません。 title: "Wheel Wizardのアップデートを無効にする" no_connect_server: extra: "サーバーに接続できませんでした。後でもう一度試してください。" @@ -333,7 +344,10 @@ ja: extra: failed_update_delete: "アップデートファイルの削除に失敗しました。中止しています。" failed_update_apply: "アップデートの適用に失敗しました。中止しています。" - invalid_file_path: "無効なファイルパスが検知されました。開発者に連絡してください。\\n サーバーエラー: {$1}" + invalid_file_path: | + 無効なファイルパスが検知されました。開発者に連絡してください。 + + サーバーエラー: {$1} title: "Retro Rewindのアップデートを中止" restart_admin_fail: extra: "管理者権限で再起動するのに失敗しました。" diff --git a/WheelWizard/Resources/Languages/ko.yml b/WheelWizard/Resources/Languages/ko.yml index 22c44e14..900254dd 100644 --- a/WheelWizard/Resources/Languages/ko.yml +++ b/WheelWizard/Resources/Languages/ko.yml @@ -167,7 +167,9 @@ ko: mii_editor: "Mii 에디터" mii_carousel: "Mii 슬라이더" text: - made_by_string: "만든이: {$1} \\n 과 {$2}" + made_by_string: | + 만든이: {$1} + 과 {$2} thanks_translators: "모든 번역가 분들에게 감사드립니다:" wh_wz_translation_percentage: "해당 언어의 번역은 {$1}% 완료됐습니다." powered_gamebanana: "GameBanana 제공" @@ -242,7 +244,10 @@ ko: extra: "변경 사항 저장을 선택하지 않으면 변경 전인 {$1}로 돌아갑니다" dolphin_found: title: "돌핀 에뮬레이터 폴더를 찾았습니다" - extra: "돌핀 에뮬레이터 폴더를 찾았습니다. 해당 폴더를 사용하시겠습니까? \\n뭔 소린지 모르겠다면 그냥 \"네\"를 누르세요 ^_^" + extra: | + 돌핀 에뮬레이터 폴더를 찾았습니다. 해당 폴더를 사용하시겠습니까? + + 뭔 소린지 모르겠다면 그냥 \"네\"를 누르세요 ^_^ new_version_wh_wz: title: "휠 위저드의 새로운 업데이트가 있습니다." extra: "휠 위저드 최신 버전 {$1}이 있습니다.(현재 버전 {$2}). 업데이트 하시겠습니까?" @@ -258,12 +263,12 @@ ko: rr_to_old: extra: "설치된 레트로 리와인드가 너무 구버전입니다. 레트로 리와인드를 재설치하시겠습니까?" title: "레트로 리와인드의 버전이 너무 구버전입니다" - rr_not_determent: + rr_not_determined: title: "레트로 리와인드 다운로드" extra: "설치된 레트로 리와인드 버전을 확인 할 수 없습니다. 레트로 리와인드를 다운로드 하시겠습니까?" - dolphin_flatpack: + dolphin_flatpak: title: "돌핀 Flatpak을 설치했습니다" - extra: "돌핀 에뮬레이터의 Flatpak 버전이 설치되지 않은 것 같습니다. 시스템에 설치하시겠습니까?" + extra: "돌핀 에뮬레이터의 Flatpak 버전이 설치되지 않은 것 같습니다. 본인 계정에만 설치하시겠습니까?" install_mod: title: "모드를 다운로드하고 설치하시겠습니까: {$1}?" search_mod: "모드를 검색합니다..." @@ -292,8 +297,14 @@ ko: extra: "업데이트를 확인 할 수 없습니다. 인터넷 연결이 끊어졌거나 서버가 다운된 상태일 수 있습니다" unable_update_wh_wz: extra: - reason_network: "휠 위저드의 버전을 확인할 수 없습니다. \\n네트워크 문제가 발생했을 수 있습니다." - reason_location: "휠 위저드를 업데이트할 수 없습니다. 프로그램이 쓰기 가능한 폴더에 있는지 확인하십시오.\\n현재 폴더를 찾을 수 없습니다." + reason_network: | + 휠 위저드의 버전을 확인할 수 없습니다. + + 네트워크 문제가 발생했을 수 있습니다. + reason_location: | + 휠 위저드를 업데이트할 수 없습니다. 프로그램이 쓰기 가능한 폴더에 있는지 확인하십시오. + + 현재 폴더를 찾을 수 없습니다. title: "휠 위저드를 업데이트 할 수 없습니다" no_connect_server: extra: "서버에 연결할 수 없습니다. 잠시 후 다시 시도해 주십시오." @@ -329,7 +340,10 @@ ko: extra: failed_update_delete: "업데이트 파일 삭제 실패, 중단합니다." failed_update_apply: "업데이트 적용 실패, 중단합니다." - invalid_file_path: "잘못된 파일 경로가 감지됐습니다. 개발자에게 연락하세요.\\n 서버 에러: {$1}" + invalid_file_path: | + 잘못된 파일 경로가 감지됐습니다. 개발자에게 연락하세요. + + 서버 에러: {$1} title: "레트로 리와인드 업데이트 중단" restart_admin_fail: extra: "관리자 권한으로 재시작하는 데 실패했습니다." diff --git a/WheelWizard/Resources/Languages/nl.yml b/WheelWizard/Resources/Languages/nl.yml index 8a04a3cc..6b3525f1 100644 --- a/WheelWizard/Resources/Languages/nl.yml +++ b/WheelWizard/Resources/Languages/nl.yml @@ -167,7 +167,9 @@ nl: mii_editor: "Mii-editor" mii_carousel: "Mii-carrousel" text: - made_by_string: "Gemaakt door {$1} \\n en {$2}" + made_by_string: | + Gemaakt door {$1} + en {$2} thanks_translators: "Hartelijk dank aan alle vertalers:" wh_wz_translation_percentage: "Vertalingen voor deze taal zijn {$1}% voltooid." powered_gamebanana: "Mogelijk gemaakt door GameBanana." @@ -242,7 +244,10 @@ nl: extra: "Deze wijziging wordt over {$1} teruggedraaid, tenzij je ervoor kiest om de wijziging te behouden." dolphin_found: title: "Dolphin-emulator-map gevonden" - extra: "Als je niet weet wat dit allemaal betekent, druk op ja :) \\nDolphin-emulator-map gevonden. Wil je deze gebruiken?" + extra: | + Als je niet weet wat dit allemaal betekent, druk op ja :) + + Dolphin-emulator-map gevonden. Wil je deze gebruiken? new_version_wh_wz: title: "Wheel Wizard-update beschikbaar" extra: "Versie {$1} van Wheel Wizard is beschikbaar (momenteel op {$2}). Wil je nu updaten?" @@ -258,12 +263,12 @@ nl: rr_to_old: extra: "Je versie van Retro Rewind is te oud om te updaten. Wil je Retro Rewind opnieuw installeren?" title: "Retro Rewind versie is te oud." - rr_not_determent: + rr_not_determined: title: "Retro Rewind downloaden" extra: "Je versie van Retro Rewind kon niet worden bepaald. Wil je Retro Rewind downloaden?" - dolphin_flatpack: + dolphin_flatpak: title: "Dolphin-Flatpak installeren" - extra: "De Flatpak-versie van de Dolphin-emulator is niet geïnstalleerd. Installeer dit voor het hele systeem?" + extra: "De Flatpak-versie van de Dolphin-emulator is niet geïnstalleerd. Installeer dit voor je eigen account?" install_mod: title: "Wil je de mod \"{$1}\" downloaden en installeren?" search_mod: "Zoeken naar mods..." @@ -292,8 +297,14 @@ nl: extra: "Kan momenteel niet op updates controleren. Mogelijk heb je geen internetverbinding of de server is offline." unable_update_wh_wz: extra: - reason_network: "Kan niet controleren of Wheel Wizard up-to-date is. \\nEr zijn mogelijk netwerkproblemen." - reason_location: "Wheel Wizard kan niet worden geüpdatet. Zorg ervoor dat de applicatie zich in een map bevindt waarnaar kan worden geschreven.\\n Kan de huidige map niet vinden." + reason_network: | + Kan niet controleren of Wheel Wizard up-to-date is. + + Er zijn mogelijk netwerkproblemen. + reason_location: | + Wheel Wizard kan niet worden geüpdatet. Zorg ervoor dat de applicatie zich in een map bevindt waarnaar kan worden geschreven. + + Kan de huidige map niet vinden. title: "Wheel Wizard kan niet worden geüpdatet." no_connect_server: extra: "Kan geen verbinding maken met de server. Probeer het later opnieuw." @@ -329,7 +340,10 @@ nl: extra: failed_update_delete: "Het is niet gelukt om bestanden te verwijderen voor de update. Proces word afgebroken." failed_update_apply: "Het is niet gelukt om te updaten. Proces word afgebroken." - invalid_file_path: "Ongeldige bestandslocatie gedetecteerd. Neem contact op met de ontwikkelaars.\\n Serverfout: {$1}" + invalid_file_path: | + Ongeldige bestandslocatie gedetecteerd. Neem contact op met de ontwikkelaars. + + Serverfout: {$1} title: "RR-update afgebroken." restart_admin_fail: extra: "Het is niet gelukt om opnieuw op te starten met administratorrechten." diff --git a/WheelWizard/Resources/Languages/pt.yml b/WheelWizard/Resources/Languages/pt.yml index 2bc0e733..6cd13417 100644 --- a/WheelWizard/Resources/Languages/pt.yml +++ b/WheelWizard/Resources/Languages/pt.yml @@ -167,7 +167,9 @@ pt: mii_editor: "Editor Mii" mii_carousel: "Carrosel Mii" text: - made_by_string: "Feito por: {$1} \\n e {$2}" + made_by_string: | + Feito por: {$1} + e {$2} thanks_translators: "Muito obrigado a todos os tradutores:" wh_wz_translation_percentage: "Traduções para esta língua estão {$1}% completas" powered_gamebanana: "Contribuido pelo GameBanana" @@ -240,7 +242,10 @@ pt: extra: "Esta alteração será revertida em {$1} a menos que decida manter a alteração." dolphin_found: title: "Pasta Do Dolphin Emulator Encontrada" - extra: "Se não sabes o que isto significa, clica só que sim :) \\nPasta do Dolphin Emulator encontrada. Gostarias de usar esta pasta?" + extra: | + Se não sabes o que isto significa, clica só que sim :) + + Pasta do Dolphin Emulator encontrada. Gostarias de usar esta pasta? new_version_wh_wz: title: "Atualização do Wheel Wizard Disponível" extra: "Versão {$1} do Wheel Wizard está disponível (de momento encontra-se na versão {$2}). Queres atualizar agora?" @@ -256,12 +261,12 @@ pt: rr_to_old: extra: "A tua versão do Retro Rewind é demasiado antiga par atualizar. Gostarias de reinstalar o Retro Rewind" title: "A versão do Retro Rewind é muito antiga." - rr_not_determent: + rr_not_determined: title: "Descarrega o Retro Rewind" extra: "A tua versão do Retro Rewind não pode ser determinada. Gostarias de instalar o Retro Rewind" - dolphin_flatpack: + dolphin_flatpak: title: "Instalação do Dolphin Flatpak" - extra: "A versão Flatpak do Dolphin Emulator parece não estar instalada. Deseja que a instalemos (em todo o sistema)?" + extra: "A versão Flatpak do Dolphin Emulator parece não estar instalada. Deseja que a instalemos (para a tua conta)?" install_mod: title: "Pretende transferir e instalar o mod: {$1}?" search_mod: "Procura por mods..." @@ -290,8 +295,14 @@ pt: extra: "Não é possível verificar se há atualizações no momento. Pode não estar conectado à internet ou o servidor pode estar indisponível ou em baixo." unable_update_wh_wz: extra: - reason_network: "Impossível verificar se o Wheel Wizard está atualizado. \\nTalvez estejas a experienciar problemas de net" - reason_location: "Incapaz de atualizar o Wheel Wizard. Garante que a aplicação se encontra numa pasta que pode ser localizada.\\n Falha a encontar a pasta atual" + reason_network: | + Impossível verificar se o Wheel Wizard está atualizado. + + Talvez estejas a experienciar problemas de net. + reason_location: | + Incapaz de atualizar o Wheel Wizard. Garante que a aplicação se encontra numa pasta que pode ser localizada. + + Falha a encontar a pasta atual. title: "Não é possível atualizar o Wheel Wizard" no_connect_server: extra: "Falha ao conectar ao servidor. Tente de novo mais tarde" @@ -327,7 +338,10 @@ pt: extra: failed_update_delete: "Falha a apagar ficheiros para a atualização. Abortando." failed_update_apply: "Falha a aplicar a atualização. Abortando." - invalid_file_path: "Caminho de arquivo inválido detectado. Entra em contato com os desenvolvedores.\\nErro do servidor: {$1}" + invalid_file_path: | + Caminho de arquivo inválido detectado. Entra em contato com os desenvolvedores. + + Erro do servidor: {$1} title: "A abortar o Update do RR." restart_admin_fail: extra: "Falha ao reiniciar com direitos de administrador" diff --git a/WheelWizard/Resources/Languages/ru.yml b/WheelWizard/Resources/Languages/ru.yml index f2271621..20a8faff 100644 --- a/WheelWizard/Resources/Languages/ru.yml +++ b/WheelWizard/Resources/Languages/ru.yml @@ -167,7 +167,9 @@ ru: mii_editor: "Редактор Mii" mii_carousel: "Карусель Mii" text: - made_by_string: "Создатели: {$1}\\nи {$2}" + made_by_string: | + Создатели: {$1} + и {$2} thanks_translators: "Низкий поклон и спасибо переводчикам:" wh_wz_translation_percentage: "Перевод на этот язык завершён на {$1}%" powered_gamebanana: "Моды из GameBanana" @@ -235,7 +237,10 @@ ru: title: "Хотите применить новый масштаб?" dolphin_found: title: "Папка эмулятора Dolphin найдена" - extra: "Если ты понятия не имеешь что это значит, просто нажми да :D \\nПапка эмулятора Dolphin найдена. Хотите её использовать?" + extra: | + Если ты понятия не имеешь что это значит, просто нажми да :D + + Папка эмулятора Dolphin найдена. Хотите её использовать? new_version_wh_wz: title: "Доступно обновление Wheel Wizard" extra: "Версия {$1} Wheel Wizard'а доступна (прямо сейчас. вы на {$2}). Хотите произвести обновление?" @@ -251,7 +256,7 @@ ru: rr_to_old: extra: "Ваша версия Retro Rewind слишком устарела для обновлений. Хотите переустановить Retro Rewind?" title: "Версия Retro Rewind слишком стара" - rr_not_determent: + rr_not_determined: title: "Скачать Retro Rewind" extra: "Не удалось определить вашу версию Retro Rewind. Хотите установить Retro Rewind?" install_mod: @@ -278,8 +283,14 @@ ru: title: "Не удалось проверить обновления" unable_update_wh_wz: extra: - reason_network: "Не удалось проверить, обновлён ли Wheel Wizard до последней версии? \\nВы возможно испытываете проблемы с подключеним." - reason_location: "Не удалось обновить Wheel Wizard. Пожалуйста убедитесь, что исполняемый файл находится в папке куда можно добавлять файлы.\\n Не удалось найти текущую папку." + reason_network: | + Не удалось проверить, обновлён ли Wheel Wizard до последней версии? + + Вы возможно испытываете проблемы с подключеним. + reason_location: | + Не удалось обновить Wheel Wizard. Пожалуйста убедитесь, что исполняемый файл находится в папке куда можно добавлять файлы. + + Не удалось найти текущую папку. title: "Не удалось обновить Wheel Wizard." no_connect_server: extra: "Не удалось подключиться к серверу. Попробуйте чуть позже." diff --git a/WheelWizard/Resources/Languages/tr.yml b/WheelWizard/Resources/Languages/tr.yml index fc5cbf06..6d13e2f6 100644 --- a/WheelWizard/Resources/Languages/tr.yml +++ b/WheelWizard/Resources/Languages/tr.yml @@ -167,7 +167,9 @@ tr: mii_editor: "Mii Düzenleyicisi" mii_carousel: "Mii Görüntüleyicisi" text: - made_by_string: "Yapımcı: {$1} \\n Ve {$2}" + made_by_string: | + Yapımcı: {$1} + ve {$2} thanks_translators: "Tüm çevirmenlere çok teşekkür ederiz:" wh_wz_translation_percentage: "Bu dilin çevirileri {$1}% tamamlandı" powered_gamebanana: "GameBanana tarafından" @@ -242,7 +244,10 @@ tr: extra: "Bu değişiklik onaylamadığınız takdirde {$1} içinde eski haline dönecek." dolphin_found: title: "Dolphin Emulator Klasörü Bulundu" - extra: "Eğer bunların ne anlama geldiğini bilmiyorsanız, evet diyebilirsiniz :) \\nDolphin Emulator klasörü bulundu. Bu klasörü kullanmak ister misiniz?" + extra: | + Eğer bunların ne anlama geldiğini bilmiyorsanız, evet diyebilirsiniz :) + + Dolphin Emulator klasörü bulundu. Bu klasörü kullanmak ister misiniz? new_version_wh_wz: title: "Wheel Wizard Güncellemesi Mevcut" extra: "Wheel Wizard'ın {$1} sürümü mevcut (şu anda {$2}'de). Şimdi güncellemek ister misiniz?" @@ -258,12 +263,12 @@ tr: rr_to_old: extra: "Retro Rewind sürümünüz güncellemeye çok eski. Retro Rewind'ı yeniden yüklemek ister misiniz?" title: "Retro Rewind sürümü çok eski." - rr_not_determent: + rr_not_determined: title: "Retro Rewind İndir" extra: "Retro Rewind sürümünüz belirlenemedi. Retro Rewind'ı indirmek ister misiniz?" - dolphin_flatpack: + dolphin_flatpak: title: "Dolphin Flatpak Yüklemesi" - extra: "Bilgisayarınızda Dolphin Emulator'ın Flatpak sürümü bulunamadı. Yüklememizi ister misiniz? (tüm kullanıcılar için)" + extra: "Bilgisayarınızda Dolphin Emulator'ın Flatpak sürümü bulunamadı. Yüklememizi ister misiniz? (kendi hesabın için)" install_mod: title: "Modu indirip kurmak ister misiniz: {$1}?" search_mod: "Modları ara..." @@ -292,8 +297,14 @@ tr: extra: "Şu an güncellemeler kontrol edilemiyor. İnternete bağlı olmayabilirsiniz veya sunucular çalışmıyor olabilir." unable_update_wh_wz: extra: - reason_network: "Wheel Wizard'ın güncel olup olmadığını kontrol edilemedi. \\nAğ sorunları yaşıyor olabilirsiniz." - reason_location: "Wheel Wizard güncellenemedi. Uygulamanın erişilebilir bir klasörde bulunduğundan emin olun. \\n İstenilen klasör bulunamadı." + reason_network: | + Wheel Wizard'ın güncel olup olmadığını kontrol edilemedi. + + Ağ sorunları yaşıyor olabilirsiniz. + reason_location: | + Wheel Wizard güncellenemedi. Uygulamanın erişilebilir bir klasörde bulunduğundan emin olun. + + İstenilen klasör bulunamadı. title: "Wheel Wizard güncellenemedi." no_connect_server: extra: "Sunucuya bağlanılamadı. Lütfen daha sonra tekrar deneyin." @@ -329,7 +340,10 @@ tr: extra: failed_update_delete: "Güncelleme dosyalarını silmek başarısız oldu. İşlem iptal ediliyor." failed_update_apply: "Güncellemeyi uygulamak başarısız oldu. İşlem iptal ediliyor." - invalid_file_path: "Yanlış dosya yolu tespit edildi. Lütfen geliştiricilere bildirin.\\n Sunucu hatası: {$1}" + invalid_file_path: | + Yanlış dosya yolu tespit edildi. Lütfen geliştiricilere bildirin. + + Sunucu hatası: {$1} title: "Retro Rewind güncellemesi iptal ediliyor" restart_admin_fail: extra: "Yöneticilik haklarıyla yeniden başlatılamadı." diff --git a/WheelWizard/Services/Launcher/Helpers/DolphinLaunchHelper.cs b/WheelWizard/Services/Launcher/Helpers/DolphinLaunchHelper.cs index ac2135d2..e921d909 100644 --- a/WheelWizard/Services/Launcher/Helpers/DolphinLaunchHelper.cs +++ b/WheelWizard/Services/Launcher/Helpers/DolphinLaunchHelper.cs @@ -26,27 +26,23 @@ public static void KillDolphin() //dont tell PETA private static bool IsFixableFlatpakGamePath(string gameFilePath) { - if (PathManager.IsFlatpakDolphinFilePath()) + // Because with the file picker on a Flatpak build, we get XDG portal paths like these... + // We can fix Flatpak Dolphin to gain access to this game file path though. + var xdgRuntimeDir = Environment.GetEnvironmentVariable("XDG_RUNTIME_DIR") ?? string.Empty; + if (EnvHelper.IsRelativeLinuxPath(xdgRuntimeDir)) { - // Because with the file picker on a Flatpak build, we get XDG portal paths like these... - // We can fix Flatpak Dolphin to gain access to this game file path though. - var xdgRuntimeDir = Environment.GetEnvironmentVariable("XDG_RUNTIME_DIR") ?? string.Empty; - if (EnvHelper.IsRelativeLinuxPath(xdgRuntimeDir)) - { - var fixablePattern = @"^/run/user/(\d+)/doc"; - var fixablePatternRegex = new Regex(fixablePattern); - return fixablePatternRegex.IsMatch(gameFilePath); - } - else - { - var xdgRuntimeDirDocPath = Path.Combine(xdgRuntimeDir, "doc"); - return gameFilePath.StartsWith(xdgRuntimeDirDocPath); - } + var fixablePattern = @"^/run/user/(\d+)/doc"; + var fixablePatternRegex = new Regex(fixablePattern); + return fixablePatternRegex.IsMatch(gameFilePath); + } + else + { + var xdgRuntimeDirDocPath = Path.Combine(xdgRuntimeDir, "doc"); + return gameFilePath.StartsWith(xdgRuntimeDirDocPath); } - return false; } - private static bool TryFixFlatpakPortalAccess(string path, string additionalFlag = "") + private static bool TryFixFlatpakPortalAccess(string path, string dolphinAppId, string additionalFlag = "") { if (IsFixableFlatpakGamePath(path)) { @@ -60,7 +56,7 @@ private static bool TryFixFlatpakPortalAccess(string path, string additionalFlag ArgumentList = { "document-export", - "--app=org.DolphinEmu.dolphin-emu", + $"--app={dolphinAppId}", // Default to a flag that is on by default string.IsNullOrWhiteSpace(additionalFlag) ? "-r" @@ -85,8 +81,22 @@ private static bool TryFixFlatpakPortalAccess(string path, string additionalFlag return false; } + private static string ExtractDolphinAppId(string flatpakDolphinLocation) + { + var defaultAppId = "org.DolphinEmu.dolphin-emu"; + + if (string.IsNullOrWhiteSpace(flatpakDolphinLocation)) + { + return defaultAppId; + } + + var matches = Regex.Matches(flatpakDolphinLocation, @"(?i)\b[a-z][a-z0-9]*(?:\.[a-z_][a-z0-9_]*){1,}\.[a-z_][a-z0-9_-]*\b"); + return matches.Count == 0 ? defaultAppId : matches[^1].Value; + } + private static string FixFlatpakDolphinPermissions(string flatpakDolphinLocation) { + var dolphinAppId = ExtractDolphinAppId(flatpakDolphinLocation); var fixedFlatpakDolphinLocation = flatpakDolphinLocation; void AddFilesystemPerm(string newFilesystemPerm, string mode = "") { @@ -101,7 +111,7 @@ void AddFilesystemPerm(string newFilesystemPerm, string mode = "") // Try to export all portal-based paths to the Dolphin Flatpak so there are no issues. // We are going to try to fix all user-configurable paths (excluding the Dolphin executable). - if (!TryFixFlatpakPortalAccess(PathManager.UserFolderPath, "-w")) + if (!TryFixFlatpakPortalAccess(PathManager.UserFolderPath, dolphinAppId, "-w")) AddFilesystemPerm(PathManager.UserFolderPath, ":rw"); // It doesn't seem viable to always enforce read-only Riivolution folder access // while granting read-write to the save subdirectory, @@ -109,15 +119,15 @@ void AddFilesystemPerm(string newFilesystemPerm, string mode = "") // The Dolphin Flatpak itself would have write access to the entire Riivolution folder // anyway in the default configuration, so we will only use read-only permissions on // launch files if possible, not folders. - if (!TryFixFlatpakPortalAccess(PathManager.RiivolutionWhWzFolderPath, "-w")) + if (!TryFixFlatpakPortalAccess(PathManager.RiivolutionWhWzFolderPath, dolphinAppId, "-w")) AddFilesystemPerm(PathManager.RiivolutionWhWzFolderPath, ":rw"); // Read-only permissions on files where possible - if (!TryFixFlatpakPortalAccess(PathManager.GameFilePath, "-r")) + if (!TryFixFlatpakPortalAccess(PathManager.GameFilePath, dolphinAppId, "-r")) AddFilesystemPerm(PathManager.GameFilePath, ":ro"); // We need to provide the directory where the `RR.json` is located in for portal access! - if (!TryFixFlatpakPortalAccess(Path.GetDirectoryName(PathManager.RrLaunchJsonFilePath) ?? "", "-r")) + if (!TryFixFlatpakPortalAccess(Path.GetDirectoryName(PathManager.RrLaunchJsonFilePath) ?? "", dolphinAppId, "-r")) AddFilesystemPerm(PathManager.RrLaunchJsonFilePath, ":ro"); return fixedFlatpakDolphinLocation; @@ -150,7 +160,7 @@ public static void LaunchDolphin(string arguments = "", bool shellExecute = fals startInfo.ArgumentList.Add("--"); if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { - if (PathManager.IsFlatpakDolphinFilePath()) + if (PathManager.IsFlatpakDolphinFilePath(dolphinLocation)) dolphinLocation = FixFlatpakDolphinPermissions(dolphinLocation); else startInfo.EnvironmentVariables["QT_QPA_PLATFORM"] = "xcb"; diff --git a/WheelWizard/Services/PathManager.cs b/WheelWizard/Services/PathManager.cs index ff6610c9..0651f955 100644 --- a/WheelWizard/Services/PathManager.cs +++ b/WheelWizard/Services/PathManager.cs @@ -604,7 +604,7 @@ public static string SplitLinuxDolphinConfigDir { get { - if (IsFlatpakDolphinFilePath()) + if (IsFlatpakDolphinFilePath(DolphinFilePath)) { if (LinuxDolphinFlatpakDataDir.Equals(Path.GetFullPath(UserFolderPath), StringComparison.Ordinal)) return LinuxDolphinFlatpakConfigDir; @@ -676,28 +676,9 @@ public static bool IsFlatpakDolphinFilePath(string filePath) // Prioritize Flatpak Dolphin installation if no file path has been saved yet, so return true return true; } + // Because we need this prefix for the permission workarounds, we just expect it to start with "flatpak run" var flatpakRunCommand = "flatpak run"; - var dolphinAppId = "org.DolphinEmu.dolphin-emu"; - string[] possibleFlatpakDolphinCommands = - [ - $"{flatpakRunCommand} {dolphinAppId}", - $"{flatpakRunCommand} --system {dolphinAppId}", - $"{flatpakRunCommand} --user {dolphinAppId}", - $"{flatpakRunCommand} -p {dolphinAppId}", - $"{flatpakRunCommand} --system -p {dolphinAppId}", - $"{flatpakRunCommand} --user -p {dolphinAppId}", - ]; - foreach (var possibleFlatpakDolphinCommand in possibleFlatpakDolphinCommands) - { - if (possibleFlatpakDolphinCommand.Equals(filePath, StringComparison.Ordinal)) - return true; - } - return false; - } - - public static bool IsFlatpakDolphinFilePath() - { - return IsFlatpakDolphinFilePath(DolphinFilePath); + return filePath.StartsWith(flatpakRunCommand, StringComparison.Ordinal); } private static string GetContainingBaseDirectorySafe(string path) diff --git a/WheelWizard/Views/Layout.axaml b/WheelWizard/Views/Layout.axaml index 7f880645..08c95d95 100644 --- a/WheelWizard/Views/Layout.axaml +++ b/WheelWizard/Views/Layout.axaml @@ -56,7 +56,7 @@ x:Name="ContentArea" Margin="{StaticResource EdgeGap}" /> - + - - + diff --git a/WheelWizard/Views/Layout.axaml.cs b/WheelWizard/Views/Layout.axaml.cs index 1e4c283b..84a81c57 100644 --- a/WheelWizard/Views/Layout.axaml.cs +++ b/WheelWizard/Views/Layout.axaml.cs @@ -137,12 +137,7 @@ private void OnLanguageChanged(object? sender, EventArgs e) private void UpdateMadeByText() { var completeString = t("text.made_by_string", "Patchzy", "WantToBeeMe"); - if (!completeString.Contains("\\n")) - return; - - var split = completeString.Split("\\n"); - MadeBy_Part1.Text = split[0]; - MadeBy_Part2.Text = split[1]; + MadeBy.Text = completeString; } private void ModManager_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) diff --git a/WheelWizard/Views/Pages/Settings/WhWzSettings.axaml.cs b/WheelWizard/Views/Pages/Settings/WhWzSettings.axaml.cs index 96ef795a..b231d435 100644 --- a/WheelWizard/Views/Pages/Settings/WhWzSettings.axaml.cs +++ b/WheelWizard/Views/Pages/Settings/WhWzSettings.axaml.cs @@ -160,8 +160,8 @@ private async void DolphinExeBrowse_OnClick(object sender, RoutedEventArgs e) if (isInstalled()) { var result = await new YesNoWindow() - .SetMainText(t("question.dolphin_found.title")) - .SetExtraText($"{t("question.dolphin_found.extra")}\n{path}") + .SetMainText(t("question.dolphin_program_found.title")) + .SetExtraText($"{t("question.dolphin_program_found.extra")}\n{path}") .AwaitAnswer(); if (result) @@ -172,11 +172,11 @@ private async void DolphinExeBrowse_OnClick(object sender, RoutedEventArgs e) } } - if (!EnvHelper.IsFlatpakSandboxed() && !IsFlatpakDolphinInstalled()) + if (!IsFlatpakDolphinInstalled()) { var wantsAutomaticInstall = await new YesNoWindow() - .SetMainText(t("question.dolphin_flatpack.title")) - .SetExtraText(t("question.dolphin_flatpack.extra")) + .SetMainText(t("question.dolphin_flatpak.title")) + .SetExtraText(t("question.dolphin_flatpak.extra")) .SetButtonText(t("action.install"), t("action.do_manually")) .AwaitAnswer(); if (wantsAutomaticInstall) @@ -205,6 +205,12 @@ private async void DolphinExeBrowse_OnClick(object sender, RoutedEventArgs e) } } + if (EnvHelper.IsFlatpakSandboxed()) + { + // Having a picker does not make sense if Wheel Wizard is sandboxed. + return; + } + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { var dolphinAppPath = PathManager.TryToFindApplicationPath();