fix: fixing some bugs

* fixed bug with "Restart" popup
* fixed unusued strings
* fixed tunnel status not translated
This commit is contained in:
Andrea-Filice
2025-11-19 22:42:48 +01:00
parent bdec8bfef4
commit 93faac1f41
5 changed files with 113 additions and 76 deletions

View File

@@ -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) {

View File

@@ -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";

View File

@@ -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";

View File

@@ -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 allavvio";
"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 p 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 inapp.";
"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";

View File

@@ -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";