i18n: 5 languages (FR/EN/ZH/TH/AR), auto-detect from Windows + Settings picker
Localization infrastructure
---------------------------
PSLauncher.Core/Localization/Strings.cs is a static class exposing each
UI string as a static property. T(fr,en,zh,th,ar) helper switches by the
current language code. ~50 keys cover the visible top-level strings:
top bar, body, status badges, action buttons, "..." menu items, license
badge texts, Settings section headers, Onboarding dialog, Update dialog.
Bindings via x:Static in XAML:
xmlns:loc="clr-namespace:PSLauncher.Core.Localization;assembly=PSLauncher.Core"
Content="{x:Static loc:Strings.ActionLaunch}"
Auto-detection
--------------
LocalConfig gains a Language field defaulting to "auto". Strings.Init()
called at App.xaml.cs OnStartup before any UI:
- "auto" (or unknown code) → reads CultureInfo.CurrentUICulture
.TwoLetterISOLanguageName, picks the matching supported language,
falls back to English.
- explicit code → forced.
The chosen culture is then propagated to CurrentCulture / CurrentUICulture
so date/number formats follow.
Settings picker
---------------
SettingsDialog gets a top section "LANGUE" with a ComboBox bound to
SettingsViewModel.AvailableLanguages (Auto / FR / EN / ZH / TH / AR).
On Save, if the language code changed, prompt the user to confirm
restart, spawn `cmd /c timeout 1 & start PSLauncher.exe` and Shutdown
the current process — the new instance picks up the language at
bootstrap.
RTL for Arabic
--------------
Strings.IsRightToLeft is true when lang=="ar". App.xaml.cs sets
window.FlowDirection = RightToLeft on the MainWindow — WPF mirrors the
layout (icons on right, text aligned right).
Translations
------------
Done as best-effort by the assistant. The product wordmark "PROSERVE"
stays untranslated (brand). Logs and debug-level messages remain in
French in code — only user-visible UI is localized. Operator can
refine translations by editing Strings.cs and rebuilding.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:vm="clr-namespace:PSLauncher.App.ViewModels"
|
||||
xmlns:loc="clr-namespace:PSLauncher.Core.Localization;assembly=PSLauncher.Core"
|
||||
xmlns:shell="clr-namespace:System.Windows.Shell;assembly=PresentationFramework"
|
||||
Title="PROSERVE Launcher"
|
||||
Icon="pack://application:,,,/Resources/favicon.ico"
|
||||
@@ -113,7 +114,7 @@
|
||||
<!-- Action button -->
|
||||
<StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Center" Margin="12,0,0,0">
|
||||
<Button Style="{StaticResource PrimaryButton}"
|
||||
Content="▶ Lancer" Padding="22,8" FontSize="13"
|
||||
Content="{x:Static loc:Strings.ActionLaunch}" Padding="22,8" FontSize="13"
|
||||
Command="{Binding LaunchCommand}"
|
||||
Visibility="{Binding IsInstalled, Converter={StaticResource BoolToVisibility}}" />
|
||||
<Button Style="{StaticResource AccentButton}"
|
||||
@@ -143,13 +144,13 @@
|
||||
Click="OnMoreMenuClick">
|
||||
<Button.ContextMenu>
|
||||
<ContextMenu>
|
||||
<MenuItem Header="📜 Voir les release notes"
|
||||
<MenuItem Header="{x:Static loc:Strings.MenuReleaseNotes}"
|
||||
Command="{Binding PlacementTarget.Tag.ShowReleaseNotesCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
|
||||
<MenuItem Header="📁 Ouvrir le dossier"
|
||||
<MenuItem Header="{x:Static loc:Strings.MenuOpenFolder}"
|
||||
Command="{Binding PlacementTarget.Tag.OpenFolderCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
|
||||
Visibility="{Binding PlacementTarget.Tag.IsInstalled, RelativeSource={RelativeSource AncestorType=ContextMenu}, Converter={StaticResource BoolToVisibility}}" />
|
||||
<Separator Visibility="{Binding PlacementTarget.Tag.IsInstalled, RelativeSource={RelativeSource AncestorType=ContextMenu}, Converter={StaticResource BoolToVisibility}}" />
|
||||
<MenuItem Header="🗑 Supprimer cette version…"
|
||||
<MenuItem Header="{x:Static loc:Strings.MenuUninstall}"
|
||||
Command="{Binding PlacementTarget.Tag.UninstallCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
|
||||
Visibility="{Binding PlacementTarget.Tag.IsInstalled, RelativeSource={RelativeSource AncestorType=ContextMenu}, Converter={StaticResource BoolToVisibility}}" />
|
||||
</ContextMenu>
|
||||
@@ -219,7 +220,7 @@
|
||||
Cursor="Hand"
|
||||
CornerRadius="16" Padding="14,6"
|
||||
shell:WindowChrome.IsHitTestVisibleInChrome="True"
|
||||
ToolTip="Voir / changer la license">
|
||||
ToolTip="{x:Static loc:Strings.LicenseTooltip}">
|
||||
<Border.Style>
|
||||
<Style TargetType="Border">
|
||||
<Setter Property="Background" Value="#2A1414" />
|
||||
@@ -283,7 +284,7 @@
|
||||
<StackPanel Grid.Column="2" Orientation="Horizontal"
|
||||
HorizontalAlignment="Right" VerticalAlignment="Center">
|
||||
<Button Style="{StaticResource SecondaryButton}"
|
||||
Content="⚙ Paramètres"
|
||||
Content="{x:Static loc:Strings.TopBarSettings}"
|
||||
shell:WindowChrome.IsHitTestVisibleInChrome="True"
|
||||
Command="{Binding OpenSettingsCommand}"
|
||||
Margin="0,0,16,0" />
|
||||
@@ -368,7 +369,7 @@
|
||||
|
||||
<!-- Label "Version courante" -->
|
||||
<TextBlock Grid.Row="0" Grid.Column="0"
|
||||
Text="VERSION COURANTE"
|
||||
Text="{x:Static loc:Strings.FeaturedCurrent}"
|
||||
FontSize="11" FontWeight="Bold"
|
||||
Foreground="{StaticResource Brush.Text.Secondary}"
|
||||
Margin="0,0,0,4" />
|
||||
@@ -412,7 +413,7 @@
|
||||
<!-- Action principale (gros bouton) -->
|
||||
<Button Grid.Row="0" Grid.RowSpan="3" Grid.Column="1"
|
||||
Style="{StaticResource PrimaryButton}"
|
||||
Content="▶ LANCER"
|
||||
Content="{x:Static loc:Strings.ActionLaunchBig}"
|
||||
FontSize="20" Padding="56,16"
|
||||
VerticalAlignment="Center"
|
||||
Command="{Binding FeaturedVersion.LaunchCommand}"
|
||||
@@ -454,13 +455,13 @@
|
||||
Click="OnMoreMenuClick">
|
||||
<Button.ContextMenu>
|
||||
<ContextMenu>
|
||||
<MenuItem Header="📜 Voir les release notes"
|
||||
<MenuItem Header="{x:Static loc:Strings.MenuReleaseNotes}"
|
||||
Command="{Binding PlacementTarget.Tag.ShowReleaseNotesCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
|
||||
<MenuItem Header="📁 Ouvrir le dossier"
|
||||
<MenuItem Header="{x:Static loc:Strings.MenuOpenFolder}"
|
||||
Command="{Binding PlacementTarget.Tag.OpenFolderCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
|
||||
Visibility="{Binding PlacementTarget.Tag.IsInstalled, RelativeSource={RelativeSource AncestorType=ContextMenu}, Converter={StaticResource BoolToVisibility}}" />
|
||||
<Separator Visibility="{Binding PlacementTarget.Tag.IsInstalled, RelativeSource={RelativeSource AncestorType=ContextMenu}, Converter={StaticResource BoolToVisibility}}" />
|
||||
<MenuItem Header="🗑 Supprimer cette version…"
|
||||
<MenuItem Header="{x:Static loc:Strings.MenuUninstall}"
|
||||
Command="{Binding PlacementTarget.Tag.UninstallCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
|
||||
Visibility="{Binding PlacementTarget.Tag.IsInstalled, RelativeSource={RelativeSource AncestorType=ContextMenu}, Converter={StaticResource BoolToVisibility}}" />
|
||||
</ContextMenu>
|
||||
@@ -477,7 +478,7 @@
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Column="0" Text="AUTRES VERSIONS"
|
||||
<TextBlock Grid.Column="0" Text="{x:Static loc:Strings.SectionOther}"
|
||||
FontSize="12" FontWeight="Bold"
|
||||
Foreground="{StaticResource Brush.Text.Secondary}"
|
||||
VerticalAlignment="Center" />
|
||||
@@ -508,7 +509,7 @@
|
||||
<Button HorizontalAlignment="Left" VerticalAlignment="Bottom"
|
||||
Margin="32,0,0,24"
|
||||
Style="{StaticResource SecondaryButton}"
|
||||
Content="🔄 Vérifier les MAJ"
|
||||
Content="{x:Static loc:Strings.TopBarCheckUpdates}"
|
||||
Command="{Binding CheckForUpdatesCommand}" />
|
||||
|
||||
<!-- Copyright flottant en bas centré, sur une pill sombre pour rester
|
||||
@@ -546,7 +547,7 @@
|
||||
</StackPanel>
|
||||
<Button Grid.Column="1"
|
||||
Style="{StaticResource SecondaryButton}"
|
||||
Content="Annuler"
|
||||
Content="{x:Static loc:Strings.ActionCancel}"
|
||||
VerticalAlignment="Center" Margin="12,0,0,0"
|
||||
Command="{Binding CancelDownloadCommand}"
|
||||
Visibility="{Binding IsBusy, Converter={StaticResource BoolToVisibility}}" />
|
||||
|
||||
Reference in New Issue
Block a user