diff --git a/installer/PSLauncher.iss b/installer/PSLauncher.iss index ee1efd8..cac7143 100644 --- a/installer/PSLauncher.iss +++ b/installer/PSLauncher.iss @@ -11,7 +11,7 @@ #define MyAppName "PROSERVE Launcher" #define MyAppShortName "PS_Launcher" -#define MyAppVersion "0.29.10" +#define MyAppVersion "1.0.0" #define MyAppPublisher "ASTERION VR" #define MyAppURL "https://asterionvr.com" #define MyAppExeName "PS_Launcher.exe" diff --git a/server/admin/licenses.php b/server/admin/licenses.php index 1aaf073..2e9f49f 100644 --- a/server/admin/licenses.php +++ b/server/admin/licenses.php @@ -169,25 +169,34 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } } elseif ($action === 'set_contact_emails') { - // Met à jour la liste des emails de contact pour les notifications - // de nouvelles versions. L'admin saisit en texte libre (1 par ligne, - // virgules, point-virgules — peu importe), on parse + valide via - // FILTER_VALIDATE_EMAIL et on stocke en CSV. Vide / aucun email - // valide → on stocke NULL (= pas de notif possible pour cette - // license, juste skip silencieux à l'envoi). + // Met à jour la liste des emails de contact + la langue préférée + // pour les notifications de nouvelles versions. L'admin saisit en + // texte libre (1 par ligne, virgules, point-virgules — peu importe), + // on parse + valide via FILTER_VALIDATE_EMAIL et on stocke en CSV. + // Vide / aucun email valide → on stocke NULL (= pas de notif possible + // pour cette license, juste skip silencieux à l'envoi). + // + // Language : whitelist stricte fr/en/zh/th/ar (= ce que le launcher + // supporte côté Strings.cs). NULL ou inconnu → fallback English. $id = (int)($_POST['id'] ?? 0); $raw = (string)($_POST['contact_emails'] ?? ''); + $lang = trim((string)($_POST['language'] ?? '')); if ($id <= 0) { throw new Exception('License id invalide.'); } + $allowedLangs = ['fr', 'en', 'es', 'de', 'zh', 'th', 'ar']; + if ($lang !== '' && !in_array($lang, $allowedLangs, true)) { + throw new Exception("Code langue invalide : '{$lang}'. Attendu : " . implode(', ', $allowedLangs) . ' ou vide.'); + } $parsed = Mailer::parseEmails($raw); $stored = Mailer::joinForStorage($parsed); - $db->prepare('UPDATE licenses SET contact_emails = ? WHERE id = ?') - ->execute([$stored, $id]); + $db->prepare('UPDATE licenses SET contact_emails = ?, language = ? WHERE id = ?') + ->execute([$stored, $lang !== '' ? $lang : null, $id]); $count = count($parsed); + $langDisplay = $lang !== '' ? $lang : 'en (défaut)'; $message = $count === 0 - ? "License #{$id} : contacts de notification supprimés." - : "License #{$id} : {$count} contact(s) email enregistré(s) pour les notifications de release."; + ? "License #{$id} : contacts de notification supprimés. Langue email : {$langDisplay}." + : "License #{$id} : {$count} contact(s) email enregistré(s), langue email : {$langDisplay}."; } elseif ($action === 'reset_machines') { $id = (int)($_POST['id'] ?? 0); @@ -546,17 +555,45 @@ Layout::header('Licenses', 'licenses'); version de PROSERVE accessible à cette license (matching channel + entitlement). Format libre : une adresse par ligne, virgules, ou point-virgules. Adresses invalides ignorées silencieusement. + La langue choisie ci-dessous est utilisée pour le contenu de l'email + (greeting + instructions) — les release notes elles-mêmes restent + toujours en anglais.

'English (defaut)', + 'fr' => 'Français', + 'en' => 'English', + 'es' => 'Español', + 'de' => 'Deutsch', + 'zh' => '中文 (Chinese)', + 'th' => 'ภาษาไทย (Thai)', + 'ar' => 'العربية (Arabic)', + ]; ?>
+
+ + +

+ Langue dans laquelle l'email de notification sera rédigé. + Le contenu des release notes reste toujours en anglais. +

+