Skip to content

Commit b9ea5cc

Browse files
author
MPCoreDeveloper
committed
multiple extra language support , reconnect bug fix for sharp coreDb UI , dark light mode optimized
1 parent ce9f5b5 commit b9ea5cc

16 files changed

+504
-100
lines changed

SharpCoreDB.Data.Provider/SharpCoreDBConnection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public override void Open()
128128
$"Original error: {ex.Message}", ex);
129129
}
130130

131-
throw new SharpCoreDBException("Failed to open connection to SharpCoreDB.", ex);
131+
throw new SharpCoreDBException($"Failed to open connection to SharpCoreDB: {ex.Message}", ex);
132132
}
133133
}
134134

SharpCoreDB.Viewer/App.axaml.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,16 @@ public override void OnFrameworkInitializationCompleted()
2424
// Avoid duplicate validations from both Avalonia and the CommunityToolkit.
2525
DisableAvaloniaDataAnnotationValidation();
2626

27-
// Load and apply settings
27+
// Load and apply settings (auto-detects system language on first startup)
2828
var settingsService = SettingsService.Instance;
2929
settingsService.ApplySettings();
3030
ApplyTheme(settingsService.Settings.Theme);
3131

32+
#if DEBUG
33+
System.Diagnostics.Debug.WriteLine($"[App] Starting with language: {settingsService.Settings.Language}");
34+
System.Diagnostics.Debug.WriteLine($"[App] Starting with theme: {settingsService.Settings.Theme}");
35+
#endif
36+
3237
// Subscribe to settings changes
3338
settingsService.SettingsChanged += (s, settings) =>
3439
{
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"AppTitle": "SharpCoreDB Viewer",
3+
"Connect": "Verbinden",
4+
"Disconnect": "Verbindung trennen",
5+
"Execute": "Ausführen",
6+
"NotConnected": "Nicht verbunden",
7+
"DatabaseTables": "Datenbanktabellen",
8+
"QueryEditor": "SQL Query Editor",
9+
"QueryResults": "Abfrageergebnisse",
10+
"Ready": "Bereit",
11+
"WelcomeTitle": "SharpCoreDB Viewer",
12+
"WelcomeMessage": "Klicken Sie auf 'Verbinden', um eine Datenbank zu öffnen",
13+
"ConnectToDatabase": "Mit Datenbank verbinden",
14+
"QueryPlaceholder": "SQL-Abfrage hier eingeben...",
15+
"ResultsPlaceholder": "Führen Sie eine Abfrage aus, um Ergebnisse zu sehen",
16+
"ConnectionDialogTitle": "Mit SharpCoreDB verbinden",
17+
"ConnectionDialogSubtitle": "Öffnen Sie eine vorhandene Datenbank oder erstellen Sie eine neue",
18+
"DatabasePath": "Datenbankpfad:",
19+
"DatabasePathPlaceholder": "C:\\data\\meinedb.scdb oder Datenbankverzeichnis",
20+
"Browse": "Durchsuchen...",
21+
"New": "Neu...",
22+
"MasterPassword": "Hauptkennwort:",
23+
"PasswordPlaceholder": "Datenbankkennwort eingeben",
24+
"Cancel": "Abbrechen",
25+
"Connecting": "Verbinde...",
26+
"Save": "Speichern",
27+
"ConnectTooltip": "Mit vorhandener Datenbank verbinden",
28+
"DisconnectTooltip": "Verbindung zur Datenbank trennen",
29+
"ExecuteTooltip": "SQL-Abfrage ausführen (F5)",
30+
"BrowseTooltip": "Nach vorhandener Datenbank suchen",
31+
"NewTooltip": "Neue Datenbank erstellen",
32+
"ErrorDatabasePathRequired": "Bitte geben Sie einen Datenbankpfad ein",
33+
"ErrorPasswordRequired": "Bitte geben Sie ein Kennwort ein",
34+
"ErrorDatabaseNotFound": "Datenbankpfad existiert nicht",
35+
"ErrorConnectionFailed": "Verbindung fehlgeschlagen: {0}",
36+
"ErrorIncorrectPassword": "⚠️ Falsches Kennwort oder beschädigte Datenbank. Bitte überprüfen Sie Ihr Kennwort und versuchen Sie es erneut.",
37+
"ErrorTableLoadFailed": "Laden der Tabellen fehlgeschlagen: {0}",
38+
"ConnectedTo": "Verbunden mit: {0}",
39+
"SelectNewDatabaseLocation": "Speicherort für neue SharpCoreDB-Datenbank auswählen",
40+
"SettingsTitle": "Einstellungen",
41+
"LanguageLabel": "Sprache",
42+
"LanguageDescription": "Änderungen werden sofort angewendet. Klicken Sie auf 'Einstellungen speichern', um Ihre Auswahl beim nächsten Start zu speichern.",
43+
"ThemeLabel": "Design",
44+
"ThemeDescription": "Umschalten zur Vorschau. Klicken Sie auf 'Einstellungen speichern', um Ihre Auswahl beim nächsten Start zu speichern.",
45+
"FileMenu": "Datei",
46+
"SettingsMenu": "Einstellungen",
47+
"ExitMenu": "Beenden",
48+
"ShowPassword": "Kennwort anzeigen",
49+
"HidePassword": "Kennwort verbergen",
50+
"ErrorQueryEmpty": "Bitte geben Sie eine SQL-Abfrage ein",
51+
"ExecutingQuery": "Abfrage wird ausgeführt...",
52+
"QueryExecutedSuccess": "Abfrage erfolgreich ausgeführt. {0} Zeilen zurückgegeben.",
53+
"QueryExecutedAffected": "{0} Zeilen betroffen.",
54+
"ErrorQueryFailed": "Abfrage fehlgeschlagen: {0}"
55+
}

SharpCoreDB.Viewer/Resources/Strings.en-US.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,5 +50,6 @@
5050
"ExecutingQuery": "Executing query...",
5151
"QueryExecutedSuccess": "Query executed successfully. {0} rows returned.",
5252
"QueryExecutedAffected": "{0} rows affected.",
53-
"ErrorQueryFailed": "Query failed: {0}"
53+
"ErrorQueryFailed": "Query failed: {0}",
54+
"ErrorIncorrectPassword": "⚠️ Incorrect password or corrupted database. Please check your password and try again."
5455
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"AppTitle": "SharpCoreDB Viewer",
3+
"Connect": "Conectar",
4+
"Disconnect": "Desconectar",
5+
"Execute": "Ejecutar",
6+
"NotConnected": "No conectado",
7+
"DatabaseTables": "Tablas de base de datos",
8+
"QueryEditor": "Editor de consultas SQL",
9+
"QueryResults": "Resultados de la consulta",
10+
"Ready": "Listo",
11+
"WelcomeTitle": "SharpCoreDB Viewer",
12+
"WelcomeMessage": "Haga clic en 'Conectar' para abrir una base de datos",
13+
"ConnectToDatabase": "Conectar a base de datos",
14+
"QueryPlaceholder": "Ingrese la consulta SQL aquí...",
15+
"ResultsPlaceholder": "Ejecute una consulta para ver los resultados",
16+
"ConnectionDialogTitle": "Conectar a SharpCoreDB",
17+
"ConnectionDialogSubtitle": "Abra una base de datos existente o cree una nueva",
18+
"DatabasePath": "Ruta de la base de datos:",
19+
"DatabasePathPlaceholder": "C:\\data\\mibd.scdb o directorio de base de datos",
20+
"Browse": "Examinar...",
21+
"New": "Nuevo...",
22+
"MasterPassword": "Contraseña maestra:",
23+
"PasswordPlaceholder": "Ingrese la contraseña de la base de datos",
24+
"Cancel": "Cancelar",
25+
"Connecting": "Conectando...",
26+
"Save": "Guardar",
27+
"ConnectTooltip": "Conectar a base de datos existente",
28+
"DisconnectTooltip": "Desconectar de la base de datos",
29+
"ExecuteTooltip": "Ejecutar consulta SQL (F5)",
30+
"BrowseTooltip": "Buscar base de datos existente",
31+
"NewTooltip": "Crear nueva base de datos",
32+
"ErrorDatabasePathRequired": "Por favor, ingrese una ruta de base de datos",
33+
"ErrorPasswordRequired": "Por favor, ingrese una contraseña",
34+
"ErrorDatabaseNotFound": "La ruta de la base de datos no existe",
35+
"ErrorConnectionFailed": "Conexión fallida: {0}",
36+
"ErrorIncorrectPassword": "⚠️ Contraseña incorrecta o base de datos corrupta. Por favor, verifique su contraseña e intente nuevamente.",
37+
"ErrorTableLoadFailed": "Error al cargar las tablas: {0}",
38+
"ConnectedTo": "Conectado a: {0}",
39+
"SelectNewDatabaseLocation": "Seleccionar ubicación para nueva base de datos SharpCoreDB",
40+
"SettingsTitle": "Configuración",
41+
"LanguageLabel": "Idioma",
42+
"LanguageDescription": "Los cambios se aplican inmediatamente. Haga clic en 'Guardar configuración' para recordar su elección en el próximo inicio.",
43+
"ThemeLabel": "Tema",
44+
"ThemeDescription": "Cambiar para previsualizar. Haga clic en 'Guardar configuración' para recordar su elección en el próximo inicio.",
45+
"FileMenu": "Archivo",
46+
"SettingsMenu": "Configuración",
47+
"ExitMenu": "Salir",
48+
"ShowPassword": "Mostrar contraseña",
49+
"HidePassword": "Ocultar contraseña",
50+
"ErrorQueryEmpty": "Por favor, ingrese una consulta SQL",
51+
"ExecutingQuery": "Ejecutando consulta...",
52+
"QueryExecutedSuccess": "Consulta ejecutada con éxito. {0} filas devueltas.",
53+
"QueryExecutedAffected": "{0} filas afectadas.",
54+
"ErrorQueryFailed": "Consulta fallida: {0}"
55+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"AppTitle": "SharpCoreDB Viewer",
3+
"Connect": "Connecter",
4+
"Disconnect": "Déconnecter",
5+
"Execute": "Exécuter",
6+
"NotConnected": "Non connecté",
7+
"DatabaseTables": "Tables de base de données",
8+
"QueryEditor": "Éditeur de requête SQL",
9+
"QueryResults": "Résultats de la requête",
10+
"Ready": "Prêt",
11+
"WelcomeTitle": "SharpCoreDB Viewer",
12+
"WelcomeMessage": "Cliquez sur 'Connecter' pour ouvrir une base de données",
13+
"ConnectToDatabase": "Se connecter à la base de données",
14+
"QueryPlaceholder": "Saisissez la requête SQL ici...",
15+
"ResultsPlaceholder": "Exécutez une requête pour voir les résultats",
16+
"ConnectionDialogTitle": "Se connecter à SharpCoreDB",
17+
"ConnectionDialogSubtitle": "Ouvrez une base de données existante ou créez-en une nouvelle",
18+
"DatabasePath": "Chemin de la base de données :",
19+
"DatabasePathPlaceholder": "C:\\data\\mabase.scdb ou répertoire de base de données",
20+
"Browse": "Parcourir...",
21+
"New": "Nouveau...",
22+
"MasterPassword": "Mot de passe principal :",
23+
"PasswordPlaceholder": "Saisissez le mot de passe de la base de données",
24+
"Cancel": "Annuler",
25+
"Connecting": "Connexion en cours...",
26+
"Save": "Enregistrer",
27+
"ConnectTooltip": "Se connecter à une base de données existante",
28+
"DisconnectTooltip": "Se déconnecter de la base de données",
29+
"ExecuteTooltip": "Exécuter la requête SQL (F5)",
30+
"BrowseTooltip": "Rechercher une base de données existante",
31+
"NewTooltip": "Créer une nouvelle base de données",
32+
"ErrorDatabasePathRequired": "Veuillez saisir un chemin de base de données",
33+
"ErrorPasswordRequired": "Veuillez saisir un mot de passe",
34+
"ErrorDatabaseNotFound": "Le chemin de la base de données n'existe pas",
35+
"ErrorConnectionFailed": "Échec de la connexion : {0}",
36+
"ErrorIncorrectPassword": "⚠️ Mot de passe incorrect ou base de données corrompue. Veuillez vérifier votre mot de passe et réessayer.",
37+
"ErrorTableLoadFailed": "Échec du chargement des tables : {0}",
38+
"ConnectedTo": "Connecté à : {0}",
39+
"SelectNewDatabaseLocation": "Sélectionner l'emplacement de la nouvelle base de données SharpCoreDB",
40+
"SettingsTitle": "Paramètres",
41+
"LanguageLabel": "Langue",
42+
"LanguageDescription": "Les modifications sont appliquées immédiatement. Cliquez sur 'Enregistrer les paramètres' pour mémoriser votre choix au prochain démarrage.",
43+
"ThemeLabel": "Thème",
44+
"ThemeDescription": "Basculer pour prévisualiser. Cliquez sur 'Enregistrer les paramètres' pour mémoriser votre choix au prochain démarrage.",
45+
"FileMenu": "Fichier",
46+
"SettingsMenu": "Paramètres",
47+
"ExitMenu": "Quitter",
48+
"ShowPassword": "Afficher le mot de passe",
49+
"HidePassword": "Masquer le mot de passe",
50+
"ErrorQueryEmpty": "Veuillez saisir une requête SQL",
51+
"ExecutingQuery": "Exécution de la requête...",
52+
"QueryExecutedSuccess": "Requête exécutée avec succès. {0} lignes retournées.",
53+
"QueryExecutedAffected": "{0} lignes affectées.",
54+
"ErrorQueryFailed": "Échec de la requête : {0}"
55+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"AppTitle": "SharpCoreDB Viewer",
3+
"Connect": "Connetti",
4+
"Disconnect": "Disconnetti",
5+
"Execute": "Esegui",
6+
"NotConnected": "Non connesso",
7+
"DatabaseTables": "Tabelle del database",
8+
"QueryEditor": "Editor di query SQL",
9+
"QueryResults": "Risultati della query",
10+
"Ready": "Pronto",
11+
"WelcomeTitle": "SharpCoreDB Viewer",
12+
"WelcomeMessage": "Fai clic su 'Connetti' per aprire un database",
13+
"ConnectToDatabase": "Connetti al database",
14+
"QueryPlaceholder": "Inserisci la query SQL qui...",
15+
"ResultsPlaceholder": "Esegui una query per vedere i risultati",
16+
"ConnectionDialogTitle": "Connetti a SharpCoreDB",
17+
"ConnectionDialogSubtitle": "Apri un database esistente o creane uno nuovo",
18+
"DatabasePath": "Percorso del database:",
19+
"DatabasePathPlaceholder": "C:\\data\\miodb.scdb o directory del database",
20+
"Browse": "Sfoglia...",
21+
"New": "Nuovo...",
22+
"MasterPassword": "Password principale:",
23+
"PasswordPlaceholder": "Inserisci la password del database",
24+
"Cancel": "Annulla",
25+
"Connecting": "Connessione in corso...",
26+
"Save": "Salva",
27+
"ConnectTooltip": "Connetti a database esistente",
28+
"DisconnectTooltip": "Disconnetti dal database",
29+
"ExecuteTooltip": "Esegui query SQL (F5)",
30+
"BrowseTooltip": "Cerca database esistente",
31+
"NewTooltip": "Crea nuovo database",
32+
"ErrorDatabasePathRequired": "Inserisci un percorso del database",
33+
"ErrorPasswordRequired": "Inserisci una password",
34+
"ErrorDatabaseNotFound": "Il percorso del database non esiste",
35+
"ErrorConnectionFailed": "Connessione fallita: {0}",
36+
"ErrorIncorrectPassword": "?? Password errata o database corrotto. Verifica la tua password e riprova.",
37+
"ErrorTableLoadFailed": "Caricamento delle tabelle fallito: {0}",
38+
"ConnectedTo": "Connesso a: {0}",
39+
"SelectNewDatabaseLocation": "Seleziona la posizione per il nuovo database SharpCoreDB",
40+
"SettingsTitle": "Impostazioni",
41+
"LanguageLabel": "Lingua",
42+
"LanguageDescription": "Le modifiche vengono applicate immediatamente. Fai clic su 'Salva impostazioni' per ricordare la tua scelta al prossimo avvio.",
43+
"ThemeLabel": "Tema",
44+
"ThemeDescription": "Cambia per visualizzare l'anteprima. Fai clic su 'Salva impostazioni' per ricordare la tua scelta al prossimo avvio.",
45+
"FileMenu": "File",
46+
"SettingsMenu": "Impostazioni",
47+
"ExitMenu": "Esci",
48+
"ShowPassword": "Mostra password",
49+
"HidePassword": "Nascondi password",
50+
"ErrorQueryEmpty": "Inserisci una query SQL",
51+
"ExecutingQuery": "Esecuzione della query...",
52+
"QueryExecutedSuccess": "Query eseguita con successo. {0} righe restituite.",
53+
"QueryExecutedAffected": "{0} righe interessate.",
54+
"ErrorQueryFailed": "Query fallita: {0}"
55+
}

SharpCoreDB.Viewer/Resources/Strings.nl-NL.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
"ErrorPasswordRequired": "Voer een wachtwoord in",
3434
"ErrorDatabaseNotFound": "Database pad bestaat niet",
3535
"ErrorConnectionFailed": "Verbinding mislukt: {0}",
36+
"ErrorIncorrectPassword": "⚠️ Onjuist wachtwoord of beschadigde database. Controleer uw wachtwoord en probeer het opnieuw.",
3637
"ErrorTableLoadFailed": "Laden van tabellen mislukt: {0}",
3738
"ConnectedTo": "Verbonden met: {0}",
3839
"SelectNewDatabaseLocation": "Selecteer Locatie voor Nieuwe SharpCoreDB Database",

SharpCoreDB.Viewer/Services/LocalizationService.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ public class LocalizationService : INotifyPropertyChanged
2323

2424
private LocalizationService()
2525
{
26-
_currentCulture = CultureInfo.CurrentUICulture;
26+
// Get initial language from settings (which handles system language detection)
27+
var settingsService = SettingsService.Instance;
28+
_currentCulture = new CultureInfo(settingsService.Settings.Language);
29+
2730
Debug.WriteLine($"[Localization] Service initialized with culture: {_currentCulture.Name}");
2831
LoadLanguage(_currentCulture.Name);
2932
}

SharpCoreDB.Viewer/Services/SettingsService.cs

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using SharpCoreDB.Viewer.Models;
22
using System.Text.Json;
3+
using System.Globalization;
34

45
namespace SharpCoreDB.Viewer.Services;
56

@@ -16,6 +17,17 @@ public class SettingsService
1617
private readonly string _settingsPath;
1718
private AppSettings _settings;
1819

20+
// Supported languages in the application
21+
private static readonly string[] SupportedLanguages =
22+
[
23+
"en-US",
24+
"nl-NL",
25+
"de-DE",
26+
"fr-FR",
27+
"es-ES",
28+
"it-IT"
29+
];
30+
1931
public static SettingsService Instance => _instance ??= new SettingsService();
2032

2133
public event EventHandler<AppSettings>? SettingsChanged;
@@ -49,15 +61,71 @@ private AppSettings LoadSettings()
4961
if (File.Exists(_settingsPath))
5062
{
5163
var json = File.ReadAllText(_settingsPath);
52-
return JsonSerializer.Deserialize<AppSettings>(json) ?? new AppSettings();
64+
var settings = JsonSerializer.Deserialize<AppSettings>(json);
65+
66+
if (settings != null)
67+
{
68+
// Validate that the saved language is still supported
69+
if (!SupportedLanguages.Contains(settings.Language))
70+
{
71+
settings.Language = GetDefaultLanguage();
72+
}
73+
return settings;
74+
}
5375
}
5476
}
5577
catch (Exception ex)
5678
{
5779
Console.WriteLine($"Failed to load settings: {ex.Message}");
5880
}
5981

60-
return new AppSettings();
82+
// First time startup - use system language or fallback to English
83+
return new AppSettings
84+
{
85+
Language = GetDefaultLanguage(),
86+
Theme = "Light"
87+
};
88+
}
89+
90+
/// <summary>
91+
/// Gets the default language based on system culture.
92+
/// Falls back to "en-US" if system language is not supported.
93+
/// </summary>
94+
private static string GetDefaultLanguage()
95+
{
96+
var systemCulture = CultureInfo.CurrentUICulture.Name;
97+
98+
#if DEBUG
99+
Console.WriteLine($"[SettingsService] System culture detected: {systemCulture}");
100+
#endif
101+
102+
// Check if exact match exists (e.g., "nl-NL")
103+
if (SupportedLanguages.Contains(systemCulture))
104+
{
105+
#if DEBUG
106+
Console.WriteLine($"[SettingsService] Exact match found, using: {systemCulture}");
107+
#endif
108+
return systemCulture;
109+
}
110+
111+
// Try to match just the language part (e.g., "nl" from "nl-BE")
112+
var languageOnly = systemCulture.Split('-')[0];
113+
var match = SupportedLanguages.FirstOrDefault(lang => lang.StartsWith(languageOnly + "-"));
114+
115+
if (match != null)
116+
{
117+
#if DEBUG
118+
Console.WriteLine($"[SettingsService] Language match found, using: {match}");
119+
#endif
120+
return match;
121+
}
122+
123+
#if DEBUG
124+
Console.WriteLine($"[SettingsService] No match found, falling back to: en-US");
125+
#endif
126+
127+
// Fallback to English (neutral language)
128+
return "en-US";
61129
}
62130

63131
public void ApplySettings()

0 commit comments

Comments
 (0)