From 2e320d2ab5ac951d40c15b29939e5e5d263f188a Mon Sep 17 00:00:00 2001 From: "j.foucher" Date: Sat, 2 May 2026 12:46:26 +0200 Subject: [PATCH] Brand: install folder uses uppercase PROSERVE v{version} MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The product wordmark is rendered uppercase everywhere in the UI (PROSERVE in Pirulen). Align the install directory naming so it reads "PROSERVE v1.4.7" instead of "Proserve v1.4.7" — same brand, same case on disk and in dialog titles. Changes: - server/manifest/versions.json: installFolderTemplate updated for both existing entries. - server/admin/versions.php: default template for new versions added via the backoffice form. - src/PSLauncher.Models/RemoteManifest.cs: default fallback for the property when missing from JSON. - src/PSLauncher.App/Views/MainWindow.xaml + dialogs + ViewModel toasts: UI strings now read "PROSERVE v..." consistent with the brand. InstallationRegistry's regex was already RegexOptions.IgnoreCase, so existing user installs in "Proserve v..." folders keep working (case-insensitive on Windows filesystems anyway). Re-installing an older version after the change re-creates the folder with the new case — Windows is case-preserving but case-insensitive, so launching remains identical. Co-Authored-By: Claude Opus 4.7 (1M context) --- server/admin/versions.php | 2 +- server/manifest/versions.json | 4 ++-- src/PSLauncher.App/ViewModels/MainViewModel.cs | 6 +++--- src/PSLauncher.App/Views/MainWindow.xaml | 2 +- src/PSLauncher.App/Views/UpdateAvailableDialog.xaml.cs | 2 +- src/PSLauncher.Core/Installations/InstallationRegistry.cs | 4 +++- src/PSLauncher.Models/RemoteManifest.cs | 2 +- 7 files changed, 12 insertions(+), 10 deletions(-) diff --git a/server/admin/versions.php b/server/admin/versions.php index af3e3b0..13abe4a 100644 --- a/server/admin/versions.php +++ b/server/admin/versions.php @@ -64,7 +64,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { 'version' => $version, 'releasedAt' => $releasedAtIso, 'executable' => 'PROSERVE_UE_5_5.exe', - 'installFolderTemplate' => 'Proserve v{version}', + 'installFolderTemplate' => 'PROSERVE v{version}', 'download' => [ 'url' => "{$base}/builds/proserve-{$version}.zip", 'sizeBytes' => 0, diff --git a/server/manifest/versions.json b/server/manifest/versions.json index c890d38..1b63c9d 100644 --- a/server/manifest/versions.json +++ b/server/manifest/versions.json @@ -9,7 +9,7 @@ "version": "1.4.6", "releasedAt": "2026-04-29T10:00:00Z", "executable": "PROSERVE_UE_5_5.exe", - "installFolderTemplate": "Proserve v{version}", + "installFolderTemplate": "PROSERVE v{version}", "download": { "url": "https://asterionvr.com/PS_Launcher/builds/proserve-1.4.6.zip", "sizeBytes": 0, @@ -23,7 +23,7 @@ "version": "1.4.5", "releasedAt": "2026-04-15T10:00:00Z", "executable": "PROSERVE_UE_5_5.exe", - "installFolderTemplate": "Proserve v{version}", + "installFolderTemplate": "PROSERVE v{version}", "download": { "url": "https://asterionvr.com/PS_Launcher/builds/proserve-1.4.5.zip", "sizeBytes": 0, diff --git a/src/PSLauncher.App/ViewModels/MainViewModel.cs b/src/PSLauncher.App/ViewModels/MainViewModel.cs index fe1fb0e..51b1541 100644 --- a/src/PSLauncher.App/ViewModels/MainViewModel.cs +++ b/src/PSLauncher.App/ViewModels/MainViewModel.cs @@ -135,7 +135,7 @@ public sealed partial class MainViewModel : ObservableObject public string EmptyHint => "Aucune version locale ni distante.\n" + "Clique « Vérifier les mises à jour » pour récupérer le catalogue depuis le serveur, " + - "ou place un dossier « Proserve v{X.Y.Z} » contenant PROSERVE_UE_5_5.exe dans :\n" + + "ou place un dossier « PROSERVE v{X.Y.Z} » contenant PROSERVE_UE_5_5.exe dans :\n" + _config.InstallRoot; public Visibility EmptyHintVisibility => @@ -439,7 +439,7 @@ public sealed partial class MainViewModel : ObservableObject proc.EnableRaisingEvents = true; proc.Exited += (_, _) => { - _logger.LogInformation("Proserve v{Version} a quitté — restauration du launcher", row.Version); + _logger.LogInformation("PROSERVE v{Version} a quitté — restauration du launcher", row.Version); Application.Current?.Dispatcher.Invoke(() => { if (Application.Current.MainWindow is { } main) @@ -539,7 +539,7 @@ public sealed partial class MainViewModel : ObservableObject RebuildList(); _toastService.ShowSuccess( "Installation terminée", - $"Proserve v{row.Version} est prête à être lancée."); + $"PROSERVE v{row.Version} est prête à être lancée."); } catch (OperationCanceledException) { diff --git a/src/PSLauncher.App/Views/MainWindow.xaml b/src/PSLauncher.App/Views/MainWindow.xaml index 0fe56aa..86bf746 100644 --- a/src/PSLauncher.App/Views/MainWindow.xaml +++ b/src/PSLauncher.App/Views/MainWindow.xaml @@ -371,7 +371,7 @@ - \d+\.\d+\.\d+)$", RegexOptions.IgnoreCase)] + // IgnoreCase pour matcher à la fois les anciens dossiers "Proserve vX.Y.Z" et les + // nouveaux "PROSERVE vX.Y.Z" (changement de casse de la marque). + [GeneratedRegex(@"^PROSERVE v(?\d+\.\d+\.\d+)$", RegexOptions.IgnoreCase)] private static partial Regex VersionFolderRegex(); private readonly ILogger _logger; diff --git a/src/PSLauncher.Models/RemoteManifest.cs b/src/PSLauncher.Models/RemoteManifest.cs index 80828e7..c1f5117 100644 --- a/src/PSLauncher.Models/RemoteManifest.cs +++ b/src/PSLauncher.Models/RemoteManifest.cs @@ -56,7 +56,7 @@ public sealed class VersionManifest public string Executable { get; set; } = "PROSERVE_UE_5_5.exe"; [JsonPropertyName("installFolderTemplate")] - public string InstallFolderTemplate { get; set; } = "Proserve v{version}"; + public string InstallFolderTemplate { get; set; } = "PROSERVE v{version}"; [JsonPropertyName("download")] public DownloadDescriptor Download { get; set; } = new();