From ece4d338046b606416a89ecdc560bee292b1db96 Mon Sep 17 00:00:00 2001 From: marionbarker Date: Fri, 16 Jan 2026 06:54:28 -0800 Subject: [PATCH 1/6] Live-Activity: short labels for display, long labels for description --- LoopCore/LiveActivitySettings.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/LoopCore/LiveActivitySettings.swift b/LoopCore/LiveActivitySettings.swift index ef37a88f2..ef3e44986 100644 --- a/LoopCore/LiveActivitySettings.swift +++ b/LoopCore/LiveActivitySettings.swift @@ -23,9 +23,9 @@ public enum BottomRowConfiguration: Codable { public func name() -> String { switch self { case .iob: - return NSLocalizedString("Active Insulin", comment: "") + return NSLocalizedString("IOB", comment: "") case .cob: - return NSLocalizedString("Active Carbs", comment: "") + return NSLocalizedString("COB", comment: "") case .basal: return NSLocalizedString("Basal", comment: "") case .currentBg: @@ -35,7 +35,7 @@ public enum BottomRowConfiguration: Codable { case .deltaBg: return NSLocalizedString("Delta", comment: "") case .updatedAt: - return NSLocalizedString("Updated", comment: "") + return NSLocalizedString("at", comment: "") } } @@ -46,13 +46,13 @@ public enum BottomRowConfiguration: Codable { case .cob: return NSLocalizedString("Active Carbohydrates", comment: "") case .basal: - return NSLocalizedString("Basal", comment: "") + return NSLocalizedString("Relative Basal Rate", comment: "") case .currentBg: return NSLocalizedString("Current Glucose", comment: "") case .eventualBg: - return NSLocalizedString("Eventually", comment: "") + return NSLocalizedString("Eventual Glucose", comment: "") case .deltaBg: - return NSLocalizedString("Delta", comment: "") + return NSLocalizedString("Delta Glucose", comment: "") case .updatedAt: return NSLocalizedString("Updated at", comment: "") } From 28dd3e743a19be1de8fcc38f7d05fde63bd49fde Mon Sep 17 00:00:00 2001 From: marionbarker Date: Fri, 16 Jan 2026 06:55:36 -0800 Subject: [PATCH 2/6] Enable autoscaling in Live Activity widget to prevent truncation --- Loop Widget Extension/Live Activity/BasalViewActivity.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Loop Widget Extension/Live Activity/BasalViewActivity.swift b/Loop Widget Extension/Live Activity/BasalViewActivity.swift index 915335c5f..4342100fa 100644 --- a/Loop Widget Extension/Live Activity/BasalViewActivity.swift +++ b/Loop Widget Extension/Live Activity/BasalViewActivity.swift @@ -25,10 +25,14 @@ struct BasalViewActivity: View { if let rateString = decimalFormatter.string(from: NSNumber(value: rate)) { Text("\(rateString)U") .font(.subheadline) + .minimumScaleFactor(0.5) + .lineLimit(2) } else { Text("-U") .font(.subheadline) + .minimumScaleFactor(0.5) + .lineLimit(2) } } } From f651548f0c5f10193a03afb3d8d5d6d9bdc319aa Mon Sep 17 00:00:00 2001 From: marionbarker Date: Fri, 16 Jan 2026 07:00:19 -0800 Subject: [PATCH 3/6] update string catalog for Live Activity modifications --- .../Bootstrap/Localizable.xcstrings | 5 +-- LoopCore/Localizable.xcstrings | 36 ++++++++++++------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Loop Widget Extension/Bootstrap/Localizable.xcstrings b/Loop Widget Extension/Bootstrap/Localizable.xcstrings index 17bac774e..0f623cee6 100644 --- a/Loop Widget Extension/Bootstrap/Localizable.xcstrings +++ b/Loop Widget Extension/Bootstrap/Localizable.xcstrings @@ -440,7 +440,8 @@ } }, "%@U" : { - + "comment" : "A label displaying the basal insulin rate in micro-units (U).", + "isCommentAutoGenerated" : true }, "%1$@ v%2$@" : { "comment" : "The format string for the app name and version number. (1: bundle name)(2: bundle version)", @@ -1553,5 +1554,5 @@ } } }, - "version" : "1.0" + "version" : "1.1" } \ No newline at end of file diff --git a/LoopCore/Localizable.xcstrings b/LoopCore/Localizable.xcstrings index 28eac3f1a..55f478be2 100644 --- a/LoopCore/Localizable.xcstrings +++ b/LoopCore/Localizable.xcstrings @@ -130,14 +130,14 @@ "comment" : "Description of a bottom row configuration option for active carbohydrates.", "isCommentAutoGenerated" : true }, - "Active Carbs" : { - "comment" : "Name of the \"Active Carbs\" option in the Live Activity settings.", - "isCommentAutoGenerated" : true - }, "Active Insulin" : { "comment" : "Name of the active insulin value in the bottom row.", "isCommentAutoGenerated" : true }, + "at" : { + "comment" : "Label for the timestamp in the Live Activity.", + "isCommentAutoGenerated" : true + }, "Automatic Bolus" : { "comment" : "Title string for automatic bolus dosing strategy", "localizations" : { @@ -231,8 +231,12 @@ "comment" : "Name of the basal insulin rate.", "isCommentAutoGenerated" : true }, + "COB" : { + "comment" : "Name of the COB value in the Live Activity.", + "isCommentAutoGenerated" : true + }, "Current BG" : { - "comment" : "Name of a bottom row item that shows the current blood glucose level.", + "comment" : "Name of a bottom row item that shows the current glucose value.", "isCommentAutoGenerated" : true }, "Current Glucose" : { @@ -243,22 +247,34 @@ "comment" : "The name of the delta BG value.", "isCommentAutoGenerated" : true }, + "Delta Glucose" : { + "comment" : "Description of a bottom row configuration option that shows the delta glucose value.", + "isCommentAutoGenerated" : true + }, "Eventual BG" : { - "comment" : "Description of a bottom row configuration option for displaying the eventual glucose value.", + "comment" : "Name of a bottom row item that shows the eventual glucose value.", "isCommentAutoGenerated" : true }, - "Eventually" : { - "comment" : "Description of a glucose value that is expected to change in the future.", + "Eventual Glucose" : { + "comment" : "Description of a bottom row configuration option that shows the eventual glucose value.", "isCommentAutoGenerated" : true }, "In which mode do you want to render the Live Activity" : { "comment" : "Description of a setting that allows the user to choose between a large or small display of the Live Activity.", "isCommentAutoGenerated" : true }, + "IOB" : { + "comment" : "Name of a bottom row configuration option for IOB (Insulin On Board).", + "isCommentAutoGenerated" : true + }, "Large" : { "comment" : "Name of the \"Large\" Live Activity mode.", "isCommentAutoGenerated" : true }, + "Relative Basal Rate" : { + "comment" : "Description of a bottom row configuration option for the basal rate.", + "isCommentAutoGenerated" : true + }, "Small" : { "comment" : "Name of the \"Small\" Live Activity mode.", "isCommentAutoGenerated" : true @@ -352,10 +368,6 @@ } } }, - "Updated" : { - "comment" : "Name of the \"Updated\" option in the Live Activity settings.", - "isCommentAutoGenerated" : true - }, "Updated at" : { "comment" : "Label for the date and time when the last update was made.", "isCommentAutoGenerated" : true From f66d3320a0e54ed5f9677e7d68d6721530ebd8cd Mon Sep 17 00:00:00 2001 From: marionbarker Date: Mon, 19 Jan 2026 10:47:39 -0800 Subject: [PATCH 4/6] improve large font display for Live Activity; * add section headings; * modify strings --- Loop/Localizable.xcstrings | 46 ++++++++---- .../LiveActivityBottomRowManagerView.swift | 31 ++++---- Loop/Views/LiveActivityManagementView.swift | 72 ++++++++++--------- LoopCore/LiveActivitySettings.swift | 4 +- LoopCore/Localizable.xcstrings | 8 +-- 5 files changed, 91 insertions(+), 70 deletions(-) diff --git a/Loop/Localizable.xcstrings b/Loop/Localizable.xcstrings index 77f54808c..7c83fad26 100644 --- a/Loop/Localizable.xcstrings +++ b/Loop/Localizable.xcstrings @@ -5321,7 +5321,7 @@ } } }, - "Add item to bottom row" : { + "Add item to Lock Screen / CarPlay display" : { "comment" : "Title for Add item" }, "Add Meal" : { @@ -5449,9 +5449,6 @@ } } }, - "Add predictive line" : { - "comment" : "Title for predictive line toggle" - }, "Add Pump" : { "comment" : "Action sheet title selecting Pump\nThe title of the pump chooser in settings\nTitle text for button to add pump device\nTitle text for button to set up a Pump", "localizations" : { @@ -9837,12 +9834,6 @@ } } }, - "Bottom row" : { - "comment" : "Live activity Bottom row configuration title" - }, - "Bottom row configuration" : { - "comment" : "Title for Bottom row configuration" - }, "Cancel" : { "comment" : "Button label for cancel\nButton text to cancel\nCancel button for reset loop alert\nCancel export button title\nThe title of the cancel action in an action sheet", "localizations" : { @@ -13108,6 +13099,14 @@ } } }, + "Configure Display" : { + "comment" : "The title of the view that allows users to configure the display of their live activity information on their iPhone's lock screen and CarPlay display.", + "isCommentAutoGenerated" : true + }, + "Configure Lock Screen / Carplay Row" : { + "comment" : "A link in the live activity settings that takes the user to a view where they can configure the row displayed on their lock screen or carplay.", + "isCommentAutoGenerated" : true + }, "Continue" : { "comment" : "Button label for continue\nDefault alert dismissal", "localizations" : { @@ -16128,6 +16127,20 @@ } } }, + "Display colors for glucose" : { + "comment" : "Title for glucose coloring" + }, + "Display Control Options" : { + "comment" : "A section header for controls related to the display of glucose levels in the live activity chart.", + "isCommentAutoGenerated" : true + }, + "Display prediction in plot" : { + "comment" : "Title for prediction line toggle" + }, + "Display up to 4 items" : { + "comment" : "A section header that instructs the user on how many items can be displayed in the Lock Screen / CarPlay row.", + "isCommentAutoGenerated" : true + }, "Done" : { "localizations" : { "cs" : { @@ -23559,6 +23572,10 @@ } } }, + "Lock Screen / Dynamic Island / CarPlay" : { + "comment" : "The title of a section in the live activity settings view, related to lock screen, dynamic island, and carplay.", + "isCommentAutoGenerated" : true + }, "Log Dose" : { "comment" : "Button text to log a dose\nTitle for dose logging screen", "localizations" : { @@ -32945,6 +32962,10 @@ } } }, + "Select Lock Screen Display Options" : { + "comment" : "A section header in the live activity settings screen, describing the options available for customizing the display on the lock screen.", + "isCommentAutoGenerated" : true + }, "Selecting a favorite food in the carb entry screen automatically fills in the carb quantity, food type, and absorption time fields! Tap the add button below to create your first favorite food!" : { "localizations" : { "da" : { @@ -38430,9 +38451,6 @@ } } }, - "Use BG coloring" : { - "comment" : "Title for BG coloring" - }, "Use Pre-Meal Preset" : { "comment" : "The title of the alert controller used to select a duration for pre-meal targets", "localizations" : { @@ -40913,5 +40931,5 @@ } } }, - "version" : "1.0" + "version" : "1.1" } \ No newline at end of file diff --git a/Loop/Views/LiveActivityBottomRowManagerView.swift b/Loop/Views/LiveActivityBottomRowManagerView.swift index 85a45b017..203975369 100644 --- a/Loop/Views/LiveActivityBottomRowManagerView.swift +++ b/Loop/Views/LiveActivityBottomRowManagerView.swift @@ -36,26 +36,27 @@ struct LiveActivityBottomRowManagerView: View { } buttons.append(.cancel(Text(NSLocalizedString("Cancel", comment: "Button text to cancel")))) - return ActionSheet(title: Text(NSLocalizedString("Add item to bottom row", comment: "Title for Add item")), buttons: buttons) + return ActionSheet(title: Text(NSLocalizedString("Add item to Lock Screen / CarPlay display", comment: "Title for Add item")), buttons: buttons) } var body: some View { List { - ForEach($configuration, id: \.self) { item in - HStack { - deleteButton - .onTapGesture { - onDelete(item.wrappedValue) - isDirty = configuration != previousConfiguration - } - Text(item.wrappedValue.description()) - - Spacer() - editBars + Section(header: Text("Display up to 4 items")) { + ForEach($configuration, id: \.self) { item in + HStack { + deleteButton + .onTapGesture { + onDelete(item.wrappedValue) + isDirty = configuration != previousConfiguration + } + Text(item.wrappedValue.description()) + Spacer() + editBars + } } + .onMove(perform: onReorder) + .deleteDisabled(true) } - .onMove(perform: onReorder) - .deleteDisabled(true) Section { Button(action: onSave) { @@ -81,7 +82,7 @@ struct LiveActivityBottomRowManagerView: View { } .actionSheet(isPresented: $showAdd, content: { addItem }) .insetGroupedListStyle() - .navigationBarTitle(Text(NSLocalizedString("Bottom row", comment: "Live activity Bottom row configuration title"))) + .navigationBarTitle(Text(NSLocalizedString("Configure Display", comment: ""))) } @ViewBuilder diff --git a/Loop/Views/LiveActivityManagementView.swift b/Loop/Views/LiveActivityManagementView.swift index bdf87dc55..fac5576c5 100644 --- a/Loop/Views/LiveActivityManagementView.swift +++ b/Loop/Views/LiveActivityManagementView.swift @@ -21,12 +21,14 @@ struct LiveActivityManagementView: View { var body: some View { VStack { List { - Section { + Section(header: Text("Lock Screen / Dynamic Island / CarPlay")) { Toggle(NSLocalizedString("Enabled", comment: "Title for enable live activity toggle"), isOn: $viewModel.enabled) .onChange(of: viewModel.enabled) { _ in self.isDirty = previousViewModel.enabled != viewModel.enabled } - + } + + Section(header: Text("Select Lock Screen Display Options")){ ExpandableSetting( isEditing: $viewModel.isEditingMode, leadingValueContent: { @@ -48,50 +50,50 @@ struct LiveActivityManagementView: View { } } - Section { - if viewModel.mode == .large { - Toggle(NSLocalizedString("Add predictive line", comment: "Title for predictive line toggle"), isOn: $viewModel.addPredictiveLine) - .transition(.move(edge: viewModel.mode == .large ? .top : .bottom)) - .onChange(of: viewModel.addPredictiveLine) { _ in - self.isDirty = previousViewModel.addPredictiveLine != viewModel.addPredictiveLine - } - } + Section(header: Text("Display Control Options")) { + Toggle(NSLocalizedString("Display prediction in plot", comment: "Title for prediction line toggle"), isOn: $viewModel.addPredictiveLine) + .transition(.move(edge: viewModel.mode == .large ? .top : .bottom)) + .onChange(of: viewModel.addPredictiveLine) { _ in + self.isDirty = previousViewModel.addPredictiveLine != viewModel.addPredictiveLine + } - Toggle(NSLocalizedString("Use BG coloring", comment: "Title for BG coloring"), isOn: $viewModel.useLimits) + Toggle(NSLocalizedString("Display colors for glucose", comment: "Title for glucose coloring"), isOn: $viewModel.useLimits) .transition(.move(edge: viewModel.mode == .large ? .top : .bottom)) .onChange(of: viewModel.useLimits) { _ in self.isDirty = previousViewModel.useLimits != viewModel.useLimits } - if self.displayGlucosePreference.unit == .millimolesPerLiter { - TextInput(label: "Upper limit", value: $viewModel.upperLimitChartMmol) - .transition(.move(edge: viewModel.useLimits ? .top : .bottom)) - .onChange(of: viewModel.upperLimitChartMmol) { _ in - self.isDirty = previousViewModel.upperLimitChartMmol != viewModel.upperLimitChartMmol - } - TextInput(label: "Lower limit", value: $viewModel.lowerLimitChartMmol) - .transition(.move(edge: viewModel.useLimits ? .top : .bottom)) - .onChange(of: viewModel.lowerLimitChartMmol) { _ in - self.isDirty = previousViewModel.lowerLimitChartMmol != viewModel.lowerLimitChartMmol - } - } else { - TextInput(label: "Upper limit", value: $viewModel.upperLimitChartMg) - .transition(.move(edge: viewModel.useLimits ? .top : .bottom)) - .onChange(of: viewModel.upperLimitChartMg) { _ in - self.isDirty = previousViewModel.upperLimitChartMg != viewModel.upperLimitChartMg - } - TextInput(label: "Lower limit", value: $viewModel.lowerLimitChartMg) - .transition(.move(edge: viewModel.useLimits ? .top : .bottom)) - .onChange(of: viewModel.lowerLimitChartMg) { _ in - self.isDirty = previousViewModel.lowerLimitChartMg != viewModel.lowerLimitChartMg - } + if self.viewModel.useLimits { + if self.displayGlucosePreference.unit == .millimolesPerLiter { + TextInput(label: "Upper limit", value: $viewModel.upperLimitChartMmol) + .transition(.move(edge: viewModel.useLimits ? .top : .bottom)) + .onChange(of: viewModel.upperLimitChartMmol) { _ in + self.isDirty = previousViewModel.upperLimitChartMmol != viewModel.upperLimitChartMmol + } + TextInput(label: "Lower limit", value: $viewModel.lowerLimitChartMmol) + .transition(.move(edge: viewModel.useLimits ? .top : .bottom)) + .onChange(of: viewModel.lowerLimitChartMmol) { _ in + self.isDirty = previousViewModel.lowerLimitChartMmol != viewModel.lowerLimitChartMmol + } + } else { + TextInput(label: "Upper limit", value: $viewModel.upperLimitChartMg) + .transition(.move(edge: viewModel.useLimits ? .top : .bottom)) + .onChange(of: viewModel.upperLimitChartMg) { _ in + self.isDirty = previousViewModel.upperLimitChartMg != viewModel.upperLimitChartMg + } + TextInput(label: "Lower limit", value: $viewModel.lowerLimitChartMg) + .transition(.move(edge: viewModel.useLimits ? .top : .bottom)) + .onChange(of: viewModel.lowerLimitChartMg) { _ in + self.isDirty = previousViewModel.lowerLimitChartMg != viewModel.lowerLimitChartMg + } + } } } - Section { + Section(header: Text("Configure Lock Screen / Carplay Row")) { NavigationLink( destination: LiveActivityBottomRowManagerView(), - label: { Text(NSLocalizedString("Bottom row configuration", comment: "Title for Bottom row configuration")) } + label: { Text(NSLocalizedString("Configure Display", comment: "")) } ) } } diff --git a/LoopCore/LiveActivitySettings.swift b/LoopCore/LiveActivitySettings.swift index ef3e44986..cf3a9a72b 100644 --- a/LoopCore/LiveActivitySettings.swift +++ b/LoopCore/LiveActivitySettings.swift @@ -71,9 +71,9 @@ public enum LiveActivityMode: Codable, CustomStringConvertible { public func name() -> String { switch self { case .large: - return NSLocalizedString("Large", comment: "") + return NSLocalizedString("Plot and Row", comment: "") case .small: - return NSLocalizedString("Small", comment: "") + return NSLocalizedString("Row Only", comment: "") } } } diff --git a/LoopCore/Localizable.xcstrings b/LoopCore/Localizable.xcstrings index 55f478be2..cecc36cc3 100644 --- a/LoopCore/Localizable.xcstrings +++ b/LoopCore/Localizable.xcstrings @@ -267,16 +267,16 @@ "comment" : "Name of a bottom row configuration option for IOB (Insulin On Board).", "isCommentAutoGenerated" : true }, - "Large" : { - "comment" : "Name of the \"Large\" Live Activity mode.", + "Plot and Row" : { + "comment" : "Name of the live activity mode that shows both the plot and the row.", "isCommentAutoGenerated" : true }, "Relative Basal Rate" : { "comment" : "Description of a bottom row configuration option for the basal rate.", "isCommentAutoGenerated" : true }, - "Small" : { - "comment" : "Name of the \"Small\" Live Activity mode.", + "Row Only" : { + "comment" : "Name of the Live Activity Mode when it is set to .small.", "isCommentAutoGenerated" : true }, "Temp Basal Only" : { From 101cde26a8e4dc94f373fc94ac97b6da1e6e8cd8 Mon Sep 17 00:00:00 2001 From: marionbarker Date: Wed, 21 Jan 2026 09:35:12 -0800 Subject: [PATCH 5/6] update glucose color for live activity; author: bastiaanv --- .../Live Activity/ChartView.swift | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/Loop Widget Extension/Live Activity/ChartView.swift b/Loop Widget Extension/Live Activity/ChartView.swift index b69bf3397..d5a0aca0a 100644 --- a/Loop Widget Extension/Live Activity/ChartView.swift +++ b/Loop Widget Extension/Live Activity/ChartView.swift @@ -17,6 +17,7 @@ struct ChartView: View { private let glucoseRanges: [GlucoseRangeValue] private let preset: Preset? private let yAxisMarks: [Double] + private let colorGradient: LinearGradient init(glucoseSamples: [GlucoseSampleAttributes], predicatedGlucose: [Double], predicatedStartDate: Date?, predicatedInterval: TimeInterval?, useLimits: Bool, lowerLimit: Double, upperLimit: Double, glucoseRanges: [GlucoseRangeValue], preset: Preset?, yAxisMarks: [Double]) { self.glucoseSampleData = ChartValues.convert(data: glucoseSamples, useLimits: useLimits, lowerLimit: lowerLimit, upperLimit: upperLimit) @@ -28,6 +29,7 @@ struct ChartView: View { lowerLimit: lowerLimit, upperLimit: upperLimit ) + self.colorGradient = ChartView.getGradient(useLimits: useLimits, lowerLimit: lowerLimit, upperLimit: upperLimit, highestValue: yAxisMarks.max() ?? 1) self.preset = preset self.glucoseRanges = glucoseRanges self.yAxisMarks = yAxisMarks @@ -39,6 +41,28 @@ struct ChartView: View { self.preset = preset self.glucoseRanges = glucoseRanges self.yAxisMarks = yAxisMarks + self.colorGradient = ChartView.getGradient(useLimits: useLimits, lowerLimit: lowerLimit, upperLimit: upperLimit, highestValue: yAxisMarks.max() ?? 1) + } + + private static func getGradient(useLimits: Bool, lowerLimit: Double, upperLimit: Double, highestValue: Double) -> LinearGradient { + var stops: [Gradient.Stop] = [Gradient.Stop(color: Color("glucose"), location: 0)] + if useLimits { + let lowerStop = lowerLimit / highestValue + let upperStop = upperLimit / highestValue + stops = [ + Gradient.Stop(color: .red, location: 0), + Gradient.Stop(color: .red, location: lowerStop - 0.01), + Gradient.Stop(color: .green, location: lowerStop), + Gradient.Stop(color: .green, location: upperStop), + Gradient.Stop(color: .orange, location: upperStop + 0.01), + Gradient.Stop(color: .orange, location: 600), // Just use the mg/dl limit for the most upper value + ] + } + return LinearGradient( + gradient: Gradient(stops: stops), + startPoint: .bottom, + endPoint: .top + ) } var body: some View { @@ -79,7 +103,7 @@ struct ChartView: View { y: .value("Glucose level", item.y) ) .lineStyle(StrokeStyle(lineWidth: 2, dash: [6, 5])) - .foregroundStyle(by: .value("Color", item.color)) + .foregroundStyle(colorGradient) } } .chartForegroundStyleScale([ @@ -144,7 +168,7 @@ struct ChartValues: Identifiable { return ChartValues( x: startDate.addingTimeInterval(interval * Double(index)), y: item, - color: !useLimits ? "Default" : item < lowerLimit ? "Low" : item > upperLimit ? "High" : "Good" + color: "Default" // Color is handled by the gradient ) } } From 6575f96339c94cdf6036bda85222b6a1ffd86e61 Mon Sep 17 00:00:00 2001 From: marionbarker Date: Wed, 21 Jan 2026 11:15:47 -0800 Subject: [PATCH 6/6] modify live activity configuration descriptions; include some comments --- Loop/Localizable.xcstrings | 8 +-- .../LiveActivityBottomRowManagerView.swift | 4 +- LoopCore/LiveActivitySettings.swift | 32 +++++----- LoopCore/Localizable.xcstrings | 62 +++++++------------ 4 files changed, 44 insertions(+), 62 deletions(-) diff --git a/Loop/Localizable.xcstrings b/Loop/Localizable.xcstrings index 7c83fad26..aebf2719a 100644 --- a/Loop/Localizable.xcstrings +++ b/Loop/Localizable.xcstrings @@ -13100,8 +13100,7 @@ } }, "Configure Display" : { - "comment" : "The title of the view that allows users to configure the display of their live activity information on their iPhone's lock screen and CarPlay display.", - "isCommentAutoGenerated" : true + "comment" : "Title for the view to configure the lock screen display" }, "Configure Lock Screen / Carplay Row" : { "comment" : "A link in the live activity settings that takes the user to a view where they can configure the row displayed on their lock screen or carplay.", @@ -16137,9 +16136,8 @@ "Display prediction in plot" : { "comment" : "Title for prediction line toggle" }, - "Display up to 4 items" : { - "comment" : "A section header that instructs the user on how many items can be displayed in the Lock Screen / CarPlay row.", - "isCommentAutoGenerated" : true + "Display up to 4 items. Display label is in parentheses." : { + "comment" : "Indicates the maximum number of items that can be displayed and how the label for each item is shortened." }, "Done" : { "localizations" : { diff --git a/Loop/Views/LiveActivityBottomRowManagerView.swift b/Loop/Views/LiveActivityBottomRowManagerView.swift index 203975369..88731431c 100644 --- a/Loop/Views/LiveActivityBottomRowManagerView.swift +++ b/Loop/Views/LiveActivityBottomRowManagerView.swift @@ -41,7 +41,7 @@ struct LiveActivityBottomRowManagerView: View { var body: some View { List { - Section(header: Text("Display up to 4 items")) { + Section(header: Text("Display up to 4 items. Display label is in parentheses.", comment: "Indicates the maximum number of items that can be displayed and how the label for each item is shortened.")) { ForEach($configuration, id: \.self) { item in HStack { deleteButton @@ -82,7 +82,7 @@ struct LiveActivityBottomRowManagerView: View { } .actionSheet(isPresented: $showAdd, content: { addItem }) .insetGroupedListStyle() - .navigationBarTitle(Text(NSLocalizedString("Configure Display", comment: ""))) + .navigationBarTitle(Text(NSLocalizedString("Configure Display", comment: "Title for the view to configure the lock screen display"))) } @ViewBuilder diff --git a/LoopCore/LiveActivitySettings.swift b/LoopCore/LiveActivitySettings.swift index cf3a9a72b..157fc05bc 100644 --- a/LoopCore/LiveActivitySettings.swift +++ b/LoopCore/LiveActivitySettings.swift @@ -23,38 +23,38 @@ public enum BottomRowConfiguration: Codable { public func name() -> String { switch self { case .iob: - return NSLocalizedString("IOB", comment: "") + return NSLocalizedString("IOB", comment: "Label used for the Insulin On Board value in the Live Activity view") case .cob: - return NSLocalizedString("COB", comment: "") + return NSLocalizedString("COB", comment: "Label used for the Carbohydrates On Board value in the Live Activity view") case .basal: - return NSLocalizedString("Basal", comment: "") + return NSLocalizedString("Basal", comment: "Label used for the Basal Rate plot in the Live Activity view") case .currentBg: - return NSLocalizedString("Current BG", comment: "") + return NSLocalizedString("Current BG", comment: "Label not shown in the Live Activity view") case .eventualBg: - return NSLocalizedString("Eventual BG", comment: "") + return NSLocalizedString("Eventual BG", comment: "Label used for the Forecasted Glucose in the Live Activity view") case .deltaBg: - return NSLocalizedString("Delta", comment: "") + return NSLocalizedString("Delta", comment: "Label used for the Delta Glucose in the Live Activity view") case .updatedAt: - return NSLocalizedString("at", comment: "") + return NSLocalizedString("at", comment: "Label used for the Updated time value in the Live Activity view") } } public func description() -> String { switch self { case .iob: - return NSLocalizedString("Active Insulin", comment: "") + return NSLocalizedString("Active Insulin (IOB)", comment: "Description for the Insulin On Board selection for the Live Activity configuration") case .cob: - return NSLocalizedString("Active Carbohydrates", comment: "") + return NSLocalizedString("Active Carbohydrates (COB)", comment: "Description for the Carbohydrates On Board selection for the Live Activity configuration") case .basal: - return NSLocalizedString("Relative Basal Rate", comment: "") + return NSLocalizedString("Relative Basal Rate (Basal)", comment: "Description for the Basal Rate plot selection for the Live Activity configuration") case .currentBg: - return NSLocalizedString("Current Glucose", comment: "") + return NSLocalizedString("Current Glucose (Value and Arrow)", comment: "Description for the Current Glucose selection for the Live Activity configuration") case .eventualBg: - return NSLocalizedString("Eventual Glucose", comment: "") + return NSLocalizedString("Forecasted Glucose (Eventual BG)", comment: "Description for the Forecasted Glucose selection for the Live Activity configuration") case .deltaBg: - return NSLocalizedString("Delta Glucose", comment: "") + return NSLocalizedString("Delta Glucose (Delta)", comment: "Description for the Delta Glucose selection for the Live Activity configuration") case .updatedAt: - return NSLocalizedString("Updated at", comment: "") + return NSLocalizedString("Updated (at)", comment: "Description for the Updated time selection for the Live Activity configuration") } } } @@ -71,9 +71,9 @@ public enum LiveActivityMode: Codable, CustomStringConvertible { public func name() -> String { switch self { case .large: - return NSLocalizedString("Plot and Row", comment: "") + return NSLocalizedString("Plot and Row", comment: "Short name to choose the Lock Screen display including the the plot") case .small: - return NSLocalizedString("Row Only", comment: "") + return NSLocalizedString("Row Only", comment: "Short name to choose the Lock Screen display without the plot") } } } diff --git a/LoopCore/Localizable.xcstrings b/LoopCore/Localizable.xcstrings index cecc36cc3..2e9688e02 100644 --- a/LoopCore/Localizable.xcstrings +++ b/LoopCore/Localizable.xcstrings @@ -126,17 +126,14 @@ } } }, - "Active Carbohydrates" : { - "comment" : "Description of a bottom row configuration option for active carbohydrates.", - "isCommentAutoGenerated" : true + "Active Carbohydrates (COB)" : { + "comment" : "Description for the Carbohydrates On Board selection for the Live Activity configuration" }, - "Active Insulin" : { - "comment" : "Name of the active insulin value in the bottom row.", - "isCommentAutoGenerated" : true + "Active Insulin (IOB)" : { + "comment" : "Description for the Insulin On Board selection for the Live Activity configuration" }, "at" : { - "comment" : "Label for the timestamp in the Live Activity.", - "isCommentAutoGenerated" : true + "comment" : "Label used for the Updated time value in the Live Activity view" }, "Automatic Bolus" : { "comment" : "Title string for automatic bolus dosing strategy", @@ -228,56 +225,44 @@ } }, "Basal" : { - "comment" : "Name of the basal insulin rate.", - "isCommentAutoGenerated" : true + "comment" : "Label used for the Basal Rate plot in the Live Activity view" }, "COB" : { - "comment" : "Name of the COB value in the Live Activity.", - "isCommentAutoGenerated" : true + "comment" : "Label used for the Carbohydrates On Board value in the Live Activity view" }, "Current BG" : { - "comment" : "Name of a bottom row item that shows the current glucose value.", - "isCommentAutoGenerated" : true + "comment" : "Label not shown in the Live Activity view" }, - "Current Glucose" : { - "comment" : "Description of a bottom row item that shows the current glucose level.", - "isCommentAutoGenerated" : true + "Current Glucose (Value and Arrow)" : { + "comment" : "Description for the Current Glucose selection for the Live Activity configuration" }, "Delta" : { - "comment" : "The name of the delta BG value.", - "isCommentAutoGenerated" : true + "comment" : "Label used for the Delta Glucose in the Live Activity view" }, - "Delta Glucose" : { - "comment" : "Description of a bottom row configuration option that shows the delta glucose value.", - "isCommentAutoGenerated" : true + "Delta Glucose (Delta)" : { + "comment" : "Description for the Delta Glucose selection for the Live Activity configuration" }, "Eventual BG" : { - "comment" : "Name of a bottom row item that shows the eventual glucose value.", - "isCommentAutoGenerated" : true + "comment" : "Label used for the Forecasted Glucose in the Live Activity view" }, - "Eventual Glucose" : { - "comment" : "Description of a bottom row configuration option that shows the eventual glucose value.", - "isCommentAutoGenerated" : true + "Forecasted Glucose (Eventual BG)" : { + "comment" : "Description for the Forecasted Glucose selection for the Live Activity configuration" }, "In which mode do you want to render the Live Activity" : { "comment" : "Description of a setting that allows the user to choose between a large or small display of the Live Activity.", "isCommentAutoGenerated" : true }, "IOB" : { - "comment" : "Name of a bottom row configuration option for IOB (Insulin On Board).", - "isCommentAutoGenerated" : true + "comment" : "Label used for the Insulin On Board value in the Live Activity view" }, "Plot and Row" : { - "comment" : "Name of the live activity mode that shows both the plot and the row.", - "isCommentAutoGenerated" : true + "comment" : "Short name to choose the Lock Screen display including the the plot" }, - "Relative Basal Rate" : { - "comment" : "Description of a bottom row configuration option for the basal rate.", - "isCommentAutoGenerated" : true + "Relative Basal Rate (Basal)" : { + "comment" : "Description for the Basal Rate plot selection for the Live Activity configuration" }, "Row Only" : { - "comment" : "Name of the Live Activity Mode when it is set to .small.", - "isCommentAutoGenerated" : true + "comment" : "Short name to choose the Lock Screen display without the plot" }, "Temp Basal Only" : { "comment" : "Title string for temp basal only dosing strategy", @@ -368,9 +353,8 @@ } } }, - "Updated at" : { - "comment" : "Label for the date and time when the last update was made.", - "isCommentAutoGenerated" : true + "Updated (at)" : { + "comment" : "Description for the Updated time selection for the Live Activity configuration" } }, "version" : "1.1"