diff --git a/StosVPN/ContentView.swift b/StosVPN/ContentView.swift index 1d4b32b..a9b6d05 100644 --- a/StosVPN/ContentView.swift +++ b/StosVPN/ContentView.swift @@ -54,12 +54,14 @@ class TunnelManager: ObservableObject { Bundle.main.bundleIdentifier!.appending(".TunnelProv") } - enum TunnelStatus: String { - case disconnected = "Disconnected" - case connecting = "Connecting" - case connected = "Connected" - case disconnecting = "Disconnecting" - case error = "Error" + import SwiftUI + + enum TunnelStatus { + case disconnected + case connecting + case connected + case disconnecting + case error var color: Color { switch self { @@ -80,7 +82,23 @@ class TunnelManager: ObservableObject { case .error: return "exclamationmark.shield.fill" } } + + var localizedTitle: String { + switch self { + case .disconnected: + return NSLocalizedString("disconnected", comment: "") + case .connecting: + return NSLocalizedString("connecting", comment: "") + case .connected: + return NSLocalizedString("connected", comment: "") + case .disconnecting: + return NSLocalizedString("disconnecting", comment: "") + case .error: + return NSLocalizedString("error", comment: "") + } + } } + private init() { loadTunnelPreferences() @@ -165,7 +183,7 @@ class TunnelManager: ObservableObject { let proto = NETunnelProviderProtocol() proto.providerBundleIdentifier = self.tunnelBundleId - proto.serverAddress = "StosVPN's Local Network Tunnel" + proto.serverAddress = NSLocalizedString("server_address_name", comment: "") manager.protocolConfiguration = proto let onDemandRule = NEOnDemandRuleEvaluateConnection() @@ -423,8 +441,9 @@ struct StatusIndicatorView: View { .onChange(of: tunnelManager.tunnelStatus) { _ in updateAnimation() } - - Text(tunnelManager.tunnelStatus == .connected ? "Local tunnel active" : "Local tunnel inactive") + Text(tunnelManager.tunnelStatus == .connected ? + NSLocalizedString("local_tunnel_active", comment: "") : + NSLocalizedString("local_tunnel_inactive", comment: "")) .font(.subheadline) .foregroundColor(tunnelManager.tunnelStatus == .connected ? .green : .secondary) } @@ -480,14 +499,15 @@ struct ConnectionButton: View { } private var buttonText: String { - if tunnelManager.tunnelStatus == .connected { - return "Disconnect" - } else if tunnelManager.tunnelStatus == .connecting { - return "Connecting..." - } else if tunnelManager.tunnelStatus == .disconnecting { - return "Disconnecting..." - } else { - return "Connect" + switch tunnelManager.tunnelStatus { + case .connected: + return NSLocalizedString("disconnect", comment: "") + case .connecting: + return NSLocalizedString("connecting_ellipsis", comment: "") + case .disconnecting: + return NSLocalizedString("disconnecting_ellipsis", comment: "") + default: + return NSLocalizedString("connect", comment: "") } } @@ -516,33 +536,29 @@ struct ConnectionStatsView: View { var body: some View { VStack(spacing: 25) { - Text("Local Tunnel Details") + Text("local_tunnel_details") .font(.headline) .foregroundColor(.primary) - HStack(spacing: 30) { StatItemView( - title: "Time Connected", + title: NSLocalizedString("time_connected", comment: ""), value: formattedTime, icon: "clock.fill" ) - StatItemView( - title: "Status", - value: "Active", + title: NSLocalizedString("status", comment: ""), + value: NSLocalizedString("active", comment: ""), icon: "checkmark.circle.fill" ) } - HStack(spacing: 30) { StatItemView( - title: "Network Interface", - value: "Local", + title: NSLocalizedString("network_interface", comment: ""), + value: NSLocalizedString("local", comment: ""), icon: "network" ) - StatItemView( - title: "Assigned IP", + title: NSLocalizedString("assigned_ip", comment: ""), value: "10.7.0.1", icon: "number" ) @@ -599,79 +615,86 @@ struct StatItemView: View { // MARK: - Updated SettingsView struct SettingsView: View { @Environment(\.dismiss) private var dismiss + @AppStorage("selectedLanguage") private var selectedLanguage = Locale.current.languageCode ?? "en" @AppStorage("TunnelDeviceIP") private var deviceIP = "10.7.0.0" @AppStorage("TunnelFakeIP") private var fakeIP = "10.7.0.1" @AppStorage("TunnelSubnetMask") private var subnetMask = "255.255.255.0" @AppStorage("autoConnect") private var autoConnect = false - + var body: some View { NavigationStack { List { - Section(header: Text("Connection Settings")) { - Toggle("Auto-connect on Launch", isOn: $autoConnect) - + Section(header: Text("connection_settings")) { + Toggle("auto_connect_on_launch", isOn: $autoConnect) NavigationLink(destination: ConnectionLogView()) { - Label("Connection Logs", systemImage: "doc.text") + Label("connection_logs", systemImage: "doc.text") } } - - Section(header: Text("Network Configuration")) { + + Section(header: Text("network_configuration")) { HStack { - Text("Device IP") + Text("device_ip") Spacer() - TextField("Device IP", text: $deviceIP) + TextField("device_ip", text: $deviceIP) .multilineTextAlignment(.trailing) .foregroundColor(.secondary) .keyboardType(.numbersAndPunctuation) } - HStack { - Text("Tunnel IP") + Text("tunnel_ip") Spacer() - TextField("Tunnel IP", text: $fakeIP) + TextField("tunnel_ip", text: $fakeIP) .multilineTextAlignment(.trailing) .foregroundColor(.secondary) .keyboardType(.numbersAndPunctuation) } - HStack { - Text("Subnet Mask") + Text("subnet_mask") Spacer() - TextField("Subnet Mask", text: $subnetMask) + TextField("subnet_mask", text: $subnetMask) .multilineTextAlignment(.trailing) .foregroundColor(.secondary) .keyboardType(.numbersAndPunctuation) } } - - Section(header: Text("App Information")) { + + Section(header: Text("app_information")) { Button { UIApplication.shared.open(URL(string: "https://github.com/stossy11/PrivacyPolicy/blob/main/PrivacyPolicy.md")!, options: [:]) } label: { - Label("Privacy Policy", systemImage: "lock.shield") + Label("privacy_policy", systemImage: "lock.shield") } - NavigationLink(destination: DataCollectionInfoView()) { - Label("Data Collection Policy", systemImage: "hand.raised.slash") + Label("data_collection_policy", systemImage: "hand.raised.slash") } - HStack { - Text("App Version") + Text("app_version") Spacer() Text("1.1.0") .foregroundColor(.secondary) } - NavigationLink(destination: HelpView()) { - Text("Help & Support") + Text("help_and_support") + } + } + + Section(header: Text("language")) { + Picker("language", selection: $selectedLanguage) { + Text("English").tag(0) + Text("Spanish").tag(1) + Text("Italian").tag(2) + } + .onChange(of: selectedLanguage) { newValue in + let languageCode = ["en", "es", "it"][newValue] + LanguageManager().updateLanguage(to: languageCode) } } } - .navigationTitle("Settings") + .navigationTitle(Text("settings")) .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .topBarTrailing) { - Button("Done") { + Button("done") { dismiss() } } @@ -680,49 +703,49 @@ struct SettingsView: View { } } + // MARK: - New Data Collection Info View struct DataCollectionInfoView: View { var body: some View { ScrollView { VStack(alignment: .leading, spacing: 20) { - Text("Data Collection Policy") + Text("data_collection_policy_title") .font(.title) .fontWeight(.bold) .padding(.bottom, 10) - GroupBox(label: Label("No Data Collection", systemImage: "hand.raised.slash").font(.headline)) { - Text("StosVPN does NOT collect any user data, traffic information, or browsing activity. This app creates a purely local network tunnel that stays entirely on your device.") + GroupBox(label: Label("no_data_collection", systemImage: "hand.raised.slash").font(.headline)) { + Text("no_data_collection_description") .padding(.vertical) } - GroupBox(label: Label("Local Processing Only", systemImage: "iphone").font(.headline)) { - Text("All network traffic and configurations are processed locally on your device. No information ever leaves your device or is transmitted over the internet.") + GroupBox(label: Label("local_processing_only", systemImage: "iphone").font(.headline)) { + Text("local_processing_only_description") .padding(.vertical) } - GroupBox(label: Label("No Third-Party Sharing", systemImage: "person.2.slash").font(.headline)) { - Text("Since we collect no data, there is no data shared with third parties. We have no analytics, tracking, or data collection mechanisms in this app.") + GroupBox(label: Label("no_third_party_sharing", systemImage: "person.2.slash").font(.headline)) { + Text("no_third_party_sharing_description") .padding(.vertical) } - GroupBox(label: Label("Why Use Network Permissions", systemImage: "network").font(.headline)) { - Text("StosVPN requires network extension permissions to create a local network interface on your device. This is used exclusively for local development and testing purposes, such as connecting to local web servers for development.") + GroupBox(label: Label("why_use_network_permissions", systemImage: "network").font(.headline)) { + Text("why_use_network_permissions_description") .padding(.vertical) } - GroupBox(label: Label("Our Promise", systemImage: "checkmark.seal").font(.headline)) { - Text("We're committed to privacy and transparency. This app is designed for developers to test and connect to local servers on their device without any privacy concerns.") + GroupBox(label: Label("our_promise", systemImage: "checkmark.seal").font(.headline)) { + Text("our_promise_description") .padding(.vertical) } } .padding() } - .navigationTitle("Data Collection") + .navigationTitle(Text("data_collection_policy_nav")) .navigationBarTitleDisplayMode(.inline) } } -// MARK: - Updated ConnectionLogView struct ConnectionLogView: View { @StateObject var logger = VPNLogger.shared var body: some View { @@ -730,115 +753,98 @@ struct ConnectionLogView: View { Text(log) .font(.system(.body, design: .monospaced)) } - .navigationTitle("Logs") + .navigationTitle(Text("logs_nav")) .navigationBarTitleDisplayMode(.inline) } } -// MARK: - Updated HelpView struct HelpView: View { var body: some View { List { - Section(header: Text("Frequently Asked Questions")) { - NavigationLink("What does this app do?") { + Section(header: Text("faq_header")) { + NavigationLink("faq_q1") { VStack(alignment: .leading, spacing: 15) { - Text("StosVPN creates a local network interface that can be used for development and testing purposes. It does not route traffic through any external servers - everything stays on your device.") + Text("faq_q1_a1") .padding(.bottom, 10) - - Text("Common use cases include:") + Text("faq_common_use_cases") .fontWeight(.medium) - - Text("• Testing web applications with local web servers") - Text("• Developing and debugging network-related features") - Text("• Accessing locally hosted development environments") - Text("• Testing applications that require specific network configurations") + Text("faq_case1") + Text("faq_case2") + Text("faq_case3") + Text("faq_case4") } .padding() } - - NavigationLink("Is this a traditional VPN?") { + NavigationLink("faq_q2") { VStack(alignment: .leading, spacing: 15) { - Text("No, StosVPN is NOT a traditional VPN service. It does not:") + Text("faq_q2_a1") .padding(.bottom, 10) .fontWeight(.medium) - - Text("• Route your traffic through external servers") - Text("• Provide privacy or anonymity for internet browsing") - Text("• Connect to remote VPN servers") - Text("• Encrypt or route your internet traffic") - - Text("StosVPN only creates a local network interface on your device to help developers connect to local services and servers for testing and development purposes.") + Text("faq_q2_point1") + Text("faq_q2_point2") + Text("faq_q2_point3") + Text("faq_q2_point4") + Text("faq_q2_a2") .padding(.top, 10) } .padding() } - - NavigationLink("Why does the connection fail?") { + NavigationLink("faq_q3") { VStack(alignment: .leading, spacing: 15) { - Text("Connection failures could be due to system permission issues, configuration errors, or iOS restrictions.") + Text("faq_q3_a1") .padding(.bottom, 10) - - Text("Troubleshooting steps:") + Text("faq_troubleshoot_header") .fontWeight(.medium) - - Text("• Ensure you've approved the network extension permission") - Text("• Try restarting the app") - Text("• Check if your IP configuration is valid") - Text("• Restart your device if issues persist") + Text("faq_troubleshoot1") + Text("faq_troubleshoot2") + Text("faq_troubleshoot3") + Text("faq_troubleshoot4") } .padding() } - - NavigationLink("Who is this app for?") { + NavigationLink("faq_q4") { VStack(alignment: .leading, spacing: 15) { - Text("StosVPN is primarily designed for:") + Text("faq_q4_intro") .fontWeight(.medium) .padding(.bottom, 10) - - Text("• Developers testing local web servers") - Text("• App developers testing network features") - Text("• QA engineers testing applications in isolated network environments") - Text("• Anyone who needs to access locally hosted services on their iOS device") - - Text("This app is available to the general public and is especially useful for developers who need to test applications with network features on iOS devices.") + Text("faq_q4_case1") + Text("faq_q4_case2") + Text("faq_q4_case3") + Text("faq_q4_case4") + Text("faq_q4_conclusion") .padding(.top, 10) } .padding() } } - - Section(header: Text("Business Model Information")) { - NavigationLink("How does StosVPN work?") { + Section(header: Text("business_model_header")) { + NavigationLink("biz_q1") { VStack(alignment: .leading, spacing: 15) { - Text("StosVPN is a completely free app available to the general public. There are no paid features, subscriptions, or in-app purchases.") + Text("biz_q1_a1") .padding(.bottom, 10) - - Text("Key points about our business model:") + Text("biz_key_points_header") .fontWeight(.medium) - - Text("• The app is not restricted to any specific company or group") - Text("• Anyone can download and use the app from the App Store") - Text("• No account creation is required to use the app") - Text("• All features are available to all users free of charge") - Text("• The app is developed and maintained as an open utility for the iOS development community") + Text("biz_point1") + Text("biz_point2") + Text("biz_point3") + Text("biz_point4") + Text("biz_point5") } .padding() } } - - Section(header: Text("App Information")) { + Section(header: Text("app_info_header")) { HStack { Image(systemName: "exclamationmark.shield") - Text("Requires iOS 16.0 or later") + Text("requires_ios") } - HStack { Image(systemName: "lock.shield") - Text("Uses Apple's Network Extension APIs") + Text("uses_network_extension") } } } - .navigationTitle("Help & Support") + .navigationTitle(Text("help_and_support_nav")) .navigationBarTitleDisplayMode(.inline) } } @@ -847,34 +853,32 @@ struct SetupView: View { @Environment(\.dismiss) private var dismiss @AppStorage("hasNotCompletedSetup") private var hasNotCompletedSetup = true @State private var currentPage = 0 - let pages = [ SetupPage( - title: "Welcome to StosVPN", - description: "A simple local network tunnel for developers", + title: "setup_welcome_title", + description: "setup_welcome_description", imageName: "checkmark.shield.fill", - details: "StosVPN creates a local network interface on your device for development, testing, and accessing local servers. This app does NOT collect any user data or route traffic through external servers." + details: "setup_welcome_details" ), SetupPage( - title: "Why Use StosVPN?", - description: "Perfect for iOS developers", + title: "setup_why_title", + description: "setup_why_description", imageName: "person.2.fill", - details: "• Access local web servers and development environments\n• Test applications that require specific network configurations\n• Connect to local network services without complex setup\n• Create isolated network environments for testing" + details: "setup_why_details" ), SetupPage( - title: "Easy to Use", - description: "Just one tap to connect", + title: "setup_easy_title", + description: "setup_easy_description", imageName: "hand.tap.fill", - details: "StosVPN is designed to be simple and straightforward. Just tap the connect button to establish a local network tunnel with pre-configured settings that work for most developer testing needs." + details: "setup_easy_details" ), SetupPage( - title: "Privacy Focused", - description: "Your data stays on your device", + title: "setup_privacy_title", + description: "setup_privacy_description", imageName: "lock.shield.fill", - details: "StosVPN creates a local tunnel that doesn't route traffic through external servers. All network traffic remains on your device, ensuring your privacy and security. No data is collected or shared with third parties." + details: "setup_privacy_details" ) ] - var body: some View { NavigationStack { VStack { @@ -885,64 +889,41 @@ struct SetupView: View { } } .tabViewStyle(PageTabViewStyle(indexDisplayMode: .always)) - Spacer() - if currentPage == pages.count - 1 { Button { hasNotCompletedSetup = false dismiss() } label: { - Text("Get Started") + Text("setup_get_started") .font(.headline) .fontWeight(.semibold) .frame(height: 50) .frame(maxWidth: .infinity) - .background( - LinearGradient( - gradient: Gradient(colors: [Color.blue.opacity(0.8), Color.blue]), - startPoint: .leading, - endPoint: .trailing - ) - ) - .foregroundColor(.white) .cornerRadius(10) .padding(.horizontal) } .padding(.bottom) } else { Button { - withAnimation { - currentPage += 1 - } + withAnimation { currentPage += 1 } } label: { - Text("Next") + Text("setup_next") .font(.headline) .fontWeight(.semibold) .frame(height: 50) .frame(maxWidth: .infinity) - .background( - LinearGradient( - gradient: Gradient(colors: [Color.blue.opacity(0.8), Color.blue]), - startPoint: .leading, - endPoint: .trailing - ) - ) - .foregroundColor(.white) .cornerRadius(10) .padding(.horizontal) } .padding(.bottom) } } - .navigationTitle("Setup") + .navigationTitle(Text("setup_nav")) .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .topBarTrailing) { - Button("Skip") { - hasNotCompletedSetup = false - dismiss() - } + Button("setup_skip") { hasNotCompletedSetup = false; dismiss() } } } } @@ -989,6 +970,24 @@ struct SetupPageView: View { } } +class LanguageManager: ObservableObject { + @Published var currentLanguage: String = Locale.current.languageCode ?? "en" + + private let supportedLanguages = ["en", "es", "it"] + + func updateLanguage(to languageCode: String) { + if supportedLanguages.contains(languageCode) { + currentLanguage = languageCode + UserDefaults.standard.set([languageCode], forKey: "AppleLanguages") + UserDefaults.standard.synchronize() + } else { + currentLanguage = "en" //FALLBACK TO DEFAULT LANGUAGE + UserDefaults.standard.set(["en"], forKey: "AppleLanguages") + UserDefaults.standard.synchronize() + } + } +} + #Preview { ContentView() -} +} \ No newline at end of file diff --git a/StosVPN/Localization/en.lproj/Localizable.strings b/StosVPN/Localization/en.lproj/Localizable.strings new file mode 100644 index 0000000..1811605 --- /dev/null +++ b/StosVPN/Localization/en.lproj/Localizable.strings @@ -0,0 +1,117 @@ +/* MARK: Start Screen */ + +"disconnected" = "Disconnected"; +"connecting" = "Connecting"; +"connected" = "Connected"; +"disconnecting" = "Disconnecting"; +"error" = "Error"; + +"local_tunnel_active" = "Local Tunnel Active"; +"local_tunnel_inactive" = "Local Tunnel Inactive"; + +"connect" = "Connect"; +"disconnect" = "Disconnect"; +"connecting_ellipsis" = "Connecting..."; +"disconnecting_ellipsis" = "Disconnecting..."; +"server_address_name" = "StosVPN Local Tunnel"; + +"local_tunnel_details" = "Tunnel Details"; +"time_connected" = "Time Connected"; +"status" = "Status"; +"active" = "Active"; +"network_interface" = "Network Interface"; +"local" = "Local"; +"assigned_ip" = "Assigned IP"; + +/* MARK: Settings */ + +"connection_settings" = "Connection Settings"; +"auto_connect_on_launch" = "Auto Connect on Launch"; +"connection_logs" = "Connection Logs"; +"network_configuration" = "Network Configuration"; +"device_ip" = "Device IP"; +"tunnel_ip" = "Tunnel IP"; +"subnet_mask" = "Subnet Mask"; +"app_information" = "App Information"; +"privacy_policy" = "Privacy Policy"; +"data_collection_policy" = "Data Collection Policy"; +"app_version" = "App Version"; +"help_and_support" = "Help and Support"; +"language" = "Language"; +"english" = "English"; +"spanish" = "Spanish"; +"italian" = "Italian"; +"settings" = "Settings"; +"done" = "Done"; + +"data_collection_policy_title" = "Data Collection Policy"; +"no_data_collection" = "No Data Collection"; +"no_data_collection_description" = "StosVPN DOES NOT collect user data, traffic information, or browsing activity. This app creates a local network tunnel that stays entirely on your device."; +"local_processing_only" = "Local Processing Only"; +"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_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."; +"data_collection_policy_nav" = "Data Collection"; +"logs_nav" = "Logs"; +"faq_header" = "Frequently Asked Questions"; +"faq_q1" = "What does this app do?"; +"faq_q1_a1" = "StosVPN creates a local network interface for development and testing. It does not route traffic through external servers: everything stays on the device."; +"faq_common_use_cases" = "Common use cases include:"; +"faq_case1" = "• Web app testing with local servers"; +"faq_case2" = "• Development and debugging of network features"; +"faq_case3" = "• Accessing hosted local development environments"; +"faq_case4" = "• Testing apps that require specific network configurations"; +"faq_q2" = "Is it a traditional VPN?"; +"faq_q2_a1" = "No, StosVPN is NOT a traditional VPN service. It does NOT:"; +"faq_q2_point1" = "• Route your traffic through external servers"; +"faq_q2_point2" = "• Provide privacy or anonymity for browsing"; +"faq_q2_point3" = "• Connect to remote VPN servers"; +"faq_q2_point4" = "• Encrypt or route your internet traffic"; +"faq_q2_a2" = "StosVPN only creates a local network interface to help developers connect to local services for development and testing."; +"faq_q3" = "Why does the connection fail?"; +"faq_q3_a1" = "Connection failures may be due to system permissions, configuration errors, or iOS restrictions."; +"faq_troubleshoot_header" = "Troubleshooting steps:"; +"faq_troubleshoot1" = "• Make sure you have approved the network extension permission"; +"faq_troubleshoot2" = "• Try restarting the app"; +"faq_troubleshoot3" = "• Check if the IP configuration is valid"; +"faq_troubleshoot4" = "• Restart the device if problems persist"; +"faq_q4" = "Who is this app for?"; +"faq_q4_intro" = "StosVPN is primarily designed for:"; +"faq_q4_case1" = "• Developers testing local web servers"; +"faq_q4_case2" = "• App developers testing network features"; +"faq_q4_case3" = "• QA engineers testing apps in isolated environments"; +"faq_q4_case4" = "• Anyone needing access to local services on iOS"; +"faq_q4_conclusion" = "This app is publicly available and useful for developers who need to test apps with network features on iOS."; +"business_model_header" = "Business Model"; +"biz_q1" = "How does StosVPN work?"; +"biz_q1_a1" = "StosVPN is a completely free app available to the public. There are no paid features, subscriptions, or in-app purchases."; +"biz_key_points_header" = "Key points of our model:"; +"biz_point1" = "• The app is not tied to any company or group"; +"biz_point2" = "• Anyone can download and use the app from the App Store"; +"biz_point3" = "• No account creation is required"; +"biz_point4" = "• All features are free for all users"; +"biz_point5" = "• The app is developed and maintained as an open utility for the iOS community"; +"app_info_header" = "App Information"; +"requires_ios" = "Requires iOS 16.0 or later"; +"uses_network_extension" = "Uses Apple Network Extension APIs"; +"help_and_support_nav" = "Help & Support"; +"setup_welcome_title" = "Welcome to StosVPN"; +"setup_welcome_description" = "A simple local network tunnel for developers"; +"setup_welcome_details" = "StosVPN creates a local network interface for development, testing, and access to local servers. This app DOES NOT collect user data or route traffic through external servers."; +"setup_why_title" = "Why Use StosVPN?"; +"setup_why_description" = "Perfect for iOS developers"; +"setup_why_details" = "• Access local web servers and development environments\n• Test apps requiring specific network configurations\n• Connect to local network services without complex setup\n• Create isolated testing environments"; +"setup_easy_title" = "Easy to Use"; +"setup_easy_description" = "Just one tap to connect"; +"setup_easy_details" = "StosVPN is designed to be simple. Just tap the connect button to establish a local tunnel with preconfigured settings."; +"setup_privacy_title" = "Privacy Focused"; +"setup_privacy_description" = "Your data stays on the device"; +"setup_privacy_details" = "StosVPN creates a local tunnel that does not route traffic through external servers. All traffic stays on your device, ensuring privacy and security. No data is collected or shared with third parties."; +"setup_nav" = "Setup"; +"setup_get_started" = "Get Started"; +"setup_next" = "Next"; +"setup_skip" = "Skip"; \ No newline at end of file diff --git a/StosVPN/Localization/es.lproj/Localizable.strings b/StosVPN/Localization/es.lproj/Localizable.strings new file mode 100644 index 0000000..a543c03 --- /dev/null +++ b/StosVPN/Localization/es.lproj/Localizable.strings @@ -0,0 +1,117 @@ +/* MARK: Pantalla de inicio */ + +"disconnected" = "Desconectado"; +"connecting" = "Conectando"; +"connected" = "Conectado"; +"disconnecting" = "Desconectando"; +"error" = "Error"; + +"local_tunnel_active" = "Túnel local activo"; +"local_tunnel_inactive" = "Túnel local inactivo"; + +"connect" = "Conectar"; +"disconnect" = "Desconectar"; +"connecting_ellipsis" = "Conectando..."; +"disconnecting_ellipsis" = "Desconectando..."; +"server_address_name" = "Túnel Local de StosVPN"; + +"local_tunnel_details" = "Detalles del Túnel"; +"time_connected" = "Tiempo Conectado"; +"status" = "Estado"; +"active" = "Activo"; +"network_interface" = "Interfaz de Red"; +"local" = "Local"; +"assigned_ip" = "IP Asignada"; + +/* MARK: Configuración */ + +"connection_settings" = "Configuración de Conexión"; +"auto_connect_on_launch" = "Conectar automáticamente al iniciar"; +"connection_logs" = "Registros de Conexión"; +"network_configuration" = "Configuración de Red"; +"device_ip" = "IP del Dispositivo"; +"tunnel_ip" = "IP del Túnel"; +"subnet_mask" = "Máscara de Subred"; +"app_information" = "Información de la App"; +"privacy_policy" = "Política de Privacidad"; +"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"; +"settings" = "Configuración"; +"done" = "Hecho"; + +"data_collection_policy_title" = "Política de Recopilación de Datos"; +"no_data_collection" = "No Recopilación de Datos"; +"no_data_collection_description" = "StosVPN NO recopila datos de usuarios, información sobre el tráfico o actividad de navegación. Esta app crea un túnel de red local que permanece completamente en tu dispositivo."; +"local_processing_only" = "Solo Procesamiento Local"; +"local_processing_only_description" = "Todo el tráfico de red y configuraciones se procesan localmente en tu dispositivo. Ninguna información deja el dispositivo ni se transmite a Internet."; +"no_third_party_sharing" = "No Compartir con Terceros"; +"no_third_party_sharing_description" = "Dado que no recopilamos datos, no compartimos con terceros. No tenemos análisis, rastreo ni mecanismos de recopilación de datos en esta app."; +"why_use_network_permissions" = "¿Por Qué Usar Permisos de Red?"; +"why_use_network_permissions_description" = "StosVPN requiere permisos de extensión de red para crear una interfaz de red local en tu dispositivo. Esto se utiliza exclusivamente para desarrollo y pruebas locales."; +"our_promise" = "Nuestra Promesa"; +"our_promise_description" = "Estamos comprometidos con la privacidad y la transparencia. Esta app está diseñada para desarrolladores para probar y conectarse a servidores locales sin preocupaciones sobre la privacidad."; +"data_collection_policy_nav" = "Recopilación de Datos"; +"logs_nav" = "Registros"; +"faq_header" = "Preguntas Frecuentes"; +"faq_q1" = "¿Qué hace esta app?"; +"faq_q1_a1" = "StosVPN crea una interfaz de red local útil para el desarrollo y las pruebas. No enruta el tráfico a través de servidores externos: todo permanece en el dispositivo."; +"faq_common_use_cases" = "Los casos de uso comunes incluyen:"; +"faq_case1" = "• Pruebas de aplicaciones web con servidores locales"; +"faq_case2" = "• Desarrollo y depuración de funcionalidades de red"; +"faq_case3" = "• Acceso a entornos de desarrollo locales alojados"; +"faq_case4" = "• Pruebas de apps que requieren configuraciones de red específicas"; +"faq_q2" = "¿Es una VPN tradicional?"; +"faq_q2_a1" = "No, StosVPN NO es un servicio de VPN tradicional. No:"; +"faq_q2_point1" = "• Enruta tu tráfico a través de servidores externos"; +"faq_q2_point2" = "• Proporciona privacidad o anonimato para la navegación"; +"faq_q2_point3" = "• Se conecta a servidores VPN remotos"; +"faq_q2_point4" = "• Cifra o enruta tu tráfico de internet"; +"faq_q2_a2" = "StosVPN solo crea una interfaz de red local para ayudar a los desarrolladores a conectarse a servicios locales para el desarrollo y las pruebas."; +"faq_q3" = "¿Por qué falla la conexión?"; +"faq_q3_a1" = "Las fallas en la conexión pueden deberse a permisos del sistema, errores de configuración o restricciones de iOS."; +"faq_troubleshoot_header" = "Pasos para solucionar problemas:"; +"faq_troubleshoot1" = "• Asegúrate de haber aprobado el permiso de extensión de red"; +"faq_troubleshoot2" = "• Intenta reiniciar la app"; +"faq_troubleshoot3" = "• Verifica si la configuración IP es válida"; +"faq_troubleshoot4" = "• Reinicia el dispositivo si los problemas persisten"; +"faq_q4" = "¿Para quién es esta app?"; +"faq_q4_intro" = "StosVPN está diseñado principalmente para:"; +"faq_q4_case1" = "• Desarrolladores que prueban servidores web locales"; +"faq_q4_case2" = "• Desarrolladores de apps que prueban funcionalidades de red"; +"faq_q4_case3" = "• Ingenieros de QA que prueban apps en entornos aislados"; +"faq_q4_case4" = "• Cualquier persona que necesite acceder a servicios locales en iOS"; +"faq_q4_conclusion" = "Esta app está disponible para el público y es útil para desarrolladores que necesitan probar apps con funcionalidades de red en iOS."; +"business_model_header" = "Modelo de Negocio"; +"biz_q1" = "¿Cómo funciona StosVPN?"; +"biz_q1_a1" = "StosVPN es una app completamente gratuita disponible para el público. No hay funciones de pago, suscripciones ni compras dentro de la app."; +"biz_key_points_header" = "Puntos clave de nuestro modelo:"; +"biz_point1" = "• La app no está vinculada a ninguna empresa o grupo"; +"biz_point2" = "• Cualquier persona puede descargar y usar la app desde la App Store"; +"biz_point3" = "• No es necesario crear una cuenta"; +"biz_point4" = "• Todas las funciones son gratuitas para todos los usuarios"; +"biz_point5" = "• La app es desarrollada y mantenida como una utilidad abierta para la comunidad de iOS"; +"app_info_header" = "Información de la App"; +"requires_ios" = "Requiere iOS 16.0 o superior"; +"uses_network_extension" = "Usa la API de Extensión de Red de Apple"; +"help_and_support_nav" = "Ayuda & Soporte"; +"setup_welcome_title" = "Bienvenido a StosVPN"; +"setup_welcome_description" = "Un simple túnel de red local para desarrolladores"; +"setup_welcome_details" = "StosVPN crea una interfaz de red local para el desarrollo, pruebas y acceso a servidores locales. Esta app NO recopila datos de usuario ni enruta el tráfico a través de servidores externos."; +"setup_why_title" = "¿Por qué usar StosVPN?"; +"setup_why_description" = "Ideal para desarrolladores iOS"; +"setup_why_details" = "• Accede a servidores web locales y entornos de desarrollo\n• Prueba apps que requieren configuraciones de red específicas\n• Conéctate a servicios de red locales sin configuraciones complejas\n• Crea entornos aislados para pruebas"; +"setup_easy_title" = "Fácil de Usar"; +"setup_easy_description" = "Conéctate con solo un toque"; +"setup_easy_details" = "StosVPN está diseñado para ser simple. Solo toca el botón de conexión para establecer un túnel local con configuraciones predefinidas."; +"setup_privacy_title" = "Enfocado en la Privacidad"; +"setup_privacy_description" = "Tus datos permanecen en tu dispositivo"; +"setup_privacy_details" = "StosVPN crea un túnel local que no enruta el tráfico a través de servidores externos. Todo el tráfico permanece en tu dispositivo, asegurando privacidad y seguridad. Ningún dato se recopila ni se comparte con terceros."; +"setup_nav" = "Configuración"; +"setup_get_started" = "Comenzar"; +"setup_next" = "Siguiente"; +"setup_skip" = "Saltar"; diff --git a/StosVPN/Localization/it.lproj/Localizable.strings b/StosVPN/Localization/it.lproj/Localizable.strings new file mode 100644 index 0000000..d0b391b --- /dev/null +++ b/StosVPN/Localization/it.lproj/Localizable.strings @@ -0,0 +1,117 @@ +/* MARK: Start Screen */ + +"disconnected" = "Disconnesso"; +"connecting" = "Connessione in corso"; +"connected" = "Connesso"; +"disconnecting" = "Disconnessione in corso"; +"error" = "Errore"; + +"local_tunnel_active" = "Tunnel locale attivo"; +"local_tunnel_inactive" = "Tunnel locale inattivo"; + +"connect" = "Connetti"; +"disconnect" = "Disconnetti"; +"connecting_ellipsis" = "Connessione in corso..."; +"disconnecting_ellipsis" = "Disconnessione in corso..."; +"server_address_name" = "Tunnel Locale di StosVPN"; + +"local_tunnel_details" = "Dettagli del Tunnel"; +"time_connected" = "Tempo Connesso"; +"status" = "Stato"; +"active" = "Attivo"; +"network_interface" = "Interfaccia di Rete"; +"local" = "Locale"; +"assigned_ip" = "IP Assegnato"; + +/* MARK: Settins*/ + +"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"; +"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"; +"settings" = "Impostazioni"; +"done" = "Fine"; + +"data_collection_policy_title" = "Politica di Raccolta Dati"; +"no_data_collection" = "Nessuna Raccolta 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_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_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"; +"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"; +"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_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_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_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_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"; +"app_info_header" = "Informazioni App"; +"requires_ios" = "Richiede iOS 16.0 o superiore"; +"uses_network_extension" = "Usa le Network Extension API di Apple"; +"help_and_support_nav" = "Guida & Supporto"; +"setup_welcome_title" = "Benvenuto in StosVPN"; +"setup_welcome_description" = "Un semplice tunnel di rete locale per sviluppatori"; +"setup_welcome_details" = "StosVPN crea un'interfaccia di rete locale per sviluppo, test e accesso a server locali. Questa app NON raccoglie dati utente né instrada il traffico attraverso server esterni."; +"setup_why_title" = "Perché Usare StosVPN?"; +"setup_why_description" = "Perfetto per sviluppatori iOS"; +"setup_why_details" = "• Accedi a server web locali e ambienti di sviluppo\n• Testa app che richiedono configurazioni di rete specifiche\n• Connettiti a servizi di rete locali senza setup complessi\n• Crea ambienti isolati per test"; +"setup_easy_title" = "Facile da Usare"; +"setup_easy_description" = "Basta un tap per connettersi"; +"setup_easy_details" = "StosVPN è progettato per essere semplice. Basta toccare il pulsante di connessione per stabilire un tunnel locale con impostazioni preconfigurate."; +"setup_privacy_title" = "Focalizzato sulla Privacy"; +"setup_privacy_description" = "I tuoi dati restano sul dispositivo"; +"setup_privacy_details" = "StosVPN crea un tunnel locale che non instrada il traffico attraverso server esterni. Tutto il traffico rimane sul tuo dispositivo, garantendo privacy e sicurezza. Nessun dato viene raccolto o condiviso con terze parti."; +"setup_nav" = "Setup"; +"setup_get_started" = "Inizia"; +"setup_next" = "Avanti"; +"setup_skip" = "Salta";