From 93faac1f41659f81ff28e77c570f82ae9d0a934e Mon Sep 17 00:00:00 2001 From: Andrea-Filice Date: Wed, 19 Nov 2025 22:42:48 +0100 Subject: [PATCH] fix: fixing some bugs * fixed bug with "Restart" popup * fixed unusued strings * fixed tunnel status not translated --- StosVPN/ContentView.swift | 38 ++++---- .../Localization/en.lproj/Localizable.strings | 21 +++-- .../Localization/es.lproj/Localizable.strings | 19 +++- .../Localization/it.lproj/Localizable.strings | 91 ++++++++++--------- .../Localization/pl.lproj/Localizable.strings | 20 +++- 5 files changed, 113 insertions(+), 76 deletions(-) diff --git a/StosVPN/ContentView.swift b/StosVPN/ContentView.swift index 3176ba0..327233e 100644 --- a/StosVPN/ContentView.swift +++ b/StosVPN/ContentView.swift @@ -118,11 +118,7 @@ class TunnelManager: ObservableObject { DispatchQueue.main.async { if let error = error { VPNLogger.shared.log("Error loading preferences: \(error.localizedDescription)") - #if targetEnvironment(simulator) - self.tunnelStatus = .disconnected - #else self.tunnelStatus = .error - #endif self.waitingOnSettings = true return } @@ -203,7 +199,7 @@ class TunnelManager: ObservableObject { } private func updateTunnelStatus(from connectionStatus: NEVPNStatus) { - var newStatus: TunnelStatus + let newStatus: TunnelStatus switch connectionStatus { case .invalid, .disconnected: newStatus = .disconnected @@ -219,10 +215,6 @@ class TunnelManager: ObservableObject { newStatus = .error } - #if targetEnvironment(simulator) - newStatus = .connected - #endif - DispatchQueue.main.async { [weak self] in guard let self = self else { return } if self.tunnelStatus != newStatus { @@ -830,14 +822,14 @@ struct ConnectionStatsView: View { ) StatItemView( title: "status", - value: "active", + value: NSLocalizedString("active", comment: ""), icon: "checkmark.circle.fill" ) } HStack(spacing: 30) { StatItemView( title: "network_interface", - value: "local", + value: NSLocalizedString("local", comment: ""), icon: "network" ) StatItemView( @@ -908,6 +900,7 @@ struct SettingsView: View { @AppStorage("hasNotCompletedSetup") private var hasNotCompletedSetup = true @State private var showNetworkWarning = false + @State private var showRestartPopUp = false var body: some View { NBNavigationStack { @@ -948,16 +941,26 @@ struct SettingsView: View { } Section(header: Text("language")) { - Picker("language", selection: $selectedLanguage) { - Text("English").tag("en") - Text("Spanish").tag("es") - Text("Italian").tag("it") - Text("Polish").tag("pl") + Picker("dropdown_language", selection: $selectedLanguage) { + Text("english").tag("en") + Text("spanish").tag("es") + Text("italian").tag("it") + Text("polish").tag("pl") } .onChange(of: selectedLanguage) { newValue in let languageCode = newValue LanguageManager.shared.updateLanguage(to: languageCode) + showRestartPopUp = true } + .alert(isPresented: $showRestartPopUp){ + Alert( + title: Text("restart_title"), + message: Text("restart_message"), + dismissButton: .cancel(Text("understand_button")) { + showRestartPopUp = true + } + ) + } } } .alert(isPresented: $showNetworkWarning) { @@ -1012,7 +1015,6 @@ struct SettingsView: View { } } - // MARK: - New Data Collection Info View struct DataCollectionInfoView: View { var body: some View { @@ -1340,9 +1342,7 @@ struct SetupPageView: View { class LanguageManager: ObservableObject { static let shared = LanguageManager() - @Published var currentLanguage: String = Locale.current.languageCode ?? "en" - private let supportedLanguages = ["en", "es", "it", "pl"] func updateLanguage(to languageCode: String) { diff --git a/StosVPN/Localization/en.lproj/Localizable.strings b/StosVPN/Localization/en.lproj/Localizable.strings index 8a3c8f3..def42cb 100644 --- a/StosVPN/Localization/en.lproj/Localizable.strings +++ b/StosVPN/Localization/en.lproj/Localizable.strings @@ -23,6 +23,12 @@ "local" = "Local"; "assigned_ip" = "Assigned IP"; +/* MARK: Locales */ +"english" = "English"; +"spanish" = "Spanish"; +"italian" = "Italian"; +"polish" = "Polish"; + /* MARK: Settings */ "connection_settings" = "Connection Settings"; @@ -37,11 +43,8 @@ "data_collection_policy" = "Data Collection Policy"; "app_version" = "App Version"; "help_and_support" = "Help and Support"; -"language" = "Language"; -"english" = "English"; -"spanish" = "Spanish"; -"italian" = "Italian"; -"polish" = "Polish"; +"language" = "Set Language"; +"dropdown_language" = "Language"; "settings" = "Settings"; "done" = "Done"; "warning_alert" = "Warning"; @@ -55,7 +58,7 @@ "local_processing_only_description" = "All network traffic and configurations are processed locally on your device. No information ever leaves the device or is transmitted over the Internet."; "no_third_party_sharing" = "No Third Party Sharing"; "no_third_party_sharing_description" = "Since we do not collect data, there is no sharing with third parties. We do not have analytics, tracking, or data collection mechanisms in this app."; -"why_use_network_permissions" = "Why Use Network Permissions"; +"why_use_network_permissions" = "Why Use Network Permissions?"; "why_use_network_permissions_description" = "StosVPN requires network extension permissions to create a local network interface on your device. This is used exclusively for local development and testing."; "our_promise" = "Our Promise"; "our_promise_description" = "We are committed to privacy and transparency. This app is designed for developers to test and connect to local servers with no privacy concerns."; @@ -119,3 +122,9 @@ "setup_get_started" = "Get Started"; "setup_next" = "Next"; "setup_skip" = "Skip"; + +/*MARK: Restart pop-up*/ +restart_title = "Restart"; +restart_message = "To apply the changes, you need to restart the application."; +confirmYes = "Yes"; +confirmNo = "No"; diff --git a/StosVPN/Localization/es.lproj/Localizable.strings b/StosVPN/Localization/es.lproj/Localizable.strings index 5152a6a..29ab1a9 100644 --- a/StosVPN/Localization/es.lproj/Localizable.strings +++ b/StosVPN/Localization/es.lproj/Localizable.strings @@ -23,6 +23,12 @@ "local" = "Local"; "assigned_ip" = "IP Asignada"; +/* MARK: Locales */ +"english" = "Inglés"; +"spanish" = "Español"; +"italian" = "Italiano"; +"polish" = "Polaco"; + /* MARK: Configuración */ "connection_settings" = "Configuración de Conexión"; @@ -37,11 +43,8 @@ "data_collection_policy" = "Política de Recopilación de Datos"; "app_version" = "Versión de la App"; "help_and_support" = "Ayuda y Soporte"; -"language" = "Idioma"; -"english" = "Inglés"; -"spanish" = "Español"; -"italian" = "Italiano"; -"polish" = "Polish"; +"language" = "Establecer idioma"; +"dropdown_language" = "Idioma"; "settings" = "Configuración"; "done" = "Hecho"; "warning_alert" = "Advertencia"; @@ -119,3 +122,9 @@ "setup_get_started" = "Comenzar"; "setup_next" = "Siguiente"; "setup_skip" = "Saltar"; + +/*MARK: Restart pop-up*/ +restart_title = "Reiniciar"; +restart_message = "Para aplicar los cambios, es necesario reiniciar la aplicación."; +confirmYes = "Sí"; +confirmNo = "No"; diff --git a/StosVPN/Localization/it.lproj/Localizable.strings b/StosVPN/Localization/it.lproj/Localizable.strings index 44c266a..ea7d7e8 100644 --- a/StosVPN/Localization/it.lproj/Localizable.strings +++ b/StosVPN/Localization/it.lproj/Localizable.strings @@ -23,25 +23,28 @@ "local" = "Locale"; "assigned_ip" = "IP Assegnato"; -/* MARK: Settins*/ +/* MARK: Locales */ +"english" = "Inglese"; +"spanish" = "Spagnolo"; +"italian" = "Italiano"; +"polish" = "Polacco"; + +/* MARK: Settings*/ "connection_settings" = "Impostazioni Connessione"; "auto_connect_on_launch" = "Connessione automatica all’avvio"; "connection_logs" = "Log di Connessione"; "network_configuration" = "Configurazione Rete"; -"device_ip" = "IP Dispositivo"; -"tunnel_ip" = "IP Tunnel"; +"device_ip" = "Indirizzo IP Dispositivo"; +"tunnel_ip" = "Indirizzo IP Tunnel"; "subnet_mask" = "Maschera di Sottorete"; "app_information" = "Informazioni App"; "privacy_policy" = "Privacy Policy"; "data_collection_policy" = "Politica di Raccolta Dati"; "app_version" = "Versione App"; "help_and_support" = "Guida e Supporto"; -"language" = "Lingua"; -"english" = "Inglese"; -"spanish" = "Spagnolo"; -"italian" = "Italiano"; -"polish" = "Polish"; +"language" = "Imposta Lingua"; +"dropdown_language" = "Lingua"; "settings" = "Impostazioni"; "done" = "Fine"; "warning_alert" = "Avviso"; @@ -49,56 +52,56 @@ "understand_button" = "Ho capito"; "data_collection_policy_title" = "Politica di Raccolta Dati"; -"no_data_collection" = "Nessuna Raccolta Dati"; +"no_data_collection" = "Nessuna raccolta di dati"; "no_data_collection_description" = "StosVPN NON raccoglie dati utente, informazioni sul traffico o attività di navigazione. Questa app crea un tunnel di rete locale che rimane interamente sul tuo dispositivo."; -"local_processing_only" = "Elaborazione Solo Locale"; +"local_processing_only" = "Elaborazione solo sul tuo smartphone"; "local_processing_only_description" = "Tutto il traffico di rete e le configurazioni vengono elaborate localmente sul tuo dispositivo. Nessuna informazione lascia mai il dispositivo o viene trasmessa su Internet."; -"no_third_party_sharing" = "Nessuna Condivisione con Terze Parti"; +"no_third_party_sharing" = "Nessuna condivisione con servizi di terze parti"; "no_third_party_sharing_description" = "Poiché non raccogliamo dati, non c'è alcuna condivisione con terze parti. Non abbiamo analisi, tracciamento o meccanismi di raccolta dati in questa app."; -"why_use_network_permissions" = "Perché Usare i Permessi di Rete"; -"why_use_network_permissions_description" = "StosVPN richiede permessi di estensione di rete per creare un'interfaccia di rete locale sul tuo dispositivo. Questo è utilizzato esclusivamente per sviluppo e test locali."; -"our_promise" = "La Nostra Promessa"; +"why_use_network_permissions" = "Perché concedere i permessi di Rete?"; +"why_use_network_permissions_description" = "StosVPN richiede permessi di estensione di rete per creare un'interfaccia di rete locale sul tuo dispositivo. Questo è utilizzato esclusivamente per sviluppo e test locali sul tuo dispositivo."; +"our_promise" = "La nostra promessa"; "our_promise_description" = "Ci impegniamo per la privacy e la trasparenza. Questa app è progettata per sviluppatori per testare e connettersi a server locali senza preoccupazioni sulla privacy."; "data_collection_policy_nav" = "Raccolta Dati"; -"logs_nav" = "Log"; +"logs_nav" = "Log di connessione"; "faq_header" = "Domande Frequenti"; "faq_q1" = "Cosa fa questa app?"; -"faq_q1_a1" = "StosVPN crea un'interfaccia di rete locale utilizzabile per sviluppo e test. Non instrada il traffico attraverso server esterni: tutto rimane sul dispositivo."; +"faq_q1_a1" = "StosVPN crea un'interfaccia di rete locale utilizzabile per sviluppo e test. Non instrada il traffico attraverso server esterni, tutto rimane sul dispositivo."; "faq_common_use_cases" = "I casi d'uso comuni includono:"; -"faq_case1" = "• Test di applicazioni web con server locali"; -"faq_case2" = "• Sviluppo e debug di funzionalità di rete"; -"faq_case3" = "• Accesso ad ambienti di sviluppo locali ospitati"; -"faq_case4" = "• Test di app che richiedono configurazioni di rete specifiche"; +"faq_case1" = "• Test di applicazioni web con server locali."; +"faq_case2" = "• Sviluppo e Debug di funzionalità di rete."; +"faq_case3" = "• Accesso ad ambienti di sviluppo locali ospitati."; +"faq_case4" = "• Test di applicazioni che richiedono configurazioni di rete specifiche."; "faq_q2" = "È un VPN tradizionale?"; "faq_q2_a1" = "No, StosVPN NON è un servizio VPN tradizionale. Non:"; -"faq_q2_point1" = "• Instrada il tuo traffico attraverso server esterni"; -"faq_q2_point2" = "• Fornisce privacy o anonimato per la navigazione"; -"faq_q2_point3" = "• Connette a server VPN remoti"; -"faq_q2_point4" = "• Cripta o instrada il tuo traffico internet"; -"faq_q2_a2" = "StosVPN crea solo un'interfaccia di rete locale per aiutare gli sviluppatori a connettersi a servizi locali per sviluppo e test."; -"faq_q3" = "Perché la connessione fallisce?"; -"faq_q3_a1" = "I fallimenti di connessione possono essere dovuti a permessi di sistema, errori di configurazione o restrizioni iOS."; -"faq_troubleshoot_header" = "Passaggi di risoluzione:"; -"faq_troubleshoot1" = "• Assicurati di aver approvato il permesso di estensione di rete"; -"faq_troubleshoot2" = "• Prova a riavviare l'app"; -"faq_troubleshoot3" = "• Verifica se la configurazione IP è valida"; -"faq_troubleshoot4" = "• Riavvia il dispositivo se i problemi persistono"; +"faq_q2_point1" = "• Instrada il tuo traffico attraverso server esterni."; +"faq_q2_point2" = "• Garantisce privacy e la navigazione in incognito."; +"faq_q2_point3" = "• Esegue connessioni a server VPN remoti."; +"faq_q2_point4" = "• Cripta o instrada il tuo traffico internet."; +"faq_q2_a2" = "StosVPN crea solo un'interfaccia di rete locale per aiutare gli sviluppatori a connettersi a servizi locali per lo sviluppo e test."; +"faq_q3" = "Perché non si connette?"; +"faq_q3_a1" = "Un errore durante la connessione può essere dovuto a permessi di sistema, errori di configurazione o restrizioni di iOS."; +"faq_troubleshoot_header" = "Passaggi per risolvere:"; +"faq_troubleshoot1" = "• Assicurati di aver accettato il permesso di estensione di rete."; +"faq_troubleshoot2" = "• Prova a riavviare l'applicazione."; +"faq_troubleshoot3" = "• Verifica se la configurazione IP è valida."; +"faq_troubleshoot4" = "• Riavvia il dispositivo se i problemi persistono."; "faq_q4" = "Per chi è questa app?"; "faq_q4_intro" = "StosVPN è progettato principalmente per:"; -"faq_q4_case1" = "• Sviluppatori che testano server web locali"; -"faq_q4_case2" = "• Sviluppatori app che testano funzionalità di rete"; -"faq_q4_case3" = "• Ingegneri QA che testano app in ambienti isolati"; -"faq_q4_case4" = "• Chiunque necessiti di accedere a servizi locali sull'iOS"; +"faq_q4_case1" = "• Sviluppatori che testano server web locali."; +"faq_q4_case2" = "• Sviluppatori app che testano funzionalità di rete."; +"faq_q4_case3" = "• Ingegneri QA che testano app in ambienti isolati."; +"faq_q4_case4" = "• Chiunque necessiti di accedere a servizi locali sull'iOS."; "faq_q4_conclusion" = "Questa app è disponibile al pubblico ed è utile per sviluppatori che devono testare app con funzionalità di rete su iOS."; "business_model_header" = "Modello di Business"; "biz_q1" = "Come funziona StosVPN?"; "biz_q1_a1" = "StosVPN è un'app completamente gratuita disponibile al pubblico. Non ci sono funzionalità a pagamento, abbonamenti o acquisti in‑app."; "biz_key_points_header" = "Punti chiave del nostro modello:"; -"biz_point1" = "• L'app non è vincolata a nessuna azienda o gruppo"; -"biz_point2" = "• Chiunque può scaricare e usare l'app dall'App Store"; -"biz_point3" = "• Non è necessario creare un account"; -"biz_point4" = "• Tutte le funzionalità sono gratuite per tutti gli utenti"; -"biz_point5" = "• L'app è sviluppata e mantenuta come utility open per la comunità iOS"; +"biz_point1" = "• L'app non è vincolata a nessuna azienda o gruppo."; +"biz_point2" = "• Chiunque può scaricare e usare l'app dall'App Store."; +"biz_point3" = "• Non è necessario creare un account."; +"biz_point4" = "• Tutte le funzionalità sono gratuite per tutti gli utenti."; +"biz_point5" = "• L'app è sviluppata e mantenuta come utility open per la comunità iOS."; "app_info_header" = "Informazioni App"; "requires_ios" = "Richiede iOS 14.0 o superiore"; "uses_network_extension" = "Usa le Network Extension API di Apple"; @@ -119,3 +122,9 @@ "setup_get_started" = "Inizia"; "setup_next" = "Avanti"; "setup_skip" = "Salta"; + +/*MARK: Restart pop-up*/ +restart_title = "Riavvia"; +restart_message = "Per applicare le modifiche, c'è bisogno di riavviare l'applicazione."; +confirmYes = "Si"; +confirmNo = "No"; diff --git a/StosVPN/Localization/pl.lproj/Localizable.strings b/StosVPN/Localization/pl.lproj/Localizable.strings index 9815f62..4a78895 100644 --- a/StosVPN/Localization/pl.lproj/Localizable.strings +++ b/StosVPN/Localization/pl.lproj/Localizable.strings @@ -23,6 +23,13 @@ "local" = "Lokalny"; "assigned_ip" = "Przydzielony IP"; +/* MARK: Locales */ + +"english" = "Angielski"; +"spanish" = "Hiszpański"; +"italian" = "Włoski"; +"polish" = "Polski"; + /* MARK: Settings */ "connection_settings" = "Ustawienia połączenia"; @@ -37,11 +44,8 @@ "data_collection_policy" = "Polityka zbierania danych"; "app_version" = "Wersja aplikacji"; "help_and_support" = "Pomoc i wsparcie"; -"language" = "Język"; -"english" = "Angielski"; -"spanish" = "Hiszpański"; -"italian" = "Włoski"; -"polish" = "Polski"; +"language" = "Ustaw język"; +"dropdown_language" = "Język"; "settings" = "Ustawienia"; "done" = "Gotowe"; @@ -119,3 +123,9 @@ "setup_get_started" = "Zaczynamy"; "setup_next" = "Dalej"; "setup_skip" = "Pomiń"; + +/*MARK: Restart pop-up*/ +restart_title = "Restartuj"; +restart_message = "Aby zastosować zmiany, należy ponownie uruchomić aplikację."; +confirmYes = "Si"; +confirmNo = "No";