Languages introduction

idk if this is a useless feauture or not, but I develop this pull request with the addition of IT, EN and ES languages.
This commit is contained in:
Andrea Filice
2025-04-20 23:47:21 +02:00
parent 2065040a70
commit 83e7c2b8e7
4 changed files with 498 additions and 169 deletions

View File

@@ -54,12 +54,14 @@ class TunnelManager: ObservableObject {
Bundle.main.bundleIdentifier!.appending(".TunnelProv") Bundle.main.bundleIdentifier!.appending(".TunnelProv")
} }
enum TunnelStatus: String { import SwiftUI
case disconnected = "Disconnected"
case connecting = "Connecting" enum TunnelStatus {
case connected = "Connected" case disconnected
case disconnecting = "Disconnecting" case connecting
case error = "Error" case connected
case disconnecting
case error
var color: Color { var color: Color {
switch self { switch self {
@@ -80,7 +82,23 @@ class TunnelManager: ObservableObject {
case .error: return "exclamationmark.shield.fill" 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() { private init() {
loadTunnelPreferences() loadTunnelPreferences()
@@ -165,7 +183,7 @@ class TunnelManager: ObservableObject {
let proto = NETunnelProviderProtocol() let proto = NETunnelProviderProtocol()
proto.providerBundleIdentifier = self.tunnelBundleId proto.providerBundleIdentifier = self.tunnelBundleId
proto.serverAddress = "StosVPN's Local Network Tunnel" proto.serverAddress = NSLocalizedString("server_address_name", comment: "")
manager.protocolConfiguration = proto manager.protocolConfiguration = proto
let onDemandRule = NEOnDemandRuleEvaluateConnection() let onDemandRule = NEOnDemandRuleEvaluateConnection()
@@ -423,8 +441,9 @@ struct StatusIndicatorView: View {
.onChange(of: tunnelManager.tunnelStatus) { _ in .onChange(of: tunnelManager.tunnelStatus) { _ in
updateAnimation() updateAnimation()
} }
Text(tunnelManager.tunnelStatus == .connected ?
Text(tunnelManager.tunnelStatus == .connected ? "Local tunnel active" : "Local tunnel inactive") NSLocalizedString("local_tunnel_active", comment: "") :
NSLocalizedString("local_tunnel_inactive", comment: ""))
.font(.subheadline) .font(.subheadline)
.foregroundColor(tunnelManager.tunnelStatus == .connected ? .green : .secondary) .foregroundColor(tunnelManager.tunnelStatus == .connected ? .green : .secondary)
} }
@@ -480,14 +499,15 @@ struct ConnectionButton: View {
} }
private var buttonText: String { private var buttonText: String {
if tunnelManager.tunnelStatus == .connected { switch tunnelManager.tunnelStatus {
return "Disconnect" case .connected:
} else if tunnelManager.tunnelStatus == .connecting { return NSLocalizedString("disconnect", comment: "")
return "Connecting..." case .connecting:
} else if tunnelManager.tunnelStatus == .disconnecting { return NSLocalizedString("connecting_ellipsis", comment: "")
return "Disconnecting..." case .disconnecting:
} else { return NSLocalizedString("disconnecting_ellipsis", comment: "")
return "Connect" default:
return NSLocalizedString("connect", comment: "")
} }
} }
@@ -516,33 +536,29 @@ struct ConnectionStatsView: View {
var body: some View { var body: some View {
VStack(spacing: 25) { VStack(spacing: 25) {
Text("Local Tunnel Details") Text("local_tunnel_details")
.font(.headline) .font(.headline)
.foregroundColor(.primary) .foregroundColor(.primary)
HStack(spacing: 30) { HStack(spacing: 30) {
StatItemView( StatItemView(
title: "Time Connected", title: NSLocalizedString("time_connected", comment: ""),
value: formattedTime, value: formattedTime,
icon: "clock.fill" icon: "clock.fill"
) )
StatItemView( StatItemView(
title: "Status", title: NSLocalizedString("status", comment: ""),
value: "Active", value: NSLocalizedString("active", comment: ""),
icon: "checkmark.circle.fill" icon: "checkmark.circle.fill"
) )
} }
HStack(spacing: 30) { HStack(spacing: 30) {
StatItemView( StatItemView(
title: "Network Interface", title: NSLocalizedString("network_interface", comment: ""),
value: "Local", value: NSLocalizedString("local", comment: ""),
icon: "network" icon: "network"
) )
StatItemView( StatItemView(
title: "Assigned IP", title: NSLocalizedString("assigned_ip", comment: ""),
value: "10.7.0.1", value: "10.7.0.1",
icon: "number" icon: "number"
) )
@@ -599,6 +615,7 @@ struct StatItemView: View {
// MARK: - Updated SettingsView // MARK: - Updated SettingsView
struct SettingsView: View { struct SettingsView: View {
@Environment(\.dismiss) private var dismiss @Environment(\.dismiss) private var dismiss
@State private var selectedLanguage = 0
@AppStorage("TunnelDeviceIP") private var deviceIP = "10.7.0.0" @AppStorage("TunnelDeviceIP") private var deviceIP = "10.7.0.0"
@AppStorage("TunnelFakeIP") private var fakeIP = "10.7.0.1" @AppStorage("TunnelFakeIP") private var fakeIP = "10.7.0.1"
@AppStorage("TunnelSubnetMask") private var subnetMask = "255.255.255.0" @AppStorage("TunnelSubnetMask") private var subnetMask = "255.255.255.0"
@@ -607,71 +624,74 @@ struct SettingsView: View {
var body: some View { var body: some View {
NavigationStack { NavigationStack {
List { List {
Section(header: Text("Connection Settings")) { Section(header: Text("connection_settings")) {
Toggle("Auto-connect on Launch", isOn: $autoConnect) Toggle("auto_connect_on_launch", isOn: $autoConnect)
NavigationLink(destination: ConnectionLogView()) { 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 { HStack {
Text("Device IP") Text("device_ip")
Spacer() Spacer()
TextField("Device IP", text: $deviceIP) TextField("device_ip", text: $deviceIP)
.multilineTextAlignment(.trailing) .multilineTextAlignment(.trailing)
.foregroundColor(.secondary) .foregroundColor(.secondary)
.keyboardType(.numbersAndPunctuation) .keyboardType(.numbersAndPunctuation)
} }
HStack { HStack {
Text("Tunnel IP") Text("tunnel_ip")
Spacer() Spacer()
TextField("Tunnel IP", text: $fakeIP) TextField("tunnel_ip", text: $fakeIP)
.multilineTextAlignment(.trailing) .multilineTextAlignment(.trailing)
.foregroundColor(.secondary) .foregroundColor(.secondary)
.keyboardType(.numbersAndPunctuation) .keyboardType(.numbersAndPunctuation)
} }
HStack { HStack {
Text("Subnet Mask") Text("subnet_mask")
Spacer() Spacer()
TextField("Subnet Mask", text: $subnetMask) TextField("subnet_mask", text: $subnetMask)
.multilineTextAlignment(.trailing) .multilineTextAlignment(.trailing)
.foregroundColor(.secondary) .foregroundColor(.secondary)
.keyboardType(.numbersAndPunctuation) .keyboardType(.numbersAndPunctuation)
} }
} }
Section(header: Text("App Information")) { Section(header: Text("app_information")) {
Button { Button {
UIApplication.shared.open(URL(string: "https://github.com/stossy11/PrivacyPolicy/blob/main/PrivacyPolicy.md")!, options: [:]) UIApplication.shared.open(URL(string: "https://github.com/stossy11/PrivacyPolicy/blob/main/PrivacyPolicy.md")!, options: [:])
} label: { } label: {
Label("Privacy Policy", systemImage: "lock.shield") Label("privacy_policy", systemImage: "lock.shield")
} }
NavigationLink(destination: DataCollectionInfoView()) { NavigationLink(destination: DataCollectionInfoView()) {
Label("Data Collection Policy", systemImage: "hand.raised.slash") Label("data_collection_policy", systemImage: "hand.raised.slash")
} }
HStack { HStack {
Text("App Version") Text("app_version")
Spacer() Spacer()
Text("1.1.0") Text("1.1.0")
.foregroundColor(.secondary) .foregroundColor(.secondary)
} }
NavigationLink(destination: HelpView()) { 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)
} }
.navigationTitle("Settings") .pickerStyle(MenuPickerStyle())
}
}
.navigationTitle(Text("settings"))
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
.toolbar { .toolbar {
ToolbarItem(placement: .topBarTrailing) { ToolbarItem(placement: .topBarTrailing) {
Button("Done") { Button("done") {
dismiss() dismiss()
} }
} }
@@ -680,49 +700,49 @@ struct SettingsView: View {
} }
} }
// MARK: - New Data Collection Info View // MARK: - New Data Collection Info View
struct DataCollectionInfoView: View { struct DataCollectionInfoView: View {
var body: some View { var body: some View {
ScrollView { ScrollView {
VStack(alignment: .leading, spacing: 20) { VStack(alignment: .leading, spacing: 20) {
Text("Data Collection Policy") Text("data_collection_policy_title")
.font(.title) .font(.title)
.fontWeight(.bold) .fontWeight(.bold)
.padding(.bottom, 10) .padding(.bottom, 10)
GroupBox(label: Label("No Data Collection", systemImage: "hand.raised.slash").font(.headline)) { 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.") Text("no_data_collection_description")
.padding(.vertical) .padding(.vertical)
} }
GroupBox(label: Label("Local Processing Only", systemImage: "iphone").font(.headline)) { 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.") Text("local_processing_only_description")
.padding(.vertical) .padding(.vertical)
} }
GroupBox(label: Label("No Third-Party Sharing", systemImage: "person.2.slash").font(.headline)) { 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.") Text("no_third_party_sharing_description")
.padding(.vertical) .padding(.vertical)
} }
GroupBox(label: Label("Why Use Network Permissions", systemImage: "network").font(.headline)) { 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.") Text("why_use_network_permissions_description")
.padding(.vertical) .padding(.vertical)
} }
GroupBox(label: Label("Our Promise", systemImage: "checkmark.seal").font(.headline)) { 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.") Text("our_promise_description")
.padding(.vertical) .padding(.vertical)
} }
} }
.padding() .padding()
} }
.navigationTitle("Data Collection") .navigationTitle(Text("data_collection_policy_nav"))
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
} }
} }
// MARK: - Updated ConnectionLogView
struct ConnectionLogView: View { struct ConnectionLogView: View {
@StateObject var logger = VPNLogger.shared @StateObject var logger = VPNLogger.shared
var body: some View { var body: some View {
@@ -730,115 +750,98 @@ struct ConnectionLogView: View {
Text(log) Text(log)
.font(.system(.body, design: .monospaced)) .font(.system(.body, design: .monospaced))
} }
.navigationTitle("Logs") .navigationTitle(Text("logs_nav"))
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
} }
} }
// MARK: - Updated HelpView
struct HelpView: View { struct HelpView: View {
var body: some View { var body: some View {
List { List {
Section(header: Text("Frequently Asked Questions")) { Section(header: Text("faq_header")) {
NavigationLink("What does this app do?") { NavigationLink("faq_q1") {
VStack(alignment: .leading, spacing: 15) { 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) .padding(.bottom, 10)
Text("faq_common_use_cases")
Text("Common use cases include:")
.fontWeight(.medium) .fontWeight(.medium)
Text("faq_case1")
Text("• Testing web applications with local web servers") Text("faq_case2")
Text("• Developing and debugging network-related features") Text("faq_case3")
Text("• Accessing locally hosted development environments") Text("faq_case4")
Text("• Testing applications that require specific network configurations")
} }
.padding() .padding()
} }
NavigationLink("faq_q2") {
NavigationLink("Is this a traditional VPN?") {
VStack(alignment: .leading, spacing: 15) { VStack(alignment: .leading, spacing: 15) {
Text("No, StosVPN is NOT a traditional VPN service. It does not:") Text("faq_q2_a1")
.padding(.bottom, 10) .padding(.bottom, 10)
.fontWeight(.medium) .fontWeight(.medium)
Text("faq_q2_point1")
Text("• Route your traffic through external servers") Text("faq_q2_point2")
Text("• Provide privacy or anonymity for internet browsing") Text("faq_q2_point3")
Text("• Connect to remote VPN servers") Text("faq_q2_point4")
Text("• Encrypt or route your internet traffic") Text("faq_q2_a2")
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.")
.padding(.top, 10) .padding(.top, 10)
} }
.padding() .padding()
} }
NavigationLink("faq_q3") {
NavigationLink("Why does the connection fail?") {
VStack(alignment: .leading, spacing: 15) { 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) .padding(.bottom, 10)
Text("faq_troubleshoot_header")
Text("Troubleshooting steps:")
.fontWeight(.medium) .fontWeight(.medium)
Text("faq_troubleshoot1")
Text("• Ensure you've approved the network extension permission") Text("faq_troubleshoot2")
Text("• Try restarting the app") Text("faq_troubleshoot3")
Text("• Check if your IP configuration is valid") Text("faq_troubleshoot4")
Text("• Restart your device if issues persist")
} }
.padding() .padding()
} }
NavigationLink("faq_q4") {
NavigationLink("Who is this app for?") {
VStack(alignment: .leading, spacing: 15) { VStack(alignment: .leading, spacing: 15) {
Text("StosVPN is primarily designed for:") Text("faq_q4_intro")
.fontWeight(.medium) .fontWeight(.medium)
.padding(.bottom, 10) .padding(.bottom, 10)
Text("faq_q4_case1")
Text("• Developers testing local web servers") Text("faq_q4_case2")
Text("• App developers testing network features") Text("faq_q4_case3")
Text("• QA engineers testing applications in isolated network environments") Text("faq_q4_case4")
Text("• Anyone who needs to access locally hosted services on their iOS device") Text("faq_q4_conclusion")
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.")
.padding(.top, 10) .padding(.top, 10)
} }
.padding() .padding()
} }
} }
Section(header: Text("business_model_header")) {
Section(header: Text("Business Model Information")) { NavigationLink("biz_q1") {
NavigationLink("How does StosVPN work?") {
VStack(alignment: .leading, spacing: 15) { 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) .padding(.bottom, 10)
Text("biz_key_points_header")
Text("Key points about our business model:")
.fontWeight(.medium) .fontWeight(.medium)
Text("biz_point1")
Text("• The app is not restricted to any specific company or group") Text("biz_point2")
Text("• Anyone can download and use the app from the App Store") Text("biz_point3")
Text("• No account creation is required to use the app") Text("biz_point4")
Text("• All features are available to all users free of charge") Text("biz_point5")
Text("• The app is developed and maintained as an open utility for the iOS development community")
} }
.padding() .padding()
} }
} }
Section(header: Text("app_info_header")) {
Section(header: Text("App Information")) {
HStack { HStack {
Image(systemName: "exclamationmark.shield") Image(systemName: "exclamationmark.shield")
Text("Requires iOS 16.0 or later") Text("requires_ios")
} }
HStack { HStack {
Image(systemName: "lock.shield") 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) .navigationBarTitleDisplayMode(.inline)
} }
} }
@@ -847,34 +850,32 @@ struct SetupView: View {
@Environment(\.dismiss) private var dismiss @Environment(\.dismiss) private var dismiss
@AppStorage("hasNotCompletedSetup") private var hasNotCompletedSetup = true @AppStorage("hasNotCompletedSetup") private var hasNotCompletedSetup = true
@State private var currentPage = 0 @State private var currentPage = 0
let pages = [ let pages = [
SetupPage( SetupPage(
title: "Welcome to StosVPN", title: "setup_welcome_title",
description: "A simple local network tunnel for developers", description: "setup_welcome_description",
imageName: "checkmark.shield.fill", 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( SetupPage(
title: "Why Use StosVPN?", title: "setup_why_title",
description: "Perfect for iOS developers", description: "setup_why_description",
imageName: "person.2.fill", 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( SetupPage(
title: "Easy to Use", title: "setup_easy_title",
description: "Just one tap to connect", description: "setup_easy_description",
imageName: "hand.tap.fill", 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( SetupPage(
title: "Privacy Focused", title: "setup_privacy_title",
description: "Your data stays on your device", description: "setup_privacy_description",
imageName: "lock.shield.fill", 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 { var body: some View {
NavigationStack { NavigationStack {
VStack { VStack {
@@ -885,64 +886,41 @@ struct SetupView: View {
} }
} }
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .always)) .tabViewStyle(PageTabViewStyle(indexDisplayMode: .always))
Spacer() Spacer()
if currentPage == pages.count - 1 { if currentPage == pages.count - 1 {
Button { Button {
hasNotCompletedSetup = false hasNotCompletedSetup = false
dismiss() dismiss()
} label: { } label: {
Text("Get Started") Text("setup_get_started")
.font(.headline) .font(.headline)
.fontWeight(.semibold) .fontWeight(.semibold)
.frame(height: 50) .frame(height: 50)
.frame(maxWidth: .infinity) .frame(maxWidth: .infinity)
.background(
LinearGradient(
gradient: Gradient(colors: [Color.blue.opacity(0.8), Color.blue]),
startPoint: .leading,
endPoint: .trailing
)
)
.foregroundColor(.white)
.cornerRadius(10) .cornerRadius(10)
.padding(.horizontal) .padding(.horizontal)
} }
.padding(.bottom) .padding(.bottom)
} else { } else {
Button { Button {
withAnimation { withAnimation { currentPage += 1 }
currentPage += 1
}
} label: { } label: {
Text("Next") Text("setup_next")
.font(.headline) .font(.headline)
.fontWeight(.semibold) .fontWeight(.semibold)
.frame(height: 50) .frame(height: 50)
.frame(maxWidth: .infinity) .frame(maxWidth: .infinity)
.background(
LinearGradient(
gradient: Gradient(colors: [Color.blue.opacity(0.8), Color.blue]),
startPoint: .leading,
endPoint: .trailing
)
)
.foregroundColor(.white)
.cornerRadius(10) .cornerRadius(10)
.padding(.horizontal) .padding(.horizontal)
} }
.padding(.bottom) .padding(.bottom)
} }
} }
.navigationTitle("Setup") .navigationTitle(Text("setup_nav"))
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
.toolbar { .toolbar {
ToolbarItem(placement: .topBarTrailing) { ToolbarItem(placement: .topBarTrailing) {
Button("Skip") { Button("setup_skip") { hasNotCompletedSetup = false; dismiss() }
hasNotCompletedSetup = false
dismiss()
}
} }
} }
} }

View File

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

View File

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

View File

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