Brand: install folder uses uppercase PROSERVE v{version}

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) <noreply@anthropic.com>
This commit is contained in:
2026-05-02 12:46:26 +02:00
parent 7a12153343
commit 2e320d2ab5
7 changed files with 12 additions and 10 deletions

View File

@@ -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,

View File

@@ -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,

View File

@@ -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)
{

View File

@@ -371,7 +371,7 @@
<!-- Numéro version + badge -->
<StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding FeaturedVersion.Version, StringFormat='Proserve v{0}'}"
<TextBlock Text="{Binding FeaturedVersion.Version, StringFormat='PROSERVE v{0}'}"
FontSize="32" FontWeight="Bold"
Foreground="{StaticResource Brush.Text.Primary}" />
<Border CornerRadius="12" Padding="10,4" Margin="16,8,0,0"

View File

@@ -11,7 +11,7 @@ public partial class UpdateAvailableDialog : Window
DataContext = new
{
Title = $"Proserve v{version.Version} disponible",
Title = $"PROSERVE v{version.Version} disponible",
Subtitle = $"Date de release : {version.ReleasedAt.ToLocalTime():dd MMMM yyyy} • {FormatSize(version.Download.SizeBytes)}",
ReleaseNotesDocument = MarkdownTheming.BuildThemedDocument(releaseNotesMarkdown)
};

View File

@@ -8,7 +8,9 @@ public sealed partial class InstallationRegistry : IInstallationRegistry
{
private const string ExecutableName = "PROSERVE_UE_5_5.exe";
[GeneratedRegex(@"^Proserve v(?<v>\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(?<v>\d+\.\d+\.\d+)$", RegexOptions.IgnoreCase)]
private static partial Regex VersionFolderRegex();
private readonly ILogger<InstallationRegistry> _logger;

View File

@@ -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();