i18n: full pass + culture-aware dates/sizes + Software Update License wording

- Strings.cs : ~80 new keys covering status messages, progress detail
  (DL/extraction/verify), license summary, license details dialog, onboarding
  statuses, settings field labels, restart/cancel/quit confirmations, toasts,
  resume choice, copyright. Strings.FormatSize and Strings.FormatDate /
  FormatLongDate switch units (o/Ko vs B/KB) and pattern (dd/MM/yyyy vs M/d/yyyy
  vs 2026年) by active language.
- License terminology renamed across UI: "License" → "License de mise à jour"
  / "Software Update License" to clarify it gates UPDATES, not Proserve itself.
  Expired/revoked dialogs now spell out "you can still download versions
  released before this date and launch any installed version".
- "🔒 License insuffisante" → "🔒 License de mise à jour requise pour cette
  version" / "Valid update license needed for this version" so users understand
  it's a per-version eligibility check, not a global block.
- All hardcoded FR strings in views (SettingsDialog labels, LicenseDetails
  fields, Onboarding statuses, dialog titles, copyright, window chrome
  tooltips, "Sortie le", etc.) replaced with x:Static loc bindings.
- All FormatSize duplicates (5 places) and date format strings (8 places)
  delegate to Strings helpers — single source of truth for localization.
- Settings dialog: License section moved to the top before Language. It's
  the most important info and conditions what the user can download.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-02 19:14:57 +02:00
parent 962f5a8ce0
commit b4f205cbe5
13 changed files with 634 additions and 135 deletions

View File

@@ -30,30 +30,9 @@
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" Padding="32,0,32,16">
<StackPanel>
<!-- Langue de l'interface -->
<Border Background="{StaticResource Brush.Bg.Card}"
BorderBrush="{StaticResource Brush.Border}" BorderThickness="1"
CornerRadius="6" Padding="20" Margin="0,0,0,16">
<StackPanel>
<TextBlock Text="{x:Static loc:Strings.SettingsLanguage}"
FontSize="11" FontWeight="Bold"
Foreground="{StaticResource Brush.Text.Secondary}"
Margin="0,0,0,8" />
<ComboBox ItemsSource="{Binding AvailableLanguages}"
DisplayMemberPath="Name"
SelectedValuePath="Code"
SelectedValue="{Binding Language, Mode=TwoWay}"
Background="#1A1A20"
Foreground="{StaticResource Brush.Text.Primary}"
BorderBrush="{StaticResource Brush.Border}"
BorderThickness="1" Padding="8" />
<TextBlock Text="{x:Static loc:Strings.SettingsLanguageHint}"
FontSize="11" Foreground="{StaticResource Brush.Text.Secondary}"
FontStyle="Italic" Margin="0,6,0,0" TextWrapping="Wrap" />
</StackPanel>
</Border>
<!-- License (en tête, bordure colorée selon état) -->
<!-- License de mise à jour (en tête : c'est l'info la plus importante,
elle conditionne ce que l'utilisateur peut télécharger.
Bordure colorée selon l'état : vert/jaune/rouge). -->
<Border BorderThickness="2"
CornerRadius="6" Padding="20" Margin="0,0,0,16">
<Border.Style>
@@ -124,7 +103,7 @@
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<TextBlock Text="Identifiant machine (anonyme)"
<TextBlock Text="{x:Static loc:Strings.SettingsMachineId}"
FontSize="11"
Foreground="{StaticResource Brush.Text.Secondary}" />
<TextBlock Text="{Binding MachineId}"
@@ -134,12 +113,35 @@
</StackPanel>
<Button Grid.Column="1"
Style="{StaticResource SecondaryButton}"
Content="📋 Copier"
Content="{x:Static loc:Strings.SettingsCopyMachineId}"
Command="{Binding CopyMachineIdCommand}" />
</Grid>
</Grid>
</Border>
<!-- Langue de l'interface -->
<Border Background="{StaticResource Brush.Bg.Card}"
BorderBrush="{StaticResource Brush.Border}" BorderThickness="1"
CornerRadius="6" Padding="20" Margin="0,0,0,16">
<StackPanel>
<TextBlock Text="{x:Static loc:Strings.SettingsLanguage}"
FontSize="11" FontWeight="Bold"
Foreground="{StaticResource Brush.Text.Secondary}"
Margin="0,0,0,8" />
<ComboBox ItemsSource="{Binding AvailableLanguages}"
DisplayMemberPath="Name"
SelectedValuePath="Code"
SelectedValue="{Binding Language, Mode=TwoWay}"
Background="#1A1A20"
Foreground="{StaticResource Brush.Text.Primary}"
BorderBrush="{StaticResource Brush.Border}"
BorderThickness="1" Padding="8" />
<TextBlock Text="{x:Static loc:Strings.SettingsLanguageHint}"
FontSize="11" Foreground="{StaticResource Brush.Text.Secondary}"
FontStyle="Italic" Margin="0,6,0,0" TextWrapping="Wrap" />
</StackPanel>
</Border>
<!-- Serveur -->
<Border Background="{StaticResource Brush.Bg.Card}"
BorderBrush="{StaticResource Brush.Border}" BorderThickness="1"
@@ -149,7 +151,7 @@
FontSize="11" FontWeight="Bold"
Foreground="{StaticResource Brush.Text.Secondary}"
Margin="0,0,0,8" />
<TextBlock Text="URL de l'API"
<TextBlock Text="{x:Static loc:Strings.SettingsApiUrl}"
Foreground="{StaticResource Brush.Text.Secondary}"
FontSize="12" Margin="0,0,0,4" />
<Grid>
@@ -184,7 +186,7 @@
FontSize="11" FontWeight="Bold"
Foreground="{StaticResource Brush.Text.Secondary}"
Margin="0,0,0,8" />
<TextBlock Text="Dossier où sont installées les versions"
<TextBlock Text="{x:Static loc:Strings.SettingsInstallRoot}"
Foreground="{StaticResource Brush.Text.Secondary}"
FontSize="12" Margin="0,0,0,4" />
<Grid>
@@ -229,7 +231,8 @@
TextTrimming="CharacterEllipsis" />
<TextBlock FontSize="12"
Foreground="{StaticResource Brush.Text.Secondary}">
<Run Text="Taille actuelle : " />
<Run Text="{x:Static loc:Strings.SettingsCacheSize}" />
<Run Text=" " />
<Run Text="{Binding CacheSizeDisplay}" FontWeight="SemiBold" />
</TextBlock>
</StackPanel>
@@ -256,10 +259,11 @@
Margin="0,0,0,8" />
<TextBlock FontSize="13"
Foreground="{StaticResource Brush.Text.Primary}">
<Run Text="Version : " />
<Run Text="{x:Static loc:Strings.SettingsLauncherVersion}" />
<Run Text=" " />
<Run Text="{Binding LauncherVersion, Mode=OneWay}" FontWeight="SemiBold" />
</TextBlock>
<TextBlock Text="© 2026 ASTERION VR — Tous droits réservés"
<TextBlock Text="{x:Static loc:Strings.Copyright}"
FontSize="12"
Foreground="{StaticResource Brush.Text.Secondary}"
Margin="0,4,0,0" />
@@ -273,14 +277,14 @@
FontFamily="Consolas" FontSize="11"
Foreground="{StaticResource Brush.Text.Primary}"
TextTrimming="CharacterEllipsis" />
<TextBlock Text="Logs rotation quotidienne, 10 jours conservés"
<TextBlock Text="{x:Static loc:Strings.SettingsCacheRotation}"
FontSize="12"
Foreground="{StaticResource Brush.Text.Secondary}"
Margin="0,2,0,0" />
</StackPanel>
<Button Grid.Column="1" Margin="8,0,0,0"
Style="{StaticResource SecondaryButton}"
Content="📁 Ouvrir"
Content="{x:Static loc:Strings.OpenButton}"
Command="{Binding OpenLogsFolderCommand}" />
</Grid>
</StackPanel>