Files
RouterOS/RouterOSAssistant/Features/Wizard/Steps/Setup/FirewallStepView.swift
T
KayandClaude Sonnet 5 16706d5c6b M21: Zweisprachigkeit (DE/EN) auf alle fünf Tabs ausgerollt
Einrichten-Wizard (alle sieben Schritte), Übersicht, LAN-Scanner,
Sicherungen laufen jetzt über L10n.t statt fester deutscher
String-Literale — Experte- und Verbinden-Tab waren bereits vorher
umgestellt (M16/M17). Model-Layer-Strings werden am Verwendungsort
gewrappt, ViewModel-generierte Laufzeitstrings (Fehlermeldungen,
CLI-Zeilen, Log) bleiben bewusst unübersetzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 08:31:08 +02:00

71 lines
3.6 KiB
Swift

import SwiftUI
struct FirewallStepView: View {
@ObservedObject var viewModel: SetupViewModel
@AppStorage("appLanguage") private var appLanguage: String = "de"
var body: some View {
Form {
Section {
if viewModel.mode == .expert {
Toggle(
L10n.t("Firewall-Grundschutz einrichten (empfohlen)", appLanguage),
isOn: Binding(
get: { viewModel.firewallSectionEnabled },
set: { viewModel.setFirewallSectionEnabled($0) }
)
)
.help(L10n.t("Schützt deinen Router und deine Geräte vor unaufgeforderten Zugriffen aus dem Internet und ermöglicht deinen Geräten den Internetzugriff (NAT).", appLanguage))
} else {
Text(L10n.t("Firewall-Grundschutz ist im einfachen Modus immer aktiv.", appLanguage))
}
Text(L10n.t("Richtet einen Standard-Schutz ein: Internetfreigabe (NAT) für dein Heimnetz, und blockiert unaufgeforderte Zugriffe aus dem Internet auf deinen Router und deine Geräte. Bestehende, selbst eingerichtete Regeln bleiben erhalten — die neuen Regeln werden vorangestellt.", appLanguage))
.font(.caption)
.foregroundStyle(.secondary)
}
if viewModel.firewallSectionEnabled {
Section(L10n.t("Bereits vorhandene Regeln", appLanguage)) {
if viewModel.isLoadingFirewallRuleCounts {
ProgressView()
} else if let counts = viewModel.existingFirewallRuleCounts {
LabeledContent(L10n.t("Filter-Regeln", appLanguage), value: "\(counts.filterRuleCount)")
LabeledContent(L10n.t("NAT-Regeln", appLanguage), value: "\(counts.natRuleCount)")
if counts.filterRuleCount > 0 || counts.natRuleCount > 0 {
Text(L10n.t("Dein Router hat bereits eigene Firewall-Regeln. Die neuen Regeln werden vorangestellt, bestehende bleiben erhalten — prüfe nach dem Anwenden trotzdem die Reihenfolge, z.B. über Winbox oder \"/ip firewall filter print\".", appLanguage))
.font(.caption)
.foregroundStyle(.orange)
}
} else if let error = viewModel.firewallRuleCountsError {
Text(error).font(.caption).foregroundStyle(.red)
}
}
}
if !viewModel.isolatedNetworkNames.isEmpty {
Section(L10n.t("Isolierte Netzwerke", appLanguage)) {
Text(viewModel.isolatedNetworkNames.joined(separator: ", "))
Text(L10n.t("Diese Netzwerke werden vom Datenverkehr aller anderen konfigurierten Netzwerke abgeschottet, sobald der Firewall-Grundschutz aktiv ist.", appLanguage))
.font(.caption)
.foregroundStyle(.secondary)
}
}
Section {
HStack {
Button(L10n.t("Zurück", appLanguage)) { viewModel.goBack() }
Spacer()
Button(L10n.t("Weiter", appLanguage)) { viewModel.goNext() }
}
}
}
.formStyle(.grouped)
.navigationTitle(LocalizedStringKey(L10n.t("Firewall (optional)", appLanguage)))
.onAppear {
if viewModel.firewallSectionEnabled {
viewModel.loadExistingFirewallRuleCounts()
}
}
}
}