فهرست منبع

Merge branch 'dev' into experimental

Jon B.M 4 سال پیش
والد
کامیت
14a07c2ba3

+ 98 - 0
Dependencies/LoopKit/LoopKit/pt-PT.lproj/Localizable.strings

@@ -0,0 +1,98 @@
+/* Describes a certain bolus failure (1: size of the bolus in units) */
+"%1$@ U bolus failed" = "%1$@ U bolus failed";
+
+/* Describes an uncertain bolus failure (1: size of the bolus in units) */
+"%1$@ U bolus may not have succeeded" = "%1$@ U bolus may not have succeeded";
+
+/* The error description describing when Health sharing was denied */
+"Authorization Denied" = "Authorization Denied";
+
+/* Recovery instruction for an uncertain bolus failure */
+"Check your pump before retrying" = "Check your pump before retrying";
+
+/* The description of an error returned when attempting to delete a sample not shared by the current app */
+"com.loudnate.CarbKit.deleteCarbEntryUnownedErrorDescription" = "Authorization Denied";
+
+/* The error recovery suggestion when attempting to delete a sample not shared by the current app */
+"com.loudnate.carbKit.sharingDeniedErrorRecoverySuggestion" = "This sample can be deleted from the Health app";
+
+/* Generic pump error description */
+"Communication Failure" = "Communication Failure";
+
+/* Generic pump error description */
+"Connection Failure" = "Connection Failure";
+
+/* Generic pump error description */
+"Device Refused" = "Device Refused";
+
+/* Recovery suggestion for a no data error */
+"Ensure carb data exists for the specified date" = "Ensure carb data exists for the specified date";
+
+/* Glucose trend down */
+"Falling" = "Falling";
+
+/* Glucose trend down-down */
+"Falling fast" = "Falling fast";
+
+/* Glucose trend down-down-down */
+"Falling very fast" = "Falling very fast";
+
+/* Glucose trend flat */
+"Flat" = "Flat";
+
+/* The short unit display string for grams per U */
+"g/U" = "g/U";
+
+/* Generic pump error description */
+"Invalid Configuration" = "Invalid Configuration";
+
+/* Recovery instruction for a certain bolus failure */
+"It is safe to retry" = "It is safe to retry";
+
+/* The short unit display string for milligrams per deciliter per U */
+"mg/dL/U" = "mg/dL/U";
+
+/* The short unit display string for millimoles per liter */
+"mmol/L" = "mmol/L";
+
+/* The short unit display string for millimoles per liter per U */
+"mmol/L/U" = "mmol/L/U";
+
+/* Sensor state description for the non-valid state */
+"Needs Attention" = "Needs Attention";
+
+/* Describes an error for no data found in a CarbStore request */
+"No values found" = "No values found";
+
+/* Sensor state description for the valid state */
+"OK" = "OK";
+
+/* The error recovery suggestion when Health sharing was denied */
+"Please re-enable sharing in Health" = "Please re-enable sharing in Health";
+
+/* Glucose trend up */
+"Rising" = "Rising";
+
+/* Glucose trend up-up */
+"Rising fast" = "Rising fast";
+
+/* Glucose trend up-up-up */
+"Rising very fast" = "Rising very fast";
+
+/* The short unit display string for international units of insulin */
+"U" = "U";
+
+/* The short unit display string for international units of insulin per hour */
+"U/hr" = "U/hr";
+
+/* The long unit display string for a singular international unit of insulin */
+"Unit" = "Unit";
+
+/* The long unit display string for a singular international unit of insulin per hour */
+"Unit/hour" = "Unit/hour";
+
+/* The long unit display string for international units of insulin */
+"Units" = "Units";
+
+/* The long unit display string for international units of insulin per hour */
+"Units/hour" = "Units/hour";

+ 252 - 0
Dependencies/LoopKit/LoopKitUI/pt-PT.lproj/Localizable.strings

@@ -0,0 +1,252 @@
+/* The format for an override preset cell. (1: symbol)(2: name)
+   The format for an override symbol and name (1: symbol)(2: name) */
+"%1$@ %2$@" = "%1$@ %2$@";
+
+/* Accessibility format string for (1: localized volume)(2: time) */
+"%1$@ units remaining at %2$@" = "%1$@ units remaining at %2$@";
+
+/* The format for a glucose target range. (1: min target)(2: max target)(3: glucose unit) */
+"%1$@ – %2$@ %3$@" = "%1$@ – %2$@ %3$@";
+
+/* The format for an insulin needs percentage. */
+"%@%% of normal insulin" = "%@%% of normal insulin";
+
+/* Appends a full-stop to a statement */
+"%@." = "%@.";
+
+/* Format string for reservoir volume. (1: The localized volume) */
+"%@U" = "%@U";
+
+/* Title of the carb entry absorption time cell */
+"Absorption Time" = "Absorption Time";
+
+/* The title for the override emoji activity section */
+"Activity" = "Activity";
+
+/* Action sheet confirmation message for pump history deletion */
+"Are you sure you want to delete all history entries?" = "Are you sure you want to delete all history entries?";
+
+/* Action sheet confirmation message for reservoir deletion */
+"Are you sure you want to delete all reservoir values?" = "Are you sure you want to delete all reservoir values?";
+
+/* The title of the button to add the credentials for a service */
+"Add Account" = "Add Account";
+
+/* The title of the button to remove the credentials for a service */
+"Delete Account" = "Delete Account";
+
+/* Describes a percentage decrease in overall insulin needs */
+"Basal, bolus, and correction insulin dose amounts are decreased by %@%%." = "Basal, bolus, and correction insulin dose amounts are decreased by %@%%.";
+
+/* Describes a percentage increase in overall insulin needs */
+"Basal, bolus, and correction insulin dose amounts are increased by %@%%." = "Basal, bolus, and correction insulin dose amounts are increased by %@%%.";
+
+/* Describes a lack of change in overall insulin needs */
+"Basal, bolus, and correction insulin dose amounts are unaffected." = "Basal, bolus, and correction insulin dose amounts are unaffected.";
+
+/* The title of the cancel action in an action sheet */
+"Cancel" = "Cancel";
+
+/* The text for the override cancellation button */
+"Cancel Override" = "Cancel Override";
+
+/* Title text for suspend resume button when temp basal canceling */
+"Canceling Temp Basal" = "Canceling Temp Basal";
+
+/* The title of the view controller to create a new carb entry */
+"Add Carb Entry" = "Add Carb Entry";
+
+/* The title of the view controller to edit an existing carb entry */
+"Edit Carb Entry" = "Edit Carb Entry";
+
+/* Footer text for customizing an override from a preset (1: preset name) */
+"Changes will only apply this time you enable the override. The default settings of %@ will not be affected." = "Changes will only apply this time you enable the override. The default settings of %@ will not be affected.";
+
+/* Carb entry section footer text explaining absorption time */
+"Choose a longer absorption time for larger meals, or those containing fats and proteins. This is only guidance to the algorithm and need not be exact." = "Choose a longer absorption time for larger meals, or those containing fats and proteins. This is only guidance to the algorithm and need not be exact.";
+
+/* The format string describing the date of a COB value. The first format argument is the localized date. */
+"com.loudnate.CarbKit.COBDateLabel" = "at %1$@";
+
+/* The format string describing the starting date of a total value. The first format argument is the localized date. */
+"com.loudnate.CarbKit.totalDateLabel" = "since %1$@";
+
+/* The format string describing the date of an IOB value. The first format argument is the localized date. */
+"com.loudnate.InsulinKit.IOBDateLabel" = "at %1$@";
+
+/* The format string describing the starting date of a total value. The first format argument is the localized date. */
+"com.loudnate.InsulinKit.totalDateLabel" = "since %1$@";
+
+/* The title of the action used to dismiss an error alert */
+"com.loudnate.LoopKit.errorAlertActionTitle" = "OK";
+
+/* The title for the override emoji condition section */
+"Condition" = "Condition";
+
+/* Title of the setup button to continue */
+"Continue" = "Continue";
+
+/* The section footer of correction range schedule */
+"Correction range is the blood glucose range that you would like Loop to correct to." = "Correction range is the blood glucose range that you would like Loop to correct to.";
+
+/* The text for a custom override */
+"Custom" = "Custom";
+
+/* The title for the custom override entry screen */
+"Custom Override" = "Custom Override";
+
+/* Title of the carb entry date picker cell */
+"Date" = "Date";
+
+/* Button title to delete all objects */
+"Delete All" = "Delete All";
+
+/* The text for the override duration setting */
+"Duration" = "Duration";
+
+/* The title for the override editing screen */
+"Edit Override" = "Edit Override";
+
+/* Footer text for editing an active override (1: preset name) */
+"Editing affects only the active override. The default settings of %@ will not be affected." = "Editing affects only the active override. The default settings of %@ will not be affected.";
+
+/* The text for the indefinite override duration setting */
+"Enable Indefinitely" = "Enable Indefinitely";
+
+/* The detail text describing an enabled setting */
+"Enabled" = "Enabled";
+
+/* The placeholder text instructing users how to enter a maximum bolus */
+"Enter a number of units" = "Enter a number of units";
+
+/* The placeholder text instructing users how to enter a maximum basal rate */
+"Enter a rate in units per hour" = "Enter a rate in units per hour";
+
+/* Section title for fast absorbing food */
+"Fast" = "Fast";
+
+/* The description shown on the insulin sensitivity schedule interface. */
+"Insulin sensitivity describes how your blood glucose should respond to a 1 Unit dose of insulin. Smaller values mean more insulin will be given when above target. Values that are too small can cause dangerously low blood glucose." = "Insulin sensitivity describes how your blood glucose should respond to a 1 Unit dose of insulin. Smaller values mean more insulin will be given when above target. Values that are too small can cause dangerously low blood glucose.";
+
+/* Placeholder for maximum value in glucose range */
+"max" = "max";
+
+/* The title text for the maximum basal rate value */
+"Maximum Basal Rate" = "Maximum Basal Rate";
+
+/* The title text for the maximum bolus value */
+"Maximum Bolus" = "Maximum Bolus";
+
+/* Section title for medium absorbing food */
+"Medium" = "Medium";
+
+/* Placeholder for minimum value in glucose range */
+"min" = "min";
+
+/* Alert action title to open error help */
+"More Info" = "More Info";
+
+/* The text for the override preset name setting */
+"Name" = "Name";
+
+/* The title for the new override preset entry screen */
+"New Preset" = "New Preset";
+
+/* Section title for no-carb food
+   The title for override emoji miscellaneous section */
+"Other" = "Other";
+
+/* The title text for the insulin sensitivity scaling setting */
+"Overall Insulin Needs" = "Overall Insulin Needs";
+
+/* The title text for the override presets screen */
+"Override Presets" = "Override Presets";
+
+/* Text directing the user to configure override presets */
+"Override presets can be set up under the 'Configuration' section of the settings screen." = "Override presets can be set up under the 'Configuration' section of the settings screen.";
+
+/* The section title of glucose overrides */
+"Overrides" = "Overrides";
+
+/* Title for the pre-meal override range */
+"Pre-Meal" = "Pre-Meal";
+
+/* The section header text override presets */
+"PRESETS" = "PRESETS";
+
+/* The title of the screen displaying a pump event */
+"Pump Event" = "Pump Event";
+
+/* Title text for button to resume insulin delivery */
+"Resume Delivery" = "Resume Delivery";
+
+/* Title text for button when insulin delivery is in the process of being resumed */
+"Resuming" = "Resuming";
+
+/* The text for the override preset name field placeholder */
+"Running" = "Running";
+
+/* Button text for saving glucose correction range schedule
+   Button text for saving insulin sensitivity schedule */
+"Save" = "Save";
+
+/* The section header text for a scheduled override */
+"SCHEDULED OVERRIDE" = "SCHEDULED OVERRIDE";
+
+/* Section title for slow absorbing food */
+"Slow" = "Slow";
+
+/* The text for the override start time */
+"Start Time" = "Start Time";
+
+/* Title text for suspend resume button when temp basal starting */
+"Starting Temp Basal" = "Starting Temp Basal";
+
+/* Title text for button to suspend insulin delivery */
+"Suspend Delivery" = "Suspend Delivery";
+
+/* Title text for button when insulin delivery is in the process of being stopped */
+"Suspending" = "Suspending";
+
+/* The text for the override preset symbol setting */
+"Symbol" = "Symbol";
+
+/* The empty-state text for a configuration value */
+"Tap to set" = "Tap to set";
+
+/* The text for the override target range setting */
+"Target Range" = "Target Range";
+
+/* The title for the override selection screen */
+"Temporary Override" = "Temporary Override";
+
+/* The default placeholder string for a credential */
+"Required" = "Required";
+
+/* Alert body displayed absorption time greater than max (1: maximum absorption time) */
+"The maximum absorption time is %@" = "The maximum absorption time is %@";
+
+/* Alert body displayed for quantity greater than max (1: maximum quantity in grams) */
+"The maximum allowed amount is %@ grams" = "The maximum allowed amount is %@ grams";
+
+/* The schedule table view header describing the configured time zone difference from the default time zone. The substitution parameters are: (1: time zone name)(2: +/-)(3: time interval) */
+"Times in %1$@%2$@%3$@" = "Times in %1$@%2$@%3$@";
+
+/* The unit string for units per hour */
+"U/hour" = "U/hour";
+
+/* The unit string for units */
+"Units" = "Units";
+
+/* Accessibility value for an unknown value
+   The default title to use when an entry has none */
+"Unknown" = "Unknown";
+
+/* Label indicating validation is occurring */
+"Verifying" = "Verifying";
+
+/* Title of an alert containing a validation warning */
+"Warning" = "Warning";
+
+/* Title for the workout override range */
+"Workout" = "Workout";

+ 261 - 0
Dependencies/rileylink_ios/OmniKitUI/pt-PT.lproj/Localizable.strings

@@ -0,0 +1,261 @@
+/* Accessibility format string for (1: localized volume)(2: time) */
+"%1$@ units remaining at %2$@" = "%1$@ units remaining at %2$@";
+
+/* The format string for displaying an offset from a time zone: (1: GMT)(2: -)(3: 4:00) */
+"%1$@%2$@%3$@" = "%1$@%2$@%3$@";
+
+/* Format string providing instructions for replacing pod due to a fault. (1: The fault description) */
+"%1$@. Insulin delivery has stopped. Please deactivate and remove pod." = "%1$@. Insulin delivery has stopped. Please deactivate and remove pod.";
+
+/* Format string for delivered insulin. (1: The localized amount)
+   Format string for insulin remaining in reservoir. (1: The localized amount) */
+"%@ U" = "%@ U";
+
+/* Format string for bolus progress when finished. (1: The localized amount) */
+"%@ U (Finished)" = "%@ U (Finished)";
+
+/* Format string for bolus progress. (1: The delivered amount) (2: The programmed amount) (3: the percent progress) */
+"%@ U of %@ U (%@)" = "%1$@ U of %2$@ U (%3$@)";
+
+/* Format string for temp basal rate. (1: The localized amount) */
+"%@ U/hour" = "%@ U/hour";
+
+/* Format string for bolus percent progress. (1: Percent progress) */
+"%@%%" = "%@%%";
+
+/* Format string for reservoir reading when above or equal to maximum reading. (1: The localized amount) */
+"%@+ U" = "%@+ U";
+
+/* Appends a full-stop to a statement */
+"%@." = "%@.";
+
+/* Format string for reservoir volume. (1: The localized volume) */
+"%@U" = "%@U";
+
+/* The title of the cell showing the pod activated at time */
+"Active Time" = "Active Time";
+
+/* The title of the cell showing the Pod Active Clock */
+"Pod Active Clock" = "Pod Active Clock";
+
+/* The title of the cell showing alarm status */
+"Alarms" = "Alarms";
+
+/* Confirmation message for shutting down a pod */
+"Are you sure you want to shutdown this pod?" = "Are you sure you want to shutdown this pod?";
+
+/* Confirmation message for removing Omnipod PumpManager */
+"Are you sure you want to stop using Omnipod?" = "Are you sure you want to stop using Omnipod?";
+
+/* The title text for the address assigned to the pod */
+"Assigned Address" = "Assigned Address";
+
+/* The title of the cell showing pod basal status */
+"Basal Delivery" = "Basal Delivery";
+
+/* The title text for the basal rate schedule */
+"Basal Rates" = "Basal Rates";
+
+/* The title of the cell showing pod bolus status */
+"Bolus Delivery" = "Bolus Delivery";
+
+/* The title of the cancel action in an action sheet */
+"Cancel" = "Cancel";
+
+/* The title of the command to change pump time zone */
+"Change Time Zone" = "Change Time Zone";
+
+/* Progress message for changing pod time. */
+"Changing time…" = "Changing time…";
+
+/* The title of the configuration section in settings */
+"Configuration" = "Configuration";
+
+/* The title of the Insulin Type */
+"Insulin Type" = "Insulin Type";
+
+/* The title of the continue action in an action sheet */
+"Continue" = "Continue";
+
+/* Button title to deactivate pod because of fault during setup */
+"Deactivate" = "Deactivate";
+
+/* Button title for pod deactivation
+   Button title to deactivate pod */
+"Deactivate Pod" = "Deactivate Pod";
+
+/* Button title to delete Omnipod PumpManager */
+"Delete Omnipod" = "Delete Omnipod";
+
+/* Title text for delivery limits */
+"Delivery Limits" = "Delivery Limits";
+
+/* The title of the device information section in settings */
+"Device Information" = "Device Information";
+
+/* Title text for button to disable bolus beeps */
+"Disable Bolus Beeps" = "Disable Bolus Beeps";
+
+/* Title text for button to enable bolus beeps */
+"Enable Bolus Beeps" = "Enable Bolus Beeps";
+
+/* The alert title for disable bolus beeps error */
+"Error disabling bolus beeps" = "Error disabling bolus beeps";
+
+/* The alert title for enable bolus beeps error */
+"Error enabling bolus beeps" = "Error enabling bolus beeps";
+
+/* The alert title for enable Confirmation Beeps */
+"Enable Confirmation Beeps" = "Enable Confirmation Beeps";
+
+/* The alert title for Disable Confirmation Beep */
+"Disable Confirmation Beeps" = "Disable Confirmation Beeps";
+
+/* The alert title for enable Automatic Bolus Beeps */
+"Enable Automatic Bolus Beeps" = "Enable Automatic Bolus Beeps";
+
+/* The alert title for Disable Automatic Bolus Beeps */
+"Disable Automatic Bolus Beeps" = "Disable Automatic Bolus Beeps";
+
+/* The alert title for a resume error */
+"Error Resuming" = "Error Resuming";
+
+/* The alert title for a suspend error */
+"Error Suspending" = "Error Suspending";
+
+/* The title of the cell showing the pod expiration reminder date */
+"Expiration Reminder" = "Expiration Reminder";
+
+/* The title of the cell showing the pod expiration after expiry */
+"Expired" = "Expired";
+
+/* The title of the cell showing the pod expiration */
+"Expires" = "Expires";
+
+/* Pod life HUD view label */
+"Fault" = "Fault";
+
+/* The title of the command to finish pod setup */
+"Finish pod setup" = "Finish pod setup";
+
+/* Accessibility format string for (1: localized volume)(2: time) */
+"Greater than %1$@ units remaining at %2$@" = "Greater than %1$@ units remaining at %2$@";
+
+/* Instructions when deactivating pod that has been paired, but not attached. */
+"Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and discard pod." = "Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and discard pod.";
+
+/* Instructions when deactivating pod that has been paired and possibly attached. */
+"Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and remove pod." = "Incompletely set up pod must be deactivated before pairing with a new one. Please deactivate and remove pod.";
+
+/* Button title to insert cannula during setup */
+"Insert Cannula" = "Insert Cannula";
+
+/* The title of the cell showing delivered insulin */
+"Insulin Delivered" = "Insulin Delivered";
+
+/* The error message shown when Loop's basal schedule has an unsupported rate */
+"Invalid entry" = "Invalid entry";
+
+/* The title of the cell showing the pod lot id */
+"Lot" = "Lot";
+
+/* The detail text for bolus delivery when no bolus is being delivered */
+"None" = "None";
+
+/* Button title to pair with pod during setup */
+"Pair" = "Pair";
+
+/* The title of the command to pair new pod */
+"Pair New Pod" = "Pair New Pod";
+
+/* The text of the loading label when pairing */
+"Pairing…" = "Pairing…";
+
+/* The title of the cell showing the pod pi version */
+"PI Version" = "PI Version";
+
+/* The title of the command to play test beeps */
+"Play Test Beeps" = "Play Test Beeps";
+
+/* Progress message for play test beeps. */
+"Play Test Beeps…" = "Play Test Beeps…";
+
+/* The title of the cell showing the pod pm version */
+"PM Version" = "PM Version";
+
+/* Label describing pod age view */
+"Pod Age" = "Pod Age";
+
+/* Title of the pod settings view controller */
+"Pod Settings" = "Pod Settings";
+
+/* The text of the loading label when pod is primed */
+"Primed" = "Primed";
+
+/* The text of the loading label when priming */
+"Priming…" = "Priming…";
+
+/* Label describing time remaining view */
+"Remaining" = "Remaining";
+
+/* Label indicating pod replacement necessary
+   The title of the command to replace pod */
+"Replace Pod" = "Replace Pod";
+
+/* The title of the command to replace pod when there is a pod fault */
+"Replace Pod Now" = "Replace Pod Now";
+
+/* The title of the cell showing reservoir status */
+"Reservoir" = "Reservoir";
+
+/* Button title for retrying pod deactivation */
+"Retry Pod Deactivation" = "Retry Pod Deactivation";
+
+/* Title of button to save delivery limit settings
+   Title of button to sync basal profile when no pod paired */
+"Save" = "Save";
+
+/* The detail text of the basal row when pod is running scheduled basal */
+"Schedule" = "Schedule";
+
+/* The title of the status section in settings */
+"Status" = "Status";
+
+/* A message indicating a command succeeded */
+"Succeeded" = "Succeeded";
+
+/* The detail text of the basal row when pod is suspended */
+"Suspended" = "Suspended";
+
+/* Title text for the button to delete Omnipod PumpManager */
+"Switch from Omnipod Pumps" = "Switch from Omnipod Pumps";
+
+/* Title of button to sync basal profile from pod */
+"Sync With Pod" = "Sync With Pod";
+
+/* The title of the command to run the test command */
+"Test Command" = "Test Command";
+
+/* Progress message for testing commands. */
+"Testing Commands…" = "Testing Commands…";
+
+/* The error message shown when Loop's basal schedule has more entries than the pod can support */
+"Too many entries" = "Too many entries";
+
+/* Instructions when pod cannot be deactivated */
+"Unable to deactivate pod. Please continue and pair a new one." = "Unable to deactivate pod. Please continue and pair a new one.";
+
+/* The detail text for delivered insulin when no measurement is available */
+"Unknown" = "Unknown";
+
+/* The title of the diagnostics section in settings */
+"Diagnostics" = "Diagnostics";
+
+/* The diagnostic command Read Pod Status */
+"Read Pod Status" = "Read Pod Status";
+
+/* The diagnostic command Read Pulse Log */
+"Read Pulse Log" = "Read Pulse Log";
+
+/* The title of the pod details section in settings */
+"Pod Details" = "Pod Details";

+ 68 - 0
Dependencies/rileylink_ios/OmniKitUI/pt-PT.lproj/OmnipodPumpManager.strings

@@ -0,0 +1,68 @@
+/* Class = "UITableViewSection"; headerTitle = "Remove POD"; ObjectID = "1LF-te-Bdd"; */
+"1LF-te-Bdd.headerTitle" = "Remove POD";
+
+/* Class = "UINavigationItem"; title = "RileyLink Setup"; ObjectID = "3HH-eJ-lRh"; */
+"3HH-eJ-lRh.title" = "RileyLink Setup";
+
+/* Class = "UITableViewController"; title = "Pod Settings"; ObjectID = "6vo-Ov-UpE"; */
+"6vo-Ov-UpE.title" = "Pod Settings";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "91O-Un-vKc"; */
+"91O-Un-vKc.title" = "Pump Setup";
+
+/* Class = "UITableViewSection"; footerTitle = "NOTE: Do not remove the pod's needle cap at this time."; ObjectID = "EUt-xk-Rmp"; */
+"EUt-xk-Rmp.footerTitle" = "NOTE: Do not remove the pod's needle cap at this time.";
+
+/* Class = "UITableViewSection"; headerTitle = "Prepare Pod"; ObjectID = "EUt-xk-Rmp"; */
+"EUt-xk-Rmp.headerTitle" = "Prepare Pod";
+
+/* Class = "UILabel"; text = "Loop will remind you to change your pod before it expires. You can change this to a time convenient for you."; ObjectID = "Eng-IY-fQ7"; */
+"Eng-IY-fQ7.text" = "Loop will remind you to change your pod before it expires. You can change this to a time convenient for you.";
+
+/* Class = "UILabel"; text = "Please deactivate the pod. When deactivation is complete, remove pod from body."; ObjectID = "GK7-jb-tyY"; */
+"GK7-jb-tyY.text" = "Please deactivate the pod. When deactivation is complete, remove pod from body.";
+
+/* Class = "UINavigationItem"; title = "Insert Cannula"; ObjectID = "HwT-30-f0y"; */
+"HwT-30-f0y.title" = "Insert Cannula";
+
+/* Class = "UILabel"; text = "Prepare site. Remove the pod's needle cap and adhesive backing. If pod is OK, apply to site."; ObjectID = "Iuv-5M-bDH"; */
+"Iuv-5M-bDH.text" = "Prepare site. Remove the pod's needle cap and adhesive backing. If pod is OK, apply to site.";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "aNg-mm-Uuy"; */
+"aNg-mm-Uuy.title" = "Pump Setup";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "ack-ra-XH6"; */
+"ack-ra-XH6.title" = "Pump Setup";
+
+/* Class = "UILabel"; text = "Your Pod is ready for use."; ObjectID = "bJ5-iH-fnF"; */
+"bJ5-iH-fnF.text" = "Your Pod is ready for use.";
+
+/* Class = "UILabel"; text = "Reminder"; ObjectID = "ePA-6p-q8C"; */
+"ePA-6p-q8C.text" = "Reminder";
+
+/* Class = "UINavigationItem"; title = "Pod Pairing"; ObjectID = "jVO-Ut-MhL"; */
+"jVO-Ut-MhL.title" = "Pod Pairing";
+
+/* Class = "UITableViewController"; title = "Pump Setup"; ObjectID = "k1Y-x4-m0a"; */
+"k1Y-x4-m0a.title" = "Pump Setup";
+
+/* Class = "UILabel"; text = "Review your settings below. They will be programmed into the pod during pairing. You can change these settings at any time in Loopʼs Settings screen."; ObjectID = "kLL-SQ-K0a"; */
+"kLL-SQ-K0a.text" = "Review your settings below. They will be programmed into the pod during pairing. You can change these settings at any time in Loopʼs Settings screen.";
+
+/* Class = "UINavigationItem"; title = "Setup Complete"; ObjectID = "nDb-R5-e02"; */
+"nDb-R5-e02.title" = "Setup Complete";
+
+/* Class = "UITableViewSection"; footerTitle = "NOTE: If cannula sticks out, press cancel."; ObjectID = "rcC-ke-lUP"; */
+"rcC-ke-lUP.footerTitle" = "NOTE: If cannula sticks out, press cancel.";
+
+/* Class = "UITableViewSection"; headerTitle = "Apply POD"; ObjectID = "rcC-ke-lUP"; */
+"rcC-ke-lUP.headerTitle" = "Apply POD";
+
+/* Class = "UILabel"; text = "Label"; ObjectID = "vEc-Km-ewe"; */
+"vEc-Km-ewe.text" = "Label";
+
+/* Class = "UILabel"; text = "Fill a new pod with insulin. Listen for 2 beeps from the pod during filling. Keep RileyLink adjacent to the pod during pairing."; ObjectID = "vmF-Dc-3DS"; */
+"vmF-Dc-3DS.text" = "Fill a new pod with insulin. Listen for 2 beeps from the pod during filling. Keep the RileyLink about 6 inches from the pod during pairing.";
+
+/* Class = "UINavigationItem"; title = "Replace Pod"; ObjectID = "yy1-xf-HdR"; */
+"yy1-xf-HdR.title" = "Replace Pod";

+ 104 - 0
Dependencies/rileylink_ios/RileyLinkKitUI/pt-PT.lproj/Localizable.strings

@@ -0,0 +1,104 @@
+/* The title of the section describing commands */
+"Commands" = "Commands";
+
+/* The connected state */
+"Connected" = "Connected";
+
+/* The in-progress connecting state */
+"Connecting" = "Connecting";
+
+/* The title of the cell showing BLE connection state */
+"Connection State" = "Connection State";
+
+/* The title of the section describing the device */
+"Device" = "Device";
+
+/* The title of the devices table section in RileyLink settings */
+"Devices" = "Devices";
+
+/* The disconnected state */
+"Disconnected" = "Disconnected";
+
+/* The in-progress disconnecting state */
+"Disconnecting" = "Disconnecting";
+
+/* The title of the cell showing firmware version */
+"Firmware" = "Firmware";
+
+/* The title of the cell showing current rileylink frequency */
+"Frequency" = "Frequency";
+
+/* The title of the cell showing device name */
+"Name" = "Name";
+
+/* RileyLink setup description */
+"RileyLink allows for communication with the pump over Bluetooth Low Energy." = "RileyLink allows for communication with the pump over Bluetooth Low Energy.";
+
+/* The title of the cell showing BLE signal strength (RSSI) */
+"Signal Strength" = "Signal Strength";
+
+/* The header of the cells showing connection monitoring */
+"Connection Monitoring" = "Connection Monitoring";
+
+/* The title of the cell showing uptime */
+"Uptime" = "Uptime";
+
+/* The title of the cell showing battery level */
+"Battery level" = "Battery level";
+
+/* The title of the cell showing Voltage */
+"Voltage" = "Voltage";
+
+/* "The title of the section for alerts" */
+"Alert" = "Alert";
+
+/* The title of the cell showing Low Battery Alert */
+"Low Battery Alert" = "Low Battery Alert";
+
+/* Header of list showing battery level alert options */
+"Battery level Alert" = "Battery level Alert";
+
+/* Battery level alert OFF in list of options */
+"OFF" = "OFF";
+
+/* The title of the command to update diagnostic LEDs */
+"Diagnostic LEDs" = "Diagnostic LEDs";
+
+/* The title of the command to fetch RileyLink statistics */
+"Get RileyLink Statistics" = "Get RileyLink Statistics";
+
+/* The title of the command to invert BLE connection LED logic */
+"Invert LED Logic" = "Invert LED Logic";
+
+/* The header of the cells showing test commands */
+"Test Commands" = "Test Commands";
+
+/* The title of the cell showing Lighten Yellow LED */
+"Lighten Yellow LED" = "Lighten Yellow LED";
+
+/* The title of the cell showing Lighten Yellow LED */
+"Lighten Red LED" = "Lighten Red LED";
+
+/* The title of the cell showing Test Vibration */
+"Test Vibration" = "Test Vibration";
+
+/* The title of the cell for sounding device finding piezo */
+"Find Device" = "Find Device";
+
+/* The title of the cell for connection LED */
+"Connection LED" = "Connection LED";
+
+/* The title of the cell for connection vibration */
+"Connection Vibration" = "Connection Vibration";
+
+/* Detail text when battery alert disabled. */
+"Off" = "Off";
+
+/* Text indicating LED Mode is on */
+"On" = "On";
+
+/* Text indicating LED Mode is off */
+"Off" = "Off";
+
+/* Text indicating LED Mode is auto */
+"Auto" = "Auto";

+ 9 - 2
FreeAPS/Resources/pt.lproj/InfoPlist.strings

@@ -4,10 +4,17 @@
 /* Privacy - Bluetooth Always Usage Description */
 "NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
 
+/* Privacy - Bluetooth Peripheral Usage Description */
 "NSBluetoothPeripheralUsageDescription" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
 
+/* Privacy - Face ID Usage Description */
+"NSFaceIDUsageDescription" = "For authorized acces to bolus";
+
 /* Privacy - Calendars Usage Description */
 "NSCalendarsUsageDescription" = "Calendar is used to create a new glucose events.";
 
-/* Privacy - Face ID Usage Description */
-"NSFaceIDUsageDescription" = "For authorized acces to bolus";
+/* Privacy - Health Update Usage Description */
+"NSHealthUpdateUsageDescription" = "Health App is used to store blood glucose data";
+
+/* Privacy - Health Share Usage Description */
+"NSHealthShareUsageDescription" = "Health App is used to store blood glucose data";

+ 0 - 12
FreeAPS/Resources/pt-PT.lproj/infoPlist.strings

@@ -1,12 +0,0 @@
-/* Privacy - Bluetooth Always Usage Description */
-"Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices" = "Bluetooth is used to communicate with insulin pump and continuous glucose monitor devices";
-
-/* Privacy - Face ID Usage Description */
-"For authorized acces to bolus" = "For authorized acces to bolus";
-
-/* Privacy - NFC Scan Usage Description */
-"NFC is used to scan Libre sensors." = "NFC is used to scan Libre sensors.";
-
-/* Privacy - Calendars Usage Description */
-"Calendar is used to create a new glucose events." = "Calendar is used to create a new glucose events.";
-

+ 25 - 0
FreeAPS/Sources/AnimatedBackground/SnowScene.swift

@@ -1,3 +1,4 @@
+import Foundation
 import SpriteKit
 
 class SnowScene: SKScene {
@@ -9,6 +10,22 @@ class SnowScene: SKScene {
         snowEmitterNode.particleLifetime = 2
         snowEmitterNode.particleLifetimeRange = 6
         addChild(snowEmitterNode)
+        subscribe()
+    }
+
+    private func subscribe() {
+        Foundation.NotificationCenter.default.addObserver(
+            self,
+            selector: #selector(didEnterBackground),
+            name: UIApplication.didEnterBackgroundNotification,
+            object: nil
+        )
+        Foundation.NotificationCenter.default.addObserver(
+            self,
+            selector: #selector(willEnterForeground),
+            name: UIApplication.willEnterForegroundNotification,
+            object: nil
+        )
     }
 
     override func didChangeSize(_: CGSize) {
@@ -16,4 +33,12 @@ class SnowScene: SKScene {
         snowEmitterNode.particlePosition = CGPoint(x: size.width / 2, y: size.height)
         snowEmitterNode.particlePositionRange = CGVector(dx: size.width, dy: size.height)
     }
+
+    @objc private func didEnterBackground() {
+        isPaused = true
+    }
+
+    @objc private func willEnterForeground() {
+        isPaused = false
+    }
 }

+ 0 - 2
FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings

@@ -896,8 +896,6 @@ Enact a temp Basal or a temp target */
 /* */
 "Animated Background" = "Arrière-plan dynamique";
 
-/* */
-"Animated Background" = "Animated Background";
 
 /* */
 "Carbs" = "Carbs";

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 80 - 9
FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings


+ 86 - 72
FreeAPS/Sources/Modules/Home/View/HomeRootView.swift

@@ -37,82 +37,100 @@ extension Home {
             return scene
         }
 
-        var header: some View {
+        @ViewBuilder func header(_ geo: GeometryProxy) -> some View {
             HStack(alignment: .bottom) {
                 Spacer()
-                VStack(alignment: .leading, spacing: 12) {
-                    HStack {
-//                        Text("IOB").font(.caption2).foregroundColor(.secondary)
-                        Text(
-                            (numberFormatter.string(from: (state.suggestion?.iob ?? 0) as NSNumber) ?? "0") +
-                                NSLocalizedString(" U", comment: "Insulin unit")
-                        )
-                        .font(.system(size: 12, weight: .bold)).foregroundColor(.insulin)
-                    }
-                    HStack {
-//                        Text("COB").font(.caption2).foregroundColor(.secondary)
-                        Text(
-                            (numberFormatter.string(from: (state.suggestion?.cob ?? 0) as NSNumber) ?? "0") +
-                                NSLocalizedString(" g", comment: "gram of carbs")
-                        )
-                        .font(.system(size: 12, weight: .bold)).foregroundColor(.loopYellow)
-                    }
-                }
+                cobIobView
+                Spacer()
+                glucoseView
+                Spacer()
+                pumpView
+                Spacer()
+                loopView
                 Spacer()
+            }
+            .frame(maxWidth: .infinity)
+            .frame(maxHeight: 70)
+            .padding(.top, geo.safeAreaInsets.top)
+            .background(Color.gray.opacity(0.2))
+        }
 
-                CurrentGlucoseView(
-                    recentGlucose: $state.recentGlucose,
-                    delta: $state.glucoseDelta,
-                    units: $state.units,
-                    alarm: $state.alarm
-                )
-                .onTapGesture {
-                    if state.alarm == nil {
-                        state.openCGM()
-                    } else {
-                        state.showModal(for: .snooze)
-                    }
+        var cobIobView: some View {
+            VStack(alignment: .leading, spacing: 12) {
+                HStack {
+                    Text("IOB").font(.caption2).foregroundColor(.secondary)
+                    Text(
+                        (numberFormatter.string(from: (state.suggestion?.iob ?? 0) as NSNumber) ?? "0") +
+                            NSLocalizedString(" U", comment: "Insulin unit")
+                    )
+                    .font(.system(size: 12, weight: .bold))
                 }
-                .onLongPressGesture {
-                    let impactHeavy = UIImpactFeedbackGenerator(style: .heavy)
-                    impactHeavy.impactOccurred()
-                    if state.alarm == nil {
-                        state.showModal(for: .snooze)
-                    } else {
-                        state.openCGM()
-                    }
+                HStack {
+                    Text("COB").font(.caption2).foregroundColor(.secondary)
+                    Text(
+                        (numberFormatter.string(from: (state.suggestion?.cob ?? 0) as NSNumber) ?? "0") +
+                            NSLocalizedString(" g", comment: "gram of carbs")
+                    )
+                    .font(.system(size: 12, weight: .bold))
                 }
+            }
+        }
 
-                Spacer()
-                PumpView(
-                    reservoir: $state.reservoir,
-                    battery: $state.battery,
-                    name: $state.pumpName,
-                    expiresAtDate: $state.pumpExpiresAtDate,
-                    timerDate: $state.timerDate
-                )
-                .onTapGesture {
-                    if state.pumpDisplayState != nil {
-                        state.setupPump = true
-                    }
+        var glucoseView: some View {
+            CurrentGlucoseView(
+                recentGlucose: $state.recentGlucose,
+                delta: $state.glucoseDelta,
+                units: $state.units,
+                alarm: $state.alarm
+            )
+            .onTapGesture {
+                if state.alarm == nil {
+                    state.openCGM()
+                } else {
+                    state.showModal(for: .snooze)
                 }
-                Spacer()
-                LoopView(
-                    suggestion: $state.suggestion,
-                    enactedSuggestion: $state.enactedSuggestion,
-                    closedLoop: $state.closedLoop,
-                    timerDate: $state.timerDate,
-                    isLooping: $state.isLooping,
-                    lastLoopDate: $state.lastLoopDate
-                ).onTapGesture {
-                    isStatusPopupPresented = true
-                }.onLongPressGesture {
-                    let impactHeavy = UIImpactFeedbackGenerator(style: .heavy)
-                    impactHeavy.impactOccurred()
-                    state.runLoop()
+            }
+            .onLongPressGesture {
+                let impactHeavy = UIImpactFeedbackGenerator(style: .heavy)
+                impactHeavy.impactOccurred()
+                if state.alarm == nil {
+                    state.showModal(for: .snooze)
+                } else {
+                    state.openCGM()
                 }
-                Spacer()
-            }.frame(maxWidth: .infinity)
+            }
+        }
+
+        var pumpView: some View {
+            PumpView(
+                reservoir: $state.reservoir,
+                battery: $state.battery,
+                name: $state.pumpName,
+                expiresAtDate: $state.pumpExpiresAtDate,
+                timerDate: $state.timerDate
+            )
+            .onTapGesture {
+                if state.pumpDisplayState != nil {
+                    state.setupPump = true
+                }
+            }
+        }
+
+        var loopView: some View {
+            LoopView(
+                suggestion: $state.suggestion,
+                enactedSuggestion: $state.enactedSuggestion,
+                closedLoop: $state.closedLoop,
+                timerDate: $state.timerDate,
+                isLooping: $state.isLooping,
+                lastLoopDate: $state.lastLoopDate
+            ).onTapGesture {
+                isStatusPopupPresented = true
+            }.onLongPressGesture {
+                let impactHeavy = UIImpactFeedbackGenerator(style: .heavy)
+                impactHeavy.impactOccurred()
+                state.runLoop()
+            }
         }
 
         var infoPanal: some View {
@@ -330,11 +348,7 @@ extension Home {
         var body: some View {
             GeometryReader { geo in
                 VStack(spacing: 0) {
-                    header
-                        .frame(maxHeight: 70)
-                        .padding(.top, geo.safeAreaInsets.top)
-                        .background(Color.gray.opacity(0.2))
-
+                    header(geo)
                     infoPanal
                     mainChart
                     legendPanal

+ 17 - 2
FreeAPS/Sources/Views/DecimalTextField.swift

@@ -1,3 +1,4 @@
+import Combine
 import SwiftUI
 
 struct DecimalTextField: UIViewRepresentable {
@@ -62,8 +63,11 @@ struct DecimalTextField: UIViewRepresentable {
         return textfield
     }
 
-    func updateUIView(_ textField: UITextField, context _: Context) {
-        if value != 0 {
+    func updateUIView(_ textField: UITextField, context: Context) {
+        let coordinator = context.coordinator
+        if coordinator.isEditing {
+            coordinator.resetEditing()
+        } else if value != 0 {
             textField.text = formatter.string(for: value)
         }
     }
@@ -79,6 +83,15 @@ struct DecimalTextField: UIViewRepresentable {
             parent = textField
         }
 
+        private(set) var isEditing = false
+        private var editingCancellable: AnyCancellable?
+
+        func resetEditing() {
+            editingCancellable = Just(false)
+                .delay(for: 0.5, scheduler: DispatchQueue.main)
+                .weakAssign(to: \.isEditing, on: self)
+        }
+
         func textField(
             _ textField: UITextField,
             shouldChangeCharactersIn range: NSRange,
@@ -106,6 +119,7 @@ struct DecimalTextField: UIViewRepresentable {
 
                 // Set Value
                 let double = number.doubleValue
+                isEditing = true
                 parent.value = Decimal(double)
             }
 
@@ -118,6 +132,7 @@ struct DecimalTextField: UIViewRepresentable {
         ) {
             // Format value with formatter at End Editing
             textField.text = parent.formatter.string(for: parent.value)
+            isEditing = false
         }
     }
 }