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:
@@ -64,7 +64,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
'version' => $version,
|
'version' => $version,
|
||||||
'releasedAt' => $releasedAtIso,
|
'releasedAt' => $releasedAtIso,
|
||||||
'executable' => 'PROSERVE_UE_5_5.exe',
|
'executable' => 'PROSERVE_UE_5_5.exe',
|
||||||
'installFolderTemplate' => 'Proserve v{version}',
|
'installFolderTemplate' => 'PROSERVE v{version}',
|
||||||
'download' => [
|
'download' => [
|
||||||
'url' => "{$base}/builds/proserve-{$version}.zip",
|
'url' => "{$base}/builds/proserve-{$version}.zip",
|
||||||
'sizeBytes' => 0,
|
'sizeBytes' => 0,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"version": "1.4.6",
|
"version": "1.4.6",
|
||||||
"releasedAt": "2026-04-29T10:00:00Z",
|
"releasedAt": "2026-04-29T10:00:00Z",
|
||||||
"executable": "PROSERVE_UE_5_5.exe",
|
"executable": "PROSERVE_UE_5_5.exe",
|
||||||
"installFolderTemplate": "Proserve v{version}",
|
"installFolderTemplate": "PROSERVE v{version}",
|
||||||
"download": {
|
"download": {
|
||||||
"url": "https://asterionvr.com/PS_Launcher/builds/proserve-1.4.6.zip",
|
"url": "https://asterionvr.com/PS_Launcher/builds/proserve-1.4.6.zip",
|
||||||
"sizeBytes": 0,
|
"sizeBytes": 0,
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
"version": "1.4.5",
|
"version": "1.4.5",
|
||||||
"releasedAt": "2026-04-15T10:00:00Z",
|
"releasedAt": "2026-04-15T10:00:00Z",
|
||||||
"executable": "PROSERVE_UE_5_5.exe",
|
"executable": "PROSERVE_UE_5_5.exe",
|
||||||
"installFolderTemplate": "Proserve v{version}",
|
"installFolderTemplate": "PROSERVE v{version}",
|
||||||
"download": {
|
"download": {
|
||||||
"url": "https://asterionvr.com/PS_Launcher/builds/proserve-1.4.5.zip",
|
"url": "https://asterionvr.com/PS_Launcher/builds/proserve-1.4.5.zip",
|
||||||
"sizeBytes": 0,
|
"sizeBytes": 0,
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ public sealed partial class MainViewModel : ObservableObject
|
|||||||
public string EmptyHint =>
|
public string EmptyHint =>
|
||||||
"Aucune version locale ni distante.\n" +
|
"Aucune version locale ni distante.\n" +
|
||||||
"Clique « Vérifier les mises à jour » pour récupérer le catalogue depuis le serveur, " +
|
"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;
|
_config.InstallRoot;
|
||||||
|
|
||||||
public Visibility EmptyHintVisibility =>
|
public Visibility EmptyHintVisibility =>
|
||||||
@@ -439,7 +439,7 @@ public sealed partial class MainViewModel : ObservableObject
|
|||||||
proc.EnableRaisingEvents = true;
|
proc.EnableRaisingEvents = true;
|
||||||
proc.Exited += (_, _) =>
|
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(() =>
|
Application.Current?.Dispatcher.Invoke(() =>
|
||||||
{
|
{
|
||||||
if (Application.Current.MainWindow is { } main)
|
if (Application.Current.MainWindow is { } main)
|
||||||
@@ -539,7 +539,7 @@ public sealed partial class MainViewModel : ObservableObject
|
|||||||
RebuildList();
|
RebuildList();
|
||||||
_toastService.ShowSuccess(
|
_toastService.ShowSuccess(
|
||||||
"Installation terminée",
|
"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)
|
catch (OperationCanceledException)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -371,7 +371,7 @@
|
|||||||
|
|
||||||
<!-- Numéro version + badge -->
|
<!-- Numéro version + badge -->
|
||||||
<StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center">
|
<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"
|
FontSize="32" FontWeight="Bold"
|
||||||
Foreground="{StaticResource Brush.Text.Primary}" />
|
Foreground="{StaticResource Brush.Text.Primary}" />
|
||||||
<Border CornerRadius="12" Padding="10,4" Margin="16,8,0,0"
|
<Border CornerRadius="12" Padding="10,4" Margin="16,8,0,0"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ public partial class UpdateAvailableDialog : Window
|
|||||||
|
|
||||||
DataContext = new
|
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)}",
|
Subtitle = $"Date de release : {version.ReleasedAt.ToLocalTime():dd MMMM yyyy} • {FormatSize(version.Download.SizeBytes)}",
|
||||||
ReleaseNotesDocument = MarkdownTheming.BuildThemedDocument(releaseNotesMarkdown)
|
ReleaseNotesDocument = MarkdownTheming.BuildThemedDocument(releaseNotesMarkdown)
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ public sealed partial class InstallationRegistry : IInstallationRegistry
|
|||||||
{
|
{
|
||||||
private const string ExecutableName = "PROSERVE_UE_5_5.exe";
|
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 static partial Regex VersionFolderRegex();
|
||||||
|
|
||||||
private readonly ILogger<InstallationRegistry> _logger;
|
private readonly ILogger<InstallationRegistry> _logger;
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public sealed class VersionManifest
|
|||||||
public string Executable { get; set; } = "PROSERVE_UE_5_5.exe";
|
public string Executable { get; set; } = "PROSERVE_UE_5_5.exe";
|
||||||
|
|
||||||
[JsonPropertyName("installFolderTemplate")]
|
[JsonPropertyName("installFolderTemplate")]
|
||||||
public string InstallFolderTemplate { get; set; } = "Proserve v{version}";
|
public string InstallFolderTemplate { get; set; } = "PROSERVE v{version}";
|
||||||
|
|
||||||
[JsonPropertyName("download")]
|
[JsonPropertyName("download")]
|
||||||
public DownloadDescriptor Download { get; set; } = new();
|
public DownloadDescriptor Download { get; set; } = new();
|
||||||
|
|||||||
Reference in New Issue
Block a user