From 4c99c14be783ef80284e06005dbfd5faff333635 Mon Sep 17 00:00:00 2001 From: Flavio Fois Date: Tue, 10 Feb 2026 09:21:33 +0100 Subject: [PATCH] Features and Localization Updates for 1.5.2 Enhances user experience with increased contrast option for titlebar buttons. Adds localization option for the PDF preview page, improving accessibility for international users. Includes localization option and upgrade message for the InnoSetup installer, ensuring a smoother and more informative installation process. --- .gitignore | 3 +- config.ini | 2 +- frontend/.gitignore | 6 +- frontend/messages/en.json | 16 +++- frontend/messages/it.json | 16 +++- frontend/src/lib/stores/settings.svelte.ts | 1 + frontend/src/lib/types.d.ts | 1 + frontend/src/routes/(app)/+layout.svelte | 6 +- .../src/routes/(app)/settings/+page.svelte | 67 ++++++++++------ frontend/src/routes/pdf/+layout.svelte | 7 +- frontend/src/routes/pdf/+page.svelte | 27 ++++--- installer/installer.iss | 78 ++++++++++++++++++- 12 files changed, 184 insertions(+), 46 deletions(-) diff --git a/.gitignore b/.gitignore index c3dc776..132c29c 100644 --- a/.gitignore +++ b/.gitignore @@ -45,4 +45,5 @@ extra/*.dll *.eml -*.msg \ No newline at end of file +*.msg +frontend/bun.lock diff --git a/config.ini b/config.ini index ef8dd93..95ff810 100644 --- a/config.ini +++ b/config.ini @@ -1,7 +1,7 @@ [EMLy] SDK_DECODER_SEMVER = 1.3.2 SDK_DECODER_RELEASE_CHANNEL = stable -GUI_SEMVER = 1.5.0 +GUI_SEMVER = 1.5.2 GUI_RELEASE_CHANNEL = beta LANGUAGE = it UPDATE_CHECK_ENABLED = false diff --git a/frontend/.gitignore b/frontend/.gitignore index 91c0895..ee3de67 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -27,4 +27,8 @@ src/lib/paraglide project.inlang/cache/ # Wails -/src/lib/wailsjs \ No newline at end of file +/src/lib/wailsjs + + +bun.lock +bun.lockb \ No newline at end of file diff --git a/frontend/messages/en.json b/frontend/messages/en.json index 7b4c0a4..407d4a5 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -201,5 +201,19 @@ "settings_danger_update_checker_info": "Info: When enabled, the app will check for updates from your configured network share. Disable this if you manage updates manually or don't have network access.", "settings_reduce_motion_label": "Reduce Motion", "settings_reduce_motion_hint": "Disable transition animations for interface elements like the sidebar.", - "settings_reduce_motion_info": "Info: When enabled, animations such as the sidebar slide transition will be removed for a snappier feel or to reduce visual distractions." + "settings_reduce_motion_info": "Info: When enabled, animations such as the sidebar slide transition will be removed for a snappier feel or to reduce visual distractions.", + "settings_window_buttons_contrast_label": "Increase window buttons contrast", + "settings_window_buttons_contrast_hint": "Makes the window control buttons (minimize, maximize, close) more visible by increasing their contrast.", + "pdf_viewer_title": "PDF Viewer", + "pdf_loading": "Loading PDF...", + "pdf_zoom_in": "Zoom In", + "pdf_zoom_out": "Zoom Out", + "pdf_rotate_left": "Rotate Left", + "pdf_rotate_right": "Rotate Right", + "pdf_fit_width": "Fit to Width", + "pdf_error_no_data": "No PDF data provided", + "pdf_error_no_data_desc": "No PDF data provided. Please open this window from the main EMLy application.", + "pdf_error_timeout": "Timeout loading PDF. The worker might have failed to initialize.", + "pdf_error_parsing": "Error parsing PDF: ", + "pdf_error_rendering": "Error rendering page: " } diff --git a/frontend/messages/it.json b/frontend/messages/it.json index 870899e..eca16be 100644 --- a/frontend/messages/it.json +++ b/frontend/messages/it.json @@ -201,5 +201,19 @@ "settings_danger_update_checker_info": "Info: Quando abilitato, l'app controllerà gli aggiornamenti dal percorso di rete configurato. Disabilitalo se gestisci gli aggiornamenti manualmente o non hai accesso alla rete.", "settings_reduce_motion_label": "Riduci Movimento", "settings_reduce_motion_hint": "Disabilita le animazioni di transizione per gli elementi dell'interfaccia come la barra laterale.", - "settings_reduce_motion_info": "Info: Quando abilitato, le animazioni come la transizione della barra laterale verranno rimosse per un'esperienza più reattiva o per ridurre le distrazioni visive." + "settings_reduce_motion_info": "Info: Quando abilitato, le animazioni come la transizione della barra laterale verranno rimosse per un'esperienza più reattiva o per ridurre le distrazioni visive.", + "settings_window_buttons_contrast_label": "Aumenta contrasto pulsanti finestra", + "settings_window_buttons_contrast_hint": "Rende i pulsanti di controllo della finestra (minimizza, massimizza, chiudi) più visibili aumentando il loro contrasto.", + "pdf_viewer_title": "Visualizzatore PDF", + "pdf_loading": "Caricamento PDF...", + "pdf_zoom_in": "Ingrandisci", + "pdf_zoom_out": "Riduci", + "pdf_rotate_left": "Ruota a sinistra", + "pdf_rotate_right": "Ruota a destra", + "pdf_fit_width": "Adatta alla larghezza", + "pdf_error_no_data": "Nessun dato PDF fornito", + "pdf_error_no_data_desc": "Nessun dato PDF fornito. Apri questa finestra dall'applicazione principale EMLy.", + "pdf_error_timeout": "Timeout caricamento PDF. Il worker potrebbe non essersi inizializzato correttamente.", + "pdf_error_parsing": "Errore nel parsing del PDF: ", + "pdf_error_rendering": "Errore nel rendering della pagina: " } diff --git a/frontend/src/lib/stores/settings.svelte.ts b/frontend/src/lib/stores/settings.svelte.ts index 61e0de9..2535818 100644 --- a/frontend/src/lib/stores/settings.svelte.ts +++ b/frontend/src/lib/stores/settings.svelte.ts @@ -17,6 +17,7 @@ const defaults: EMLy_GUI_Settings = { musicInspirationEnabled: false, reduceMotion: false, theme: "dark", + increaseWindowButtonsContrast: false, }; class SettingsStore { diff --git a/frontend/src/lib/types.d.ts b/frontend/src/lib/types.d.ts index 715d447..3647e29 100644 --- a/frontend/src/lib/types.d.ts +++ b/frontend/src/lib/types.d.ts @@ -13,6 +13,7 @@ interface EMLy_GUI_Settings { musicInspirationEnabled?: boolean; reduceMotion?: boolean; theme?: "light" | "dark"; + increaseWindowButtonsContrast?: boolean; } type SupportedLanguages = "en" | "it"; diff --git a/frontend/src/routes/(app)/+layout.svelte b/frontend/src/routes/(app)/+layout.svelte index 23fa439..8d5e373 100644 --- a/frontend/src/routes/(app)/+layout.svelte +++ b/frontend/src/routes/(app)/+layout.svelte @@ -304,7 +304,7 @@ -
+
@@ -495,7 +537,7 @@ {m.settings_export_button()}
- +
@@ -640,29 +682,6 @@ {m.settings_preview_pdf_builtin_info()}

- - -
-
-
-
- {m.settings_email_dark_viewer_label()} -
-
- {m.settings_email_dark_viewer_hint()} -
-
- -
-

- {m.settings_email_dark_viewer_info()} -

-
diff --git a/frontend/src/routes/pdf/+layout.svelte b/frontend/src/routes/pdf/+layout.svelte index 5a23391..24a79ff 100644 --- a/frontend/src/routes/pdf/+layout.svelte +++ b/frontend/src/routes/pdf/+layout.svelte @@ -7,6 +7,7 @@ Quit, } from "$lib/wailsjs/runtime/runtime"; import type { LayoutProps } from "./$types"; + import { settingsStore } from "$lib/stores/settings.svelte.js"; let { data, children }: LayoutProps = $props(); @@ -57,7 +58,7 @@ >
EMLy PDF Viewer
-
+
-
- -
-
diff --git a/installer/installer.iss b/installer/installer.iss index 7c76759..0b2a027 100644 --- a/installer/installer.iss +++ b/installer/installer.iss @@ -1,6 +1,23 @@ #define ApplicationName 'EMLy' #define ApplicationVersion GetVersionNumbersString('EMLy.exe') -#define ApplicationVersion '1.5.0' +#define ApplicationVersion '1.5.2' + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" +Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl" + +[CustomMessages] +; English messages +english.UpgradeDetected=A previous version of {#ApplicationName} (v%1) has been detected. +english.UpgradeMessage=This installer will upgrade your installation to version {#ApplicationVersion}.%n%nYour settings and preferences will be preserved.%n%nDo you want to continue? +english.FreshInstall=Welcome to {#ApplicationName} {#ApplicationVersion} Setup +english.FreshInstallMessage=This will install {#ApplicationName} on your computer. + +; Italian messages +italian.UpgradeDetected=È stata rilevata una versione precedente di {#ApplicationName} (v%1). +italian.UpgradeMessage=Questo installer aggiornerà la tua installazione alla versione {#ApplicationVersion}.%n%nLe tue impostazioni e preferenze saranno preservate.%n%nVuoi continuare? +italian.FreshInstall=Benvenuto nell'installazione di {#ApplicationName} {#ApplicationVersion} +italian.FreshInstallMessage=Questo installerà {#ApplicationName} sul tuo computer. [Setup] AppName={#ApplicationName} @@ -59,6 +76,65 @@ Root: HKA; Subkey: "Software\Classes\{#ApplicationName}.MSG\shell\open"; ValueTy Name: "{autoprograms}\{#ApplicationName}"; Filename: "{app}\{#ApplicationName}.exe" [Code] +var + PreviousVersion: String; + IsUpgrade: Boolean; + +// Check if a previous version is installed +function GetPreviousVersion(): String; +var + RegPath: String; + Version: String; +begin + Result := ''; + + // Check HKLM (system-wide installation) + RegPath := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#ApplicationName}_is1'; + if RegQueryStringValue(HKLM, RegPath, 'DisplayVersion', Version) then + begin + Result := Version; + Exit; + end; + + // Check HKCU (user installation) + if RegQueryStringValue(HKCU, RegPath, 'DisplayVersion', Version) then + begin + Result := Version; + Exit; + end; +end; + +// Initialize setup and detect upgrade +function InitializeSetup(): Boolean; +var + Message: String; +begin + Result := True; + PreviousVersion := GetPreviousVersion(); + IsUpgrade := (PreviousVersion <> ''); + + if IsUpgrade then + begin + // Show upgrade message + Message := FmtMessage(CustomMessage('UpgradeDetected'), [PreviousVersion]) + #13#10#13#10 + + CustomMessage('UpgradeMessage'); + + if MsgBox(Message, mbInformation, MB_YESNO) = IDNO then + begin + Result := False; + end; + end; +end; + +// Show appropriate welcome message +procedure InitializeWizard(); +begin + if not IsUpgrade then + begin + WizardForm.WelcomeLabel2.Caption := CustomMessage('FreshInstallMessage'); + end; +end; + // Override default directory based on installation mode function GetDefaultDirName(Param: string): string; begin