mirror of
https://github.com/jkcoxson/LocalDevVPN.git
synced 2026-03-02 14:36:16 +01:00
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:
@@ -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,8 +82,24 @@ 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()
|
||||||
setupStatusObserver()
|
setupStatusObserver()
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
|
.pickerStyle(MenuPickerStyle())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.navigationTitle("Settings")
|
.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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
117
StosVPN/Localization/en.lproj/Localizable.strings
Normal file
117
StosVPN/Localization/en.lproj/Localizable.strings
Normal 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";
|
||||||
117
StosVPN/Localization/es.lproj/Localizable.strings
Normal file
117
StosVPN/Localization/es.lproj/Localizable.strings
Normal 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";
|
||||||
117
StosVPN/Localization/it.lproj/Localizable.strings
Normal file
117
StosVPN/Localization/it.lproj/Localizable.strings
Normal 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 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";
|
||||||
Reference in New Issue
Block a user