Explorar o código

Merge branch 'dev' of github.com:nightscout/Trio-dev into trio-dev-translations

Deniz Cengiz hai 1 ano
pai
achega
272eb70c61

+ 0 - 4
Trio.xcodeproj/project.pbxproj

@@ -610,7 +610,6 @@
 		DDA9AC092D672CF100E6F1A9 /* AppVersionChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA9AC082D672CEB00E6F1A9 /* AppVersionChecker.swift */; };
 		DDA9AC092D672CF100E6F1A9 /* AppVersionChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA9AC082D672CEB00E6F1A9 /* AppVersionChecker.swift */; };
 		DDAA29832D2D1D93006546A1 /* AdjustmentsRootView+Overrides.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA29822D2D1D7B006546A1 /* AdjustmentsRootView+Overrides.swift */; };
 		DDAA29832D2D1D93006546A1 /* AdjustmentsRootView+Overrides.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA29822D2D1D7B006546A1 /* AdjustmentsRootView+Overrides.swift */; };
 		DDAA29852D2D1D9E006546A1 /* AdjustmentsRootView+TempTargets.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA29842D2D1D98006546A1 /* AdjustmentsRootView+TempTargets.swift */; };
 		DDAA29852D2D1D9E006546A1 /* AdjustmentsRootView+TempTargets.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAA29842D2D1D98006546A1 /* AdjustmentsRootView+TempTargets.swift */; };
-		DDB0E3712DB087B6004B826F /* PrivacyPolicyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB0E3702DB087B6004B826F /* PrivacyPolicyView.swift */; };
 		DDB0E3742DB1BAC1004B826F /* LogoBurstSplash.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB0E3732DB1BAC1004B826F /* LogoBurstSplash.swift */; };
 		DDB0E3742DB1BAC1004B826F /* LogoBurstSplash.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB0E3732DB1BAC1004B826F /* LogoBurstSplash.swift */; };
 		DDB37CC52D05048F00D99BF4 /* ContactImageStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB37CC42D05048F00D99BF4 /* ContactImageStorage.swift */; };
 		DDB37CC52D05048F00D99BF4 /* ContactImageStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB37CC42D05048F00D99BF4 /* ContactImageStorage.swift */; };
 		DDB37CC72D05127500D99BF4 /* FontExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB37CC62D05127500D99BF4 /* FontExtensions.swift */; };
 		DDB37CC72D05127500D99BF4 /* FontExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB37CC62D05127500D99BF4 /* FontExtensions.swift */; };
@@ -1424,7 +1423,6 @@
 		DDA9AC0A2D678DAD00E6F1A9 /* blacklisted-versions.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blacklisted-versions.json"; sourceTree = "<group>"; };
 		DDA9AC0A2D678DAD00E6F1A9 /* blacklisted-versions.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blacklisted-versions.json"; sourceTree = "<group>"; };
 		DDAA29822D2D1D7B006546A1 /* AdjustmentsRootView+Overrides.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AdjustmentsRootView+Overrides.swift"; sourceTree = "<group>"; };
 		DDAA29822D2D1D7B006546A1 /* AdjustmentsRootView+Overrides.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AdjustmentsRootView+Overrides.swift"; sourceTree = "<group>"; };
 		DDAA29842D2D1D98006546A1 /* AdjustmentsRootView+TempTargets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AdjustmentsRootView+TempTargets.swift"; sourceTree = "<group>"; };
 		DDAA29842D2D1D98006546A1 /* AdjustmentsRootView+TempTargets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AdjustmentsRootView+TempTargets.swift"; sourceTree = "<group>"; };
-		DDB0E3702DB087B6004B826F /* PrivacyPolicyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyPolicyView.swift; sourceTree = "<group>"; };
 		DDB0E3732DB1BAC1004B826F /* LogoBurstSplash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogoBurstSplash.swift; sourceTree = "<group>"; };
 		DDB0E3732DB1BAC1004B826F /* LogoBurstSplash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogoBurstSplash.swift; sourceTree = "<group>"; };
 		DDB37CC22D05044D00D99BF4 /* ContactTrickEntryStored+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ContactTrickEntryStored+CoreDataClass.swift"; sourceTree = "<group>"; };
 		DDB37CC22D05044D00D99BF4 /* ContactTrickEntryStored+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ContactTrickEntryStored+CoreDataClass.swift"; sourceTree = "<group>"; };
 		DDB37CC32D05044D00D99BF4 /* ContactTrickEntryStored+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ContactTrickEntryStored+CoreDataProperties.swift"; sourceTree = "<group>"; };
 		DDB37CC32D05044D00D99BF4 /* ContactTrickEntryStored+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ContactTrickEntryStored+CoreDataProperties.swift"; sourceTree = "<group>"; };
@@ -3545,7 +3543,6 @@
 		DDF690FF2DA2CA03008BF16C /* View */ = {
 		DDF690FF2DA2CA03008BF16C /* View */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				DDB0E3702DB087B6004B826F /* PrivacyPolicyView.swift */,
 				DDF691062DA2CA28008BF16C /* AppDiagnosticsRootView.swift */,
 				DDF691062DA2CA28008BF16C /* AppDiagnosticsRootView.swift */,
 			);
 			);
 			path = View;
 			path = View;
@@ -4096,7 +4093,6 @@
 				38B4F3CD25E5031100E76A18 /* Broadcaster.swift in Sources */,
 				38B4F3CD25E5031100E76A18 /* Broadcaster.swift in Sources */,
 				383420D925FFEB3F002D46C1 /* Popup.swift in Sources */,
 				383420D925FFEB3F002D46C1 /* Popup.swift in Sources */,
 				DD4C57AA2D73B3E2001BFF2C /* RestartLiveActivityIntentRequest.swift in Sources */,
 				DD4C57AA2D73B3E2001BFF2C /* RestartLiveActivityIntentRequest.swift in Sources */,
-				DDB0E3712DB087B6004B826F /* PrivacyPolicyView.swift in Sources */,
 				DD1745402C55BFC100211FAC /* AlgorithmAdvancedSettingsRootView.swift in Sources */,
 				DD1745402C55BFC100211FAC /* AlgorithmAdvancedSettingsRootView.swift in Sources */,
 				58645BA52CA2D347008AFCE7 /* ForecastSetup.swift in Sources */,
 				58645BA52CA2D347008AFCE7 /* ForecastSetup.swift in Sources */,
 				110AEDEE2C51A0AE00615CC9 /* ShortcutsConfigStateModel.swift in Sources */,
 				110AEDEE2C51A0AE00615CC9 /* ShortcutsConfigStateModel.swift in Sources */,

+ 51 - 0
Trio/Sources/Localizations/Main/Localizable.xcstrings

@@ -19067,6 +19067,7 @@
       }
       }
     },
     },
     "A generated unique identifier (a random code like \"A7B2C9D3\" that doesn't identify you personally)" : {
     "A generated unique identifier (a random code like \"A7B2C9D3\" that doesn't identify you personally)" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -34990,6 +34991,7 @@
       }
       }
     },
     },
     "Any health-related statistics or personal medical information" : {
     "Any health-related statistics or personal medical information" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -36792,6 +36794,7 @@
       }
       }
     },
     },
     "April 15, 2025" : {
     "April 15, 2025" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -37513,6 +37516,7 @@
       }
       }
     },
     },
     "As an open source project, crash reports and debugging information may be visible to project contributors who help maintain and improve Trio. All contributors are expected to adhere to this privacy policy and handle any data responsibly." : {
     "As an open source project, crash reports and debugging information may be visible to project contributors who help maintain and improve Trio. All contributors are expected to adhere to this privacy policy and handle any data responsibly." : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -43522,6 +43526,7 @@
       }
       }
     },
     },
     "Blood glucose (BG) readings" : {
     "Blood glucose (BG) readings" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -53045,6 +53050,7 @@
       }
       }
     },
     },
     "Changes to This Privacy Policy" : {
     "Changes to This Privacy Policy" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -59136,6 +59142,7 @@
       }
       }
     },
     },
     "Contact Us" : {
     "Contact Us" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -60153,6 +60160,7 @@
       }
       }
     },
     },
     "Crash Reporting (Opt-In by default, with ability to Opt-Out)" : {
     "Crash Reporting (Opt-In by default, with ability to Opt-Out)" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -60253,6 +60261,7 @@
       }
       }
     },
     },
     "Crashlytics" : {
     "Crashlytics" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -62808,6 +62817,7 @@
       }
       }
     },
     },
     "Data Sharing and Third-Party Services" : {
     "Data Sharing and Third-Party Services" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -63745,6 +63755,7 @@
       }
       }
     },
     },
     "Debug Symbols (dSYMs)" : {
     "Debug Symbols (dSYMs)" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -72510,6 +72521,7 @@
       }
       }
     },
     },
     "Device model and OS version (example: \"iPhone 14 Pro running iOS 17.4.1\")" : {
     "Device model and OS version (example: \"iPhone 14 Pro running iOS 17.4.1\")" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -72610,6 +72622,7 @@
       }
       }
     },
     },
     "Device state at the time of the crash (example: \"Trio was in the foreground\" or \"Battery level was 42%\")" : {
     "Device state at the time of the crash (example: \"Trio was in the foreground\" or \"Battery level was 42%\")" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -80479,6 +80492,7 @@
       }
       }
     },
     },
     "Email us" : {
     "Email us" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -94918,6 +94932,7 @@
       }
       }
     },
     },
     "For complete transparency, we want to clarify that Trio does not collect:" : {
     "For complete transparency, we want to clarify that Trio does not collect:" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -101833,6 +101848,7 @@
       }
       }
     },
     },
     "Google Privacy Policy" : {
     "Google Privacy Policy" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -106963,6 +106979,7 @@
       }
       }
     },
     },
     "How We Use Your Information" : {
     "How We Use Your Information" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -107464,6 +107481,7 @@
       }
       }
     },
     },
     "Identify and fix bugs and crashes" : {
     "Identify and fix bugs and crashes" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -109282,6 +109300,7 @@
       }
       }
     },
     },
     "If you have any questions about this Privacy Policy, please contact us on Discord, or send us an email." : {
     "If you have any questions about this Privacy Policy, please contact us on Discord, or send us an email." : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -111225,6 +111244,7 @@
       }
       }
     },
     },
     "Improve Trio's stability" : {
     "Improve Trio's stability" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -112849,6 +112869,7 @@
       }
       }
     },
     },
     "Information We Collect" : {
     "Information We Collect" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -114703,6 +114724,7 @@
       }
       }
     },
     },
     "Introduction" : {
     "Introduction" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -118165,6 +118187,7 @@
       }
       }
     },
     },
     "Last Updated:" : {
     "Last Updated:" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -139780,6 +139803,7 @@
       }
       }
     },
     },
     "No new crash data will be collected or sent to us" : {
     "No new crash data will be collected or sent to us" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -148319,6 +148343,7 @@
       }
       }
     },
     },
     "Open Source Contributors" : {
     "Open Source Contributors" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -148848,6 +148873,7 @@
       }
       }
     },
     },
     "Opting Out and Data Retention" : {
     "Opting Out and Data Retention" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -153470,6 +153496,7 @@
       }
       }
     },
     },
     "Personal identifiable information such as name, address, or email" : {
     "Personal identifiable information such as name, address, or email" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -155831,6 +155858,7 @@
       }
       }
     },
     },
     "Previously collected crash data will still be retained for approximately 90 days" : {
     "Previously collected crash data will still be retained for approximately 90 days" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -180492,6 +180520,7 @@
       }
       }
     },
     },
     "Stack trace information (technical information showing which line of code failed)" : {
     "Stack trace information (technical information showing which line of code failed)" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -191973,6 +192002,7 @@
       }
       }
     },
     },
     "The following information may be sent to Crashlytics when Trio crashes:" : {
     "The following information may be sent to Crashlytics when Trio crashes:" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -192473,6 +192503,7 @@
       }
       }
     },
     },
     "The information we store is anonymous, so we are unable to look up information for a particular individual. However, our general data retention policy ensures that data older than 90 days is deleted, enabling us to accommodate data deletion requests by design despite having anonymous data." : {
     "The information we store is anonymous, so we are unable to look up information for a particular individual. However, our general data retention policy ensures that data older than 90 days is deleted, enabling us to accommodate data deletion requests by design despite having anonymous data." : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -193681,6 +193712,7 @@
       }
       }
     },
     },
     "The right to opt-out of crash reporting" : {
     "The right to opt-out of crash reporting" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -193781,6 +193813,7 @@
       }
       }
     },
     },
     "The right to request deletion of your data" : {
     "The right to request deletion of your data" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -195389,6 +195422,7 @@
       }
       }
     },
     },
     "These files only contain code-related information that helps us understand where crashes happen. They contain no personal information about you or how you use Trio." : {
     "These files only contain code-related information that helps us understand where crashes happen. They contain no personal information about you or how you use Trio." : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -200192,6 +200226,7 @@
       }
       }
     },
     },
     "This Privacy Policy explains how we collect, use, and share information when you use Trio. We respect your privacy and are committed to protecting your personal data. Please read this Privacy Policy carefully to understand our practices regarding your personal data." : {
     "This Privacy Policy explains how we collect, use, and share information when you use Trio. We respect your privacy and are committed to protecting your personal data. Please read this Privacy Policy carefully to understand our practices regarding your personal data." : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -202422,6 +202457,7 @@
       }
       }
     },
     },
     "Time and date of the crash (example: \"Trio crashed on April 6, 2025 at 2:15 PM\")" : {
     "Time and date of the crash (example: \"Trio crashed on April 6, 2025 at 2:15 PM\")" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -204330,6 +204366,7 @@
       }
       }
     },
     },
     "To avoid sending dSYMs to Crashlytics, you can delete the Trio target Build Phase script, titled \"Copy dSYMs to Crashlytics\"." : {
     "To avoid sending dSYMs to Crashlytics, you can delete the Trio target Build Phase script, titled \"Copy dSYMs to Crashlytics\"." : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -205330,6 +205367,7 @@
       }
       }
     },
     },
     "To opt-out of crash reporting, please see the section above for details about how to configure Trio to not record crash reports." : {
     "To opt-out of crash reporting, please see the section above for details about how to configure Trio to not record crash reports." : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -206447,6 +206485,7 @@
       }
       }
     },
     },
     "Total daily doses (TDD)" : {
     "Total daily doses (TDD)" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -207585,6 +207624,7 @@
       }
       }
     },
     },
     "Treatment data" : {
     "Treatment data" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -211493,6 +211533,7 @@
       }
       }
     },
     },
     "Trio uses Google Firebase Crashlytics to collect crash reports. During the initial app setup (onboarding process), you will be asked to opt in to crash reporting. The onboarding process is the series of screens you see when first launching Trio that helps you set up the app." : {
     "Trio uses Google Firebase Crashlytics to collect crash reports. During the initial app setup (onboarding process), you will be asked to opt in to crash reporting. The onboarding process is the series of screens you see when first launching Trio that helps you set up the app." : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -221470,6 +221511,7 @@
       }
       }
     },
     },
     "We do not use this information for any other purpose, such as analytics, marketing, or user profiling." : {
     "We do not use this information for any other purpose, such as analytics, marketing, or user profiling." : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -221570,6 +221612,7 @@
       }
       }
     },
     },
     "We may update this Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page and updating the \"Last Updated\" date." : {
     "We may update this Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page and updating the \"Last Updated\" date." : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -221870,6 +221913,7 @@
       }
       }
     },
     },
     "We use anonymous crash report information exclusively to:" : {
     "We use anonymous crash report information exclusively to:" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -221970,6 +222014,7 @@
       }
       }
     },
     },
     "We use Google Firebase Crashlytics to collect and analyze crash reports. Crashlytics' privacy practices are governed by the Google Privacy Policy. For more information about how Crashlytics processes data, please visit their documentation." : {
     "We use Google Firebase Crashlytics to collect and analyze crash reports. Crashlytics' privacy practices are governed by the Google Privacy Policy. For more information about how Crashlytics processes data, please visit their documentation." : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -222985,6 +223030,7 @@
       }
       }
     },
     },
     "What We Do NOT Collect" : {
     "What We Do NOT Collect" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -224805,6 +224851,7 @@
       }
       }
     },
     },
     "When we build the Trio app, we create special files called debug symbols (dSYMs) that help us read crash reports. Think of these like a decoder ring for crashes:" : {
     "When we build the Trio app, we create special files called debug symbols (dSYMs) that help us read crash reports. Think of these like a decoder ring for crashes:" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -226236,6 +226283,7 @@
       }
       }
     },
     },
     "Without dSYMs, a crash might look like: \"Error at memory address 0x1234ABCD\". With dSYMs, we can see: \"Error in function 'calculateInsulin' at line 157\"" : {
     "Without dSYMs, a crash might look like: \"Error at memory address 0x1234ABCD\". With dSYMs, we can see: \"Error in function 'calculateInsulin' at line 157\"" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -227144,6 +227192,7 @@
       }
       }
     },
     },
     "You can opt out of crash reporting at any time through the Trio settings. If you opt out:" : {
     "You can opt out of crash reporting at any time through the Trio settings. If you opt out:" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -227544,6 +227593,7 @@
       }
       }
     },
     },
     "You have certain rights regarding your information, including:" : {
     "You have certain rights regarding your information, including:" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {
@@ -229167,6 +229217,7 @@
       }
       }
     },
     },
     "Your Rights" : {
     "Your Rights" : {
+      "extractionState" : "stale",
       "localizations" : {
       "localizations" : {
         "bg" : {
         "bg" : {
           "stringUnit" : {
           "stringUnit" : {

+ 6 - 6
Trio/Sources/Modules/AppDiagnostics/View/AppDiagnosticsRootView.swift

@@ -9,8 +9,7 @@ extension AppDiagnostics {
 
 
         @Environment(\.colorScheme) var colorScheme
         @Environment(\.colorScheme) var colorScheme
         @Environment(AppState.self) var appState
         @Environment(AppState.self) var appState
-
-        @State private var shouldDisplayPrivacyPolicy: Bool = false
+        @Environment(\.openURL) var openURL
 
 
         var body: some View {
         var body: some View {
             List {
             List {
@@ -90,13 +89,14 @@ extension AppDiagnostics {
             .toolbar {
             .toolbar {
                 ToolbarItem(placement: .topBarTrailing) {
                 ToolbarItem(placement: .topBarTrailing) {
                     Button("Privacy Policy") {
                     Button("Privacy Policy") {
-                        shouldDisplayPrivacyPolicy = true
+                        if let url = URL(string: "https://github.com/nightscout/Trio/blob/dev/PRIVACY_POLICY.md") {
+                            openURL(url)
+                        } else {
+                            debug(.default, "Invalid URL! Could not gracefully unwrap privacy policy link!")
+                        }
                     }
                     }
                 }
                 }
             }
             }
-            .sheet(isPresented: $shouldDisplayPrivacyPolicy) {
-                PrivacyPolicyView()
-            }
         }
         }
     }
     }
 }
 }

+ 0 - 233
Trio/Sources/Modules/AppDiagnostics/View/PrivacyPolicyView.swift

@@ -1,233 +0,0 @@
-//
-//  PrivacyPolicyView.swift
-//  Trio
-//
-//  Created by Cengiz Deniz on 17.04.25.
-//
-import SwiftUI
-
-struct PrivacyPolicyView: View {
-    @Environment(\.openURL) var openURL
-    @Environment(\.dismiss) var dismiss
-
-    var body: some View {
-        NavigationStack {
-            List {
-                VStack(alignment: .leading, spacing: 20) {
-                    Text("Introduction").font(.headline).bold().foregroundStyle(Color.primary)
-                    Text(
-                        "This Privacy Policy explains how we collect, use, and share information when you use Trio. We respect your privacy and are committed to protecting your personal data. Please read this Privacy Policy carefully to understand our practices regarding your personal data."
-                    )
-
-                    Divider()
-
-                    Text("Information We Collect").font(.headline).bold().foregroundStyle(Color.primary)
-                    Text("What We Do NOT Collect").foregroundStyle(Color.primary)
-
-                    Text("For complete transparency, we want to clarify that Trio does not collect:")
-
-                    VStack(alignment: .leading, spacing: 10) {
-                        BulletPoint(String(localized: "Blood glucose (BG) readings"))
-                        BulletPoint(String(localized: "Treatment data"))
-                        BulletPoint(String(localized: "Total daily doses (TDD)"))
-                        BulletPoint(String(localized: "Any health-related statistics or personal medical information"))
-                        BulletPoint(String(localized: "Personal identifiable information such as name, address, or email"))
-                    }
-
-                    Text("Crash Reporting (Opt-In by default, with ability to Opt-Out)").foregroundStyle(Color.primary)
-                    Text(
-                        "Trio uses Google Firebase Crashlytics to collect crash reports. During the initial app setup (onboarding process), you will be asked to opt in to crash reporting. The onboarding process is the series of screens you see when first launching Trio that helps you set up the app."
-                    )
-
-                    Text("The following information may be sent to Crashlytics when Trio crashes:")
-
-                    VStack(alignment: .leading, spacing: 10) {
-                        BulletPoint(
-                            String(
-                                localized: "Time and date of the crash (example: \"Trio crashed on April 6, 2025 at 2:15 PM\")"
-                            )
-                        )
-                        BulletPoint(
-                            String(
-                                localized: "Device state at the time of the crash (example: \"Trio was in the foreground\" or \"Battery level was 42%\")"
-                            )
-                        )
-                        BulletPoint(
-                            String(localized: "Stack trace information (technical information showing which line of code failed)")
-                        )
-                        BulletPoint(
-                            String(localized: "Device model and OS version (example: \"iPhone 14 Pro running iOS 17.4.1\")")
-                        )
-                        BulletPoint(
-                            String(
-                                localized: "A generated unique identifier (a random code like \"A7B2C9D3\" that doesn't identify you personally)"
-                            )
-                        )
-                    }
-
-                    Text("Debug Symbols (dSYMs)").foregroundStyle(Color.primary)
-
-                    Text(
-                        "When we build the Trio app, we create special files called debug symbols (dSYMs) that help us read crash reports. Think of these like a decoder ring for crashes:"
-                    )
-
-                    Text(
-                        "Without dSYMs, a crash might look like: \"Error at memory address 0x1234ABCD\". With dSYMs, we can see: \"Error in function 'calculateInsulin' at line 157\""
-                    )
-
-                    Text(
-                        "These files only contain code-related information that helps us understand where crashes happen. They contain no personal information about you or how you use Trio."
-                    )
-
-                    Divider()
-
-                    Text("How We Use Your Information").font(.headline).bold().foregroundStyle(Color.primary)
-
-                    Text("We use anonymous crash report information exclusively to:")
-
-                    VStack(alignment: .leading, spacing: 10) {
-                        BulletPoint(String(localized: "Identify and fix bugs and crashes"))
-                        BulletPoint(String(localized: "Improve Trio's stability"))
-                    }
-
-                    Text("We do not use this information for any other purpose, such as analytics, marketing, or user profiling.")
-
-                    Divider()
-
-                    Text("Data Sharing and Third-Party Services").font(.headline).bold().foregroundStyle(Color.primary)
-
-                    Text("Crashlytics").foregroundStyle(Color.primary)
-
-                    VStack(alignment: .leading, spacing: 10) {
-                        Text(
-                            "We use Google Firebase Crashlytics to collect and analyze crash reports. Crashlytics' privacy practices are governed by the Google Privacy Policy. For more information about how Crashlytics processes data, please visit their documentation."
-                        )
-
-                        Button {
-                            openURL(URL(string: "https://policies.google.com/privacy")!)
-                        } label: {
-                            Text("Google Privacy Policy")
-                                .padding(.horizontal, 12)
-                                .padding(.vertical, 8)
-                                .background(Color.blue.opacity(0.2))
-                                .cornerRadius(8)
-                        }
-                        .frame(maxWidth: .infinity, alignment: .center)
-                        .padding(.horizontal)
-                    }
-
-                    Text("Open Source Contributors").foregroundStyle(Color.primary)
-
-                    Text(
-                        "As an open source project, crash reports and debugging information may be visible to project contributors who help maintain and improve Trio. All contributors are expected to adhere to this privacy policy and handle any data responsibly."
-                    )
-
-                    Divider()
-
-                    Text("Opting Out and Data Retention")
-
-                    Text("You can opt out of crash reporting at any time through the Trio settings. If you opt out:")
-
-                    VStack(alignment: .leading, spacing: 10) {
-                        BulletPoint(String(localized: "No new crash data will be collected or sent to us"))
-                        BulletPoint(
-                            String(localized: "Previously collected crash data will still be retained for approximately 90 days")
-                        )
-                    }
-
-                    Text(
-                        "To avoid sending dSYMs to Crashlytics, you can delete the Trio target Build Phase script, titled \"Copy dSYMs to Crashlytics\"."
-                    )
-
-                    Divider()
-
-                    Text("Your Rights").font(.headline).bold().foregroundStyle(Color.primary)
-
-                    Text("You have certain rights regarding your information, including:")
-
-                    VStack(alignment: .leading, spacing: 10) {
-                        BulletPoint(String(localized: "The right to opt-out of crash reporting"))
-                        BulletPoint(String(localized: "The right to request deletion of your data"))
-                    }
-
-                    Text(
-                        "To opt-out of crash reporting, please see the section above for details about how to configure Trio to not record crash reports."
-                    )
-
-                    Text(
-                        "The information we store is anonymous, so we are unable to look up information for a particular individual. However, our general data retention policy ensures that data older than 90 days is deleted, enabling us to accommodate data deletion requests by design despite having anonymous data."
-                    )
-
-                    Divider()
-
-                    Text("Changes to This Privacy Policy").font(.headline).bold().foregroundStyle(Color.primary)
-
-                    Text(
-                        "We may update this Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page and updating the \"Last Updated\" date."
-                    )
-
-                    Divider()
-
-                    Text("Contact Us").font(.headline).bold().foregroundStyle(Color.primary)
-
-                    VStack(alignment: .leading, spacing: 10) {
-                        Text(
-                            "If you have any questions about this Privacy Policy, please contact us on Discord, or send us an email."
-                        ).multilineTextAlignment(.leading)
-
-                        HStack(alignment: .center, spacing: 10) {
-                            Button {
-                                openURL(URL(string: "http://discord.triodocs.org/")!)
-                            } label: {
-                                Text("Trio Discord")
-                                    .padding(.horizontal, 12)
-                                    .padding(.vertical, 8)
-                                    .background(Color.blue.opacity(0.2))
-                                    .cornerRadius(8)
-                            }
-                            .frame(maxWidth: .infinity, alignment: .center)
-                            .padding(.horizontal)
-
-                            Button {
-                                openURL(URL(string: "mailto:trio.diy.diabetes@gmail.com")!)
-                            } label: {
-                                Text("Email us")
-                                    .padding(.horizontal, 12)
-                                    .padding(.vertical, 8)
-                                    .background(Color.blue.opacity(0.2))
-                                    .cornerRadius(8)
-                            }
-                            .frame(maxWidth: .infinity, alignment: .center)
-                            .padding(.horizontal)
-                        }
-                    }
-
-                    Divider()
-
-                    HStack {
-                        Text("Last Updated:").bold()
-                        Text("April 15, 2025")
-                    }
-                    .font(.headline).foregroundStyle(Color.primary)
-                }
-                .font(.footnote)
-                .foregroundStyle(Color.secondary)
-                .listRowBackground(Color.clear)
-                .fixedSize(horizontal: false, vertical: true)
-                .multilineTextAlignment(.leading)
-            }
-            .scrollContentBackground(.hidden)
-            .navigationBarTitle("Privacy Policy", displayMode: .inline)
-
-            Spacer()
-
-            Button {
-                dismiss()
-            } label: {
-                Text("Got it!").bold().frame(maxWidth: .infinity, minHeight: 30, alignment: .center)
-            }
-            .buttonStyle(.bordered)
-            .padding([.top, .horizontal])
-        }.ignoresSafeArea(edges: .top)
-    }
-}

+ 6 - 5
Trio/Sources/Modules/Onboarding/View/OnboardingSteps/DiagnosticsStepView.swift

@@ -3,7 +3,7 @@ import SwiftUI
 struct DiagnosticsStepView: View {
 struct DiagnosticsStepView: View {
     @Bindable var state: Onboarding.StateModel
     @Bindable var state: Onboarding.StateModel
 
 
-    @State private var shouldDisplayPrivacyPolicy: Bool = false
+    @Environment(\.openURL) var openURL
 
 
     var body: some View {
     var body: some View {
         VStack(alignment: .leading, spacing: 20) {
         VStack(alignment: .leading, spacing: 20) {
@@ -37,7 +37,11 @@ struct DiagnosticsStepView: View {
                 HStack {
                 HStack {
                     Text("I have read and accept the")
                     Text("I have read and accept the")
                     Button("Privacy Policy") {
                     Button("Privacy Policy") {
-                        shouldDisplayPrivacyPolicy = true
+                        if let url = URL(string: "https://github.com/nightscout/Trio/blob/dev/PRIVACY_POLICY.md") {
+                            openURL(url)
+                        } else {
+                            debug(.default, "Invalid URL! Could not gracefully unwrap privacy policy link!")
+                        }
                     }
                     }
                     .foregroundColor(.accentColor)
                     .foregroundColor(.accentColor)
                     .underline()
                     .underline()
@@ -86,8 +90,5 @@ struct DiagnosticsStepView: View {
         .onAppear {
         .onAppear {
             state.syncDiagnosticsOptionFromStorage()
             state.syncDiagnosticsOptionFromStorage()
         }
         }
-        .sheet(isPresented: $shouldDisplayPrivacyPolicy) {
-            PrivacyPolicyView()
-        }
     }
     }
 }
 }