diff --git a/.bartycrouch.toml b/.bartycrouch.toml new file mode 100644 index 0000000..7da2af3 --- /dev/null +++ b/.bartycrouch.toml @@ -0,0 +1,23 @@ +[update] +tasks = ["code", "normalize"] + +[update.code] +codePaths = ["."] +localizablePaths = ["dns"] +defaultToKeys = true +additive = false +unstripped = false +plistArguments = false +ignoreKeys = ["#bartycrouch-ignore!", "#bc-ignore!", "#i!"] + +[update.normalize] +paths = ["dns"] +subpathsToIgnore = ["InfoPlist.strings"] +sourceLocale = "en" +harmonizeWithSource = true +sortByKeys = true + +[lint] +paths = ["dns"] +duplicateKeys = true +emptyValues = true diff --git a/dns.xcodeproj/project.pbxproj b/dns.xcodeproj/project.pbxproj index bdf3b2a..651cb4e 100644 --- a/dns.xcodeproj/project.pbxproj +++ b/dns.xcodeproj/project.pbxproj @@ -36,6 +36,7 @@ /* Begin PBXFileReference section */ 069DCCFA2F8C0DCE00F1EB16 /* dns.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = dns.app; sourceTree = BUILT_PRODUCTS_DIR; }; + A051B50B2FC9DA9100EACDC0 /* .bartycrouch.toml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .bartycrouch.toml; sourceTree = ""; }; A06A74772F8E95410093A9E4 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; A06A74782F8E95410093A9E4 /* LICENCE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENCE; sourceTree = ""; }; A06A74792F8E95410093A9E4 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; @@ -85,6 +86,7 @@ A06A74772F8E95410093A9E4 /* .gitignore */, A06A74782F8E95410093A9E4 /* LICENCE */, A06A74792F8E95410093A9E4 /* README.md */, + A051B50B2FC9DA9100EACDC0 /* .bartycrouch.toml */, 069DCCFC2F8C0DCE00F1EB16 /* dns */, A082640D2FC718790077B227 /* Stickers */, 069DCCFB2F8C0DCE00F1EB16 /* Products */, @@ -107,6 +109,7 @@ isa = PBXNativeTarget; buildConfigurationList = 069DCD052F8C0DCE00F1EB16 /* Build configuration list for PBXNativeTarget "dns" */; buildPhases = ( + A051B50A2FC9DA4300EACDC0 /* BartyCrouch */, 069DCCF62F8C0DCE00F1EB16 /* Sources */, 069DCCF72F8C0DCE00F1EB16 /* Frameworks */, 069DCCF82F8C0DCE00F1EB16 /* Resources */, @@ -155,7 +158,7 @@ attributes = { BuildIndependentTargetsInParallel = 1; LastSwiftUpdateCheck = 2640; - LastUpgradeCheck = 2640; + LastUpgradeCheck = 2650; TargetAttributes = { 069DCCF92F8C0DCE00F1EB16 = { CreatedOnToolsVersion = 26.4; @@ -171,6 +174,7 @@ knownRegions = ( en, Base, + de, ); mainGroup = 069DCCF12F8C0DCD00F1EB16; minimizedProjectReferenceProxies = 1; @@ -202,6 +206,28 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + A051B50A2FC9DA4300EACDC0 /* BartyCrouch */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = BartyCrouch; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ -f /opt/homebrew/bin/bartycrouch ]; then\n /opt/homebrew/bin/bartycrouch update -x\n /opt/homebrew/bin/bartycrouch lint -x\nelse\n echo \"warning: BartyCrouch not installed. Download it form https://github.com/Flinesoft/BartyCrouch\"\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 069DCCF62F8C0DCE00F1EB16 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -226,6 +252,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; @@ -290,6 +317,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; @@ -353,6 +381,7 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_CFBundleDisplayName = "SR2 Cloud DNS"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; @@ -392,6 +421,7 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_CFBundleDisplayName = "SR2 Cloud DNS"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; diff --git a/dns/BlockedCount.swift b/dns/BlockedCount.swift index 24df33f..892191e 100644 --- a/dns/BlockedCount.swift +++ b/dns/BlockedCount.swift @@ -63,11 +63,11 @@ struct BlockedCount: View { txtRecord = count } else { - txtRecord = "Error" + txtRecord = NSLocalizedString("Error", comment: "") } } catch { - txtRecord = "Error" + txtRecord = NSLocalizedString("Error", comment: "") } } } diff --git a/dns/BlocklistOption.swift b/dns/BlocklistOption.swift index ebef560..c67c349 100644 --- a/dns/BlocklistOption.swift +++ b/dns/BlocklistOption.swift @@ -12,7 +12,15 @@ enum BlocklistOption: String, CaseIterable, Identifiable { case secure = "Secure" case securePlusAdblock = "Secure + Adblock" - var id: String { rawValue } + var id: String { + switch self { + case .secure: + return NSLocalizedString("Secure", comment: "") + + case .securePlusAdblock: + return NSLocalizedString("Secure + Adblock", comment: "") + } + } var enabled: Bool { switch self { @@ -26,14 +34,14 @@ enum BlocklistOption: String, CaseIterable, Identifiable { var description: String { switch self { case .secure: - return "Malware and phishing protection" + return NSLocalizedString("Malware and phishing protection", comment: "") case .securePlusAdblock: - return "Security plus ad and tracker blocking" + return NSLocalizedString("Security plus ad and tracker blocking", comment: "") } } var title: String { - return String(format: "%1$@: %2$@", ViewModel.title, self.rawValue) + return String(format: "%1$@: %2$@", ViewModel.title, id) } var icon: String { diff --git a/dns/BlocklistRow.swift b/dns/BlocklistRow.swift index 8f0b64d..9cdec60 100644 --- a/dns/BlocklistRow.swift +++ b/dns/BlocklistRow.swift @@ -17,7 +17,7 @@ struct BlocklistRow: View { } VStack(alignment: .leading, spacing: 4) { - Text(option.id + " " + (option.enabled ? "" : "(Coming Soon)")) + Text(option.enabled ? option.id : String(format: NSLocalizedString("%@ (Coming Soon)", comment: ""), option.id)) .font(.body) .fontWeight(isSelected ? .semibold : .regular) diff --git a/dns/HomeView.swift b/dns/HomeView.swift index 71542f1..f9295ea 100644 --- a/dns/HomeView.swift +++ b/dns/HomeView.swift @@ -23,9 +23,9 @@ struct HomeView: View { Section { HStack { VStack(alignment: .leading, spacing: 4) { - Text("DNS Protection") + Text(NSLocalizedString("DNS Protection", comment: "")) .font(.headline) - Text(viewModel.isDnsEnabled ? "Active" : "Inactive") + Text(viewModel.isDnsEnabled ? NSLocalizedString("Active", comment: "") : NSLocalizedString("Inactive", comment: "")) .font(.caption) .foregroundStyle(viewModel.isDnsEnabled ? .green : .secondary) } @@ -82,24 +82,24 @@ struct HomeView: View { .opacity(option.enabled ? 1 : 0.6) } } header: { - Text("Blocklist") + Text(NSLocalizedString("Blocklist", comment: "")) } footer: { - Text("Select the level of protection for your DNS queries") + Text(NSLocalizedString("Select the level of protection for your DNS queries", comment: "")) } // Status section if viewModel.isDnsEnabled { Section { HStack { - Label("Status", systemImage: "checkmark.circle.fill") + Label(NSLocalizedString("Status", comment: ""), systemImage: "checkmark.circle.fill") .foregroundStyle(.green) Spacer() - Text("Connected") + Text(NSLocalizedString("Connected", comment: "")) .foregroundStyle(.secondary) } HStack { - Label("Server", systemImage: "server.rack") + Label(NSLocalizedString("Server", comment: ""), systemImage: "server.rack") Spacer() Text(viewModel.blocklist.server) .foregroundStyle(.secondary) @@ -123,13 +123,13 @@ struct HomeView: View { } HStack { - Label("Domains in blocklist", systemImage: "xmark.shield.fill") + Label(NSLocalizedString("Domains in blocklist", comment: ""), systemImage: "xmark.shield.fill") Spacer() BlockedCount() .foregroundStyle(.secondary) } } header: { - Text("Connection Details") + Text(NSLocalizedString("Connection Details", comment: "")) } } @@ -138,7 +138,7 @@ struct HomeView: View { Link(destination: falsePositiveURL) { HStack { Label { - Text("Report False Positive") + Text(NSLocalizedString("Report False Positive", comment: "")) } icon: { Image(systemName: "exclamationmark.bubble") .foregroundStyle(.orange) @@ -152,7 +152,7 @@ struct HomeView: View { } }.foregroundStyle(.primary) } footer: { - Text("Submit incorrectly blocked domains for review") + Text(NSLocalizedString("Submit incorrectly blocked domains for review", comment: "")) } // Service status section @@ -164,7 +164,7 @@ struct HomeView: View { .frame(width: 12, height: 12) VStack(alignment: .leading, spacing: 4) { - Text("Service Status") + Text(NSLocalizedString("Service Status", comment: "")) .font(.headline) Text(viewModel.summaryStatus.description) .font(.caption) @@ -183,7 +183,7 @@ struct HomeView: View { Link(destination: tosURL) { HStack(spacing: 12) { Image(systemName: "doc.text") - Text("Terms of Service") + Text(NSLocalizedString("Terms of Service", comment: "")) Spacer() Image(systemName: "arrow.up.right.square") .font(.caption) @@ -195,7 +195,7 @@ struct HomeView: View { Link(destination: privacyPolicyURL) { HStack(spacing: 12) { Image(systemName: "doc.text") - Text("Privacy Policy") + Text(NSLocalizedString("Privacy Policy", comment: "")) Spacer() Image(systemName: "arrow.up.right.square") .font(.caption) @@ -207,7 +207,7 @@ struct HomeView: View { } .navigationTitle(ViewModel.title) .animation(.default, value: viewModel.isDnsEnabled) - .onChange(of: scenePhase) { _, newPhase in + .onChange(of: scenePhase) { newPhase in if newPhase == .active { Task { await viewModel.refreshConfig() diff --git a/dns/Localizable.xcstrings b/dns/Localizable.xcstrings deleted file mode 100644 index aeb6242..0000000 --- a/dns/Localizable.xcstrings +++ /dev/null @@ -1,263 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "" : { - - }, - "(Coming Soon)" : { - "comment" : "Indicates that this feature is not yet implemented but will be soon", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "(Coming Soon)" - } - } - } - }, - "Active" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Active" - } - } - } - }, - "Blocklist" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Blocklist" - } - } - } - }, - "Connected" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connected" - } - } - } - }, - "Connection Details" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connection Details" - } - } - } - }, - "DNS Protection" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "DNS Protection" - } - } - } - }, - "Domains in blocklist" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Domains in blocklist" - } - } - } - }, - "Inactive" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inactive" - } - } - } - }, - "IPv4" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "IPv4" - } - } - } - }, - "IPv6" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "IPv6" - } - } - } - }, - "Malware and phishing protection" : { - "comment" : "Description of the blocklist contents", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Malware and phishing protection" - } - } - } - }, - "No issues detected" : { - "comment" : "No current issues detected with the service", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No issues detected" - } - } - } - }, - "Privacy Policy" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Privacy Policy" - } - } - } - }, - "Report False Positive" : { - "comment" : "Link to report that a domain name has been incorrectly blocked", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Report False Positive" - } - } - } - }, - "Secure" : { - "comment" : "Name of the blocklist that only includes malware and security threats", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Secure" - } - } - } - }, - "Secure + Adblock" : { - "comment" : "Name of the blocklist that contains “Secure” plus ad blocking", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Secure + Adblock" - } - } - } - }, - "Security plus ad and tracker blocking" : { - "comment" : "Description of the blocklist contents", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Security plus ad and tracker blocking" - } - } - } - }, - "Select the level of protection for your DNS queries" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select the level of protection for your DNS queries" - } - } - } - }, - "Server" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Server" - } - } - } - }, - "Service Status" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Service Status" - } - } - } - }, - "SR2® Cloud DNS" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "SR2® Cloud DNS" - } - } - } - }, - "Status" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status" - } - } - } - }, - "Submit incorrectly blocked domains for review" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Submit incorrectly blocked domains for review" - } - } - } - }, - "Terms of Service" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Terms of Service" - } - } - } - } - }, - "version" : "1.2" -} \ No newline at end of file diff --git a/dns/Localizations/ar.xcloc/Localized Contents/ar.xliff b/dns/Localizations/ar.xcloc/Localized Contents/ar.xliff deleted file mode 100644 index 93abab9..0000000 --- a/dns/Localizations/ar.xcloc/Localized Contents/ar.xliff +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/dns/Localizations/en.xcloc/Localized Contents/en.xliff b/dns/Localizations/en.xcloc/Localized Contents/en.xliff deleted file mode 100644 index ad7a3b4..0000000 --- a/dns/Localizations/en.xcloc/Localized Contents/en.xliff +++ /dev/null @@ -1,147 +0,0 @@ - - - -
- -
- - - dns - dns - Bundle name - - -
- -
- -
- - - - - - - - (Coming Soon) - (Coming Soon) - Indicates that this feature is not yet implemented but will be soon - - - Active - Active - - - - Blocklist - Blocklist - - - - Connected - Connected - - - - Connection Details - Connection Details - - - - DNS Protection - DNS Protection - - - - Domains in blocklist - Domains in blocklist - - - - IPv4 - IPv4 - - - - IPv6 - IPv6 - - - - Inactive - Inactive - - - - Malware and phishing protection - Malware and phishing protection - Description of the blocklist contents - - - No issues detected - No issues detected - No current issues detected with the service - - - Privacy Policy - Privacy Policy - - - - Report False Positive - Report False Positive - Link to report that a domain name has been incorrectly blocked - - - SR2® Cloud DNS - SR2® Cloud DNS - - - - Secure - Secure - Name of the blocklist that only includes malware and security threats - - - Secure + Adblock - Secure + Adblock - Name of the blocklist that contains “Secure” plus ad blocking - - - Security plus ad and tracker blocking - Security plus ad and tracker blocking - Description of the blocklist contents - - - Select the level of protection for your DNS queries - Select the level of protection for your DNS queries - - - - Server - Server - - - - Service Status - Service Status - - - - Status - Status - - - - Submit incorrectly blocked domains for review - Submit incorrectly blocked domains for review - - - - Terms of Service - Terms of Service - - - -
-
diff --git a/dns/Localizations/en.xcloc/Source Contents/dns/Localizable.xcstrings b/dns/Localizations/en.xcloc/Source Contents/dns/Localizable.xcstrings deleted file mode 100644 index aeb6242..0000000 --- a/dns/Localizations/en.xcloc/Source Contents/dns/Localizable.xcstrings +++ /dev/null @@ -1,263 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "" : { - - }, - "(Coming Soon)" : { - "comment" : "Indicates that this feature is not yet implemented but will be soon", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "(Coming Soon)" - } - } - } - }, - "Active" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Active" - } - } - } - }, - "Blocklist" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Blocklist" - } - } - } - }, - "Connected" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connected" - } - } - } - }, - "Connection Details" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connection Details" - } - } - } - }, - "DNS Protection" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "DNS Protection" - } - } - } - }, - "Domains in blocklist" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Domains in blocklist" - } - } - } - }, - "Inactive" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inactive" - } - } - } - }, - "IPv4" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "IPv4" - } - } - } - }, - "IPv6" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "IPv6" - } - } - } - }, - "Malware and phishing protection" : { - "comment" : "Description of the blocklist contents", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Malware and phishing protection" - } - } - } - }, - "No issues detected" : { - "comment" : "No current issues detected with the service", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No issues detected" - } - } - } - }, - "Privacy Policy" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Privacy Policy" - } - } - } - }, - "Report False Positive" : { - "comment" : "Link to report that a domain name has been incorrectly blocked", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Report False Positive" - } - } - } - }, - "Secure" : { - "comment" : "Name of the blocklist that only includes malware and security threats", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Secure" - } - } - } - }, - "Secure + Adblock" : { - "comment" : "Name of the blocklist that contains “Secure” plus ad blocking", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Secure + Adblock" - } - } - } - }, - "Security plus ad and tracker blocking" : { - "comment" : "Description of the blocklist contents", - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Security plus ad and tracker blocking" - } - } - } - }, - "Select the level of protection for your DNS queries" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select the level of protection for your DNS queries" - } - } - } - }, - "Server" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Server" - } - } - } - }, - "Service Status" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Service Status" - } - } - } - }, - "SR2® Cloud DNS" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "SR2® Cloud DNS" - } - } - } - }, - "Status" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status" - } - } - } - }, - "Submit incorrectly blocked domains for review" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Submit incorrectly blocked domains for review" - } - } - } - }, - "Terms of Service" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Terms of Service" - } - } - } - } - }, - "version" : "1.2" -} \ No newline at end of file diff --git a/dns/Localizations/en.xcloc/Source Contents/dns/dns-InfoPlist.xcstrings b/dns/Localizations/en.xcloc/Source Contents/dns/dns-InfoPlist.xcstrings deleted file mode 100644 index a3786f7..0000000 --- a/dns/Localizations/en.xcloc/Source Contents/dns/dns-InfoPlist.xcstrings +++ /dev/null @@ -1,18 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "CFBundleName" : { - "comment" : "Bundle name", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "dns" - } - } - } - } - }, - "version" : "1.2" -} \ No newline at end of file diff --git a/dns/Localizations/en.xcloc/contents.json b/dns/Localizations/en.xcloc/contents.json deleted file mode 100644 index 2423001..0000000 --- a/dns/Localizations/en.xcloc/contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "developmentRegion" : "en", - "project" : "dns.xcodeproj", - "targetLocale" : "en", - "toolInfo" : { - "toolBuildNumber" : "17E192", - "toolID" : "com.apple.dt.xcode", - "toolName" : "Xcode", - "toolVersion" : "26.4" - }, - "version" : "1.0" -} \ No newline at end of file diff --git a/dns/Localizations/fa.xcloc/Localized Contents/fa.xliff b/dns/Localizations/fa.xcloc/Localized Contents/fa.xliff deleted file mode 100644 index 93abab9..0000000 --- a/dns/Localizations/fa.xcloc/Localized Contents/fa.xliff +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/dns/Localizations/fr.xcloc/Localized Contents/fr.xliff b/dns/Localizations/fr.xcloc/Localized Contents/fr.xliff deleted file mode 100644 index 93abab9..0000000 --- a/dns/Localizations/fr.xcloc/Localized Contents/fr.xliff +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/dns/Localizations/prs.xcloc/Localized Contents/prs.xliff b/dns/Localizations/prs.xcloc/Localized Contents/prs.xliff deleted file mode 100644 index 93abab9..0000000 --- a/dns/Localizations/prs.xcloc/Localized Contents/prs.xliff +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/dns/Localizations/ps.xcloc/Localized Contents/ps.xliff b/dns/Localizations/ps.xcloc/Localized Contents/ps.xliff deleted file mode 100644 index 93abab9..0000000 --- a/dns/Localizations/ps.xcloc/Localized Contents/ps.xliff +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/dns/Localizations/ro.xcloc/Localized Contents/ro.xliff b/dns/Localizations/ro.xcloc/Localized Contents/ro.xliff deleted file mode 100644 index 93abab9..0000000 --- a/dns/Localizations/ro.xcloc/Localized Contents/ro.xliff +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/dns/Localizations/ru.xcloc/Localized Contents/ru.xliff b/dns/Localizations/ru.xcloc/Localized Contents/ru.xliff deleted file mode 100644 index 93abab9..0000000 --- a/dns/Localizations/ru.xcloc/Localized Contents/ru.xliff +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/dns/Localizations/tok.xcloc/Localized Contents/tok.xliff b/dns/Localizations/tok.xcloc/Localized Contents/tok.xliff deleted file mode 100644 index 93abab9..0000000 --- a/dns/Localizations/tok.xcloc/Localized Contents/tok.xliff +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/dns/SummaryStatus.swift b/dns/SummaryStatus.swift index 971ba0e..5cdc15f 100644 --- a/dns/SummaryStatus.swift +++ b/dns/SummaryStatus.swift @@ -23,19 +23,19 @@ enum SummaryStatus: String, Codable, CustomStringConvertible { var description: String { switch self { case .pending: - return "Fetching service status" + return NSLocalizedString("Fetching service status", comment: "") case .ok: - return "No issues detected" + return NSLocalizedString("No issues detected", comment: "") case .notice: - return "In maintenance" + return NSLocalizedString("In maintenance", comment: "") case .disrupted: - return "Service disruption" + return NSLocalizedString("Service disruption", comment: "") case .down: - return "Service down" + return NSLocalizedString("Service down", comment: "") } } diff --git a/dns/de.lproj/Localizable.strings b/dns/de.lproj/Localizable.strings new file mode 100644 index 0000000..01a3d6e --- /dev/null +++ b/dns/de.lproj/Localizable.strings @@ -0,0 +1,98 @@ +/* No comment provided by engineer. */ +"%1$@ DNS" = "%1$@ DNS"; + +/* No comment provided by engineer. */ +"%1$@ Go to General" = "%1$@ Gehe zu Allgemein"; + +/* No comment provided by engineer. */ +"%1$@ Select \"%2$@\"" = "%1$@ Wähle \"%2$@\""; + +/* No comment provided by engineer. */ +"%1$@ Tap \"%2$@\"" = "%1$@ Tippe auf \"%2$@\""; + +/* No comment provided by engineer. */ +"%1$@ VPN & Network" = "%1$@ VPN und Geräteverwaltung"; + +/* No comment provided by engineer. */ +"%@ (Coming Soon)" = "%@ (bald)"; + +/* No comment provided by engineer. */ +"Active" = "Aktiv"; + +/* No comment provided by engineer. */ +"Blocklist" = "Sperrliste"; + +/* No comment provided by engineer. */ +"Connected" = "Verbunden"; + +/* No comment provided by engineer. */ +"Connection Details" = "Verbindungsdetails"; + +/* No comment provided by engineer. */ +"DNS Protection" = "DNS–Schutz"; + +/* No comment provided by engineer. */ +"Domains in blocklist" = "Domains in Sperrliste"; + +/* No comment provided by engineer. */ +"Error" = "Fehler"; + +/* No comment provided by engineer. */ +"Fetching service status" = "Servicestatus ermitteln"; + +/* No comment provided by engineer. */ +"In maintenance" = "Wartung"; + +/* No comment provided by engineer. */ +"Inactive" = "Inaktiv"; + +/* No comment provided by engineer. */ +"Malware and phishing protection" = "Malware- und Phishingschutz"; + +/* No comment provided by engineer. */ +"No issues detected" = "Keine Probleme erkannt"; + +/* No comment provided by engineer. */ +"Open Settings" = "Öffne Einstellungen"; + +/* No comment provided by engineer. */ +"Privacy Policy" = "Datenschutzerklärung"; + +/* No comment provided by engineer. */ +"Report False Positive" = "Berichte über falsch-positive Sperre"; + +/* No comment provided by engineer. */ +"Secure" = "Sicherheit"; + +/* No comment provided by engineer. */ +"Secure + Adblock" = "Sicherheit + Werbeblocker"; + +/* No comment provided by engineer. */ +"Security plus ad and tracker blocking" = "Sicherheit und Werbe- und Trackerschutz"; + +/* No comment provided by engineer. */ +"Select the level of protection for your DNS queries" = "Wähle das Schutzniveau für Deine DNS-Anfragen"; + +/* No comment provided by engineer. */ +"Server" = "Server"; + +/* No comment provided by engineer. */ +"Service disruption" = "Serviceunterbrechung"; + +/* No comment provided by engineer. */ +"Service down" = "Service unerreichbar"; + +/* No comment provided by engineer. */ +"Service Status" = "Servicestatus"; + +/* No comment provided by engineer. */ +"Status" = "Status"; + +/* No comment provided by engineer. */ +"Submit incorrectly blocked domains for review" = "Falsch blockierte Domains zur Überprüfung einreichen"; + +/* No comment provided by engineer. */ +"Terms of Service" = "Geschäftsbedingungen"; + +/* No comment provided by engineer. */ +"To enable %@:" = "Um %@ zu aktivieren:"; diff --git a/dns/en.lproj/Localizable.strings b/dns/en.lproj/Localizable.strings new file mode 100644 index 0000000..69eebe5 --- /dev/null +++ b/dns/en.lproj/Localizable.strings @@ -0,0 +1,98 @@ +/* No comment provided by engineer. */ +"%1$@ DNS" = "%1$@ DNS"; + +/* No comment provided by engineer. */ +"%1$@ Go to General" = "%1$@ Go to General"; + +/* No comment provided by engineer. */ +"%1$@ Select \"%2$@\"" = "%1$@ Select \"%2$@\""; + +/* No comment provided by engineer. */ +"%1$@ Tap \"%2$@\"" = "%1$@ Tap \"%2$@\""; + +/* No comment provided by engineer. */ +"%1$@ VPN & Network" = "%1$@ VPN & Network"; + +/* No comment provided by engineer. */ +"%@ (Coming Soon)" = "%@ (Coming Soon)"; + +/* No comment provided by engineer. */ +"Active" = "Active"; + +/* No comment provided by engineer. */ +"Blocklist" = "Blocklist"; + +/* No comment provided by engineer. */ +"Connected" = "Connected"; + +/* No comment provided by engineer. */ +"Connection Details" = "Connection Details"; + +/* No comment provided by engineer. */ +"DNS Protection" = "DNS Protection"; + +/* No comment provided by engineer. */ +"Domains in blocklist" = "Domains in blocklist"; + +/* No comment provided by engineer. */ +"Error" = "Error"; + +/* No comment provided by engineer. */ +"Fetching service status" = "Fetching service status"; + +/* No comment provided by engineer. */ +"In maintenance" = "In maintenance"; + +/* No comment provided by engineer. */ +"Inactive" = "Inactive"; + +/* No comment provided by engineer. */ +"Malware and phishing protection" = "Malware and phishing protection"; + +/* No comment provided by engineer. */ +"No issues detected" = "No issues detected"; + +/* No comment provided by engineer. */ +"Open Settings" = "Open Settings"; + +/* No comment provided by engineer. */ +"Privacy Policy" = "Privacy Policy"; + +/* No comment provided by engineer. */ +"Report False Positive" = "Report False Positive"; + +/* No comment provided by engineer. */ +"Secure" = "Secure"; + +/* No comment provided by engineer. */ +"Secure + Adblock" = "Secure + Adblock"; + +/* No comment provided by engineer. */ +"Security plus ad and tracker blocking" = "Security plus ad and tracker blocking"; + +/* No comment provided by engineer. */ +"Select the level of protection for your DNS queries" = "Select the level of protection for your DNS queries"; + +/* No comment provided by engineer. */ +"Server" = "Server"; + +/* No comment provided by engineer. */ +"Service disruption" = "Service disruption"; + +/* No comment provided by engineer. */ +"Service down" = "Service down"; + +/* No comment provided by engineer. */ +"Service Status" = "Service Status"; + +/* No comment provided by engineer. */ +"Status" = "Status"; + +/* No comment provided by engineer. */ +"Submit incorrectly blocked domains for review" = "Submit incorrectly blocked domains for review"; + +/* No comment provided by engineer. */ +"Terms of Service" = "Terms of Service"; + +/* No comment provided by engineer. */ +"To enable %@:" = "To enable %@:";